diff options
Diffstat (limited to 'src/server/scripts')
98 files changed, 3865 insertions, 10402 deletions
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index 8e636ee1208..60b856c4a86 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -70,7 +70,6 @@ include_directories(    ${CMAKE_SOURCE_DIR}/src/server/game/Addons    ${CMAKE_SOURCE_DIR}/src/server/game/AI    ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI -  ${CMAKE_SOURCE_DIR}/src/server/game/AI/EventAI    ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI    ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts    ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index f8db39e0338..8d0a217bbea 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 = titleInfo->name[loc]; +                std::string name = titleInfo->name;                  if (name.empty())                      continue; @@ -473,7 +473,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; diff --git a/src/server/scripts/Commands/cs_cheat.cpp b/src/server/scripts/Commands/cs_cheat.cpp index 026177ece6d..52b9bdf8740 100644 --- a/src/server/scripts/Commands/cs_cheat.cpp +++ b/src/server/scripts/Commands/cs_cheat.cpp @@ -197,14 +197,14 @@ public:          if (argstr == "off")          {              handler->GetSession()->GetPlayer()->SetCommandStatusOff(CHEAT_WATERWALK); -            handler->GetSession()->GetPlayer()->SetMovement(MOVE_LAND_WALK);                // OFF +            handler->GetSession()->GetPlayer()->SendMovementSetWaterWalking(false);         // OFF              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 +            handler->GetSession()->GetPlayer()->SendMovementSetWaterWalking(true);          // ON              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 956d9ac3376..a00563e0075 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -91,6 +91,7 @@ public:              { "areatriggers",   SEC_ADMINISTRATOR,  false, &HandleDebugAreaTriggersCommand,    "", NULL },              { "los",            SEC_MODERATOR,      false, &HandleDebugLoSCommand,             "", NULL },              { "moveflags",      SEC_ADMINISTRATOR,  false, &HandleDebugMoveflagsCommand,       "", NULL }, +            { "phase",          SEC_MODERATOR,      false, &HandleDebugPhaseCommand,           "", NULL },              { NULL,             SEC_PLAYER,         false, NULL,                               "", NULL }          };          static ChatCommand commandTable[] = @@ -237,7 +238,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;      } @@ -311,7 +312,7 @@ public:          uint32 opcode;          parsedStream >> opcode; -        WorldPacket data(opcode, 0); +        WorldPacket data(Opcodes(opcode), 0);          while (!parsedStream.eof())          { @@ -417,7 +418,7 @@ public:          }          sLog->outDebug(LOG_FILTER_NETWORKIO, "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;      } @@ -951,8 +952,21 @@ 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; + +        terrainswap.insert((uint32)atoi(t)); + +        if (p) +            phaseId.insert((uint32)atoi(p)); + +        handler->GetSession()->SendSetPhaseShift(phaseId, terrainswap);          return true;      } @@ -1328,11 +1342,22 @@ public:      {          Player* player = handler->GetSession()->GetPlayer(); -        sLog->outInfo(LOG_FILTER_SQL_DEV, "(@PATH, XX, %.3f, %.3f, %.5f, 0,0, 0,100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); +        sLog->outInfo(LOG_FILTER_SQL_DEV, "(@PATH, XX, %.3f, %.3f, %.5f, 0, 0, 0, 100, 0),", player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());          handler->PSendSysMessage("Waypoint SQL written to SQL Developer log");          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(); + +        player->GetPhaseMgr().SendDebugReportToPlayer(handler->GetSession()->GetPlayer()); +        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 b46f99eaa8f..0c6da6ba02b 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -99,19 +99,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->SendMovementSetCanFly(true);          else if (strncmp(args, "off", 4) == 0) -            data.SetOpcode(SMSG_MOVE_UNSET_CAN_FLY); +            target->SendMovementSetCanFly(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 6d75e63d053..f7f50516561 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -446,7 +446,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 c9f07c90259..7c75c9da8af 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -152,7 +152,7 @@ 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, player->GetPhaseMgr().GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))          {              delete object;              return false; @@ -165,7 +165,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->GetPhaseMgr().GetPhaseMaskForSpawn());          // this will generate a new guid if the object is in an instance          if (!object->LoadGameObjectFromDB(guidLow, map)) diff --git a/src/server/scripts/Commands/cs_guild.cpp b/src/server/scripts/Commands/cs_guild.cpp index 73955a6b9b2..33cf0bf10e9 100644 --- a/src/server/scripts/Commands/cs_guild.cpp +++ b/src/server/scripts/Commands/cs_guild.cpp @@ -22,6 +22,7 @@ Comment: All guild related commands  Category: commandscripts  EndScriptData */ +#include "AchievementMgr.h"  #include "Chat.h"  #include "Language.h"  #include "Guild.h" diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index 9c383153d46..774418cfb88 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -397,33 +397,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 977369d1405..4d9d8939aec 100644 --- a/src/server/scripts/Commands/cs_list.cpp +++ b/src/server/scripts/Commands/cs_list.cpp @@ -437,7 +437,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 13ee91884d0..36772164b20 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) @@ -970,7 +877,7 @@ public:          if (spellInfo)          {              int locale = handler->GetSessionDbcLocale(); -            std::string name = spellInfo->SpellName[locale]; +            std::string name = spellInfo->SpellName;              if (name.empty())              {                  handler->SendSysMessage(LANG_COMMAND_NOSPELLFOUND); @@ -1064,47 +971,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) @@ -1201,53 +1090,35 @@ public:              CharTitlesEntry const* titleInfo = sCharTitlesStore.LookupEntry(id);              if (titleInfo)              { -                int locale = handler->GetSessionDbcLocale(); -                std::string name = titleInfo->name[locale]; +                std::string name = titleInfo->name;                  if (name.empty())                      continue;                  if (!Utf8FitTo(name, wNamePart)) -                { -                    locale = 0; -                    for (; locale < TOTAL_LOCALES; ++locale) -                    { -                        if (locale == handler->GetSessionDbcLocale()) -                            continue; - -                        name = titleInfo->name[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 @@ -1278,7 +1149,7 @@ public:          {              if (MapEntry const* mapInfo = sMapStore.LookupEntry(id))              { -                std::string name = mapInfo->name[locale]; +                std::string name = mapInfo->name;                  if (name.empty())                      continue; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index c701c4f350c..1958ed4ea54 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -106,7 +106,6 @@ public:              { "cometome",           SEC_ADMINISTRATOR,      false, &HandleComeToMeCommand,              "", NULL },              { "damage",             SEC_ADMINISTRATOR,      false, &HandleDamageCommand,                "", NULL },              { "combatstop",         SEC_GAMEMASTER,         true,  &HandleCombatStopCommand,            "", NULL }, -            { "flusharenapoints",   SEC_ADMINISTRATOR,      false, &HandleFlushArenaPointsCommand,      "", NULL },              { "repairitems",        SEC_GAMEMASTER,         true,  &HandleRepairitemsCommand,           "", NULL },              { "freeze",             SEC_MODERATOR,          false, &HandleFreezeCommand,                "", NULL },              { "unfreeze",           SEC_MODERATOR,          false, &HandleUnFreezeCommand,              "", NULL }, @@ -221,9 +220,9 @@ public:              handler->PSendSysMessage("no VMAP available for area info");          handler->PSendSysMessage(LANG_MAP_POSITION, -            object->GetMapId(), (mapEntry ? mapEntry->name[handler->GetSessionDbcLocale()] : "<unknown>"), -            zoneId, (zoneEntry ? zoneEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"), -            areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : "<unknown>"), +            object->GetMapId(), (mapEntry ? mapEntry->name : "<unknown>"), +            zoneId, (zoneEntry ? zoneEntry->area_name : "<unknown>"), +            areaId, (areaEntry ? areaEntry->area_name : "<unknown>"),              object->GetPhaseMask(),              object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation(),              cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), @@ -1455,7 +1454,7 @@ public:          if (!target->GetSkillValue(skill))          { -            handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name[handler->GetSessionDbcLocale()]); +            handler->PSendSysMessage(LANG_SET_SKILL_ERROR, tNameLink.c_str(), skill, skillLine->name);              handler->SetSentErrorMessage(true);              return false;          } @@ -1466,7 +1465,7 @@ public:              return false;          target->SetSkill(skill, target->GetSkillStep(skill), level, max); -        handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name[handler->GetSessionDbcLocale()], tNameLink.c_str(), level, max); +        handler->PSendSysMessage(LANG_SET_SKILL, skill, skillLine->name, tNameLink.c_str(), level, max);          return true;      } @@ -1661,6 +1660,12 @@ public:              case RACE_DRAENEI:                  raceStr = "Draenei";                  break; +            case RACE_GOBLIN: +                raceStr = "Goblin"; +                break; +            case RACE_WORGEN: +                raceStr = "Worgen"; +                break;          }          switch (Class) @@ -1704,7 +1709,6 @@ public:          handler->PSendSysMessage(LANG_PINFO_LEVEL, raceStr.c_str(), ClassStr.c_str(), timeStr.c_str(), level, gold, silv, copp);          // Add map, zone, subzone and phase to output -        int locale = handler->GetSessionDbcLocale();          std::string areaName = "<unknown>";          std::string zoneName = ""; @@ -1713,22 +1717,22 @@ 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)          {              if (!zoneName.empty()) -                handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], zoneName.c_str(), areaName.c_str(), phase); +                handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name, zoneName.c_str(), areaName.c_str(), phase);              else -                handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name[locale], areaName.c_str(), "<unknown>", phase); +                handler->PSendSysMessage(LANG_PINFO_MAP_ONLINE, map->name, areaName.c_str(), "<unknown>", phase);          }          else -           handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name[locale], areaName.c_str()); +           handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name, areaName.c_str());          return true;      } @@ -2118,12 +2122,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; diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 16599e5d892..dff89821a2a 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" @@ -64,11 +65,11 @@ public:              { "mount",          SEC_MODERATOR,      false, &HandleModifyMountCommand,         "", NULL },              { "honor",          SEC_MODERATOR,      false, &HandleModifyHonorCommand,         "", NULL },              { "reputation",     SEC_GAMEMASTER,     false, &HandleModifyRepCommand,           "", NULL }, -            { "arenapoints",    SEC_MODERATOR,      false, &HandleModifyArenaCommand,         "", NULL },              { "drunk",          SEC_MODERATOR,      false, &HandleModifyDrunkCommand,         "", NULL },              { "standstate",     SEC_GAMEMASTER,     false, &HandleModifyStandStateCommand,    "", NULL },              { "phase",          SEC_ADMINISTRATOR,  false, &HandleModifyPhaseCommand,         "", NULL },              { "gender",         SEC_GAMEMASTER,     false, &HandleModifyGenderCommand,        "", NULL }, +            { "currency",       SEC_GAMEMASTER,     false, &HandleModifyCurrencyCommand,      "", NULL },              { "speed",          SEC_MODERATOR,      false, NULL,           "", modifyspeedCommandTable },              { NULL,             0,                  false, NULL,                                           "", NULL }          }; @@ -973,14 +974,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); @@ -1007,19 +1008,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; -            sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_CURRENT_MONEY), targetMoney, moneyToAdd, newmoney); +            sLog->outDebug(LOG_FILTER_GENERAL, 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()); @@ -1030,20 +1031,21 @@ public:              }              else              { +                uint32 moneyToAddMsg = moneyToAdd * -1;                  if (newmoney > 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 (moneyToAdd >= MAX_MONEY_AMOUNT)                  target->SetMoney(MAX_MONEY_AMOUNT); @@ -1051,7 +1053,7 @@ public:                  target->ModifyMoney(moneyToAdd);          } -        sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), targetMoney, moneyToAdd, target->GetMoney()); +        sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), uint32(targetMoney), int32(moneyToAdd), uint32(target->GetMoney()));          return true;      } @@ -1111,7 +1113,7 @@ public:          return true;      } -    static bool HandleModifyHonorCommand (ChatHandler* handler, const char* args) +    static bool HandleModifyHonorCommand(ChatHandler* handler, const char* args)      {          if (!*args)              return false; @@ -1130,9 +1132,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;      } @@ -1240,13 +1242,13 @@ 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); -        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;      } @@ -1281,14 +1283,15 @@ public:          uint32 phasemask = (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) +        { +            if (target->GetTypeId() == TYPEID_PLAYER) +                target->ToPlayer()->GetPhaseMgr().SetCustomPhase(phasemask); +            else +                target->SetPhaseMask(phasemask, true); +        } +        else +            handler->GetSession()->GetPlayer()->GetPhaseMgr().SetCustomPhase(phasemask);          return true;      } @@ -1305,28 +1308,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) @@ -1402,6 +1383,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 28e0744c29d..115737e0dfe 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -154,13 +154,13 @@ public:          }          Creature* creature = new Creature(); -        if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o)) +        if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o))          {              delete creature;              return false;          } -        creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +        creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());          uint32 db_guid = creature->GetDBTableGUIDLow(); @@ -181,6 +181,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)          { @@ -217,13 +219,13 @@ public:          uint32 vendor_entry = vendor ? vendor->GetEntry() : 0; -        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); @@ -438,7 +440,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); diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index f62a6f059b7..2e797ad32cd 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -25,7 +25,6 @@ EndScriptData */  #include "AchievementMgr.h"  #include "AuctionHouseMgr.h"  #include "Chat.h" -#include "CreatureEventAIMgr.h"  #include "CreatureTextMgr.h"  #include "DisableMgr.h"  #include "Language.h" @@ -52,7 +51,6 @@ public:          {              { "achievement", SEC_ADMINISTRATOR,  true,  &HandleReloadAllAchievementCommand, "", NULL },              { "area",       SEC_ADMINISTRATOR,  true,  &HandleReloadAllAreaCommand,       "", NULL }, -            { "eventai",    SEC_ADMINISTRATOR,  true,  &HandleReloadAllEventAICommand,    "", NULL },              { "gossips",    SEC_ADMINISTRATOR,  true,  &HandleReloadAllGossipsCommand,    "", NULL },              { "item",       SEC_ADMINISTRATOR,  true,  &HandleReloadAllItemCommand,       "", NULL },              { "locales",    SEC_ADMINISTRATOR,  true,  &HandleReloadAllLocalesCommand,    "", NULL }, @@ -79,8 +77,6 @@ public:              { "conditions",                   SEC_ADMINISTRATOR, true,  &HandleReloadConditions,                        "", NULL },              { "config",                       SEC_ADMINISTRATOR, true,  &HandleReloadConfigCommand,                     "", NULL },              { "creature_text",                SEC_ADMINISTRATOR, true,  &HandleReloadCreatureText,                      "", NULL }, -            { "creature_ai_scripts",          SEC_ADMINISTRATOR, true,  &HandleReloadEventAIScriptsCommand,             "", NULL }, -            { "creature_ai_texts",            SEC_ADMINISTRATOR, true,  &HandleReloadEventAITextsCommand,               "", NULL },              { "creature_involvedrelation",    SEC_ADMINISTRATOR, true,  &HandleReloadCreatureQuestInvRelationsCommand,  "", NULL },              { "creature_linked_respawn",      SEC_GAMEMASTER,    true,  &HandleReloadLinkedRespawnCommand,              "", NULL },              { "creature_loot_template",       SEC_ADMINISTRATOR, true,  &HandleReloadLootTemplatesCreatureCommand,      "", NULL }, @@ -103,7 +99,6 @@ public:              { "gossip_menu_option",           SEC_ADMINISTRATOR, true,  &HandleReloadGossipMenuOptionCommand,           "", NULL },              { "item_enchantment_template",    SEC_ADMINISTRATOR, true,  &HandleReloadItemEnchantementsCommand,          "", NULL },              { "item_loot_template",           SEC_ADMINISTRATOR, true,  &HandleReloadLootTemplatesItemCommand,          "", NULL }, -            { "item_set_names",               SEC_ADMINISTRATOR, true,  &HandleReloadItemSetNamesCommand,               "", NULL },              { "lfg_dungeon_rewards",          SEC_ADMINISTRATOR, true,  &HandleReloadLfgRewardsCommand,                 "", NULL },              { "locales_achievement_reward",   SEC_ADMINISTRATOR, true,  &HandleReloadLocalesAchievementRewardCommand,   "", NULL },              { "locales_creature",             SEC_ADMINISTRATOR, true,  &HandleReloadLocalesCreatureCommand,            "", NULL }, @@ -111,7 +106,6 @@ public:              { "locales_gameobject",           SEC_ADMINISTRATOR, true,  &HandleReloadLocalesGameobjectCommand,          "", NULL },              { "locales_gossip_menu_option",   SEC_ADMINISTRATOR, true,  &HandleReloadLocalesGossipMenuOptionCommand,    "", NULL },              { "locales_item",                 SEC_ADMINISTRATOR, true,  &HandleReloadLocalesItemCommand,                "", NULL }, -            { "locales_item_set_name",        SEC_ADMINISTRATOR, true,  &HandleReloadLocalesItemSetNameCommand,         "", NULL },              { "locales_npc_text",             SEC_ADMINISTRATOR, true,  &HandleReloadLocalesNpcTextCommand,             "", NULL },              { "locales_page_text",            SEC_ADMINISTRATOR, true,  &HandleReloadLocalesPageTextCommand,            "", NULL },              { "locales_points_of_interest",   SEC_ADMINISTRATOR, true,  &HandleReloadLocalesPointsOfInterestCommand,    "", NULL }, @@ -123,6 +117,7 @@ public:              { "npc_trainer",                  SEC_ADMINISTRATOR, true,  &HandleReloadNpcTrainerCommand,                 "", NULL },              { "npc_vendor",                   SEC_ADMINISTRATOR, true,  &HandleReloadNpcVendorCommand,                  "", NULL },              { "page_text",                    SEC_ADMINISTRATOR, true,  &HandleReloadPageTextsCommand,                  "", NULL }, +            { "phasedefinitions",             SEC_ADMINISTRATOR, true,  &HandleReloadPhaseDefinitionsCommand,           "", NULL },              { "pickpocketing_loot_template",  SEC_ADMINISTRATOR, true,  &HandleReloadLootTemplatesPickpocketingCommand, "", NULL},              { "points_of_interest",           SEC_ADMINISTRATOR, true,  &HandleReloadPointsOfInterestCommand,           "", NULL },              { "prospecting_loot_template",    SEC_ADMINISTRATOR, true,  &HandleReloadLootTemplatesProspectingCommand,   "", NULL }, @@ -180,7 +175,6 @@ public:          HandleReloadAllAchievementCommand(handler, "");          HandleReloadAllAreaCommand(handler, ""); -        HandleReloadAllEventAICommand(handler, "");          HandleReloadAllLootCommand(handler, "");          HandleReloadAllNpcCommand(handler, "");          HandleReloadAllQuestCommand(handler, ""); @@ -270,13 +264,6 @@ public:          return true;      } -    static bool HandleReloadAllEventAICommand(ChatHandler* handler, const char* /*args*/) -    { -        HandleReloadEventAITextsCommand(handler, "a"); -        HandleReloadEventAIScriptsCommand(handler, "a"); -        return true; -    } -      static bool HandleReloadAllSpellCommand(ChatHandler* handler, const char* /*args*/)      {          HandleReloadSkillDiscoveryTemplateCommand(handler, "a"); @@ -500,20 +487,21 @@ public:              cInfo->HoverHeight        = fields[68].GetFloat();              cInfo->ModHealth          = fields[69].GetFloat();              cInfo->ModMana            = fields[70].GetFloat(); -            cInfo->ModArmor           = fields[71].GetFloat(); -            cInfo->RacialLeader       = fields[72].GetBool(); -            cInfo->questItems[0]      = fields[73].GetUInt32(); -            cInfo->questItems[1]      = fields[74].GetUInt32(); -            cInfo->questItems[2]      = fields[75].GetUInt32(); -            cInfo->questItems[3]      = fields[76].GetUInt32(); -            cInfo->questItems[4]      = fields[77].GetUInt32(); -            cInfo->questItems[5]      = fields[78].GetUInt32(); -            cInfo->movementId         = fields[79].GetUInt32(); -            cInfo->RegenHealth        = fields[80].GetBool(); -            cInfo->equipmentId        = fields[81].GetUInt32(); -            cInfo->MechanicImmuneMask = fields[82].GetUInt32(); -            cInfo->flags_extra        = fields[83].GetUInt32(); -            cInfo->ScriptID           = sObjectMgr->GetScriptId(fields[84].GetCString()); +            cInfo->ModManaExtra       = fields[71].GetFloat(); +            cInfo->ModArmor           = fields[72].GetFloat(); +            cInfo->RacialLeader       = fields[73].GetBool(); +            cInfo->questItems[0]      = fields[74].GetUInt32(); +            cInfo->questItems[1]      = fields[75].GetUInt32(); +            cInfo->questItems[2]      = fields[76].GetUInt32(); +            cInfo->questItems[3]      = fields[77].GetUInt32(); +            cInfo->questItems[4]      = fields[78].GetUInt32(); +            cInfo->questItems[5]      = fields[79].GetUInt32(); +            cInfo->movementId         = fields[80].GetUInt32(); +            cInfo->RegenHealth        = fields[81].GetBool(); +            cInfo->equipmentId        = fields[82].GetUInt32(); +            cInfo->MechanicImmuneMask = fields[83].GetUInt32(); +            cInfo->flags_extra        = fields[84].GetUInt32(); +            cInfo->ScriptID           = sObjectMgr->GetScriptId(fields[85].GetCString());              sObjectMgr->CheckCreatureTemplate(cInfo);          } @@ -943,14 +931,6 @@ public:          return true;      } -    static bool HandleReloadItemSetNamesCommand(ChatHandler* handler, const char* /*args*/) -    { -        sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Item set names..."); -        sObjectMgr->LoadItemSetNames(); -        handler->SendGlobalGMSysMessage("DB table `item_set_names` reloaded."); -        return true; -    } -      static bool HandleReloadGameObjectScriptsCommand(ChatHandler* handler, const char* args)      {          if (sScriptMgr->IsScriptScheduled()) @@ -1024,23 +1004,6 @@ public:          return true;      } -    static bool HandleReloadEventAITextsCommand(ChatHandler* handler, const char* /*args*/) -    { - -        sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Texts from `creature_ai_texts`..."); -        sEventAIMgr->LoadCreatureEventAI_Texts(); -        handler->SendGlobalGMSysMessage("DB table `creature_ai_texts` reloaded."); -        return true; -    } - -    static bool HandleReloadEventAIScriptsCommand(ChatHandler* handler, const char* /*args*/) -    { -        sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Scripts from `creature_ai_scripts`..."); -        sEventAIMgr->LoadCreatureEventAI_Scripts(); -        handler->SendGlobalGMSysMessage("DB table `creature_ai_scripts` reloaded."); -        return true; -    } -      static bool HandleReloadSpellScriptsCommand(ChatHandler* handler, const char* args)      {          if (sScriptMgr->IsScriptScheduled()) @@ -1157,14 +1120,6 @@ public:          return true;      } -    static bool HandleReloadLocalesItemSetNameCommand(ChatHandler* handler, const char* /*args*/) -    { -        sLog->outInfo(LOG_FILTER_GENERAL, "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*/)      {          sLog->outInfo(LOG_FILTER_GENERAL, "Re-Loading Locales NPC Text ... "); @@ -1254,6 +1209,15 @@ public:          handler->SendGlobalGMSysMessage("Vehicle template accessories reloaded.");          return true;      } + +    static bool HandleReloadPhaseDefinitionsCommand(ChatHandler* handler, const char* /*args*/) +    { +        sLog->outInfo(LOG_FILTER_GENERAL, "Reloading phase_definitions table..."); +        sObjectMgr->LoadPhaseDefinitions(); +        sWorld->UpdatePhaseDefinitions(); +        handler->SendGlobalGMSysMessage("Phase Definitions reloaded."); +        return true; +    }  };  void AddSC_reload_commandscript() diff --git a/src/server/scripts/Commands/cs_reset.cpp b/src/server/scripts/Commands/cs_reset.cpp index 21a22381ae0..7b74678af81 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; @@ -238,7 +235,7 @@ public:          if (target)          { -            target->resetTalents(true); +            target->ResetTalents(true);              target->SendTalentsInfoData(false);              ChatHandler(target->GetSession()).SendSysMessage(LANG_RESET_TALENTS);              if (!handler->GetSession() || handler->GetSession()->GetPlayer() != target) diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp index c6e11c930fb..54adbacf028 100644 --- a/src/server/scripts/Commands/cs_titles.cpp +++ b/src/server/scripts/Commands/cs_titles.cpp @@ -96,7 +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, titleInfo->name[handler->GetSessionDbcLocale()], tNameLink.c_str()); +        handler->PSendSysMessage(LANG_TITLE_CURRENT_RES, id, titleInfo->name, tNameLink.c_str());          return true;      } @@ -139,7 +139,7 @@ public:          std::string tNameLink = handler->GetNameLink(target);          char titleNameStr[80]; -        snprintf(titleNameStr, 80, titleInfo->name[handler->GetSessionDbcLocale()], target->GetName().c_str()); +        snprintf(titleNameStr, 80, titleInfo->name, target->GetName().c_str());          target->SetTitle(titleInfo);          handler->PSendSysMessage(LANG_TITLE_ADD_RES, id, titleNameStr, tNameLink.c_str()); @@ -187,7 +187,7 @@ public:          std::string tNameLink = handler->GetNameLink(target);          char titleNameStr[80]; -        snprintf(titleNameStr, 80, titleInfo->name[handler->GetSessionDbcLocale()], target->GetName().c_str()); +        snprintf(titleNameStr, 80, titleInfo->name, 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 c0b2938c156..ee77c82c7c4 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -241,40 +241,44 @@ 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) -            { -                PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON); +            handler->PSendSysMessage("%s%s|r", "|cffff33ff", "Target does not have a loaded path."); +            return true; +        } -                stmt->setUInt32(0, guildLow); +        PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE_ADDON); -                WorldDatabase.Execute(stmt); +        stmt->setUInt32(0, guidLow); + +        WorldDatabase.Execute(stmt); -                target->UpdateWaypointID(0); +        target->UpdateWaypointID(0); -                stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE); +        stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_CREATURE_MOVEMENT_TYPE); -                stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE)); -                stmt->setUInt32(1, guildLow); +        stmt->setUInt8(0, uint8(IDLE_MOTION_TYPE)); +        stmt->setUInt32(1, guidLow); -                WorldDatabase.Execute(stmt); +        WorldDatabase.Execute(stmt); -                target->LoadPath(0); -                target->SetDefaultMovementType(IDLE_MOTION_TYPE); -                target->GetMotionMaster()->MoveTargetedHome(); -                target->GetMotionMaster()->Initialize(); -                target->MonsterSay("Path unloaded.", 0, 0); -                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->MonsterSay("Path unloaded.", 0, 0);          return true;      } @@ -690,7 +694,7 @@ public:                      }                      // re-create                      Creature* wpCreature2 = new Creature; -                    if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) +                    if (!wpCreature2->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, 0, 0, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation()))                      {                          handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);                          delete wpCreature2; @@ -698,7 +702,7 @@ public:                          return false;                      } -                    wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +                    wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());                      // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();                      //TODO: Should we first use "Create" then use "LoadFromDB"?                      if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetDBTableGUIDLow(), map)) @@ -914,7 +918,7 @@ public:                  float o = chr->GetOrientation();                  Creature* wpCreature = new Creature; -                if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) +                if (!wpCreature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))                  {                      handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);                      delete wpCreature; @@ -930,7 +934,7 @@ public:                  WorldDatabase.Execute(stmt); -                wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +                wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());                  // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();                  if (!wpCreature->LoadCreatureFromDB(wpCreature->GetDBTableGUIDLow(), map))                  { @@ -978,14 +982,14 @@ public:              Map* map = chr->GetMap();              Creature* creature = new Creature; -            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) +            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))              {                  handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id);                  delete creature;                  return false;              } -            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());              if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map))              {                  handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); @@ -1027,14 +1031,14 @@ public:              Map* map = chr->GetMap();              Creature* creature = new Creature; -            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o)) +            if (!creature->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMgr().GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))              {                  handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id);                  delete creature;                  return false;              } -            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); +            creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMgr().GetPhaseMaskForSpawn());              if (!creature->LoadCreatureFromDB(creature->GetDBTableGUIDLow(), map))              {                  handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index 5dc3b52dec1..3db2545e2c1 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -32,22 +32,17 @@ set(scripts_STAT_SRCS    EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp    EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp    EasternKingdoms/isle_of_queldanas.cpp -  EasternKingdoms/boss_kruul.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/wetlands.cpp    EasternKingdoms/arathi_highlands.cpp    EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index 2ff3dcd5e32..5422d3812f1 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -442,7 +442,7 @@ public:          {              me->SetVisible(false);              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -            me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); +            me->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);              me->SetSpeed(MOVE_WALK, 5.0f, true);              wp_reached = false;              count = 0; @@ -475,7 +475,7 @@ public:                          instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0);   //hide gameobject                      break;                  case 19: -                    me->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); +                    me->RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);                      break;                  case 20:                  { diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp index b32f9244034..4c724c1c1a1 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp @@ -254,7 +254,7 @@ public:          {              OrbsEmpowered = 0;              EmpowerCount = 0; -            me->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); +            me->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);              me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);              me->setActive(true); @@ -440,7 +440,7 @@ public:                      summoned->CastSpell(summoned, SPELL_SHADOW_CHANNELING, false);                      break;                  case CREATURE_ANVEENA: -                    summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); +                    summoned->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY);                      summoned->CastSpell(summoned, SPELL_ANVEENA_PRISON, true);                      summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);                      break; 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 c5639a68860..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_arlokk.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_Arlokk -SD%Complete: 95 -SDComment: Wrong cleave and red aura is missing. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum eYells -{ -    SAY_AGGRO                   = 0, -    SAY_FEAST_PANTHER           = 1, -    SAY_DEATH                   = 2, -}; - -enum eSpells -{ -    SPELL_SHADOWWORDPAIN        = 23952, -    SPELL_GOUGE                 = 24698, -    SPELL_MARK                  = 24210, -    SPELL_CLEAVE                = 26350,                    //Perhaps not right. Not a red aura... -    SPELL_PANTHER_TRANSFORM     = 24190, - -    MODEL_ID_NORMAL             = 15218, -    MODEL_ID_PANTHER            = 15215, -    MODEL_ID_BLANK              = 11686, - -    NPC_ZULIAN_PROWLER          = 15101 -}; - -class boss_arlokk : public CreatureScript -{ -    public: - -        boss_arlokk() -            : CreatureScript("boss_arlokk") -        { -        } - -        struct boss_arlokkAI : public ScriptedAI -        { -            boss_arlokkAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            InstanceScript* instance; - -            uint32 m_uiShadowWordPain_Timer; -            uint32 m_uiGouge_Timer; -            uint32 m_uiMark_Timer; -            uint32 m_uiCleave_Timer; -            uint32 m_uiVanish_Timer; -            uint32 m_uiVisible_Timer; - -            uint32 m_uiSummon_Timer; -            uint32 m_uiSummonCount; - -            Unit* m_pMarkedTarget; -            uint64 MarkedTargetGUID; - -            bool m_bIsPhaseTwo; -            bool m_bIsVanished; - -            void Reset() -            { -                m_uiShadowWordPain_Timer = 8000; -                m_uiGouge_Timer = 14000; -                m_uiMark_Timer = 35000; -                m_uiCleave_Timer = 4000; -                m_uiVanish_Timer = 60000; -                m_uiVisible_Timer = 6000; - -                m_uiSummon_Timer = 5000; -                m_uiSummonCount = 0; - -                m_bIsPhaseTwo = false; -                m_bIsVanished = false; - -                MarkedTargetGUID = 0; - -                me->SetDisplayId(MODEL_ID_NORMAL); -                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -            } - -            void EnterCombat(Unit* /*who*/) -            { -                Talk(SAY_AGGRO); -            } - -            void JustReachedHome() -            { -                if (instance) -                    instance->SetData(DATA_ARLOKK, NOT_STARTED); - -                //we should be summoned, so despawn -                me->DespawnOrUnsummon(); -            } - -            void JustDied(Unit* /*killer*/) -            { -                Talk(SAY_DEATH); - -                me->SetDisplayId(MODEL_ID_NORMAL); -                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - -                if (instance) -                    instance->SetData(DATA_ARLOKK, DONE); -            } - -            void DoSummonPhanters() -            { -                if (MarkedTargetGUID) -                    Talk(SAY_FEAST_PANTHER, MarkedTargetGUID); - -                me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.7998f, -1649.6734f, 41.4800f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                me->SummonCreature(NPC_ZULIAN_PROWLER, -11532.9970f, -1606.4840f, 41.2979f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -            } - -            void JustSummoned(Creature* summoned) -            { -                if (Unit* pMarkedTarget = Unit::GetUnit(*me, MarkedTargetGUID)) -                    summoned->AI()->AttackStart(pMarkedTarget); - -                ++m_uiSummonCount; -            } - -            void UpdateAI(const uint32 uiDiff) -            { -                if (!UpdateVictim()) -                    return; - -                if (!m_bIsPhaseTwo) -                { -                    if (m_uiShadowWordPain_Timer <= uiDiff) -                    { -                        DoCast(me->getVictim(), SPELL_SHADOWWORDPAIN); -                        m_uiShadowWordPain_Timer = 15000; -                    } -                    else -                        m_uiShadowWordPain_Timer -= uiDiff; - -                    if (m_uiMark_Timer <= uiDiff) -                    { -                        Unit* pMarkedTarget = SelectTarget(SELECT_TARGET_RANDOM, 0); - -                        if (pMarkedTarget) -                        { -                            DoCast(pMarkedTarget, SPELL_MARK); -                            MarkedTargetGUID = pMarkedTarget->GetGUID(); -                        } -                        else -                            sLog->outError(LOG_FILTER_TSCR, "boss_arlokk could not accuire pMarkedTarget."); - -                        m_uiMark_Timer = 15000; -                    } -                    else -                        m_uiMark_Timer -= uiDiff; -                } -                else -                { -                    //Cleave_Timer -                    if (m_uiCleave_Timer <= uiDiff) -                    { -                        DoCast(me->getVictim(), SPELL_CLEAVE); -                        m_uiCleave_Timer = 16000; -                    } -                    else -                        m_uiCleave_Timer -= uiDiff; - -                    //Gouge_Timer -                    if (m_uiGouge_Timer <= uiDiff) -                    { -                        DoCast(me->getVictim(), SPELL_GOUGE); - -                        DoModifyThreatPercent(me->getVictim(), -80); - -                        m_uiGouge_Timer = 17000+rand()%10000; -                    } -                    else -                        m_uiGouge_Timer -= uiDiff; -                } - -                if (m_uiSummonCount <= 30) -                { -                    if (m_uiSummon_Timer <= uiDiff) -                    { -                        DoSummonPhanters(); -                        m_uiSummon_Timer = 5000; -                    } -                    else -                        m_uiSummon_Timer -= uiDiff; -                } - -                if (m_uiVanish_Timer <= uiDiff) -                { -                    //Invisble Model -                    me->SetDisplayId(MODEL_ID_BLANK); -                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - -                    me->AttackStop(); -                    DoResetThreat(); - -                    m_bIsVanished = true; - -                    m_uiVanish_Timer = 45000; -                    m_uiVisible_Timer = 6000; -                } -                else -                    m_uiVanish_Timer -= uiDiff; - -                if (m_bIsVanished) -                { -                    if (m_uiVisible_Timer <= uiDiff) -                    { -                        //The Panther Model -                        me->SetDisplayId(MODEL_ID_PANTHER); -                        me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - -                        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); - -                        if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                            AttackStart(target); - -                        m_bIsPhaseTwo = true; -                        m_bIsVanished = false; -                    } -                    else -                        m_uiVisible_Timer -= uiDiff; -                } -                else -                    DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new boss_arlokkAI(creature); -        } -}; - -class go_gong_of_bethekk : public GameObjectScript -{ -    public: -        go_gong_of_bethekk() : GameObjectScript("go_gong_of_bethekk") -        { -        } - -        bool OnGossipHello(Player* /*player*/, GameObject* go) -        { -            if (InstanceScript* instance = go->GetInstanceScript()) -            { -                if (instance->GetData(DATA_ARLOKK) == DONE || instance->GetData(DATA_ARLOKK) == IN_PROGRESS) -                    return true; - -                instance->SetData(DATA_ARLOKK, IN_PROGRESS); -                return true; -            } - -            return true; -        } -}; - -void AddSC_boss_arlokk() -{ -    new boss_arlokk(); -    new go_gong_of_bethekk(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp deleted file mode 100644 index 5e553c7396f..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_Gahz'ranka -SD%Complete: 85 -SDComment: Massive Geyser with knockback not working. Spell buggy. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" - -#define SPELL_FROSTBREATH            16099 -#define SPELL_MASSIVEGEYSER          22421                  //Not working. Cause its a summon... -#define SPELL_SLAM                   24326 - -class boss_gahzranka : public CreatureScript -{ -    public: -        boss_gahzranka() : CreatureScript("boss_gahzranka") { } - -        struct boss_gahzrankaAI : public ScriptedAI -        { -            boss_gahzrankaAI(Creature* creature) : ScriptedAI(creature) { } -            uint32 Frostbreath_Timer; -            uint32 MassiveGeyser_Timer; -            uint32 Slam_Timer; - -            void Reset() -            { -                Frostbreath_Timer = 8000; -                MassiveGeyser_Timer = 25000; -                Slam_Timer = 17000; -            } - -            void EnterCombat(Unit* /*who*/) -            { -            } - -            void UpdateAI(const uint32 diff) -            { -                //Return since we have no target -                if (!UpdateVictim()) -                    return; - -                //Frostbreath_Timer -                if (Frostbreath_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_FROSTBREATH); -                    Frostbreath_Timer = urand(7000, 11000); -                } else Frostbreath_Timer -= diff; - -                //MassiveGeyser_Timer -                if (MassiveGeyser_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_MASSIVEGEYSER); -                    DoResetThreat(); - -                    MassiveGeyser_Timer = urand(22000, 32000); -                } else MassiveGeyser_Timer -= diff; - -                //Slam_Timer -                if (Slam_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_SLAM); -                    Slam_Timer = urand(12000, 20000); -                } else Slam_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new boss_gahzrankaAI(creature); -        } -}; - -void AddSC_boss_gahzranka() -{ -    new boss_gahzranka(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp index 8c71ea6d48d..f015f08f082 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_grilek.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2012 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,71 +15,65 @@   * 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" -#define SPELL_AVARTAR                24646                  //The Enrage Spell -#define SPELL_GROUNDTREMOR            6524 +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +};  class boss_grilek : public CreatureScript  {      public:          boss_grilek() : CreatureScript("boss_grilek") { } -        struct boss_grilekAI : public ScriptedAI +        struct boss_grilekAI : public BossAI          { -            boss_grilekAI(Creature* creature) : ScriptedAI(creature) { } - -            uint32 Avartar_Timer; -            uint32 GroundTremor_Timer; +            boss_grilekAI(Creature* creature) : BossAI(creature, DATA_GRILEK) +            { +            }              void Reset()              { -                Avartar_Timer = urand(15000, 25000); -                GroundTremor_Timer = urand(8000, 16000);              }              void EnterCombat(Unit* /*who*/)              {              } -            void UpdateAI(const uint32 diff) +            void JustDied(Unit* /*killer*/) +            { +            } + +            void UpdateAI(uint32 const diff)              { -                //Return since we have no target                  if (!UpdateVictim())                      return; -                //Avartar_Timer -                if (Avartar_Timer <= diff) -                { - -                    DoCast(me, SPELL_AVARTAR); -                    Unit* target = NULL; +                events.Update(diff); -                    target = SelectTarget(SELECT_TARGET_RANDOM, 1); - -                    if (DoGetThreat(me->getVictim())) -                        DoModifyThreatPercent(me->getVictim(), -50); -                    if (target) -                        AttackStart(target); - -                    Avartar_Timer = urand(25000, 35000); -                } else Avartar_Timer -= diff; - -                //GroundTremor_Timer -                if (GroundTremor_Timer <= diff) +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    DoCast(me->getVictim(), SPELL_GROUNDTREMOR); -                    GroundTremor_Timer = urand(12000, 16000); -                } else GroundTremor_Timer -= diff; +                    switch (eventId) +                    { +                        default: +                            break; +                    } +                } +                */                  DoMeleeAttackIfReady();              } @@ -96,4 +89,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 7d80de88beb..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hakkar.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_Hakkar -SD%Complete: 95 -SDComment: Blood siphon spell buggy cause of Core Issue. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Hakkar -{ -    SAY_AGGRO                   = 0, -    SAY_FLEEING                 = 1, -    SAY_MINION_DESTROY          = 2,                //where does it belong? -    SAY_PROTECT_ALTAR           = 3,                //where does it belong? - -    SPELL_BLOODSIPHON           = 24322, -    SPELL_CORRUPTEDBLOOD        = 24328, -    SPELL_CAUSEINSANITY         = 24327,                 //Not working disabled. -    SPELL_WILLOFHAKKAR          = 24178, -    SPELL_ENRAGE                = 24318, - -// The Aspects of all High Priests -    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 -}; - -class boss_hakkar : public CreatureScript -{ -    public: - -        boss_hakkar() -            : CreatureScript("boss_hakkar") -        { -        } - -        struct boss_hakkarAI : public ScriptedAI -        { -            boss_hakkarAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            InstanceScript* instance; - -            uint32 BloodSiphon_Timer; -            uint32 CorruptedBlood_Timer; -            uint32 CauseInsanity_Timer; -            uint32 WillOfHakkar_Timer; -            uint32 Enrage_Timer; - -            uint32 CheckJeklik_Timer; -            uint32 CheckVenoxis_Timer; -            uint32 CheckMarli_Timer; -            uint32 CheckThekal_Timer; -            uint32 CheckArlokk_Timer; - -            uint32 AspectOfJeklik_Timer; -            uint32 AspectOfVenoxis_Timer; -            uint32 AspectOfMarli_Timer; -            uint32 AspectOfThekal_Timer; -            uint32 AspectOfArlokk_Timer; - -            bool Enraged; - -            void Reset() -            { -                BloodSiphon_Timer = 90000; -                CorruptedBlood_Timer = 25000; -                CauseInsanity_Timer = 17000; -                WillOfHakkar_Timer = 17000; -                Enrage_Timer = 600000; - -                CheckJeklik_Timer = 1000; -                CheckVenoxis_Timer = 2000; -                CheckMarli_Timer = 3000; -                CheckThekal_Timer = 4000; -                CheckArlokk_Timer = 5000; - -                AspectOfJeklik_Timer = 4000; -                AspectOfVenoxis_Timer = 7000; -                AspectOfMarli_Timer = 12000; -                AspectOfThekal_Timer = 8000; -                AspectOfArlokk_Timer = 18000; - -                Enraged = false; -            } - -            void EnterCombat(Unit* /*who*/) -            { -                Talk(SAY_AGGRO); -            } - -            void UpdateAI(const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                //BloodSiphon_Timer -                if (BloodSiphon_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_BLOODSIPHON); -                    BloodSiphon_Timer = 90000; -                } else BloodSiphon_Timer -= diff; - -                //CorruptedBlood_Timer -                if (CorruptedBlood_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_CORRUPTEDBLOOD); -                    CorruptedBlood_Timer = urand(30000, 45000); -                } else CorruptedBlood_Timer -= diff; - -                //CauseInsanity_Timer -                /*if (CauseInsanity_Timer <= diff) -                { -                if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) -                DoCast(target, SPELL_CAUSEINSANITY); - -                CauseInsanity_Timer = urand(35000, 43000); -                } else CauseInsanity_Timer -= diff;*/ - -                //WillOfHakkar_Timer -                if (WillOfHakkar_Timer <= diff) -                { -                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                        DoCast(target, SPELL_WILLOFHAKKAR); - -                    WillOfHakkar_Timer = urand(25000, 35000); -                } else WillOfHakkar_Timer -= diff; - -                if (!Enraged && Enrage_Timer <= diff) -                { -                    DoCast(me, SPELL_ENRAGE); -                    Enraged = true; -                } else Enrage_Timer -= diff; - -                //Checking if Jeklik is dead. If not we cast her Aspect -                if (CheckJeklik_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_JEKLIK) != DONE) -                        { -                            if (AspectOfJeklik_Timer <= diff) -                            { -                                DoCast(me->getVictim(), SPELL_ASPECT_OF_JEKLIK); -                                AspectOfJeklik_Timer = urand(10000, 14000); -                            } else AspectOfJeklik_Timer -= diff; -                        } -                    } -                    CheckJeklik_Timer = 1000; -                } else CheckJeklik_Timer -= diff; - -                //Checking if Venoxis is dead. If not we cast his Aspect -                if (CheckVenoxis_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_VENOXIS) != DONE) -                        { -                            if (AspectOfVenoxis_Timer <= diff) -                            { -                                DoCast(me->getVictim(), SPELL_ASPECT_OF_VENOXIS); -                                AspectOfVenoxis_Timer = 8000; -                            } else AspectOfVenoxis_Timer -= diff; -                        } -                    } -                    CheckVenoxis_Timer = 1000; -                } else CheckVenoxis_Timer -= diff; - -                //Checking if Marli is dead. If not we cast her Aspect -                if (CheckMarli_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_MARLI) != DONE) -                        { -                            if (AspectOfMarli_Timer <= diff) -                            { -                                DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); -                                AspectOfMarli_Timer = 10000; -                            } else AspectOfMarli_Timer -= diff; - -                        } -                    } -                    CheckMarli_Timer = 1000; -                } else CheckMarli_Timer -= diff; - -                //Checking if Thekal is dead. If not we cast his Aspect -                if (CheckThekal_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_THEKAL) != DONE) -                        { -                            if (AspectOfThekal_Timer <= diff) -                            { -                                DoCast(me, SPELL_ASPECT_OF_THEKAL); -                                AspectOfThekal_Timer = 15000; -                            } else AspectOfThekal_Timer -= diff; -                        } -                    } -                    CheckThekal_Timer = 1000; -                } else CheckThekal_Timer -= diff; - -                //Checking if Arlokk is dead. If yes we cast her Aspect -                if (CheckArlokk_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_ARLOKK) != DONE) -                        { -                            if (AspectOfArlokk_Timer <= diff) -                            { -                                DoCast(me, SPELL_ASPECT_OF_ARLOKK); -                                DoResetThreat(); - -                                AspectOfArlokk_Timer = urand(10000, 15000); -                            } else AspectOfArlokk_Timer -= diff; -                        } -                    } -                    CheckArlokk_Timer = 1000; -                } else CheckArlokk_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new 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 bb3e0b14e0e..12bc4289a7d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_hazzarah.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2012 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,86 +15,65 @@   * 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" -#define SPELL_MANABURN         26046 -#define SPELL_SLEEP            24664 +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +};  class boss_hazzarah : public CreatureScript  {      public: +        boss_hazzarah() : CreatureScript("boss_hazzarah") { } -        boss_hazzarah() -            : CreatureScript("boss_hazzarah") -        { -        } - -        struct boss_hazzarahAI : public ScriptedAI +        struct boss_hazzarahAI : public BossAI          { -            boss_hazzarahAI(Creature* creature) : ScriptedAI(creature) {} - -            uint32 ManaBurn_Timer; -            uint32 Sleep_Timer; -            uint32 Illusions_Timer; +            boss_hazzarahAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH) +            { +            }              void Reset()              { -                ManaBurn_Timer = urand(4000, 10000); -                Sleep_Timer = urand(10000, 18000); -                Illusions_Timer = urand(10000, 18000);              }              void EnterCombat(Unit* /*who*/)              {              } -            void UpdateAI(const uint32 diff) +            void JustDied(Unit* /*killer*/) +            { +            } + +            void UpdateAI(uint32 const diff)              {                  if (!UpdateVictim())                      return; -                //ManaBurn_Timer -                if (ManaBurn_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_MANABURN); -                    ManaBurn_Timer = urand(8000, 16000); -                } else ManaBurn_Timer -= diff; - -                //Sleep_Timer -                if (Sleep_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_SLEEP); -                    Sleep_Timer = urand(12000, 20000); -                } else Sleep_Timer -= diff; +                events.Update(diff); -                //Illusions_Timer -                if (Illusions_Timer <= diff) +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    //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 -                    Unit* target = NULL; -                    for (uint8 i = 0; i < 3; ++i) +                    switch (eventId)                      { -                        target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                        if (!target) -                            return; - -                        Creature* Illusion = me->SummonCreature(15163, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000); -                        if (Illusion) -                            Illusion->AI()->AttackStart(target); +                        default: +                            break;                      } - -                    Illusions_Timer = urand(15000, 25000); -                } else Illusions_Timer -= diff; +                } +                */                  DoMeleeAttackIfReady();              } @@ -111,4 +89,3 @@ void AddSC_boss_hazzarah()  {      new boss_hazzarah();  } - 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 3a2da6fdba9..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jeklik.cpp +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_Jeklik -SD%Complete: 85 -SDComment: Problem in finding the right flying batriders for spawning and making them fly. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Jeklik -{ -    SAY_AGGRO                   = 0, -    SAY_RAIN_FIRE               = 1, -    SAY_DEATH                   = 2, - -    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... -}; - -class boss_jeklik : public CreatureScript -{ -    public: - -        boss_jeklik() -            : CreatureScript("boss_jeklik") -        { -        } - -        struct boss_jeklikAI : public ScriptedAI -        { -            boss_jeklikAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            InstanceScript* instance; - -            uint32 Charge_Timer; -            uint32 SonicBurst_Timer; -            uint32 Screech_Timer; -            uint32 SpawnBats_Timer; -            uint32 ShadowWordPain_Timer; -            uint32 MindFlay_Timer; -            uint32 ChainMindFlay_Timer; -            uint32 GreaterHeal_Timer; -            uint32 SpawnFlyingBats_Timer; - -            bool PhaseTwo; - -            void Reset() -            { -                Charge_Timer = 20000; -                SonicBurst_Timer = 8000; -                Screech_Timer = 13000; -                SpawnBats_Timer = 60000; -                ShadowWordPain_Timer = 6000; -                MindFlay_Timer = 11000; -                ChainMindFlay_Timer = 26000; -                GreaterHeal_Timer = 50000; -                SpawnFlyingBats_Timer = 10000; - -                PhaseTwo = false; -            } - -            void EnterCombat(Unit* /*who*/) -            { -                Talk(SAY_AGGRO); -                DoCast(me, SPELL_BAT_FORM); -            } - -            void JustDied(Unit* /*killer*/) -            { -                Talk(SAY_DEATH); - -                if (instance) -                    instance->SetData(DATA_JEKLIK, DONE); -            } - -            void UpdateAI(const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                if (me->getVictim() && me->isAlive()) -                { -                    if (HealthAbovePct(50)) -                    { -                        if (Charge_Timer <= diff) -                        { -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                            { -                                DoCast(target, SPELL_CHARGE); -                                AttackStart(target); -                            } - -                            Charge_Timer = urand(15000, 30000); -                        } else Charge_Timer -= diff; - -                        if (SonicBurst_Timer <= diff) -                        { -                            DoCast(me->getVictim(), SPELL_SONICBURST); -                            SonicBurst_Timer = urand(8000, 13000); -                        } else SonicBurst_Timer -= diff; - -                        if (Screech_Timer <= diff) -                        { -                            DoCast(me->getVictim(), SPELL_SCREECH); -                            Screech_Timer = urand(18000, 26000); -                        } else Screech_Timer -= diff; - -                        if (SpawnBats_Timer <= diff) -                        { -                            Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); - -                            Creature* Bat = NULL; -                            Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                            if (target && Bat) Bat ->AI()->AttackStart(target); - -                            Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                            if (target && Bat) Bat ->AI()->AttackStart(target); - -                            Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                            if (target && Bat) Bat ->AI()->AttackStart(target); - -                            Bat = me->SummonCreature(11368, -12291.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                            if (target && Bat) Bat ->AI()->AttackStart(target); - -                            Bat = me->SummonCreature(11368, -12289.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                            if (target && Bat) Bat ->AI()->AttackStart(target); -                            Bat = me->SummonCreature(11368, -12293.6220f, -1380.2640f, 144.8304f, 5.483f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                            if (target && Bat) Bat ->AI()->AttackStart(target); - -                            SpawnBats_Timer = 60000; -                        } else SpawnBats_Timer -= diff; -                    } -                    else -                    { -                        if (PhaseTwo) -                        { -                            if (PhaseTwo && ShadowWordPain_Timer <= diff) -                            { -                                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                                { -                                    DoCast(target, SPELL_SHADOW_WORD_PAIN); -                                    ShadowWordPain_Timer = urand(12000, 18000); -                                } -                            }ShadowWordPain_Timer -=diff; - -                            if (MindFlay_Timer <= diff) -                            { -                                DoCast(me->getVictim(), SPELL_MIND_FLAY); -                                MindFlay_Timer = 16000; -                            }MindFlay_Timer -=diff; - -                            if (ChainMindFlay_Timer <= diff) -                            { -                                me->InterruptNonMeleeSpells(false); -                                DoCast(me->getVictim(), SPELL_CHAIN_MIND_FLAY); -                                ChainMindFlay_Timer = urand(15000, 30000); -                            }ChainMindFlay_Timer -=diff; - -                            if (GreaterHeal_Timer <= diff) -                            { -                                me->InterruptNonMeleeSpells(false); -                                DoCast(me, SPELL_GREATERHEAL); -                                GreaterHeal_Timer = urand(25000, 35000); -                            }GreaterHeal_Timer -=diff; - -                            if (SpawnFlyingBats_Timer <= diff) -                            { -                                Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                                if (!target) -                                    return; - -                                Creature* FlyingBat = me->SummonCreature(14965, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()+15, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                                if (FlyingBat) -                                    FlyingBat->AI()->AttackStart(target); - -                                SpawnFlyingBats_Timer = urand(10000, 15000); -                            } else SpawnFlyingBats_Timer -=diff; -                        } -                        else -                        { -                            me->SetDisplayId(15219); -                            DoResetThreat(); -                            PhaseTwo = true; -                        } -                    } - -                    DoMeleeAttackIfReady(); -                } -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new boss_jeklikAI(creature); -        } -}; - -//Flying Bat -class mob_batrider : public CreatureScript -{ -    public: - -        mob_batrider() -            : CreatureScript("mob_batrider") -        { -        } - -        struct mob_batriderAI : public ScriptedAI -        { -            mob_batriderAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            InstanceScript* instance; - -            uint32 Bomb_Timer; -            uint32 Check_Timer; - -            void Reset() -            { -                Bomb_Timer = 2000; -                Check_Timer = 1000; - -                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -            } - -            void EnterCombat(Unit* /*who*/) {} - -            void UpdateAI (const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                //Bomb_Timer -                if (Bomb_Timer <= diff) -                { -                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                    { -                        DoCast(target, SPELL_BOMB); -                        Bomb_Timer = 5000; -                    } -                } else Bomb_Timer -= diff; - -                //Check_Timer -                if (Check_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_JEKLIK) == DONE) -                        { -                            me->setDeathState(JUST_DIED); -                            me->RemoveCorpse(); -                            return; -                        } -                    } - -                    Check_Timer = 1000; -                } else Check_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new mob_batriderAI(creature); -        } -}; - -void AddSC_boss_jeklik() -{ -    new boss_jeklik(); -    new mob_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 844a2b16800..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_Jin'do the Hexxer -SD%Complete: 85 -SDComment: Mind Control not working because of core bug. Shades visible for all. -SDCategory: Zul'Gurub -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "zulgurub.h" - -enum Jindo -{ -    SAY_AGGRO                       = 1, - -    SPELL_BRAINWASHTOTEM            = 24262, -    SPELL_POWERFULLHEALINGWARD      = 24309,               //We will not use this spell. We will summon a totem by script cause the spell totems will not cast. -    SPELL_HEX                       = 24053, -    SPELL_DELUSIONSOFJINDO          = 24306, -    SPELL_SHADEOFJINDO              = 24308,               //We will not use this spell. We will summon a shade by script. - -    //Healing Ward Spell -    SPELL_HEAL                      = 38588,               //Totems are not working right. Right heal spell ID is 24311 but this spell is not casting... - -    //Shade of Jindo Spell -    SPELL_SHADOWSHOCK               = 19460, -    SPELL_INVISIBLE                 = 24699 -}; - -class boss_jindo : public CreatureScript -{ -    public: - -        boss_jindo() -            : CreatureScript("boss_jindo") -        { -        } - -        struct boss_jindoAI : public ScriptedAI -        { -            boss_jindoAI(Creature* creature) : ScriptedAI(creature) {} - -            uint32 BrainWashTotem_Timer; -            uint32 HealingWard_Timer; -            uint32 Hex_Timer; -            uint32 Delusions_Timer; -            uint32 Teleport_Timer; - -            void Reset() -            { -                BrainWashTotem_Timer = 20000; -                HealingWard_Timer = 16000; -                Hex_Timer = 8000; -                Delusions_Timer = 10000; -                Teleport_Timer = 5000; -            } - -            void EnterCombat(Unit* /*who*/) -            { -                Talk(SAY_AGGRO); -            } - -            void UpdateAI(const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                //BrainWashTotem_Timer -                if (BrainWashTotem_Timer <= diff) -                { -                    DoCast(me, SPELL_BRAINWASHTOTEM); -                    BrainWashTotem_Timer = urand(18000, 26000); -                } else BrainWashTotem_Timer -= diff; - -                //HealingWard_Timer -                if (HealingWard_Timer <= diff) -                { -                    //DoCast(me, SPELL_POWERFULLHEALINGWARD); -                    me->SummonCreature(14987, me->GetPositionX()+3, me->GetPositionY()-2, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 30000); -                    HealingWard_Timer = urand(14000, 20000); -                } else HealingWard_Timer -= diff; - -                //Hex_Timer -                if (Hex_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_HEX); - -                    if (DoGetThreat(me->getVictim())) -                        DoModifyThreatPercent(me->getVictim(), -80); - -                    Hex_Timer = urand(12000, 20000); -                } else Hex_Timer -= diff; - -                //Casting the delusion curse with a shade. So shade will attack the same target with the curse. -                if (Delusions_Timer <= diff) -                { -                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                    { -                        DoCast(target, SPELL_DELUSIONSOFJINDO); - -                        Creature* Shade = me->SummonCreature(14986, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Shade) -                            Shade->AI()->AttackStart(target); -                    } - -                    Delusions_Timer = urand(4000, 12000); -                } else Delusions_Timer -= diff; - -                //Teleporting a random gamer and spawning 9 skeletons that will attack this gamer -                if (Teleport_Timer <= diff) -                { -                    Unit* target = NULL; -                    target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                    if (target && target->GetTypeId() == TYPEID_PLAYER) -                    { -                        DoTeleportPlayer(target, -11583.7783f, -1249.4278f, 77.5471f, 4.745f); - -                        if (DoGetThreat(me->getVictim())) -                            DoModifyThreatPercent(target, -100); - -                        Creature* Skeletons; -                        Skeletons = me->SummonCreature(14826, target->GetPositionX()+2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX()-2, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX()+4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX()-4, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-2, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()+4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX(), target->GetPositionY()-4, target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                        Skeletons = me->SummonCreature(14826, target->GetPositionX()+3, target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Skeletons) -                            Skeletons->AI()->AttackStart(target); -                    } - -                    Teleport_Timer = urand(15000, 23000); -                } else Teleport_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new boss_jindoAI(creature); -        } -}; - -//Healing Ward -class mob_healing_ward : public CreatureScript -{ -    public: - -        mob_healing_ward() -            : CreatureScript("mob_healing_ward") -        { -        } - -        struct mob_healing_wardAI : public ScriptedAI -        { -            mob_healing_wardAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            uint32 Heal_Timer; - -            InstanceScript* instance; - -            void Reset() -            { -                Heal_Timer = 2000; -            } - -            void EnterCombat(Unit* /*who*/) -            { -            } - -            void UpdateAI (const uint32 diff) -            { -                //Heal_Timer -                if (Heal_Timer <= diff) -                { -                    if (instance) -                    { -                        Unit* pJindo = Unit::GetUnit(*me, instance->GetData64(DATA_JINDO)); -                        if (pJindo) -                            DoCast(pJindo, SPELL_HEAL); -                    } -                    Heal_Timer = 3000; -                } else Heal_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new mob_healing_wardAI(creature); -        } -}; - -//Shade of Jindo -class mob_shade_of_jindo : public CreatureScript -{ -    public: - -        mob_shade_of_jindo() -            : CreatureScript("mob_shade_of_jindo") -        { -        } - -        struct mob_shade_of_jindoAI : public ScriptedAI -        { -            mob_shade_of_jindoAI(Creature* creature) : ScriptedAI(creature) {} - -            uint32 ShadowShock_Timer; - -            void Reset() -            { -                ShadowShock_Timer = 1000; -                DoCast(me, SPELL_INVISIBLE, true); -            } - -            void EnterCombat(Unit* /*who*/){} - -            void UpdateAI (const uint32 diff) -            { - -                //ShadowShock_Timer -                if (ShadowShock_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_SHADOWSHOCK); -                    ShadowShock_Timer = 2000; -                } else ShadowShock_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new mob_shade_of_jindoAI(creature); -        } -}; - -void AddSC_boss_jindo() -{ -    new boss_jindo(); -    new mob_healing_ward(); -    new mob_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..bcf742fcf32 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2008-2012 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() +            { +                _Reset(); +            } + +            void EnterCombat(Unit* /*who*/) +            { +                _EnterCombat(); +                Talk(SAY_AGGRO); +            } + +            void JustDied(Unit* /*killer*/) +            { +            } + +            void UpdateAI(uint32 const diff) +            { +                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 +        { +            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_kilnara.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp new file mode 100644 index 00000000000..f582edd54db --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2008-2012 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 "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 +{ +}; + +enum Events +{ +}; + +class boss_kilnara : public CreatureScript +{ +    public: +        boss_kilnara() : CreatureScript("boss_kilnara") { } + +        struct boss_kilnaraAI : public BossAI +        { +            boss_kilnaraAI(Creature* creature) : BossAI(creature, DATA_KILNARA) { } + +            void Reset() +            { +                _Reset(); +            } + +            void EnterCombat(Unit* /*who*/) +            { +                _EnterCombat(); +                Talk(SAY_AGGRO); +            } + +            void JustDied(Unit* /*killer*/) +            { +                _JustDied(); +                Talk(SAY_DEATH); +            } + +            void KilledUnit(Unit* victim) +            { +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL); +            } + +            void UpdateAI(uint32 const diff) +            { +                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 +        { +            return GetZulGurubAI<boss_kilnaraAI>(creature); +        } +}; + +void AddSC_boss_kilnara() +{ +    new boss_kilnara(); +} diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index 9f3aa315efa..8d9ccd7bdfc 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2012 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,351 +15,771 @@   * 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 "SpellScript.h" +#include "SpellAuraEffects.h" +#include "Player.h"  #include "zulgurub.h" -enum Mandokir +enum Yells +{ +    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 +{ +    // 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 +{ +    // 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 Action  { -    SAY_AGGRO               = 0, -    SAY_DING_KILL           = 1, -    SAY_WATCH               = 2, -    SAY_WATCH_WHISPER       = 3,                    //is this text for real? easter egg? -    SAY_GRATS_JINDO         = 0, - -    SPELL_CHARGE            = 24408, -    SPELL_CLEAVE            = 7160, -    SPELL_FEAR              = 29321, -    SPELL_WHIRLWIND         = 15589, -    SPELL_MORTAL_STRIKE     = 16856, -    SPELL_ENRAGE            = 24318, -    SPELL_WATCH             = 24314, -    SPELL_LEVEL_UP          = 24312, - -//Ohgans Spells -    SPELL_SUNDERARMOR       = 24317, - -    NPC_SPEAKER             = 11391 +    // Bloodlord Mandokir +    ACTION_OHGAN_IS_DEATH       = 1, +    ACTION_START_REVIVE         = 2, + +    // Chained Spirit +    ACTION_REVIVE               = 1 +}; + +enum Misc +{ +    POINT_START_REVIVE          = 1, + +    DATA_OHGANOT_SO_FAST        = 5762, + +    FACTION_NONE                = 1665 +}; + +// ToDo: Need better respawn support +Position const ChainedSpiritsSpawnPos[8] = +{ +    { -12330.34f, -1878.406f, 127.3196f, 3.892084f   }, +    { -12351.94f, -1861.51f,  127.4807f, 4.677482f   }, +    { -12326.71f, -1904.328f, 127.4111f, 2.75762f    }, +    { -12347.41f, -1917.535f, 127.3196f, 1.553343f   }, +    { -12378.57f, -1861.222f, 127.5416f, 5.340707f   }, +    { -12397.79f, -1887.731f, 127.5453f, 0.03490658f }, +    { -12372.36f, -1918.844f, 127.343f,  1.151917f   }, +    { -12391.23f, -1905.273f, 127.3196f, 0.6108652f  }  };  class boss_mandokir : public CreatureScript  {      public: -        boss_mandokir() -            : CreatureScript("boss_mandokir") -        { -        } +        boss_mandokir() : CreatureScript("boss_mandokir") { } -        struct boss_mandokirAI : public ScriptedAI +        struct boss_mandokirAI : public BossAI          { -            boss_mandokirAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } +            boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { } -            uint32 KillCount; -            uint32 Watch_Timer; -            uint32 TargetInRange; -            uint32 Cleave_Timer; -            uint32 Whirlwind_Timer; -            uint32 Fear_Timer; -            uint32 MortalStrike_Timer; -            uint32 Check_Timer; -            float targetX; -            float targetY; -            float targetZ; +            void Reset() +            { +                DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); -            InstanceScript* instance; +                _Reset(); -            bool endWatch; -            bool someWatched; -            bool RaptorDead; -            bool CombatStart; -            bool SpeakerDead; +                for (uint8 i = 0; i < 8; ++i) +                    me->SummonCreature(NPC_CHAINED_SPIRIT, ChainedSpiritsSpawnPos[i]); -            uint64 WatchTarget; +                _ohganotSoFast = true; +                _reanimateOhganCooldown = false; +                _reviveGUID = 0; +            } -            void Reset() +            void EnterCombat(Unit* /*who*/)              { -                KillCount = 0; -                Watch_Timer = 33000; -                Cleave_Timer = 7000; -                Whirlwind_Timer = 20000; -                Fear_Timer = 1000; -                MortalStrike_Timer = 1000; -                Check_Timer = 1000; +                _EnterCombat(); +                Talk(SAY_AGGRO); -                targetX = 0.0f; -                targetY = 0.0f; -                targetZ = 0.0f; -                TargetInRange = 0; +                DoCastAOE(SPELL_BLOODLORD_AURA); -                WatchTarget = 0; +                if (!summons.empty()) +                { +                    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); +                    } +                } -                someWatched = false; -                endWatch = false; -                RaptorDead = false; -                CombatStart = false; -                SpeakerDead = false; +                events.ScheduleEvent(EVENT_DECAPITATE, 10000); +                events.ScheduleEvent(EVENT_BLOODLETTING, 15000); +                events.ScheduleEvent(EVENT_SUMMON_OHGAN, 20000); +                events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 25000); +            } -                DoCast(me, 23243); +            void JustDied(Unit* /*killer*/) +            { +                DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); +                _JustDied(); +                Talk(SAY_DEATH);              }              void KilledUnit(Unit* victim)              {                  if (victim->GetTypeId() == TYPEID_PLAYER)                  { -                    ++KillCount; +                    Talk(SAY_PLAYER_KILL); +                    DoCast(SPELL_LEVEL_UP); +                    _reviveGUID = victim->GetGUID(); +                    DoAction(ACTION_START_REVIVE); +                } +            } -                    if (KillCount == 3) -                    { -                        Talk(SAY_DING_KILL); +            void DamageTaken(Unit* /*attacker*/, uint32& damage) +            { +                if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY)) +                { +                    DoCast(me, SPELL_FRENZY, true); +                    Talk(SAY_FRENZY); +                    Talk(EMOTE_FRENZY); +                } +            } -                        if (instance) +            void DoAction(int32 const action) +            { +                switch (action) +                { +                    case ACTION_OHGAN_IS_DEATH: +                        events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 4000); +                        _ohganotSoFast = false; +                        break; +                    case ACTION_START_REVIVE: +                    { +                        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)                          { -                            uint64 JindoGUID = instance->GetData64(DATA_JINDO); -                            if (JindoGUID) +                            if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, (*itr)->GetGUID()))                              { -                                if (Creature* jTemp = Creature::GetCreature(*me, JindoGUID)) -                                { -                                    if (jTemp->isAlive()) -                                        jTemp->AI()->Talk(SAY_GRATS_JINDO); -                                } +                                chainedSpirit->AI()->SetGUID(_reviveGUID); +                                chainedSpirit->AI()->DoAction(ACTION_REVIVE); +                                _reviveGUID = 0;                              }                          } -                        DoCast(me, SPELL_LEVEL_UP, true); -                        KillCount = 0; +                        break;                      } +                    default: +                        break; +                  }              } -            void EnterCombat(Unit* /*who*/) +            uint32 GetData(uint32 type) const              { -                Talk(SAY_AGGRO); +                if (type == DATA_OHGANOT_SO_FAST) +                    return _ohganotSoFast; + +                return 0;              } -            void UpdateAI(const uint32 diff) +            void SetGUID(uint64 guid, int32 type/* = 0 */)              { -                if (!SpeakerDead) +                _reviveGUID = guid; +            } + +            void UpdateAI(uint32 const diff) +            { +                if (!UpdateVictim()) +                    return; + +                events.Update(diff); + +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; + +                while (uint32 eventId = events.ExecuteEvent())                  { -                    if (!me->FindNearestCreature(NPC_SPEAKER, 100.0f, true)) +                    switch (eventId)                      { -                        me->GetMotionMaster()->MovePoint(0, -12196.3f, -1948.37f, 130.36f); -                        SpeakerDead = true; +                        case EVENT_SUMMON_OHGAN: +                            me->SetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID, 0); +                            DoCast(me, SPELL_SUMMON_OHGAN, true); +                            break; +                        case EVENT_DECAPITATE: +                            DoCastAOE(SPELL_DECAPITATE); +                            events.ScheduleEvent(EVENT_DECAPITATE, me->HasAura(SPELL_FRENZY) ? 17500 : 35000); +                            break; +                        case EVENT_BLOODLETTING: +                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true)) +                            { +                                DoCast(target, SPELL_BLOODLETTING, true); +                                me->ClearUnitState(UNIT_STATE_CASTING); +                            } +                            events.ScheduleEvent(EVENT_BLOODLETTING, 25000); +                            break; +                        case EVENT_REANIMATE_OHGAN: +                            if (_reanimateOhganCooldown) +                                events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 1000); +                            else +                            { +                                DoCastAOE(SPELL_REANIMATE_OHGAN); +                                Talk(SAY_REANIMATE_OHGAN); +                                // Cooldown +                                _reanimateOhganCooldown = true; +                                events.ScheduleEvent(EVENT_REANIMATE_OHGAN_COOLDOWN, 20000); +                            } +                            break; +                        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;                      }                  } -                if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE && SpeakerDead) -                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); +                DoMeleeAttackIfReady(); +            } + +        private: +            bool _ohganotSoFast; +            bool _reanimateOhganCooldown; +            uint64 _reviveGUID; +        }; +        CreatureAI* GetAI(Creature* creature) const +        { +            return GetZulGurubAI<boss_mandokirAI>(creature); +        } +}; + +class npc_ohgan : public CreatureScript +{ +    public: +        npc_ohgan() : CreatureScript("npc_ohgan") { } + +        struct npc_ohganAI : public ScriptedAI +        { +            npc_ohganAI(Creature* creature) : ScriptedAI(creature) +            { +                _instance = me->GetInstanceScript(); +            } + +            void EnterCombat(Unit* /*who*/) +            { +                DoCastAOE(SPELL_OHGAN_ORDERS, true); +            } + +            void DamageTaken(Unit* /*attacker*/, uint32& damage) +            { +                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) +            { +                if (Creature* creature = victim->ToCreature()) +                { +                    if (creature->GetEntry() == NPC_CHAINED_SPIRIT) +                        DoCastAOE(SPELL_OHGAN_ORDERS, true); +                } +            } + +            void UpdateAI(uint32 const diff) +            {                  if (!UpdateVictim())                      return; -                if (me->getVictim() && me->isAlive()) -                { -                    if (!CombatStart) -                    { -                        //At combat Start Mandokir is mounted so we must unmount it first -                        me->Dismount(); +                DoMeleeAttackIfReady(); +            } -                        //And summon his raptor -                        me->SummonCreature(14988, me->getVictim()->GetPositionX(), me->getVictim()->GetPositionY(), me->getVictim()->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35000); -                        CombatStart = true; -                    } +        private: +            InstanceScript* _instance; +        }; -                    if (Watch_Timer <= diff)                         //Every 20 Sec Mandokir will check this -                    { -                        if (WatchTarget)                             //If someone is watched and If the Position of the watched target is different from the one stored, or are attacking, mandokir will charge him -                        { -                            Unit* unit = Unit::GetUnit(*me, WatchTarget); +        CreatureAI* GetAI(Creature* creature) const +        { +            return GetZulGurubAI<npc_ohganAI>(creature); +        } +}; -                            if (unit && ( -                                targetX != unit->GetPositionX() || -                                targetY != unit->GetPositionY() || -                                targetZ != unit->GetPositionZ() || -                                unit->isInCombat())) -                            { -                                if (me->IsWithinMeleeRange(unit)) -                                { -                                    DoCast(unit, 24316); -                                } -                                else -                                { -                                    DoCast(unit, SPELL_CHARGE); -                                    //me->SendMonsterMove(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), 0, true, 1); -                                    AttackStart(unit); -                                } -                            } -                        } -                        someWatched = false; -                        Watch_Timer = 20000; -                    } else Watch_Timer -= diff; +class npc_chained_spirit : public CreatureScript +{ +    public: +        npc_chained_spirit() : CreatureScript("npc_chained_spirit") { } -                    if ((Watch_Timer < 8000) && !someWatched)       //8 sec(cast time + expire time) before the check for the watch effect mandokir will cast watch debuff on a random target -                    { -                        if (Unit* p = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                        { -                            Talk(SAY_WATCH, p->GetGUID()); -                            DoCast(p, SPELL_WATCH); -                            WatchTarget = p->GetGUID(); -                            someWatched = true; -                            endWatch = true; -                        } -                    } +        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() +            { +                _revivePlayerGUID = 0; +            } -                    if ((Watch_Timer < 1000) && endWatch)           //1 sec before the debuf expire, store the target position +            void SetGUID(uint64 guid, int32 type/* = 0 */) +            { +                _revivePlayerGUID = guid; +            } + +            void DoAction(int32 const action) +            { +                if (action == ACTION_REVIVE) +                { +                    Position pos; +                    if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID))                      { -                        Unit* unit = Unit::GetUnit(*me, WatchTarget); -                        if (unit) -                        { -                            targetX = unit->GetPositionX(); -                            targetY = unit->GetPositionY(); -                            targetZ = unit->GetPositionZ(); -                        } -                        endWatch = false; +                        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);                      } +                } +            } -                    if (!someWatched) -                    { -                        //Cleave -                        if (Cleave_Timer <= diff) -                        { -                            DoCast(me->getVictim(), SPELL_CLEAVE); -                            Cleave_Timer = 7000; -                        } else Cleave_Timer -= diff; +            void MovementInform(uint32 type, uint32 pointId) +            { +                if (type != POINT_MOTION_TYPE || !_revivePlayerGUID) +                    return; -                        //Whirlwind -                        if (Whirlwind_Timer <= diff) -                        { -                            DoCast(me, SPELL_WHIRLWIND); -                            Whirlwind_Timer = 18000; -                        } else Whirlwind_Timer -= diff; +                if (pointId == POINT_START_REVIVE) +                { +                    if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) +                        DoCast(target, SPELL_REVIVE); -                        //If more then 3 targets in melee range mandokir will cast fear -                        if (Fear_Timer <= diff) -                        { -                            TargetInRange = 0; +                    me->DespawnOrUnsummon(2000); +                } +            } -                            std::list<HostileReference*>::const_iterator i = me->getThreatManager().getThreatList().begin(); -                            for (; i != me->getThreatManager().getThreatList().end(); ++i) -                            { -                                Unit* unit = Unit::GetUnit(*me, (*i)->getUnitGuid()); -                                if (unit && me->IsWithinMeleeRange(unit)) -                                    ++TargetInRange; -                            } +            void JustDied(Unit* /*killer*/) +            { +                Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID); +                if (!target || target->isAlive()) +                    return; -                            if (TargetInRange > 3) -                                DoCast(me->getVictim(), SPELL_FEAR); +                if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_MANDOKIR))) +                { +                    mandokir->GetAI()->SetGUID(target->GetGUID()); +                    mandokir->GetAI()->DoAction(ACTION_START_REVIVE); +                } -                            Fear_Timer = 4000; -                        } else Fear_Timer -=diff; +                me->DespawnOrUnsummon(); +            } -                        //Mortal Strike if target below 50% hp -                        if (me->getVictim() && me->getVictim()->HealthBelowPct(50)) -                        { -                            if (MortalStrike_Timer <= diff) -                            { -                                DoCast(me->getVictim(), SPELL_MORTAL_STRIKE); -                                MortalStrike_Timer = 15000; -                            } else MortalStrike_Timer -= diff; -                        } -                    } -                    //Checking if Ohgan is dead. If yes Mandokir will enrage. -                    if (Check_Timer <= diff) -                    { -                        if (instance) -                        { -                            if (instance->GetData(DATA_OHGAN) == DONE) -                            { -                                if (!RaptorDead) -                                { -                                    DoCast(me, SPELL_ENRAGE); -                                    RaptorDead = true; -                                } -                            } -                        } +            void UpdateAI(uint32 const /*diff*/) { } -                        Check_Timer = 1000; -                    } else Check_Timer -= diff; +        private: +            InstanceScript* _instance; +            uint64 _revivePlayerGUID; +        }; -                    DoMeleeAttackIfReady(); -                } +        CreatureAI* GetAI(Creature* creature) const +        { +            return GetZulGurubAI<npc_chained_spiritAI>(creature); +        } +}; + +class spell_mandokir_decapitate : public SpellScriptLoader +{ +    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() +            { +                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);              }          }; -        CreatureAI* GetAI(Creature* creature) const +        SpellScript* GetSpellScript() const          { -            return new boss_mandokirAI(creature); +            return new spell_mandokir_decapitate_SpellScript();          }  }; -//Ohgan -class mob_ohgan : public CreatureScript +class spell_mandokir_bloodletting : public SpellScriptLoader  {      public: +        spell_mandokir_bloodletting() : SpellScriptLoader("spell_mandokir_bloodletting") { } + +        class spell_mandokir_bloodletting_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_mandokir_bloodletting_AuraScript); + +            bool Validate(SpellInfo const* /*spell*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_DAMAGE)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_BLOODLETTING_HEAL)) +                    return false; +                return true; +            } + +            void HandleEffectPeriodic(AuraEffect const* aurEff) +            { +                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 Register() +            { +                OnEffectPeriodic += AuraEffectPeriodicFn(spell_mandokir_bloodletting_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); +            } +        }; -        mob_ohgan() -            : CreatureScript("mob_ohgan") +        AuraScript* GetAuraScript() const          { +            return new spell_mandokir_bloodletting_AuraScript();          } +}; + +class spell_mandokir_spirit_vengeance_cancel : public SpellScriptLoader +{ +    public: +        spell_mandokir_spirit_vengeance_cancel() : SpellScriptLoader("spell_mandokir_spirit_vengeance_cancel") { } -        struct mob_ohganAI : public ScriptedAI +        class spell_mandokir_spirit_vengeance_cancel_SpellScript : public SpellScript          { -            mob_ohganAI(Creature* creature) : ScriptedAI(creature) +            PrepareSpellScript(spell_mandokir_spirit_vengeance_cancel_SpellScript); + +            void HandleScript(SpellEffIndex /*effIndex*/)              { -                instance = creature->GetInstanceScript(); +                if (Player* target = GetHitPlayer()) +                    target->RemoveAura(uint32(GetEffectValue()));              } -            uint32 SunderArmor_Timer; -            InstanceScript* instance; +            void Register() +            { +                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); +            } +        }; -            void Reset() +        SpellScript* GetSpellScript() const +        { +            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)              { -                SunderArmor_Timer = 5000; +                targets.remove_if(DevastatingSlamTargetSelector(GetCaster()->ToCreature(), GetCaster()->getVictim())); +                if (targets.empty()) +                    return; + +                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +                targets.clear(); +                targets.push_back(target);              } -            void EnterCombat(Unit* /*who*/) {} +            void HandleScript(SpellEffIndex /*effIndex*/) +            { +                Unit* caster = GetCaster(); +                float angle = 0.0f; +                float x, y, z; -            void JustDied(Unit* /*killer*/) +                if (Player* target = GetHitPlayer()) +                { +                    caster->AttackStop(); +                    caster->SetOrientation(caster->GetAngle(target)); +                    caster->SetFacingTo(caster->GetAngle(target)); + +                    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); +                    } +                } +            } + +            void Register()              { -                if (instance) -                    instance->SetData(DATA_OHGAN, DONE); +                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);              } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_mandokir_devastating_slam_SpellScript(); +        } +}; + +class spell_mandokir_ohgan_orders : public SpellScriptLoader +{ +    public: +        spell_mandokir_ohgan_orders() : SpellScriptLoader("spell_mandokir_ohgan_orders") { } + +        class spell_mandokir_ohgan_orders_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_mandokir_ohgan_orders_SpellScript); -            void UpdateAI (const uint32 diff) +            void FilterTargets(std::list<WorldObject*>& targets)              { -                //Return since we have no target -                if (!UpdateVictim()) +                if (targets.empty())                      return; -                //SunderArmor_Timer -                if (SunderArmor_Timer <= diff) +                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() +            { +                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 +        { +            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())                  { -                    DoCast(me->getVictim(), SPELL_SUNDERARMOR); -                    SunderArmor_Timer = urand(10000, 15000); -                } else SunderArmor_Timer -= diff; +                    // HACK: research better way +                    caster->ClearUnitState(UNIT_STATE_CASTING); +                    caster->GetMotionMaster()->Clear(); +                    caster->DeleteThreatList(); +                    caster->AddThreat(target, 50000000.0f); +                    caster->TauntApply(target); +                } +            } -                DoMeleeAttackIfReady(); +            void Register() +            { +                AfterEffectApply += AuraEffectApplyFn(spell_mandokir_ohgan_orders_trigger_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);              }          }; -        CreatureAI* GetAI(Creature* creature) const +        AuraScript* GetAuraScript() const          { -            return new mob_ohganAI(creature); +            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*/) +            { +                Unit* caster = GetCaster(); +                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() +            { +                OnEffectHitTarget += SpellEffectFn(spell_mandokir_reanimate_ohgan_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            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() +            { +                OnEffectHitTarget += SpellEffectFn(spell_clear_all_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            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 mob_ohgan(); +    new npc_ohgan(); +    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 17b268b92ef..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2008-2012 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 Marli -{ -    SAY_AGGRO               = 0, -    SAY_TRANSFORM           = 1, -    SAY_SPIDER_SPAWN        = 2, -    SAY_DEATH               = 3, - -    SPELL_CHARGE            = 22911, -    SPELL_ASPECT_OF_MARLI   = 24686,                     // A stun spell -    SPELL_ENVOLWINGWEB      = 24110, -    SPELL_POISONVOLLEY      = 24099, -    SPELL_SPIDER_FORM       = 24084, - -//The Spider Spells -    SPELL_LEVELUP           = 24312                     //Not right Spell. -}; - -class boss_marli : public CreatureScript -{ -    public: - -        boss_marli() -            : CreatureScript("boss_marli") -        { -        } - -        struct boss_marliAI : public ScriptedAI -        { -            boss_marliAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            InstanceScript* instance; - -            uint32 SpawnStartSpiders_Timer; -            uint32 PoisonVolley_Timer; -            uint32 SpawnSpider_Timer; -            uint32 Charge_Timer; -            uint32 Aspect_Timer; -            uint32 Transform_Timer; -            uint32 TransformBack_Timer; - -            bool Spawned; -            bool PhaseTwo; - -            void Reset() -            { -                SpawnStartSpiders_Timer = 1000; -                PoisonVolley_Timer = 15000; -                SpawnSpider_Timer = 30000; -                Charge_Timer = 1500; -                Aspect_Timer = 12000; -                Transform_Timer = 45000; -                TransformBack_Timer = 25000; - -                Spawned = false; -                PhaseTwo = false; -            } - -            void EnterCombat(Unit* /*who*/) -            { -                Talk(SAY_AGGRO); -            } - -            void JustDied(Unit* /*killer*/) -            { -                Talk(SAY_DEATH); -                if (instance) -                    instance->SetData(DATA_MARLI, DONE); -            } - -            void UpdateAI(const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                if (me->getVictim() && me->isAlive()) -                { -                    if (PoisonVolley_Timer <= diff) -                    { -                        DoCast(me->getVictim(), SPELL_POISONVOLLEY); -                        PoisonVolley_Timer = urand(10000, 20000); -                    } else PoisonVolley_Timer -= diff; - -                    if (!PhaseTwo && Aspect_Timer <= diff) -                    { -                        DoCast(me->getVictim(), SPELL_ASPECT_OF_MARLI); -                        Aspect_Timer = urand(13000, 18000); -                    } else Aspect_Timer -= diff; - -                    if (!Spawned && SpawnStartSpiders_Timer <= diff) -                    { -                        Talk(SAY_SPIDER_SPAWN); - -                        Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                        if (!target) -                            return; - -                        Creature* Spider = NULL; - -                        Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Spider) -                            Spider->AI()->AttackStart(target); -                        Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Spider) -                            Spider->AI()->AttackStart(target); -                        Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Spider) -                            Spider->AI()->AttackStart(target); -                        Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Spider) -                            Spider->AI()->AttackStart(target); - -                        Spawned = true; -                    } else SpawnStartSpiders_Timer -= diff; - -                    if (SpawnSpider_Timer <= diff) -                    { -                        Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                        if (!target) -                            return; - -                        Creature* Spider = me->SummonCreature(15041, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000); -                        if (Spider) -                            Spider->AI()->AttackStart(target); -                        SpawnSpider_Timer = urand(12000, 17000); -                    } else SpawnSpider_Timer -= diff; - -                    if (!PhaseTwo && Transform_Timer <= diff) -                    { -                        Talk(SAY_TRANSFORM); -                        DoCast(me, SPELL_SPIDER_FORM); -                        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); -                        DoCast(me->getVictim(), SPELL_ENVOLWINGWEB); - -                        if (DoGetThreat(me->getVictim())) -                            DoModifyThreatPercent(me->getVictim(), -100); - -                        PhaseTwo = true; -                        Transform_Timer = urand(35000, 60000); -                    } else Transform_Timer -= diff; - -                    if (PhaseTwo) -                    { -                        if (Charge_Timer <= diff) -                        { -                            Unit* target = NULL; -                            int i = 0; -                            while (i < 3)                           // max 3 tries to get a random target with power_mana -                            { -                                ++i; -                                target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);  // not aggro leader -                                if (target && target->getPowerType() == POWER_MANA) -                                        i = 3; -                            } -                            if (target) -                            { -                                DoCast(target, SPELL_CHARGE); -                                //me->SetPosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0); -                                //me->SendMonsterMove(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, true, 1); -                                AttackStart(target); -                            } - -                            Charge_Timer = 8000; -                        } else Charge_Timer -= diff; - -                        if (TransformBack_Timer <= diff) -                        { -                            me->SetDisplayId(15220); -                            const CreatureTemplate* 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); - -                            PhaseTwo = false; -                            TransformBack_Timer = urand(25000, 40000); -                        } else TransformBack_Timer -= diff; - -                    } - -                    DoMeleeAttackIfReady(); -                } -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new boss_marliAI(creature); -        } -}; - -//Spawn of Marli -class mob_spawn_of_marli : public CreatureScript -{ -    public: - -        mob_spawn_of_marli() -            : CreatureScript("mob_spawn_of_marli") -        { -        } - -        struct mob_spawn_of_marliAI : public ScriptedAI -        { -            mob_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) {} - -            uint32 LevelUp_Timer; - -            void Reset() -            { -                LevelUp_Timer = 3000; -            } - -            void EnterCombat(Unit* /*who*/) -            { -            } - -            void UpdateAI (const uint32 diff) -            { -                //Return since we have no target -                if (!UpdateVictim()) -                    return; - -                //LevelUp_Timer -                if (LevelUp_Timer <= diff) -                { -                    DoCast(me, SPELL_LEVELUP); -                    LevelUp_Timer = 3000; -                } else LevelUp_Timer -= diff; - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new mob_spawn_of_marliAI(creature); -        } -}; - -void AddSC_boss_marli() -{ -    new boss_marli(); -    new mob_spawn_of_marli(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index 32a8f209917..4b4cfa1bd45 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2012 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,135 +15,65 @@   * 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" -#define SPELL_AMBUSH            24337 -#define SPELL_THOUSANDBLADES    24649 +enum Yells +{ +}; -#define EQUIP_ID_MAIN_HAND      0           //was item display id 31818, but this id does not exist +enum Spells +{ +}; + +enum Events +{ +};  class boss_renataki : public CreatureScript  {      public: +        boss_renataki() : CreatureScript("boss_renataki") { } -        boss_renataki() -            : CreatureScript("boss_renataki") -        { -        } - -        struct boss_renatakiAI : public ScriptedAI +        struct boss_renatakiAI : public BossAI          { -            boss_renatakiAI(Creature* creature) : ScriptedAI(creature) {} - -            uint32 Invisible_Timer; -            uint32 Ambush_Timer; -            uint32 Visible_Timer; -            uint32 Aggro_Timer; -            uint32 ThousandBlades_Timer; - -            bool Invisible; -            bool Ambushed; +            boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_RENATAKI) +            { +            }              void Reset()              { -                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;              }              void EnterCombat(Unit* /*who*/)              {              } -            void UpdateAI(const uint32 diff) +            void JustDied(Unit* /*killer*/) +            { +            } + +            void UpdateAI(uint32 const diff)              {                  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); +                events.Update(diff); -                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -                    Invisible = true; - -                    Invisible_Timer = urand(15000, 30000); -                } else Invisible_Timer -= diff; - -                if (Invisible) -                { -                    if (Ambush_Timer <= diff) -                    { -                        Unit* target = NULL; -                        target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                        if (target) -                        { -                            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) -                    { -                        Unit* target = NULL; -                        target = SelectTarget(SELECT_TARGET_RANDOM, 1); - -                        if (DoGetThreat(me->getVictim())) -                            DoModifyThreatPercent(me->getVictim(), -50); - -                        if (target) -                            AttackStart(target); - -                        Aggro_Timer = urand(7000, 20000); -                    } else Aggro_Timer -= diff; - -                    if (ThousandBlades_Timer <= diff) +                    switch (eventId)                      { -                        DoCast(me->getVictim(), SPELL_THOUSANDBLADES); -                        ThousandBlades_Timer = urand(7000, 12000); -                    } else ThousandBlades_Timer -= diff; +                        default: +                            break; +                    }                  } +                */                  DoMeleeAttackIfReady();              } @@ -160,4 +89,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 3ea5d932ab0..00000000000 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp +++ /dev/null @@ -1,588 +0,0 @@ -/* - * Copyright (C) 2008-2012 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 Thekal -{ -    SAY_AGGRO                 = 0, -    SAY_DEATH                 = 1, - -    SPELL_MORTALCLEAVE        = 22859, -    SPELL_SILENCE             = 22666, -    SPELL_FRENZY              = 8269, -    SPELL_FORCEPUNCH          = 24189, -    SPELL_CHARGE              = 24193, -    SPELL_ENRAGE              = 8269, -    SPELL_SUMMONTIGERS        = 24183, -    SPELL_TIGER_FORM          = 24169, -    SPELL_RESURRECT           = 24173,                    //We will not use this spell. - -//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 -}; - -class boss_thekal : public CreatureScript -{ -    public: - -        boss_thekal() -            : CreatureScript("boss_thekal") -        { -        } - -        struct boss_thekalAI : public ScriptedAI -        { -            boss_thekalAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            uint32 MortalCleave_Timer; -            uint32 Silence_Timer; -            uint32 Frenzy_Timer; -            uint32 ForcePunch_Timer; -            uint32 Charge_Timer; -            uint32 Enrage_Timer; -            uint32 SummonTigers_Timer; -            uint32 Check_Timer; -            uint32 Resurrect_Timer; - -            InstanceScript* instance; -            bool Enraged; -            bool PhaseTwo; -            bool WasDead; - -            void Reset() -            { -                MortalCleave_Timer = 4000; -                Silence_Timer = 9000; -                Frenzy_Timer = 30000; -                ForcePunch_Timer = 4000; -                Charge_Timer = 12000; -                Enrage_Timer = 32000; -                SummonTigers_Timer = 25000; -                Check_Timer = 10000; -                Resurrect_Timer = 10000; - -                Enraged = false; -                PhaseTwo = false; -                WasDead = false; -            } - -            void EnterCombat(Unit* /*who*/) -            { -                Talk(SAY_AGGRO); -            } - -            void JustDied(Unit* /*killer*/) -            { -                Talk(SAY_DEATH); -                if (instance) -                    instance->SetData(DATA_THEKAL, DONE); -            } - -            void JustReachedHome() -            { -                if (instance) -                    instance->SetData(DATA_THEKAL, NOT_STARTED); -            } - -            void UpdateAI(const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                    //Check_Timer for the death of LorKhan and Zath. -                    if (!WasDead && Check_Timer <= diff) -                    { -                        if (instance) -                        { -                            if (instance->GetData(DATA_LORKHAN) == SPECIAL) -                            { -                                //Resurrect LorKhan -                                if (Unit* pLorKhan = Unit::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->GetData(DATA_ZATH) == SPECIAL) -                            { -                                //Resurrect Zath -                                Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); -                                if (pZath) -                                { -                                    pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); -                                    pZath->setFaction(14); -                                    pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -                                    pZath->SetFullHealth(); - -                                    instance->SetData(DATA_ZATH, DONE); -                                } -                            } -                        } - -                        Check_Timer = 5000; -                    } else Check_Timer -= diff; - -                    if (!PhaseTwo && MortalCleave_Timer <= diff) -                    { -                        DoCast(me->getVictim(), SPELL_MORTALCLEAVE); -                        MortalCleave_Timer = urand(15000, 20000); -                    } else MortalCleave_Timer -= diff; - -                    if (!PhaseTwo && Silence_Timer <= diff) -                    { -                        DoCast(me->getVictim(), SPELL_SILENCE); -                        Silence_Timer = urand(20000, 25000); -                    } else Silence_Timer -= diff; - -                    if (!PhaseTwo && !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(); - -                        if (instance) -                            instance->SetData(DATA_THEKAL, SPECIAL); - -                        WasDead=true; -                    } - -                    //Thekal will transform to Tiger if he died and was not resurrected after 10 seconds. -                    if (!PhaseTwo && WasDead) -                    { -                        if (Resurrect_Timer <= diff) -                        { -                            DoCast(me, SPELL_TIGER_FORM); -                            me->SetObjectScale(2.00f); -                            me->SetStandState(UNIT_STAND_STATE_STAND); -                            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -                            me->SetFullHealth(); -                            const CreatureTemplate* cinfo = me->GetCreatureTemplate(); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 40))); -                            me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 40))); -                            me->UpdateDamagePhysical(BASE_ATTACK); -                            DoResetThreat(); -                            PhaseTwo = true; -                        } else Resurrect_Timer -= diff; -                    } - -                    if (me->IsFullHealth() && WasDead) -                    { -                        WasDead = false; -                    } - -                    if (PhaseTwo) -                    { -                        if (Charge_Timer <= diff) -                        { -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) -                            { -                                DoCast(target, SPELL_CHARGE); -                                DoResetThreat(); -                                AttackStart(target); -                            } - -                            Charge_Timer = urand(15000, 22000); -                        } else Charge_Timer -= diff; - -                        if (Frenzy_Timer <= diff) -                        { -                            DoCast(me, SPELL_FRENZY); -                            Frenzy_Timer = 30000; -                        } else Frenzy_Timer -= diff; - -                        if (ForcePunch_Timer <= diff) -                        { -                            DoCast(me->getVictim(), SPELL_SILENCE); -                            ForcePunch_Timer = urand(16000, 21000); -                        } else ForcePunch_Timer -= diff; - -                        if (SummonTigers_Timer <= diff) -                        { -                            DoCast(me->getVictim(), SPELL_SUMMONTIGERS); -                            SummonTigers_Timer = urand(10000, 14000); -                        } else SummonTigers_Timer -= diff; - -                        if (HealthBelowPct(11) && !Enraged) -                        { -                            DoCast(me, SPELL_ENRAGE); -                            Enraged = true; -                        } -                    } - -                    DoMeleeAttackIfReady(); - -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new boss_thekalAI(creature); -        } -}; - -//Zealot Lor'Khan -class mob_zealot_lorkhan : public CreatureScript -{ -    public: - -        mob_zealot_lorkhan() -            : CreatureScript("mob_zealot_lorkhan") -        { -        } - -        struct mob_zealot_lorkhanAI : public ScriptedAI -        { -            mob_zealot_lorkhanAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            uint32 Shield_Timer; -            uint32 BloodLust_Timer; -            uint32 GreaterHeal_Timer; -            uint32 Disarm_Timer; -            uint32 Check_Timer; - -            bool FakeDeath; - -            InstanceScript* instance; - -            void Reset() -            { -                Shield_Timer = 1000; -                BloodLust_Timer = 16000; -                GreaterHeal_Timer = 32000; -                Disarm_Timer = 6000; -                Check_Timer = 10000; - -                FakeDeath = false; - -                if (instance) -                    instance->SetData(DATA_LORKHAN, NOT_STARTED); - -                me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); -                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -            } - -            void EnterCombat(Unit* /*who*/) -            { -            } - -            void UpdateAI (const uint32 diff) -            { -                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+rand()%8000; -                } else BloodLust_Timer -= diff; - -                //Casting Greaterheal to Thekal or Zath if they are in meele range. -                if (GreaterHeal_Timer <= diff) -                { -                    if (instance) -                    { -                        Unit* pThekal = Unit::GetUnit(*me, instance->GetData64(DATA_THEKAL)); -                        Unit* pZath = Unit::GetUnit(*me, instance->GetData64(DATA_ZATH)); - -                        if (!pThekal || !pZath) -                            return; - -                        switch (urand(0, 1)) -                        { -                            case 0: -                                if (me->IsWithinMeleeRange(pThekal)) -                                    DoCast(pThekal, SPELL_GREATERHEAL); -                                break; -                            case 1: -                                if (me->IsWithinMeleeRange(pZath)) -                                    DoCast(pZath, SPELL_GREATERHEAL); -                                break; -                        } -                    } - -                    GreaterHeal_Timer = 15000+rand()%5000; -                } else GreaterHeal_Timer -= diff; - -                //Disarm_Timer -                if (Disarm_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_DISARM); -                    Disarm_Timer = 15000+rand()%10000; -                } else Disarm_Timer -= diff; - -                //Check_Timer for the death of LorKhan and Zath. -                if (!FakeDeath && Check_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_THEKAL) == SPECIAL) -                        { -                            //Resurrect Thekal -                            if (Unit* pThekal = Unit::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->GetData(DATA_ZATH) == SPECIAL) -                        { -                            //Resurrect Zath -                            if (Unit* pZath = Unit::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(); - -                    if (instance) -                        instance->SetData(DATA_LORKHAN, SPECIAL); - -                    FakeDeath = true; -                } - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new mob_zealot_lorkhanAI(creature); -        } -}; - -//Zealot Zath -class mob_zealot_zath : public CreatureScript -{ -    public: - -        mob_zealot_zath() -            : CreatureScript("mob_zealot_zath") -        { -        } - -        struct mob_zealot_zathAI : public ScriptedAI -        { -            mob_zealot_zathAI(Creature* creature) : ScriptedAI(creature) -            { -                instance = creature->GetInstanceScript(); -            } - -            uint32 SweepingStrikes_Timer; -            uint32 SinisterStrike_Timer; -            uint32 Gouge_Timer; -            uint32 Kick_Timer; -            uint32 Blind_Timer; -            uint32 Check_Timer; - -            bool FakeDeath; - -            InstanceScript* instance; - -            void Reset() -            { -                SweepingStrikes_Timer = 13000; -                SinisterStrike_Timer = 8000; -                Gouge_Timer = 25000; -                Kick_Timer = 18000; -                Blind_Timer = 5000; -                Check_Timer = 10000; - -                FakeDeath = false; - -                if (instance) -                    instance->SetData(DATA_ZATH, NOT_STARTED); - -                me->SetStandState(UNIT_STAND_STATE_STAND); -                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -            } - -            void EnterCombat(Unit* /*who*/) -            { -            } - -            void UpdateAI (const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                //SweepingStrikes_Timer -                if (SweepingStrikes_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_SWEEPINGSTRIKES); -                    SweepingStrikes_Timer = 22000+rand()%4000; -                } else SweepingStrikes_Timer -= diff; - -                //SinisterStrike_Timer -                if (SinisterStrike_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_SINISTERSTRIKE); -                    SinisterStrike_Timer = 8000+rand()%8000; -                } else SinisterStrike_Timer -= diff; - -                //Gouge_Timer -                if (Gouge_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_GOUGE); - -                    if (DoGetThreat(me->getVictim())) -                        DoModifyThreatPercent(me->getVictim(), -100); - -                    Gouge_Timer = 17000+rand()%10000; -                } else Gouge_Timer -= diff; - -                //Kick_Timer -                if (Kick_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_KICK); -                    Kick_Timer = 15000+rand()%10000; -                } else Kick_Timer -= diff; - -                //Blind_Timer -                if (Blind_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_BLIND); -                    Blind_Timer = 10000+rand()%10000; -                } else Blind_Timer -= diff; - -                //Check_Timer for the death of LorKhan and Zath. -                if (!FakeDeath && Check_Timer <= diff) -                { -                    if (instance) -                    { -                        if (instance->GetData(DATA_LORKHAN) == SPECIAL) -                        { -                            //Resurrect LorKhan -                            if (Unit* pLorKhan = Unit::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->GetData(DATA_THEKAL) == SPECIAL) -                        { -                            //Resurrect Thekal -                            if (Unit* pThekal = Unit::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(); - -                    if (instance) -                        instance->SetData(DATA_ZATH, SPECIAL); - -                    FakeDeath = true; -                } - -                DoMeleeAttackIfReady(); -            } -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new mob_zealot_zathAI(creature); -        } -}; - -void AddSC_boss_thekal() -{ -    new boss_thekal(); -    new mob_zealot_lorkhan(); -    new mob_zealot_zath(); -} - diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp index 06448032dff..a0ca0cff73d 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_venoxis.cpp @@ -22,267 +22,85 @@  #include "Spell.h"  #include "zulgurub.h" -/* - * TODO: - * - Fix timers (research some more) - */ - -enum Texts +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 NPCs -{ -    NPC_PARASITIC_SERPENT           = 14884,  };  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  };  class boss_venoxis : public CreatureScript  {      public: -        boss_venoxis() : CreatureScript("boss_venoxis") {} +        boss_venoxis() : CreatureScript("boss_venoxis") { }          struct boss_venoxisAI : public BossAI          { -            boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) -            { -            } +            boss_venoxisAI(Creature* creature) : BossAI(creature, DATA_VENOXIS) { }              void Reset()              { -                events.Reset(); -                summons.DespawnAll(); - -                // make sure this boss is properly reset -                instance->SetBossState(DATA_VENOXIS, NOT_STARTED); - -                // remove all spells and auras from previous attempts -                me->RemoveAllAuras(); -                me->SetReactState(REACT_PASSIVE); - -                // set some internally used variables to their defaults -                _inMeleeRange = 0; -                _transformed = false; -                _frenzied = false; - -                events.SetPhase(PHASE_ONE); +                _Reset();              }              void EnterCombat(Unit* /*who*/)              { -                me->SetReactState(REACT_AGGRESSIVE); - -                instance->SetBossState(DATA_VENOXIS, IN_PROGRESS); - -                // Always running events -                events.ScheduleEvent(EVENT_THRASH, 5000); - -                // Phase one events (regular form) -                events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE); -                events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE); -                events.ScheduleEvent(EVENT_HOLY_FIRE, 10000, 0, PHASE_ONE); -                events.ScheduleEvent(EVENT_RENEW, 30000, 0, PHASE_ONE); -                events.ScheduleEvent(EVENT_HOLY_WRATH, 60000, 0, PHASE_ONE); - -                events.SetPhase(PHASE_ONE); - -                // Set zone in combat -                DoZoneInCombat(); +                _EnterCombat(); +                Talk(SAY_AGGRO);              } -            void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) +            void JustDied(Unit* /*killer*/)              { -                // 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); -                } +                _JustDied(); +                Talk(SAY_DEATH);              } -            void JustDied(Unit* /*killer*/) +            void KilledUnit(Unit* victim)              { -                Talk(SAY_VENOXIS_DEATH); -                // venoxis is dead, mark him as such for the instance -                instance->SetBossState(DATA_VENOXIS, DONE); -                me->RemoveAllAuras(); +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL);              } -            void UpdateAI(const uint32 diff) +            void UpdateAI(uint32 const diff)              {                  if (!UpdateVictim())                      return;                  events.Update(diff); -                // return back to main code if we're still casting                  if (me->HasUnitState(UNIT_STATE_CASTING))                      return; - +            /*                  while (uint32 eventId = events.ExecuteEvent())                  {                      switch (eventId)                      { -                        // thrash is available in all phases -                        case EVENT_THRASH: -                            DoCast(me, SPELL_THRASH, true); -                            events.ScheduleEvent(EVENT_THRASH, urand(10000, 20000)); -                            break; - -                        // troll form spells and Actions (first part) -                        case EVENT_DISPEL_MAGIC: -                            DoCast(me, SPELL_DISPEL_MAGIC); -                            events.ScheduleEvent(EVENT_DISPEL_MAGIC, urand(15000, 20000), 0, PHASE_ONE); -                            break; -                        case EVENT_RENEW: -                            DoCast(me, SPELL_RENEW); -                            events.ScheduleEvent(EVENT_RENEW, urand(25000, 30000), 0, PHASE_ONE); -                            break; -                        case EVENT_HOLY_NOVA: -                            _inMeleeRange = 0; - -                            for (uint8 i = 0; i < 10; ++i) -                            { -                                if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, i)) -                                    // check if target is within melee-distance -                                    if (me->IsWithinMeleeRange(target)) -                                        ++_inMeleeRange; -                            } - -                            // trigger spellcast only if we have 3 or more targets to affect -                            if (_inMeleeRange >= 3) -                                DoCast(me->getVictim(), SPELL_HOLY_NOVA); - -                            events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000, 75000), 0, PHASE_ONE); -                            break; -                        case EVENT_HOLY_FIRE: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) -                                DoCast(target, SPELL_HOLY_FIRE); -                            events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000, 60000), 0, PHASE_ONE); -                            break; -                        case EVENT_HOLY_WRATH: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) -                                DoCast(target, SPELL_HOLY_WRATH); -                            events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000, 60000), 0, PHASE_ONE); -                            break; - -                        // -                        // snake form spells and Actions -                        // - -                        case EVENT_VENOM_SPIT: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) -                                DoCast(target, SPELL_VENOM_SPIT); -                            events.ScheduleEvent(EVENT_VENOM_SPIT, urand(5000, 15000), 0, PHASE_TWO); -                            break; -                        case EVENT_POISON_CLOUD: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) -                                DoCast(target, SPELL_POISON_CLOUD); -                            events.ScheduleEvent(EVENT_POISON_CLOUD, urand(15000, 20000), 0, PHASE_TWO); -                            break; -                        case EVENT_PARASITIC_SERPENT: -                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM)) -                                DoCast(target, SPELL_SUMMON_PARASITIC_SERPENT); -                            events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 15000, 0, PHASE_TWO); -                            break; -                        case EVENT_FRENZY: -                            // frenzy at 20% health -                            DoCast(me, SPELL_FRENZY, true); -                            break; - -                        // -                        // shape and phase-changing -                        // - -                        case EVENT_TRANSFORM: -                            // shapeshift at 50% health -                            DoCast(me, SPELL_VENOXIS_TRANSFORM); -                            Talk(SAY_VENOXIS_TRANSFORM); -                            DoResetThreat(); - -                            // phase two events (snakeform) -                            events.ScheduleEvent(EVENT_VENOM_SPIT, 5000, 0, PHASE_TWO); -                            events.ScheduleEvent(EVENT_POISON_CLOUD, 10000, 0, PHASE_TWO); -                            events.ScheduleEvent(EVENT_PARASITIC_SERPENT, 30000, 0, PHASE_TWO); - -                            // transformed, start phase two -                            events.SetPhase(PHASE_TWO); - -                            break;                          default:                              break;                      }                  } +            */                  DoMeleeAttackIfReady();              } - -        private: -            uint8 _inMeleeRange; -            bool _transformed; -            bool _frenzied;          };          CreatureAI* GetAI(Creature* creature) const          { -            return new boss_venoxisAI(creature); +            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 6cdb00236df..be6dd137b67 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_wushoolay.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2012 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,65 @@   * 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" -#define SPELL_LIGHTNINGCLOUD         25033 -#define SPELL_LIGHTNINGWAVE          24819 +enum Yells +{ +}; + +enum Spells +{ +}; + +enum Events +{ +};  class boss_wushoolay : public CreatureScript  {      public: +        boss_wushoolay() : CreatureScript("boss_wushoolay") { } -        boss_wushoolay() -            : CreatureScript("boss_wushoolay") -        { -        } - -        struct boss_wushoolayAI : public ScriptedAI +        struct boss_wushoolayAI : public BossAI          { -            boss_wushoolayAI(Creature* creature) : ScriptedAI(creature) {} - -            uint32 LightningCloud_Timer; -            uint32 LightningWave_Timer; +            boss_wushoolayAI(Creature* creature) : BossAI(creature, DATA_HAZZARAH) +            { +            }              void Reset()              { -                LightningCloud_Timer = urand(5000, 10000); -                LightningWave_Timer = urand(8000, 16000);              }              void EnterCombat(Unit* /*who*/)              {              } -            void UpdateAI(const uint32 diff) +            void JustDied(Unit* /*killer*/) +            { +            } + +            void UpdateAI(uint32 const diff)              {                  if (!UpdateVictim())                      return; -                //LightningCloud_Timer -                if (LightningCloud_Timer <= diff) -                { -                    DoCast(me->getVictim(), SPELL_LIGHTNINGCLOUD); -                    LightningCloud_Timer = urand(15000, 20000); -                } else LightningCloud_Timer -= diff; +                events.Update(diff); -                //LightningWave_Timer -                if (LightningWave_Timer <= diff) +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                /* +                while (uint32 eventId = events.ExecuteEvent())                  { -                    Unit* target = NULL; -                    target = SelectTarget(SELECT_TARGET_RANDOM, 0); -                    if (target) DoCast(target, SPELL_LIGHTNINGWAVE); - -                    LightningWave_Timer = urand(12000, 16000); -                } else LightningWave_Timer -= diff; +                    switch (eventId) +                    { +                        default: +                            break; +                    } +                } +                */                  DoMeleeAttackIfReady();              } @@ -92,4 +89,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..00b8c8747f6 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_zanzil.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2008-2012 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() +            { +                _Reset(); +            } + +            void EnterCombat(Unit* /*who*/) +            { +                _EnterCombat(); +                Talk(SAY_AGGRO); +            } + +            void JustDied(Unit* /*killer*/) +            { +                _JustDied(); +                Talk(SAY_DEATH); +            } + +            void KilledUnit(Unit* victim) +            { +                if (victim->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_PLAYER_KILL); +            } + +            void UpdateAI(uint32 const diff) +            { +                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 +        { +            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 8d17a18bb1b..f1c1444be8c 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/instance_zulgurub.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2012 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,142 +15,242 @@   * 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_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("instance_zulgurub", 309) -        { -        } +        instance_zulgurub() : InstanceMapScript(ZGScriptName, 859) { }          struct instance_zulgurub_InstanceMapScript : public InstanceScript          { -            instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map) {} - -            //If all High Priest bosses were killed. Lorkhan, Zath and Ohgan are added too. -            uint32 m_auiEncounter[MAX_ENCOUNTERS]; - -            //Storing Lorkhan, Zath and Thekal because we need to cast on them later. Jindo is needed for healfunction too. -            uint64 m_uiLorKhanGUID; -            uint64 m_uiZathGUID; -            uint64 m_uiThekalGUID; -            uint64 m_uiJindoGUID; - -            void Initialize() +            instance_zulgurub_InstanceMapScript(Map* map) : InstanceScript(map)              { -                memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - -                m_uiLorKhanGUID = 0; -                m_uiZathGUID = 0; -                m_uiThekalGUID = 0; -                m_uiJindoGUID = 0; -            } - -            bool IsEncounterInProgress() const -            { -                //not active in Zul'Gurub -                return false; +                SetBossNumber(EncounterCount); +                LoadDoorData(doorData); +                venoxisGUID         = 0; +                mandokirGUID        = 0; +                kilnaraGUID         = 0; +                zanzilGUID          = 0; +                jindoGUID           = 0; +                hazzarahGUID        = 0; +                renatakiGUID        = 0; +                wushoolayGUID       = 0; +                grilekGUID          = 0; +                jindoTiggerGUID     = 0;              }              void OnCreatureCreate(Creature* creature)              {                  switch (creature->GetEntry())                  { -                    case 11347: m_uiLorKhanGUID = creature->GetGUID(); break; -                    case 11348: m_uiZathGUID = creature->GetGUID(); break; -                    case 14509: m_uiThekalGUID = creature->GetGUID(); break; -                    case 11380: m_uiJindoGUID = creature->GetGUID(); break; +                    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_JINDO: +                        jindoGUID = creature->GetGUID(); +                        break; +                    case NPC_HAZZARAH: +                        hazzarahGUID = creature->GetGUID(); +                        break; +                    case NPC_RENATAKI: +                        renatakiGUID = creature->GetGUID(); +                        break; +                    case NPC_WUSHOOLAY: +                        wushoolayGUID = creature->GetGUID(); +                        break; +                    case NPC_GRILEK: +                        grilekGUID = creature->GetGUID(); +                        break; +                    case NPC_JINDO_TRIGGER: +                        jindoTiggerGUID = creature->GetGUID(); +                        break; +                    default: +                        break;                  }              } -            void SetData(uint32 uiType, uint32 uiData) +            void OnGameObjectCreate(GameObject* go)              { -                switch (uiType) +                switch (go->GetEntry())                  { -                    case DATA_ARLOKK: -                        m_auiEncounter[0] = uiData; +                    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 DATA_JEKLIK: -                        m_auiEncounter[1] = uiData; +                    default:                          break; +                } +            } -                    case DATA_VENOXIS: -                        m_auiEncounter[2] = uiData; +            void OnGameObjectRemove(GameObject* go) +            { +                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; - -                    case DATA_MARLI: -                        m_auiEncounter[3] = uiData; +                    default:                          break; +                } +            } -                    case DATA_THEKAL: -                        m_auiEncounter[4] = uiData; -                        break; +            bool SetBossState(uint32 type, EncounterState state) +            { +                if (!InstanceScript::SetBossState(type, state)) +                    return false; -                    case DATA_LORKHAN: -                        m_auiEncounter[5] = uiData; +                switch (type) +                { +                    case DATA_VENOXIS: +                    case DATA_MANDOKIR: +                    case DATA_KILNARA: +                    case DATA_ZANZIL: +                    case DATA_JINDO: +                    case DATA_HAZZARAH: +                    case DATA_RENATAKI: +                    case DATA_WUSHOOLAY: +                    case DATA_GRILEK:                          break; - -                    case DATA_ZATH: -                        m_auiEncounter[6] = uiData; +                    default:                          break; +                } -                    case DATA_OHGAN: -                        m_auiEncounter[7] = uiData; -                        break; +                return true; +            } + +            /* +            void SetData(uint32 type, uint32 data) +            { +                switch (type) +                {                  }              } -            uint32 GetData(uint32 uiType) const +            uint32 GetData(uint32 type) const              { -                switch (uiType) +                switch (type)                  { -                    case DATA_ARLOKK: -                        return m_auiEncounter[0]; -                    case DATA_JEKLIK: -                        return m_auiEncounter[1]; -                    case DATA_VENOXIS: -                        return m_auiEncounter[2]; -                    case DATA_MARLI: -                        return m_auiEncounter[3]; -                    case DATA_THEKAL: -                        return m_auiEncounter[4]; -                    case DATA_LORKHAN: -                        return m_auiEncounter[5]; -                    case DATA_ZATH: -                        return m_auiEncounter[6]; -                    case DATA_OHGAN: -                        return m_auiEncounter[7];                  } +                  return 0;              } +            */ -            uint64 GetData64(uint32 uiData) const +            uint64 GetData64(uint32 type) const              { -                switch (uiData) +                switch (type)                  { -                    case DATA_LORKHAN: -                        return m_uiLorKhanGUID; -                    case DATA_ZATH: -                        return m_uiZathGUID; -                    case DATA_THEKAL: -                        return m_uiThekalGUID; +                    case DATA_VENOXIS: +                        return venoxisGUID; +                    case DATA_MANDOKIR: +                        return mandokirGUID; +                    case DATA_KILNARA: +                        return kilnaraGUID; +                    case DATA_ZANZIL: +                        return zanzilGUID;                      case DATA_JINDO: -                        return m_uiJindoGUID; +                        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;              } + +            std::string GetSaveData() +            { +                OUT_SAVE_INST_DATA; + +                std::ostringstream saveStream; +                saveStream << "Z G " << GetBossSaveData(); + +                OUT_SAVE_INST_DATA_COMPLETE; +                return saveStream.str(); +            } + +            void Load(char const* str) +            { +                if (!str) +                { +                    OUT_LOAD_INST_DATA_FAIL; +                    return; +                } + +                OUT_LOAD_INST_DATA(str); + +                char dataHead1, dataHead2; + +                std::istringstream loadStream(str); +                loadStream >> dataHead1 >> dataHead2; + +                if (dataHead1 == 'Z' && dataHead2 == 'G') +                { +                    for (uint8 i = 0; i < EncounterCount; ++i) +                    { +                        uint32 tmpState; +                        loadStream >> tmpState; +                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) +                            tmpState = NOT_STARTED; + +                        SetBossState(i, EncounterState(tmpState)); +                    } +                } +                else +                    OUT_LOAD_INST_DATA_FAIL; + +                OUT_LOAD_INST_DATA_COMPLETE; +            } + +        protected: +             uint64 venoxisGUID; +             uint64 mandokirGUID; +             uint64 kilnaraGUID; +             uint64 zanzilGUID; +             uint64 jindoGUID; +             uint64 hazzarahGUID; +             uint64 renatakiGUID; +             uint64 wushoolayGUID; +             uint64 grilekGUID; +             uint64 jindoTiggerGUID;          };          InstanceScript* GetInstanceScript(InstanceMap* map) const diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h index d127680cec5..e4d2d2e3902 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h +++ b/src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2012 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,20 +18,82 @@  #ifndef DEF_ZULGURUB_H  #define DEF_ZULGURUB_H +#define ZGScriptName "instance_zulgurub" + +uint32 const EncounterCount = 5; +  enum DataTypes  { -    MAX_ENCOUNTERS          = 8, - -    DATA_ARLOKK             = 1, -    DATA_JEKLIK             = 2, -    DATA_VENOXIS            = 3, -    DATA_MARLI              = 4, -    DATA_OHGAN              = 5, -    DATA_THEKAL             = 6, -    DATA_ZATH               = 7, -    DATA_LORKHAN            = 8, -    DATA_JINDO              = 10, +    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,  }; -#endif +enum CreatureIds +{ +    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 +{ +    // 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> +CreatureAI* GetZulGurubAI(Creature* creature) +{ +    if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) +        if (instance->GetInstanceScript()) +            if (instance->GetScriptId() == sObjectMgr->GetScriptId(ZGScriptName)) +                return new AI(creature); +    return NULL; +} + +#endif diff --git a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp index 7f96706f48e..604a88fc70a 100644 --- a/src/server/scripts/EasternKingdoms/arathi_highlands.cpp +++ b/src/server/scripts/EasternKingdoms/arathi_highlands.cpp @@ -49,7 +49,11 @@ enum eEnums      EMOTE_PROGRESS_8    = 8,      SAY_PROGRESS_9      = 9, -    QUEST_SUNKEN_TREASURE   = 665, +    EVENT_SAY_3         = 1, +    EVENT_SAY_6         = 2, +    EVENT_SAY_8         = 3, + +    QUEST_GOGGLE_BOGGLE     = 26050,      MOB_VENGEFUL_SURGE      = 2776  }; @@ -74,33 +78,22 @@ class npc_professor_phizzlethorpe : public CreatureScript                  switch (waypointId)                  { -                    case 4: +                    case 6:                          Talk(SAY_PROGRESS_2, player->GetGUID()); -                        break; -                    case 5: -                        Talk(SAY_PROGRESS_3, player->GetGUID()); +                        events.ScheduleEvent(EVENT_SAY_3, 3000);                          break;                      case 8:                          Talk(EMOTE_PROGRESS_4); -                        break; -                    case 9: -                        me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); -                        me->SummonCreature(MOB_VENGEFUL_SURGE, -2052.96f, -2142.49f, 20.15f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); -                        break; -                    case 10: -                        Talk(SAY_PROGRESS_5, player->GetGUID()); +                        me->SummonCreature(MOB_VENGEFUL_SURGE, -2065.505f, -2136.88f, 22.20362f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); +                        me->SummonCreature(MOB_VENGEFUL_SURGE, -2059.249f, -2134.88f, 21.51582f, 1.0f, TEMPSUMMON_CORPSE_DESPAWN, 0);                          break;                      case 11: -                        Talk(SAY_PROGRESS_6, player->GetGUID()); -                        SetRun(); +                        Talk(SAY_PROGRESS_5, player->GetGUID()); +                        events.ScheduleEvent(EVENT_SAY_6, 11000);                          break; -                    case 19: +                    case 17:                          Talk(SAY_PROGRESS_7, player->GetGUID()); -                        break; -                    case 20: -                        Talk(EMOTE_PROGRESS_8); -                        Talk(SAY_PROGRESS_9, player->GetGUID()); -                        player->GroupEventHappens(QUEST_SUNKEN_TREASURE, me); +                        events.ScheduleEvent(EVENT_SAY_8, 6000);                          break;                  }              } @@ -117,8 +110,34 @@ class npc_professor_phizzlethorpe : public CreatureScript              void UpdateAI(const uint32 diff)              { +                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->GetGUID()); +                            break; +                        case EVENT_SAY_6: +                            Talk(SAY_PROGRESS_6, player->GetGUID()); +                            SetRun(); +                            break; +                        case EVENT_SAY_8: +                            Talk(EMOTE_PROGRESS_8); +                            Talk(SAY_PROGRESS_9, player->GetGUID()); +                            player->GroupEventHappens(QUEST_GOGGLE_BOGGLE, me); +                            break; +                    } +                }                  npc_escortAI::UpdateAI(diff);              } + +            EventMap events;          };          CreatureAI* GetAI(Creature* creature) const @@ -128,13 +147,13 @@ class npc_professor_phizzlethorpe : public CreatureScript          bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest)          { -            if (quest->GetQuestId() == QUEST_SUNKEN_TREASURE) +            if (quest->GetQuestId() == QUEST_GOGGLE_BOGGLE)              {                  creature->AI()->Talk(SAY_PROGRESS_1, player->GetGUID());                  if (npc_escortAI* pEscortAI = CAST_AI(npc_professor_phizzlethorpeAI, (creature->AI())))                      pEscortAI->Start(false, false, player->GetGUID(), quest); -                creature->setFaction(113); +                creature->setFaction(42);              }              return true;          } diff --git a/src/server/scripts/EasternKingdoms/boss_kruul.cpp b/src/server/scripts/EasternKingdoms/boss_kruul.cpp deleted file mode 100644 index 6a1ba633660..00000000000 --- a/src/server/scripts/EasternKingdoms/boss_kruul.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2008-2012 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_Kruul -SD%Complete: 100 -SDComment: Highlord Kruul are presumably no longer in-game on regular bases, however future events could bring him back. -SDCategory: Bosses -EndScriptData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" - -#define SPELL_SHADOWVOLLEY          21341 -#define SPELL_CLEAVE                20677 -#define SPELL_THUNDERCLAP           23931 -#define SPELL_TWISTEDREFLECTION     21063 -#define SPELL_VOIDBOLT              21066 -#define SPELL_RAGE                  21340 -#define SPELL_CAPTURESOUL           21054 - -class boss_kruul : public CreatureScript -{ -public: -    boss_kruul() : CreatureScript("boss_kruul") { } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new boss_kruulAI (creature); -    } - -    struct boss_kruulAI : public ScriptedAI -    { -        boss_kruulAI(Creature* creature) : ScriptedAI(creature) {} - -        uint32 ShadowVolley_Timer; -        uint32 Cleave_Timer; -        uint32 ThunderClap_Timer; -        uint32 TwistedReflection_Timer; -        uint32 VoidBolt_Timer; -        uint32 Rage_Timer; -        uint32 Hound_Timer; - -        void Reset() -        { -            ShadowVolley_Timer = 10000; -            Cleave_Timer = 14000; -            ThunderClap_Timer = 20000; -            TwistedReflection_Timer = 25000; -            VoidBolt_Timer = 30000; -            Rage_Timer = 60000;                                 //Cast rage after 1 minute -            Hound_Timer = 8000; -        } - -        void EnterCombat(Unit* /*who*/) -        { -        } - -        void KilledUnit(Unit* /*victim*/) -        { -            // When a player, pet or totem gets killed, Lord Kazzak casts this spell to instantly regenerate 70, 000 health. -            DoCast(me, SPELL_CAPTURESOUL); -        } - -        void SummonHounds(Unit* victim) -        { -            if (Creature* Hound = DoSpawnCreature(19207, float(irand(-9, 9)), float(irand(-9, 9)), 0, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) -                Hound->AI()->AttackStart(victim); -        } - -        void UpdateAI(const uint32 diff) -        { -            //Return since we have no target -            if (!UpdateVictim()) -                return; - -            //ShadowVolley_Timer -            if (ShadowVolley_Timer <= diff) -            { -                if (urand(0, 99) < 45) -                    DoCast(me->getVictim(), SPELL_SHADOWVOLLEY); - -                ShadowVolley_Timer = 5000; -            } else ShadowVolley_Timer -= diff; - -            //Cleave_Timer -            if (Cleave_Timer <= diff) -            { -                if (urand(0, 1)) -                    DoCast(me->getVictim(), SPELL_CLEAVE); - -                Cleave_Timer = 10000; -            } else Cleave_Timer -= diff; - -            //ThunderClap_Timer -            if (ThunderClap_Timer <= diff) -            { -                if (urand(0, 9) < 2) -                    DoCast(me->getVictim(), SPELL_THUNDERCLAP); - -                ThunderClap_Timer = 12000; -            } else ThunderClap_Timer -= diff; - -            //TwistedReflection_Timer -            if (TwistedReflection_Timer <= diff) -            { -                DoCast(me->getVictim(), SPELL_TWISTEDREFLECTION); -                TwistedReflection_Timer = 30000; -            } else TwistedReflection_Timer -= diff; - -            //VoidBolt_Timer -            if (VoidBolt_Timer <= diff) -            { -                if (urand(0, 9) < 4) -                    DoCast(me->getVictim(), SPELL_VOIDBOLT); - -                VoidBolt_Timer = 18000; -            } else VoidBolt_Timer -= diff; - -            //Rage_Timer -            if (Rage_Timer <= diff) -            { -                DoCast(me, SPELL_RAGE); -                Rage_Timer = 70000; -            } else Rage_Timer -= diff; - -            //Hound_Timer -            if (Hound_Timer <= diff) -            { -                SummonHounds(me->getVictim()); -                SummonHounds(me->getVictim()); -                SummonHounds(me->getVictim()); - -                Hound_Timer = 45000; -            } else Hound_Timer -= diff; - -            DoMeleeAttackIfReady(); -        } -    }; -}; - -void AddSC_boss_kruul() -{ -    new boss_kruul(); -} diff --git a/src/server/scripts/EasternKingdoms/burning_steppes.cpp b/src/server/scripts/EasternKingdoms/burning_steppes.cpp index ba1d339730a..740d01fd9e6 100644 --- a/src/server/scripts/EasternKingdoms/burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/burning_steppes.cpp @@ -18,141 +18,19 @@  /* ScriptData  SDName: Burning_Steppes -SD%Complete: 100 -SDComment: Quest support: 4224, 4866 +SD%Complete: 0 +SDComment:  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" - -class npc_ragged_john : public CreatureScript -{ -public: -    npc_ragged_john() : CreatureScript("npc_ragged_john") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        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(4224); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) -    { -        if (creature->isQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(4224) == 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 -    { -        return new npc_ragged_johnAI (creature); -    } - -    struct npc_ragged_johnAI : public ScriptedAI -    { -        npc_ragged_johnAI(Creature* creature) : ScriptedAI(creature) {} - -        void Reset() {} - -        void MoveInLineOfSight(Unit* who) -        { -            if (who->HasAura(16468)) -            { -                if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 15) && who->isInAccessiblePlaceFor(me)) -                { -                    DoCast(who, 16472); -                    CAST_PLR(who)->AreaExploredOrEventHappens(4866); -                } -            } - -            ScriptedAI::MoveInLineOfSight(who); -        } - -        void EnterCombat(Unit* /*who*/) {} -    }; -};  void AddSC_burning_steppes()  { -    new npc_ragged_john(); +  } diff --git a/src/server/scripts/EasternKingdoms/ghostlands.cpp b/src/server/scripts/EasternKingdoms/ghostlands.cpp index ddd3b0f423a..5465a918169 100644 --- a/src/server/scripts/EasternKingdoms/ghostlands.cpp +++ b/src/server/scripts/EasternKingdoms/ghostlands.cpp @@ -19,13 +19,11 @@  /* ScriptData  SDName: Ghostlands  SD%Complete: 100 -SDComment: Quest support: 9692, 9212. Obtain Budd's Guise of Zul'aman. Vendor Rathis Tomber +SDComment:  SDCategory: Ghostlands  EndScriptData */  /* ContentData -npc_blood_knight_dawnstar -npc_budd_nedreck  npc_rathis_tomber  npc_ranger_lilatha  EndContentData */ @@ -38,41 +36,6 @@ EndContentData */  #include "WorldSession.h"  /*###### -## npc_budd_nedreck -######*/ - -#define GOSSIP_HBN "You gave the crew disguises?" - -class npc_budd_nedreck : public CreatureScript -{ -public: -    npc_budd_nedreck() : CreatureScript("npc_budd_nedreck") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF) -        { -            player->CLOSE_GOSSIP_MENU(); -            creature->CastSpell(player, 42540, false); -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) -    { -        if (creature->isQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(11166) == QUEST_STATUS_INCOMPLETE) -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HBN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - -        player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); -        return true; -    } -}; - -/*######  ## npc_rathis_tomber  ######*/ @@ -220,7 +183,6 @@ public:  void AddSC_ghostlands()  { -    new npc_budd_nedreck();      new npc_rathis_tomber();      new npc_ranger_lilatha();  } diff --git a/src/server/scripts/EasternKingdoms/hinterlands.cpp b/src/server/scripts/EasternKingdoms/hinterlands.cpp index 544ea0fd175..cf4a6f273f9 100644 --- a/src/server/scripts/EasternKingdoms/hinterlands.cpp +++ b/src/server/scripts/EasternKingdoms/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_00x09hl -npc_rinji  EndContentData */  #include "ScriptMgr.h" @@ -147,206 +146,7 @@ public:      };  }; -/*###### -## npc_rinji -######*/ - -enum eRinji -{ -    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 m_fX, m_fY, m_fZ; -}; - -Location m_afAmbushSpawn[] = -{ -    {191.296204f, -2839.329346f, 107.388f}, -    {70.972466f,  -2848.674805f, 109.459f} -}; - -Location m_afAmbushMoveTo[] = -{ -    {166.630386f, -2824.780273f, 108.153f}, -    {70.886589f,  -2874.335449f, 116.675f} -}; - -class npc_rinji : public CreatureScript -{ -public: -    npc_rinji() : CreatureScript("npc_rinji") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) -    { -        if (quest->GetQuestId() == QUEST_RINJI_TRAPPED) -        { -            if (GameObject* go = creature->FindNearestGameObject(GO_RINJI_CAGE, INTERACTION_DISTANCE)) -                go->UseDoorOrButton(); - -            if (npc_rinjiAI* pEscortAI = CAST_AI(npc_rinji::npc_rinjiAI, creature->AI())) -                pEscortAI->Start(false, false, player->GetGUID(), quest); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_rinjiAI(creature); -    } - -    struct npc_rinjiAI : public npc_escortAI -    { -        npc_rinjiAI(Creature* creature) : npc_escortAI(creature) -        { -            m_bIsByOutrunner = false; -            m_iSpawnId = 0; -        } - -        bool m_bIsByOutrunner; -        uint32 m_uiPostEventCount; -        uint32 m_uiPostEventTimer; -        int m_iSpawnId; - -        void Reset() -        { -            m_uiPostEventCount = 0; -            m_uiPostEventTimer = 3000; -        } - -        void JustRespawned() -        { -            m_bIsByOutrunner = false; -            m_iSpawnId = 0; - -            npc_escortAI::JustRespawned(); -        } - -        void EnterCombat(Unit* who) -        { -            if (HasEscortState(STATE_ESCORT_ESCORTING)) -            { -                if (who->GetEntry() == NPC_OUTRUNNER && !m_bIsByOutrunner) -                { -                    if (Creature* talker = who->ToCreature()) -                        talker->AI()->Talk(SAY_RIN_BY_OUTRUNNER); -                    m_bIsByOutrunner = true; -                } - -                if (rand()%4) -                    return; - -                //only if attacked and escorter is not in combat? -                Talk(SAY_RIN_HELP); -            } -        } - -        void DoSpawnAmbush(bool bFirst) -        { -            if (!bFirst) -                m_iSpawnId = 1; - -            me->SummonCreature(NPC_RANGER, -                m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f, -                TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); - -            for (int i = 0; i < 2; ++i) -            { -                me->SummonCreature(NPC_OUTRUNNER, -                    m_afAmbushSpawn[m_iSpawnId].m_fX, m_afAmbushSpawn[m_iSpawnId].m_fY, m_afAmbushSpawn[m_iSpawnId].m_fZ, 0.0f, -                    TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 60000); -            } -        } - -        void JustSummoned(Creature* summoned) -        { -            summoned->SetWalk(false); -            summoned->GetMotionMaster()->MovePoint(0, m_afAmbushMoveTo[m_iSpawnId].m_fX, m_afAmbushMoveTo[m_iSpawnId].m_fY, m_afAmbushMoveTo[m_iSpawnId].m_fZ); -        } - -        void WaypointReached(uint32 waypointId) -        { -            Player* player = GetPlayerForEscort(); -            if (!player) -                return; - -            switch (waypointId) -            { -                case 1: -                    Talk(SAY_RIN_FREE, player->GetGUID()); -                    break; -                case 7: -                    DoSpawnAmbush(true); -                    break; -                case 13: -                    DoSpawnAmbush(false); -                    break; -                case 17: -                    Talk(SAY_RIN_COMPLETE, player->GetGUID()); -                    player->GroupEventHappens(QUEST_RINJI_TRAPPED, me); -                    SetRun(); -                    m_uiPostEventCount = 1; -                    break; -            } -        } - -        void UpdateEscortAI(const uint32 uiDiff) -        { -            //Check if we have a current target -            if (!UpdateVictim()) -            { -                if (HasEscortState(STATE_ESCORT_ESCORTING) && m_uiPostEventCount) -                { -                    if (m_uiPostEventTimer <= uiDiff) -                    { -                        m_uiPostEventTimer = 3000; - -                        if (Player* player = GetPlayerForEscort()) -                        { -                            switch (m_uiPostEventCount) -                            { -                                case 1: -                                    Talk(SAY_RIN_PROGRESS_1, player->GetGUID()); -                                    ++m_uiPostEventCount; -                                    break; -                                case 2: -                                    Talk(SAY_RIN_PROGRESS_2, player->GetGUID()); -                                    m_uiPostEventCount = 0; -                                    break; -                            } -                        } -                        else -                        { -                            me->DespawnOrUnsummon(); -                            return; -                        } -                    } -                    else -                        m_uiPostEventTimer -= uiDiff; -                } - -                return; -            } - -            DoMeleeAttackIfReady(); -        } -    }; -}; -  void AddSC_hinterlands()  {      new npc_00x09hl(); -    new npc_rinji();  } diff --git a/src/server/scripts/EasternKingdoms/ironforge.cpp b/src/server/scripts/EasternKingdoms/ironforge.cpp index fdd9f5f9a86..26006d3bed9 100644 --- a/src/server/scripts/EasternKingdoms/ironforge.cpp +++ b/src/server/scripts/EasternKingdoms/ironforge.cpp @@ -18,13 +18,12 @@  /* ScriptData  SDName: Ironforge -SD%Complete: 100 -SDComment: Quest support: 3702 +SD%Complete: 0 +SDComment:  SDCategory: Ironforge  EndScriptData */  /* ContentData -npc_royal_historian_archesonus  EndContentData */  #include "ScriptMgr.h" @@ -32,68 +31,6 @@ EndContentData */  #include "ScriptedGossip.h"  #include "Player.h" -/*###### -## npc_royal_historian_archesonus -######*/ - -#define GOSSIP_ITEM_ROYAL   "I am ready to listen" -#define GOSSIP_ITEM_ROYAL_1 "That is tragic. How did this happen?" -#define GOSSIP_ITEM_ROYAL_2 "Interesting, continue please." -#define GOSSIP_ITEM_ROYAL_3 "Unbelievable! How dare they??" -#define GOSSIP_ITEM_ROYAL_4 "Of course I will help!" - -class npc_royal_historian_archesonus : public CreatureScript -{ -public: -    npc_royal_historian_archesonus() : CreatureScript("npc_royal_historian_archesonus") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        player->PlayerTalkClass->ClearMenus(); -        switch (action) -        { -            case GOSSIP_ACTION_INFO_DEF: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); -                player->SEND_GOSSIP_MENU(2236, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+1: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); -                player->SEND_GOSSIP_MENU(2237, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+2: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); -                player->SEND_GOSSIP_MENU(2238, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+3: -                player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); -                player->SEND_GOSSIP_MENU(2239, creature->GetGUID()); -                break; -            case GOSSIP_ACTION_INFO_DEF+4: -                player->CLOSE_GOSSIP_MENU(); -                player->AreaExploredOrEventHappens(3702); -                break; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) -    { -        if (creature->isQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (player->GetQuestStatus(3702) == QUEST_STATUS_INCOMPLETE) -        { -            player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_ROYAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); -            player->SEND_GOSSIP_MENU(2235, creature->GetGUID()); -        } -        else -            player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - -        return true; -    } -}; -  void AddSC_ironforge()  { -    new npc_royal_historian_archesonus();  } diff --git a/src/server/scripts/EasternKingdoms/loch_modan.cpp b/src/server/scripts/EasternKingdoms/loch_modan.cpp index 0937e3cbb30..b74ac1b5de9 100644 --- a/src/server/scripts/EasternKingdoms/loch_modan.cpp +++ b/src/server/scripts/EasternKingdoms/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) -    { -        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) -    { -        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/redridge_mountains.cpp b/src/server/scripts/EasternKingdoms/redridge_mountains.cpp index 9fa8ac70eed..1b694f10958 100644 --- a/src/server/scripts/EasternKingdoms/redridge_mountains.cpp +++ b/src/server/scripts/EasternKingdoms/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,148 +26,6 @@ Script Data End */  #include "ScriptedEscortAI.h"  #include "Player.h" -enum eCorporalKeeshan -{ -    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") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) -    { -        if (quest->GetQuestId() == QUEST_MISSING_IN_ACTION) -        { -            CAST_AI(npc_corporal_keeshan::npc_corporal_keeshanAI, creature->AI())->Start(true, false, player->GetGUID(), quest); -            creature->AI()->Talk(SAY_CORPORAL_1); -        } - -        return false; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_corporal_keeshanAI(creature); -    } - -    struct npc_corporal_keeshanAI : public npc_escortAI -    { -        npc_corporal_keeshanAI(Creature* creature) : npc_escortAI(creature) {} - -        uint32 uiPhase; -        uint32 uiTimer; -        uint32 uiMockingBlowTimer; -        uint32 uiShieldBashTimer; - -        void Reset() -        { -            uiTimer = 0; -            uiPhase = 0; -            uiMockingBlowTimer = 5000; -            uiShieldBashTimer  = 8000; -        } - -        void WaypointReached(uint32 waypointId) -        { -            Player* player = GetPlayerForEscort(); -            if (!player) -                return; - -            if (waypointId >= 65 && me->GetUnitMovementFlags() == MOVEMENTFLAG_WALKING) -                me->SetWalk(false); - -            switch (waypointId) -            { -                case 39: -                    SetEscortPaused(true); -                    uiTimer = 2000; -                    uiPhase = 1; -                    break; -                case 65: -                    me->SetWalk(false); -                    break; -                case 115: -                    player->AreaExploredOrEventHappens(QUEST_MISSING_IN_ACTION); -                    uiTimer = 2000; -                    uiPhase = 4; -                    break; -            } -        } - -        void UpdateAI(const uint32 uiDiff) -        { -            if (HasEscortState(STATE_ESCORT_NONE)) -                return; - -            npc_escortAI::UpdateAI(uiDiff); - -            if (uiPhase) -            { -                if (uiTimer <= uiDiff) -                { -                    switch (uiPhase) -                    { -                        case 1: -                            me->SetStandState(UNIT_STAND_STATE_SIT); -                            uiTimer = 1000; -                            uiPhase = 2; -                            break; -                        case 2: -                            Talk(SAY_CORPORAL_2); -                            uiTimer = 15000; -                            uiPhase = 3; -                            break; -                        case 3: -                            Talk(SAY_CORPORAL_3); -                            me->SetStandState(UNIT_STAND_STATE_STAND); -                            SetEscortPaused(false); -                            uiTimer = 0; -                            uiPhase = 0; -                            break; -                        case 4: -                            Talk(SAY_CORPORAL_4); -                            uiTimer = 2500; -                            uiPhase = 5; -                        case 5: -                            Talk(SAY_CORPORAL_5); -                            uiTimer = 0; -                            uiPhase = 0; -                    } -                } else uiTimer -= uiDiff; -            } - -            if (!UpdateVictim()) -                return; - -            if (uiMockingBlowTimer <= uiDiff) -            { -                DoCast(me->getVictim(), SPELL_MOCKING_BLOW); -                uiMockingBlowTimer = 5000; -            } else uiMockingBlowTimer -= uiDiff; - -            if (uiShieldBashTimer <= uiDiff) -            { -                DoCast(me->getVictim(), SPELL_MOCKING_BLOW); -                uiShieldBashTimer = 8000; -            } else uiShieldBashTimer -= uiDiff; - -            DoMeleeAttackIfReady(); -        } -    }; -}; -  void AddSC_redridge_mountains()  { -    new npc_corporal_keeshan();  } diff --git a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/silverpine_forest.cpp index 1960d90f28f..8c202962c70 100644 --- a/src/server/scripts/EasternKingdoms/silverpine_forest.cpp +++ b/src/server/scripts/EasternKingdoms/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" @@ -136,192 +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) -    { -        if (quest->GetQuestId() == QUEST_PYREWOOD_AMBUSH && !CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress) -        { -            CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->QuestInProgress = true; -            CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->Phase = 0; -            CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->KillCount = 0; -            CAST_AI(pyrewood_ambush::pyrewood_ambushAI, creature->AI())->PlayerGUID = player->GetGUID(); -        } - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new pyrewood_ambushAI (creature); -    } - -    struct pyrewood_ambushAI : public ScriptedAI -    { -        pyrewood_ambushAI(Creature* creature) : ScriptedAI(creature), Summons(me) -        { -           QuestInProgress = false; -        } - -        uint32 Phase; -        int8 KillCount; -        uint32 WaitTimer; -        uint64 PlayerGUID; -        SummonList Summons; - -        bool QuestInProgress; - -        void Reset() -        { -            WaitTimer = WAIT_SECS; - -            if (!QuestInProgress) //fix reset values (see UpdateVictim) -            { -                Phase = 0; -                KillCount = 0; -                PlayerGUID = 0; -                Summons.DespawnAll(); -            } -        } - -        void EnterCombat(Unit* /*who*/){} - -        void JustSummoned(Creature* summoned) -        { -            Summons.Summon(summoned); -            ++KillCount; -        } - -        void SummonedCreatureDespawn(Creature* summoned) -        { -            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 = Unit::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*/) -        { -            if (PlayerGUID) -                if (Player* player = Unit::GetPlayer(*me, PlayerGUID)) -                    if (player->GetQuestStatus(QUEST_PYREWOOD_AMBUSH) == QUEST_STATUS_INCOMPLETE) -                        player->FailQuest(QUEST_PYREWOOD_AMBUSH); -        } - -        void UpdateAI(const uint32 diff) -        { -            //sLog->outInfo(LOG_FILTER_TSCR, "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->MonsterSay(NPCSAY_INIT, LANG_UNIVERSAL, 0); //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 = Unit::GetPlayer(*me, PlayerGUID)) -                        { -                            me->MonsterSay(NPCSAY_END, LANG_UNIVERSAL, 0); //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/stormwind_city.cpp b/src/server/scripts/EasternKingdoms/stormwind_city.cpp index 47717526aaa..ef7d3ed3877 100644 --- a/src/server/scripts/EasternKingdoms/stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/stormwind_city.cpp @@ -16,632 +16,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) -    { -        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) -    { -        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 eBartleby -{ -    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) -    { -        if (quest->GetQuestId() == QUEST_BEAT) -        { -            creature->setFaction(FACTION_ENEMY); -            creature->AI()->AttackStart(player); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        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() -        { -            if (me->getFaction() != m_uiNormalFaction) -                me->setFaction(m_uiNormalFaction); -        } - -        void AttackedBy(Unit* pAttacker) -        { -            if (me->getVictim()) -                return; - -            if (me->IsFriendlyTo(pAttacker)) -                return; - -            AttackStart(pAttacker); -        } - -        void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) -        { -            if (uiDamage > me->GetHealth() || me->HealthBelowPctDamaged(15, uiDamage)) -            { -                //Take 0 damage -                uiDamage = 0; - -                if (pDoneBy->GetTypeId() == TYPEID_PLAYER) -                    CAST_PLR(pDoneBy)->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) -    { -        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) -    { -        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 eLordGregorLescovar -{ -    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 -    { -        return new npc_lord_gregor_lescovarAI(creature); -    } - -    struct npc_lord_gregor_lescovarAI : public npc_escortAI -    { -        npc_lord_gregor_lescovarAI(Creature* creature) : npc_escortAI(creature) -        { -            creature->RestoreFaction(); -        } - -        uint32 uiTimer; -        uint32 uiPhase; - -        uint64 MarzonGUID; - -        void Reset() -        { -            uiTimer = 0; -            uiPhase = 0; - -            MarzonGUID = 0; -        } - -        void EnterEvadeMode() -        { -            me->DisappearAndDie(); - -            if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) -            { -                if (pMarzon->isAlive()) -                    pMarzon->DisappearAndDie(); -            } -        } - -        void EnterCombat(Unit* who) -        { -            if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) -            { -                if (pMarzon->isAlive() && !pMarzon->isInCombat()) -                    pMarzon->AI()->AttackStart(who); -            } -        } - -        void WaypointReached(uint32 waypointId) -        { -            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(const uint32 uiDiff) -        { -            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 = Unit::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 = Unit::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 -    { -        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() -        { -            me->RestoreFaction(); -        } - -        void EnterCombat(Unit* who) -        { -            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() -        { -            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*/) -        { -            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(const uint32 /*diff*/) -        { -            if (!UpdateVictim()) -                return; - -            DoMeleeAttackIfReady(); -        } -    }; -}; - -/*###### -## npc_tyrion_spybot -######*/ - -enum eTyrionSpybot -{ -    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 -    { -        return new npc_tyrion_spybotAI(creature); -    } - -    struct npc_tyrion_spybotAI : public npc_escortAI -    { -        npc_tyrion_spybotAI(Creature* creature) : npc_escortAI(creature) {} - -        uint32 uiTimer; -        uint32 uiPhase; - -        void Reset() -        { -            uiTimer = 0; -            uiPhase = 0; -        } - -        void WaypointReached(uint32 waypointId) -        { -            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(const uint32 uiDiff) -        { -            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, ALLIANCE); -                            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()) -                                { -                                    CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID()); -                                    CAST_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 eTyrion -{ -    NPC_TYRION_SPYBOT = 8856 -}; - -class npc_tyrion : public CreatureScript -{ -public: -    npc_tyrion() : CreatureScript("npc_tyrion") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) -    { -        if (quest->GetQuestId() == QUEST_THE_ATTACK) -        { -            if (Creature* pSpybot = creature->FindNearestCreature(NPC_TYRION_SPYBOT, 5.0f, true)) -            { -                CAST_AI(npc_tyrion_spybot::npc_tyrion_spybotAI, pSpybot->AI())->Start(false, false, player->GetGUID()); -                CAST_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/swamp_of_sorrows.cpp b/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp index 099bc0770b7..0356fd170b1 100644 --- a/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp +++ b/src/server/scripts/EasternKingdoms/swamp_of_sorrows.cpp @@ -16,140 +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") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) -    { -        if (quest->GetQuestId() == QUEST_GALENS_ESCAPE) -        { -            CAST_AI(npc_galen_goodward::npc_galen_goodwardAI, creature->AI())->Start(false, false, player->GetGUID()); -            creature->setFaction(FACTION_ESCORT_N_NEUTRAL_ACTIVE); -            creature->AI()->Talk(SAY_QUEST_ACCEPTED); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_galen_goodwardAI(creature); -    } - -    struct npc_galen_goodwardAI : public npc_escortAI -    { -        npc_galen_goodwardAI(Creature* creature) : npc_escortAI(creature) -        { -            m_uiGalensCageGUID = 0; -            Reset(); -        } - -        uint64 m_uiGalensCageGUID; -        uint32 m_uiPeriodicSay; - -        void Reset() -        { -            m_uiPeriodicSay = 6000; -        } - -        void EnterCombat(Unit* who) -        { -            if (HasEscortState(STATE_ESCORT_ESCORTING)) -                Talk(SAY_ATTACKED, who->GetGUID()); -        } - -        void WaypointStart(uint32 uiPointId) -        { -            switch (uiPointId) -            { -            case 0: -                { -                    GameObject* pCage = NULL; -                    if (m_uiGalensCageGUID) -                        pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID); -                    else -                        pCage = GetClosestGameObjectWithEntry(me, GO_GALENS_CAGE, INTERACTION_DISTANCE); -                    if (pCage) -                    { -                        pCage->UseDoorOrButton(); -                        m_uiGalensCageGUID = pCage->GetGUID(); -                    } -                    break; -                } -            case 21: -                Talk(EMOTE_DISAPPEAR); -                break; -            } -        } - -        void WaypointReached(uint32 waypointId) -        { -            switch (waypointId) -            { -                case 0: -                    if (GameObject* pCage = me->GetMap()->GetGameObject(m_uiGalensCageGUID)) -                        pCage->ResetDoorOrButton(); -                    break; -                case 20: -                    if (Player* player = GetPlayerForEscort()) -                    { -                        me->SetFacingToObject(player); -                        Talk(SAY_QUEST_COMPLETE, player->GetGUID()); -                        Talk(EMOTE_WHISPER, player->GetGUID()); -                        player->GroupEventHappens(QUEST_GALENS_ESCAPE, me); -                    } -                    SetRun(true); -                    break; -            } -        } - -        void UpdateAI(const uint32 uiDiff) -        { -            npc_escortAI::UpdateAI(uiDiff); - -            if (HasEscortState(STATE_ESCORT_NONE)) -                return; - -            if (m_uiPeriodicSay < uiDiff) -            { -                if (!HasEscortState(STATE_ESCORT_ESCORTING)) -                    Talk(SAY_PERIODIC); -                m_uiPeriodicSay = 15000; -            } -            else -                m_uiPeriodicSay -= uiDiff; - -            DoMeleeAttackIfReady(); -        } -    }; -}; -  void AddSC_swamp_of_sorrows()  { -    new npc_galen_goodward();  } diff --git a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp b/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp index 22cd971a081..949ea963c02 100644 --- a/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp +++ b/src/server/scripts/EasternKingdoms/tirisfal_glades.cpp @@ -16,202 +16,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) -    { -        if (quest->GetQuestId() == QUEST_590) -        { -            creature->setFaction(FACTION_HOSTILE); -            creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -            CAST_AI(npc_calvin_montague::npc_calvin_montagueAI, creature->AI())->AttackStart(player); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_calvin_montagueAI (creature); -    } - -    struct npc_calvin_montagueAI : public ScriptedAI -    { -        npc_calvin_montagueAI(Creature* creature) : ScriptedAI(creature) { } - -        uint32 m_uiPhase; -        uint32 m_uiPhaseTimer; -        uint64 m_uiPlayerGUID; - -        void Reset() -        { -            m_uiPhase = 0; -            m_uiPhaseTimer = 5000; -            m_uiPlayerGUID = 0; - -            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*/) {} - -        void AttackedBy(Unit* pAttacker) -        { -            if (me->getVictim() || me->IsFriendlyTo(pAttacker)) -                return; - -            AttackStart(pAttacker); -        } - -        void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) -        { -            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 const diff) -        { -            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 = Unit::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 eMausoleum -{ -    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*/) -    { -        if (player->GetQuestStatus(QUEST_ULAG) != QUEST_STATUS_INCOMPLETE) -            return false; - -        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) -    { -        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 7f63c521594..49415506565 100644 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ b/src/server/scripts/Kalimdor/CMakeLists.txt @@ -101,7 +101,6 @@ set(scripts_STAT_SRCS    Kalimdor/WailingCaverns/wailing_caverns.cpp    Kalimdor/durotar.cpp    Kalimdor/felwood.cpp -  Kalimdor/boss_azuregos.cpp    Kalimdor/tanaris.cpp    Kalimdor/dustwallow_marsh.cpp    Kalimdor/winterspring.cpp @@ -111,6 +110,10 @@ set(scripts_STAT_SRCS    Kalimdor/OnyxiasLair/boss_onyxia.cpp    Kalimdor/OnyxiasLair/onyxias_lair.h    Kalimdor/OnyxiasLair/instance_onyxias_lair.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  )  message("  -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp index df180bf5568..d51a9afbb9a 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 "Opcodes.h" +#include "WorldSession.h"  enum Misc  { 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..63ee95cb3de --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp @@ -0,0 +1,391 @@ +/* + * Copyright (C) 2008-2012 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 "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_EARTH_SPIKE_ERUPT         = 75339, +     +    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: +    InstanceScript* _instance; +    Unit* _owner; +}; + +class EruptEarthSpike : public BasicEvent +{ +public: +    EruptEarthSpike(Unit* caster, WorldLocation const target) : _caster(caster), _target(target) { } + +    bool Execute(uint64 execTime, uint32 /*diff*/) +    { +        _caster->CastSpell(_target.GetPositionX(), _target.GetPositionY(), _target.GetPositionZ(), SPELL_EARTH_SPIKE_ERUPT, true); +        return true; +    } + +protected: +    Unit* _caster; +    WorldLocation const _target; +}; + +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 SendWeather(WeatherState weather, float grade) const +        { +            WorldPacket data(SMSG_WEATHER, 9); +            data << uint32(weather); +            data << float(grade); +            data << uint8(0); +            SendPacketToPlayers(&data); +        } + +        // Send packet to all players in Tomb of the Earthrager +        void SendPacketToPlayers(WorldPacket const* data) const +        { +            Map::PlayerList const& players = me->GetMap()->GetPlayers(); +            if (!players.isEmpty()) +                for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) +                    if (Player* player = itr->getSource()) +                        if (player->GetAreaId() == AREA_TOMB_OF_THE_EARTHRAGER) +                            player->GetSession()->SendPacket(data); +        } + +        void Reset() +        { +            _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) +        { +            if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_MASK_NORMAL) && !_hasDispersed) +            { +                events.SetPhase(PHASE_DISPERSE); +                _hasDispersed = true; +                 +                me->AttackStop(); +                DoCast(me, SPELL_SANDSTORM); +                SendWeather(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) +        { +            if (index == DATA_SUMMON_DEATHS) +            { +                ++_summonDeaths; +                if (_summonDeaths == 11) // All summons died +                { +                    SendWeather(WEATHER_STATE_UNK, 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*/) +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); +            Talk(SAY_AGGRO); +            _EnterCombat(); +        } + +        void JustDied(Unit* /*killer*/) +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            Talk(SAY_DEATH); +            _JustDied(); +            Cleanup(); +        } + +        void JustReachedHome() +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            _JustReachedHome(); +            instance->SetBossState(DATA_EARTHRAGER_PTAH, FAIL); +        } + +        void UpdateAI(uint32 const diff) +        { +            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: +        bool _hasDispersed; +        uint8 _summonDeaths; +    }; + +    CreatureAI* GetAI(Creature* creature) const +    { +        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() +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_earthrager_ptah_flame_bolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_earthrager_ptah_flame_bolt_SpellScript(); +        } +}; + +class spell_earthrager_ptah_earth_spike : public SpellScriptLoader +{ +public: +    spell_earthrager_ptah_earth_spike() : SpellScriptLoader("spell_earthrager_ptah_earth_spike") { } + +    class spell_earthrager_ptah_earth_spike_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_earthrager_ptah_earth_spike_SpellScript); + +        void Launch(SpellEffIndex index) +        { +            PreventHitDefaultEffect(index); +            // Erupt the spike in 4 seconds. +            GetCaster()->m_Events.AddEvent(new EruptEarthSpike(GetCaster(), *GetExplTargetDest()), GetCaster()->m_Events.CalculateTime(4000)); +        } + +        void Register() +        { +            OnEffectHit += SpellEffectFn(spell_earthrager_ptah_earth_spike_SpellScript::Launch, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); +        } +    }; + +    SpellScript* GetSpellScript() const +    { +        return new spell_earthrager_ptah_earth_spike_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, 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, 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_earth_spike(); +    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..d4f9593df03 --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp @@ -0,0 +1,404 @@ +/* + * Copyright (C) 2008-2012 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() +        { +            _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) +        { +            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, 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 const action) +        { +            if (action == ACTION_DISABLE_BEACON) +            { +                --_beacons; +                if (!_beacons) +                { +                    me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT); +                    Talk(EMOTE_UNSHIELD); +                    _phase = _oldPhase; +                } +            } +        } + +        void EnterCombat(Unit* /*who*/) +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); +            Talk(SAY_AGGRO); +            _EnterCombat(); +        } + +        void JustDied(Unit* /*killer*/) +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            Talk(SAY_DEATH); +            _JustDied(); +        } + +        void KilledUnit(Unit* victim) +        { +            if (victim->GetTypeId() == TYPEID_PLAYER) +                Talk(SAY_KILL); +        } + +        void JustReachedHome() +        { +            instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); +            _JustReachedHome(); +            instance->SetBossState(DATA_TEMPLE_GUARDIAN_ANHUUR, FAIL); +        } + +        void UpdateAI(uint32 const diff) +        { +            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 +    { +        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() +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_anhuur_shield_of_light_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENTRY); +            } +        }; +         +        SpellScript* GetSpellScript() const +        { +            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() +            { +                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 +        { +            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() +            { +                OnEffectHitTarget += SpellEffectFn(spell_anhuur_activate_beacons_SpellScript::Activate, EFFECT_0, SPELL_EFFECT_ACTIVATE_OBJECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            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..8bdd4a16c9e --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2008-2012 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 HoOScriptName "instance_halls_of_origination" + +uint32 const EncounterCount = 7; + +enum Data +{ +    // Bosses +    DATA_TEMPLE_GUARDIAN_ANHUUR, +    DATA_EARTHRAGER_PTAH, +    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, +}; + +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) +}; + +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, +}; + +enum AreaIds +{ +    AREA_TOMB_OF_THE_EARTHRAGER     = 5610, +}; + +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..726ecbacd2e --- /dev/null +++ b/src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2008-2012 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 }, +    {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)  +            { +                SetBossNumber(EncounterCount); +                LoadDoorData(doorData); +                TempleGuardianAnhuurGUID = 0; +                AnhuursBridgeGUID = 0; +                AnhuursDoorGUID = 0; +                AnhuurRightBeaconGUID = 0; +                AnhuurLeftBeaconGUID = 0; +            } +             +            void OnGameObjectCreate(GameObject* go) +            { +                switch (go->GetEntry()) +                { +                    case GO_ANHUURS_BRIDGE: +                        AnhuursBridgeGUID = go->GetGUID(); +                    case GO_DOODAD_ULDUM_ELEVATOR_COL01: +                        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; +                } +            } + +            void OnGameObjectRemove(GameObject* go) +            { +                switch (go->GetEntry()) +                { +                    case GO_ANHUURS_BRIDGE: +                    case GO_DOODAD_ULDUM_ELEVATOR_COL01: +                    case GO_ANHUURS_DOOR: +                        AddDoor(go, false); +                        break; +                } +            } + +            void OnCreatureCreate(Creature* creature) +            { +                switch (creature->GetEntry()) +                { +                    case BOSS_TEMPLE_GUARDIAN_ANHUUR: +                        TempleGuardianAnhuurGUID = creature->GetGUID(); +                        break; +                } +            } + +            uint64 GetData64(uint32 index) const +            { +                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; +                } +                 +                return 0; +            } + +            std::string GetSaveData() +            { +                OUT_SAVE_INST_DATA; + +                std::ostringstream saveStream; +                saveStream << "H O " << GetBossSaveData(); + +                OUT_SAVE_INST_DATA_COMPLETE; +                return saveStream.str(); +            } + +            void Load(const char* str) +            { +                if (!str) +                { +                    OUT_LOAD_INST_DATA_FAIL; +                    return; +                } + +                OUT_LOAD_INST_DATA(str); + +                char dataHead1, dataHead2; + +                std::istringstream loadStream(str); +                loadStream >> dataHead1 >> dataHead2; + +                if (dataHead1 == 'H' && dataHead2 == 'O') +                { +                    for (uint32 i = 0; i < EncounterCount; ++i) +                    { +                        uint32 tmpState; +                        loadStream >> tmpState; +                        if (tmpState == IN_PROGRESS || tmpState > SPECIAL) +                            tmpState = NOT_STARTED; +                        SetBossState(i, EncounterState(tmpState)); +                    } +                } +                else +                    OUT_LOAD_INST_DATA_FAIL; + +                OUT_LOAD_INST_DATA_COMPLETE; +            } + +        protected: +            uint64 TempleGuardianAnhuurGUID; +            uint64 AnhuursBridgeGUID; +            uint64 AnhuursDoorGUID; +            uint64 AnhuurRightBeaconGUID; +            uint64 AnhuurLeftBeaconGUID; +        }; +         +        InstanceScript* GetInstanceScript(InstanceMap* map) const +        { +            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/azshara.cpp b/src/server/scripts/Kalimdor/azshara.cpp index b38d1ac2c3b..1357fcaf356 100644 --- a/src/server/scripts/Kalimdor/azshara.cpp +++ b/src/server/scripts/Kalimdor/azshara.cpp @@ -16,510 +16,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 -mobs_spitelashes -npc_loramus_thalipedes -mob_rizzle_sprysprocket -mob_depth_charge -EndContentData */ - -#include "ScriptMgr.h" -#include "ScriptedCreature.h" -#include "ScriptedGossip.h" -#include "Player.h" -#include "SpellInfo.h" -#include "WorldSession.h" - -/*###### -## mobs_spitelashes -######*/ - -class mobs_spitelashes : public CreatureScript -{ -public: -    mobs_spitelashes() : CreatureScript("mobs_spitelashes") { } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new mobs_spitelashesAI (creature); -    } - -    struct mobs_spitelashesAI : public ScriptedAI -    { -        mobs_spitelashesAI(Creature* creature) : ScriptedAI(creature) {} - -        uint32 morphtimer; -        bool spellhit; - -        void Reset() -        { -            morphtimer = 0; -            spellhit = false; -        } - -        void EnterCombat(Unit* /*who*/) { } - -        void SpellHit(Unit* Hitter, const SpellInfo* Spellkind) -        { -            if (!spellhit && -                Hitter->GetTypeId() == TYPEID_PLAYER && -                CAST_PLR(Hitter)->GetQuestStatus(9364) == QUEST_STATUS_INCOMPLETE && -                (Spellkind->Id == 118 || Spellkind->Id == 12824 || Spellkind->Id == 12825 || Spellkind->Id == 12826)) -            { -                spellhit=true; -                DoCast(me, 29124);                       //become a sheep -            } -        } - -        void UpdateAI(const uint32 diff) -        { -            // 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, 28406);                   //summon copies -                    DoCast(me, 6924);                    //visual explosion -                } -            } -            if (!UpdateVictim()) -                return; - -            //TODO: add abilities for the different creatures -            DoMeleeAttackIfReady(); -        } -    }; - -}; - -/*###### -## 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) -    { -        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) -    { -        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; -    } -}; - -/*#### -# mob_rizzle_sprysprocket -####*/ - -enum RizzleSprysprocketData -{ -    QUEST_CHASING_THE_MOONSTONE     = 10994, - -    MOB_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 mob_rizzle_sprysprocket : public CreatureScript -{ -public: -    mob_rizzle_sprysprocket() : CreatureScript("mob_rizzle_sprysprocket") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) -        { -            player->CLOSE_GOSSIP_MENU(); -            creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); -            CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDieTimer = 3000; -            CAST_AI(mob_rizzle_sprysprocket::mob_rizzle_sprysprocketAI, creature->AI())->MustDie = true; -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) -    { -        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 -    { -        return new mob_rizzle_sprysprocketAI (creature); -    } - -    struct mob_rizzle_sprysprocketAI : public ScriptedAI -    { -        mob_rizzle_sprysprocketAI(Creature* creature) : ScriptedAI(creature) {} - -        uint32 SpellEscapeTimer; -        uint32 TeleportTimer; -        uint32 CheckTimer; -        uint32 GrenadeTimer; -        uint32 MustDieTimer; -        uint32 CurrWP; - -        uint64 PlayerGUID; - -        bool MustDie; -        bool Escape; -        bool ContinueWP; -        bool Reached; - -        void Reset() -        { -            SpellEscapeTimer = 1300; -            TeleportTimer = 3500; -            CheckTimer = 10000; -            GrenadeTimer = 30000; -            MustDieTimer = 3000; -            CurrWP = 0; - -            PlayerGUID = 0; - -            MustDie = false; -            Escape = false; -            ContinueWP = false; -            Reached = false; -        } - -        void UpdateAI(const uint32 diff) -        { -            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 = Unit::GetPlayer(*me, PlayerGUID); -                    if (!player) -                        return; - -                    Talk(MSG_ESCAPE_NOTICE, player->GetGUID()); -                    DoCast(me, SPELL_PERIODIC_DEPTH_CHARGE); -                    me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING); -                    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) -            { -                Player* player = Unit::GetPlayer(*me, PlayerGUID); -                if (player) -                { -                   Talk(SAY_RIZZLE_GRENADE, player->GetGUID()); -                   DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); -                } -                GrenadeTimer = 30000; -            } else GrenadeTimer -= diff; - -            if (CheckTimer <= diff) -            { -                Player* player = Unit::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; - -        } - -        void SendText(int32 iTextEntry, Player* player) -        { -            LocaleConstant loc_idx = player->GetSession()->GetSessionDbLocaleIndex(); -            const char* text = sObjectMgr->GetTrinityString(iTextEntry, loc_idx); -            sWorld->SendServerMessage(SERVER_MSG_STRING, text, player); -        } - -        void AttackStart(Unit* who) -        { -            if (!who || PlayerGUID) -                return; - -            if (who->GetTypeId() == TYPEID_PLAYER && CAST_PLR(who)->GetQuestStatus(QUEST_CHASING_THE_MOONSTONE) == QUEST_STATUS_INCOMPLETE) -            { -                PlayerGUID = who->GetGUID(); -                Talk(SAY_RIZZLE_START); -                DoCast(who, SPELL_RIZZLE_BLACKJACK, false); -                return; -            } -        } - -        void EnterCombat(Unit* /*who*/) {} - -        void MovementInform(uint32 type, uint32 id) -        { -            if (type != POINT_MOTION_TYPE) -                return; - -            if (id == 57) -            { -                me->DespawnOrUnsummon(); -                return; -            } - -            ++CurrWP; -            ContinueWP = true; -        } -    }; -}; - -/*#### -# mob_depth_charge -####*/ -class mob_depth_charge : public CreatureScript -{ -public: -    mob_depth_charge() : CreatureScript("mob_depth_charge") { } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new mob_depth_chargeAI (creature); -    } - -    struct mob_depth_chargeAI : public ScriptedAI -    { -        mob_depth_chargeAI(Creature* creature) : ScriptedAI(creature) {} - -        bool WeMustDie; -        uint32 WeMustDieTimer; - -        void Reset() -        { -            me->SetUnitMovementFlags(MOVEMENTFLAG_HOVER | MOVEMENTFLAG_SWIMMING); -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); -            WeMustDie = false; -            WeMustDieTimer = 1000; -        } - -        void UpdateAI(const uint32 diff) -        { -            if (WeMustDie) -            { -                if (WeMustDieTimer <= diff) -                    me->DespawnOrUnsummon(); -                else -                    WeMustDieTimer -= diff; -            } -            return; -        } - -        void MoveInLineOfSight(Unit* who) -        { -            if (!who) -                return; - -            if (who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 5)) -            { -                DoCast(who, SPELL_DEPTH_CHARGE_TRAP); -                WeMustDie = true; -                return; -            } -        } - -        void AttackStart(Unit* /*who*/) {} - -        void EnterCombat(Unit* /*who*/) {} -    }; -}; -  void AddSC_azshara()  { -    new mobs_spitelashes(); -    new npc_loramus_thalipedes(); -    new mob_rizzle_sprysprocket(); -    new mob_depth_charge();  } diff --git a/src/server/scripts/Kalimdor/azuremyst_isle.cpp b/src/server/scripts/Kalimdor/azuremyst_isle.cpp index 9747150e736..07f7aabe58c 100644 --- a/src/server/scripts/Kalimdor/azuremyst_isle.cpp +++ b/src/server/scripts/Kalimdor/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 */ @@ -762,7 +761,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/darkshore.cpp b/src/server/scripts/Kalimdor/darkshore.cpp index 921cc6aaf97..f1fe56b5c10 100644 --- a/src/server/scripts/Kalimdor/darkshore.cpp +++ b/src/server/scripts/Kalimdor/darkshore.cpp @@ -16,379 +16,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") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) -    { -        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->GetGUID()); -                pKerlonianAI->StartFollow(player, FACTION_KER_ESCORTEE, quest); -            } -        } - -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_kerlonianAI(creature); -    } - -    struct npc_kerlonianAI : public FollowerAI -    { -        npc_kerlonianAI(Creature* creature) : FollowerAI(creature) { } - -        uint32 FallAsleepTimer; - -        void Reset() -        { -            FallAsleepTimer = urand(10000, 45000); -        } - -        void MoveInLineOfSight(Unit* who) -        { -            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) -        { -            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(const uint32 Diff) -        { -            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(); -        } -    }; - -}; - -/*#### -# 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") { } - -    bool OnQuestAccept(Player* player, Creature* creature, const Quest* quest) -    { -        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 -    { -        return new npc_prospector_remtravelAI(creature); -    } - -    struct npc_prospector_remtravelAI : public npc_escortAI -    { -        npc_prospector_remtravelAI(Creature* creature) : npc_escortAI(creature) {} - -        void WaypointReached(uint32 waypointId) -        { -            if (Player* player = GetPlayerForEscort()) -            { -                switch (waypointId) -                { -                    case 0: -                        Talk(SAY_REM_START, player->GetGUID()); -                        break; -                    case 5: -                        Talk(SAY_REM_RAMP1_1, player->GetGUID()); -                        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->GetGUID()); -                        break; -                    case 14: -                        //depend quest rewarded? -                        Talk(SAY_REM_BOOK, player->GetGUID()); -                        break; -                    case 15: -                        Talk(SAY_REM_TENT1_1, player->GetGUID()); -                        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->GetGUID()); -                        break; -                    case 26: -                        Talk(SAY_REM_MOSS, player->GetGUID()); -                        break; -                    case 27: -                        Talk(EMOTE_REM_MOSS, player->GetGUID()); -                        break; -                    case 28: -                        Talk(SAY_REM_MOSS_PROGRESS, player->GetGUID()); -                        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->GetGUID()); -                        break; -                    case 41: -                        Talk(SAY_REM_REMEMBER, player->GetGUID()); -                        break; -                    case 42: -                        Talk(EMOTE_REM_END, player->GetGUID()); -                        player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me); -                        break; -                } -            } -        } - -        void Reset() {} - -        void EnterCombat(Unit* who) -        { -            if (urand(0, 1)) -                Talk(SAY_REM_AGGRO, who->GetGUID()); -        } - -        void JustSummoned(Creature* /*pSummoned*/) -        { -            //unsure if it should be any -            //pSummoned->AI()->AttackStart(me); -        } -    }; - -}; - -/*#### -# 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") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        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) -    { -        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 -    { -        return new npc_threshwackonatorAI(creature); -    } - -    struct npc_threshwackonatorAI : public FollowerAI -    { -        npc_threshwackonatorAI(Creature* creature) : FollowerAI(creature) { } - -        void Reset() { } - -        void MoveInLineOfSight(Unit* who) -        { -            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->GetGUID()); -                    DoAtEnd(); -                } -            } -        } - -        void DoAtEnd() -        { -            me->setFaction(FACTION_HOSTILE); - -            if (Player* pHolder = GetLeaderForFollower()) -                me->AI()->AttackStart(pHolder); - -            SetFollowComplete(); -        } -    }; - -}; -  void AddSC_darkshore()  { -    new npc_kerlonian(); -    new npc_prospector_remtravel(); -    new npc_threshwackonator();  } diff --git a/src/server/scripts/Kalimdor/desolace.cpp b/src/server/scripts/Kalimdor/desolace.cpp index 8c56714e614..b30b73a3e8f 100644 --- a/src/server/scripts/Kalimdor/desolace.cpp +++ b/src/server/scripts/Kalimdor/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 */ @@ -174,104 +172,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) -        { -            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") { } - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) -    { -        if (quest->GetQuestId() == QUEST_RETURN_TO_VAHLARRIEL) -       { -            if (npc_escortAI* pEscortAI = CAST_AI(npc_dalinda::npc_dalindaAI, creature->AI())) -            { -                pEscortAI->Start(true, false, player->GetGUID()); -                creature->setFaction(113); -            } -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_dalindaAI(creature); -    } - -    struct npc_dalindaAI : public npc_escortAI -    { -        npc_dalindaAI(Creature* creature) : npc_escortAI(creature) { } - -        void WaypointReached(uint32 waypointId) -        { -            Player* player = GetPlayerForEscort(); - -            switch (waypointId) -            { -                case 1: -                    me->IsStandState(); -                    break; -                case 15: -                    if (player) -                        player->GroupEventHappens(QUEST_RETURN_TO_VAHLARRIEL, me); -                    break; -            } -        } - -        void EnterCombat(Unit* /*who*/) { } - -        void Reset() {} - -        void JustDied(Unit* /*killer*/) -        { -            if (Player* player = GetPlayerForEscort()) -                player->FailQuest(QUEST_RETURN_TO_VAHLARRIEL); -            return; -        } - -        void UpdateAI(const uint32 Diff) -        { -            npc_escortAI::UpdateAI(Diff); -            if (!UpdateVictim()) -                return; -            DoMeleeAttackIfReady(); -        } -    }; -}; - -/*######  ## go_demon_portal  ######*/ @@ -302,7 +202,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/durotar.cpp b/src/server/scripts/Kalimdor/durotar.cpp index 04e65693154..0d769f62426 100644 --- a/src/server/scripts/Kalimdor/durotar.cpp +++ b/src/server/scripts/Kalimdor/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 @@ -91,7 +90,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; @@ -102,431 +101,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 Scripted_NoMovementAI -        { -           npc_tiger_matriarch_creditAI(Creature* creature) : Scripted_NoMovementAI(creature) -           { -               events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 2000); -           } - -            void UpdateAI(uint32 const diff) -            { -                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->GetGUID()); -                                } -                        } -                    } - -                    events.ScheduleEvent(EVENT_CHECK_SUMMON_AURA, 5000); -                } -            } - -        private: -            EventMap events; -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new npc_tiger_matriarch_creditAI(creature); -        } -}; - -class npc_tiger_matriarch : public CreatureScript -{ -    public: -        npc_tiger_matriarch() : CreatureScript("npc_tiger_matriarch") {} - -        struct npc_tiger_matriarchAI : public ScriptedAI -        { -            npc_tiger_matriarchAI(Creature* creature) : ScriptedAI(creature), -                _tigerGuid(0) -            { -            } - -            void EnterCombat(Unit* /*target*/) -            { -                _events.Reset(); -                _events.ScheduleEvent(EVENT_POUNCE, 100); -                _events.ScheduleEvent(EVENT_NOSUMMON, 50000); -            } - -            void IsSummonedBy(Unit* summoner) -            { -                if (summoner->GetTypeId() != TYPEID_PLAYER || !summoner->GetVehicle()) -                    return; - -                _tigerGuid = summoner->GetVehicle()->GetBase()->GetGUID(); -                if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) -                { -                    me->AddThreat(tiger, 500000.0f); -                    DoCast(me, SPELL_FURIOUS_BITE); -                } -            } - -            void KilledUnit(Unit* victim) -            { -                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) -            { -                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(const uint32 diff) -            { -                if (!UpdateVictim()) -                    return; - -                if (!_tigerGuid) -                    return; - -                _events.Update(diff); - -                while (uint32 eventId = _events.ExecuteEvent()) -                { -                    switch (eventId) -                    { -                        case EVENT_POUNCE: -                            DoCastVictim(SPELL_POUNCE); -                            _events.ScheduleEvent(EVENT_POUNCE, 30000); -                            break; -                        case EVENT_NOSUMMON: // Reapply SPELL_NO_SUMMON_AURA -                            if (Unit* tiger = ObjectAccessor::GetUnit(*me, _tigerGuid)) -                            { -                                if (tiger->isSummon()) -                                    if (Unit* vehSummoner = tiger->ToTempSummon()->GetSummoner()) -                                        me->AddAura(SPELL_NO_SUMMON_AURA, vehSummoner); -                            } -                            _events.ScheduleEvent(EVENT_NOSUMMON, 50000); -                            break; -                        default: -                            break; -                    } -                } - -                DoMeleeAttackIfReady(); -            } - -        private: -            EventMap _events; -            uint64 _tigerGuid; -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new npc_tiger_matriarchAI(creature); -        } -}; - -// These models was found in sniff. -// TODO: generalize these models with race from dbc -uint32 const trollmodel[] = -{11665, 11734, 11750, 12037, 12038, 12042, 12049, 12849, 13529, 14759, 15570, 15701, -15702, 1882, 1897, 1976, 2025, 27286, 2734, 2735, 4084, 4085, 4087, 4089, 4231, 4357, -4358, 4360, 4361, 4362, 4363, 4370, 4532, 4537, 4540, 4610, 6839, 7037, 9767, 9768}; - -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) -            { -            } - -            void InitializeAI() -            { -                if (me->isDead() || !me->GetOwner()) -                    return; - -                Reset(); - -                switch (urand(0, 3)) -                { -                    case 0: -                        _mountModel = 6471; -                        break; -                    case 1: -                        _mountModel = 6473; -                        break; -                    case 2: -                        _mountModel = 6469; -                        break; -                    default: -                        _mountModel = 6472; -                        break; -                } -                me->SetDisplayId(trollmodel[urand(0, 39)]); -                if (Player* player = me->GetOwner()->ToPlayer()) -                    me->GetMotionMaster()->MoveFollow(player, 5.0f, float(rand_norm() + 1.0f) * M_PI / 3.0f * 4.0f); -            } - -            void Reset() -            { -                _complete = false; -                me->AddAura(SPELL_VOLUNTEER_AURA, me); -                me->AddAura(SPELL_MOUNTING_CHECK, me); -                DoCast(me, SPELL_PETACT_AURA); -                me->SetReactState(REACT_PASSIVE); -                Talk(SAY_VOLUNTEER_START); -            } - -            // This is needed for mount check aura to know what mountmodel the npc got stored -            uint32 GetMountId() -            { -                return _mountModel; -            } - -            void MovementInform(uint32 type, uint32 id) -            { -                if (type != POINT_MOTION_TYPE) -                    return; -                if (id == POINT_URUZIN) -                    me->DespawnOrUnsummon(); -            } - -            void SpellHit(Unit* caster, SpellInfo const* spell) -            { -                if (spell->Id == SPELL_AOE_TURNIN && caster->GetEntry() == NPC_URUZIN && !_complete) -                { -                    _complete = true;    // Preventing from giving credit twice -                    DoCast(me, SPELL_TURNIN); -                    DoCast(me, SPELL_QUEST_CREDIT); -                    me->RemoveAurasDueToSpell(SPELL_MOUNTING_CHECK); -                    me->Dismount(); -                    Talk(SAY_VOLUNTEER_END); -                    me->GetMotionMaster()->MovePoint(POINT_URUZIN, caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); -                } -            } - -        private: -            uint32 _mountModel; -            bool _complete; -        }; - -        CreatureAI* GetAI(Creature* creature) const -        { -            return new npc_troll_volunteerAI(creature); -        } -}; - -typedef npc_troll_volunteer::npc_troll_volunteerAI VolunteerAI; - -class spell_mount_check : public SpellScriptLoader -{ -    public: -        spell_mount_check() : SpellScriptLoader("spell_mount_check") {} - -        class spell_mount_check_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_mount_check_AuraScript) -            bool Validate(SpellInfo const* /*spellEntry*/) -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_MOUNTING_CHECK)) -                    return false; -                return true; -            } - -            void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) -            { -                Unit* target = GetTarget(); -                Unit* owner = target->GetOwner(); - -                if (!owner) -                    return; - -                if (owner->IsMounted() && !target->IsMounted()) -                { -                    if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI())) -                        target->Mount(volunteerAI->GetMountId()); -                } -                else if (!owner->IsMounted() && target->IsMounted()) -                    target->Dismount(); - -                target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN)); -                target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK)); -            } - -            void Register() -            { -                OnEffectPeriodic += AuraEffectPeriodicFn(spell_mount_check_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); -            } -        }; - -        AuraScript* GetAuraScript() const -        { -            return new spell_mount_check_AuraScript(); -        } -}; - -class spell_voljin_war_drums : public SpellScriptLoader -{ -    public: -        spell_voljin_war_drums() : SpellScriptLoader("spell_voljin_war_drums") {} - -        class spell_voljin_war_drums_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_voljin_war_drums_SpellScript) -            bool Validate(SpellInfo const* /*spellEntry*/) -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_1)) -                    return false; -                if (!sSpellMgr->GetSpellInfo(SPELL_MOTIVATE_2)) -                    return false; -               return true; -            } - -            void HandleDummy(SpellEffIndex /*effIndex*/) -            { -                Unit* caster = GetCaster(); -                if (Unit* target = GetHitUnit()) -                { -                    uint32 motivate = 0; -                    if (target->GetEntry() == NPC_CITIZEN_1) -                        motivate = SPELL_MOTIVATE_1; -                    else if (target->GetEntry() == NPC_CITIZEN_2) -                        motivate = SPELL_MOTIVATE_2; -                    if (motivate) -                        caster->CastSpell(target, motivate, false); -                } -            } - -            void Register() -            { -                OnEffectHitTarget += SpellEffectFn(spell_voljin_war_drums_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -            } -        }; - -        SpellScript* GetSpellScript() const -        { -            return new spell_voljin_war_drums_SpellScript(); -        } -}; -  enum VoodooSpells  {      SPELL_BREW      = 16712, // Special Brew @@ -546,9 +120,9 @@ class spell_voodoo : public SpellScriptLoader          class spell_voodoo_SpellScript : public SpellScript          { -            PrepareSpellScript(spell_voodoo_SpellScript) +            PrepareSpellScript(spell_voodoo_SpellScript); -            bool Validate(SpellInfo const* /*spellEntry*/) +            bool Validate(SpellInfo const* /*spell*/)              {                  if (!sSpellMgr->GetSpellInfo(SPELL_BREW) || !sSpellMgr->GetSpellInfo(SPELL_GHOSTLY) ||                      !sSpellMgr->GetSpellInfo(SPELL_HEX1) || !sSpellMgr->GetSpellInfo(SPELL_HEX2) || @@ -580,10 +154,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/dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/dustwallow_marsh.cpp index 40ec3141ee9..e1a75cbe9f8 100644 --- a/src/server/scripts/Kalimdor/dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/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 -mobs_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" @@ -766,13 +763,7 @@ public:  void AddSC_dustwallow_marsh()  { -    new mobs_risen_husk_spirit(); -    new npc_lady_jaina_proudmoore(); -    new npc_nat_pagle(); -    new npc_private_hendel(); -    new npc_zelfrax();      new npc_stinky(); -    new npc_theramore_guard();      new spell_ooze_zap();      new spell_ooze_zap_channel_end();      new spell_energize_aoe(); diff --git a/src/server/scripts/Kalimdor/felwood.cpp b/src/server/scripts/Kalimdor/felwood.cpp index f1d9a9028e1..e0a28ea86a0 100644 --- a/src/server/scripts/Kalimdor/felwood.cpp +++ b/src/server/scripts/Kalimdor/felwood.cpp @@ -19,12 +19,11 @@  /* ScriptData  SDName: Felwood  SD%Complete: 95 -SDComment: Quest support: 4101, 4102 +SDComment: Quest support:  SDCategory: Felwood  EndScriptData */  /* ContentData -npcs_riverbreeze_and_silversky  EndContentData */  #include "ScriptMgr.h" @@ -32,75 +31,6 @@ EndContentData */  #include "ScriptedGossip.h"  #include "Player.h" -/*###### -## npcs_riverbreeze_and_silversky -######*/ - -#define GOSSIP_ITEM_BEACON  "Please make me a Cenarion Beacon" - -enum RiverbreezeAndSilversky -{ -    SPELL_CENARION_BEACON       = 15120, - -    NPC_ARATHANDRIS_SILVERSKY   = 9528, -    NPC_MAYBESS_RIVERBREEZE     = 9529, - -    QUEST_CLEASING_FELWOOD_A    = 4101, -    QUEST_CLEASING_FELWOOD_H    = 4102 -}; - -class npcs_riverbreeze_and_silversky : public CreatureScript -{ -public: -    npcs_riverbreeze_and_silversky() : CreatureScript("npcs_riverbreeze_and_silversky") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_INFO_DEF+1) -        { -            player->CLOSE_GOSSIP_MENU(); -            creature->CastSpell(player, SPELL_CENARION_BEACON, false); -        } -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) -    { -        if (creature->isQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        uint32 creatureId = creature->GetEntry(); - -        if (creatureId == NPC_ARATHANDRIS_SILVERSKY) -        { -            if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_A)) -            { -                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()); -        } - -        if (creatureId == NPC_MAYBESS_RIVERBREEZE) -        { -            if (player->GetQuestRewardStatus(QUEST_CLEASING_FELWOOD_H)) -            { -                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()); -        } - -        return true; -    } -}; -  void AddSC_felwood()  { -    new npcs_riverbreeze_and_silversky();  } diff --git a/src/server/scripts/Kalimdor/feralas.cpp b/src/server/scripts/Kalimdor/feralas.cpp index 148f53c9e57..850321133b4 100644 --- a/src/server/scripts/Kalimdor/feralas.cpp +++ b/src/server/scripts/Kalimdor/feralas.cpp @@ -16,234 +16,7 @@   * with this program. If not, see <http://www.gnu.org/licenses/>.   */ -/* ScriptData -SDName: Feralas -SD%Complete: 100 -SDComment: Quest support: 3520, 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) -    { -        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) -    { -        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) -    { -        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 -    { -        return new npc_oox22feAI(creature); -    } - -    struct npc_oox22feAI : public npc_escortAI -    { -        npc_oox22feAI(Creature* creature) : npc_escortAI(creature) { } - -        void WaypointReached(uint32 waypointId) -        { -            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() -        { -            if (!HasEscortState(STATE_ESCORT_ESCORTING)) -                me->SetStandState(UNIT_STAND_STATE_DEAD); -        } - -        void EnterCombat(Unit* /*who*/) -        { -            //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) -        { -            summoned->AI()->AttackStart(me); -        } -    }; - -}; - -/*###### -## npc_screecher_spirit -######*/ - -class npc_screecher_spirit : public CreatureScript -{ -public: -    npc_screecher_spirit() : CreatureScript("npc_screecher_spirit") { } - -    bool OnGossipHello(Player* player, Creature* creature) -    { -        player->SEND_GOSSIP_MENU(2039, creature->GetGUID()); -        player->TalkedToCreature(creature->GetEntry(), creature->GetGUID()); -        creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - -        return true; -    } - -}; - -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); -            } - -            void Register() -            { -                OnCast += SpellCastFn(spell_gordunni_trap_SpellScript::HandleDummy); -            } -        }; - -        SpellScript* GetSpellScript() const -        { -            return new spell_gordunni_trap_SpellScript(); -        } -}; - -/*###### -## AddSC -######*/ -  void AddSC_feralas()  { -    new npc_gregan_brewspewer(); -    new npc_oox22fe(); -    new npc_screecher_spirit(); -    new spell_gordunni_trap(); +  } diff --git a/src/server/scripts/Kalimdor/moonglade.cpp b/src/server/scripts/Kalimdor/moonglade.cpp index 14a76cc153e..bcf67271179 100644 --- a/src/server/scripts/Kalimdor/moonglade.cpp +++ b/src/server/scripts/Kalimdor/moonglade.cpp @@ -18,17 +18,13 @@  /* ScriptData  SDName: Moonglade -SD%Complete: 100 -SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class. +SD%Complete: 0 +SDComment: Quest support:  SDCategory: Moonglade  EndScriptData */  /* ContentData -npc_bunthen_plainswind -npc_great_bear_spirit -npc_silva_filnaveth -npc_clintar_spirit -npc_clintar_dreamwalker +npc_omen  EndContentData */  #include "ScriptMgr.h" diff --git a/src/server/scripts/Kalimdor/mulgore.cpp b/src/server/scripts/Kalimdor/mulgore.cpp index a86f891c6c0..72e1e87bdf4 100644 --- a/src/server/scripts/Kalimdor/mulgore.cpp +++ b/src/server/scripts/Kalimdor/mulgore.cpp @@ -19,14 +19,13 @@  /* ScriptData  SDName: Mulgore  SD%Complete: 100 -SDComment: Support for quest: 11129, 772 +SDComment: Support for quest: 11129, 861  SDCategory: Mulgore  EndScriptData */  /* ContentData  npc_skorn_whitecloud  npc_kyle_frenzied -npc_plains_vision  EndContentData */  #include "ScriptMgr.h" @@ -201,127 +200,8 @@ 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 -    { -          return new npc_plains_visionAI (creature); -    } - -    struct npc_plains_visionAI  : public ScriptedAI -    { -        npc_plains_visionAI(Creature* creature) : ScriptedAI(creature) {} - -        bool newWaypoint; -        uint8 WayPointId; -        uint8 amountWP; - -        void Reset() -        { -            WayPointId = 0; -            newWaypoint = true; -            amountWP  = 49; -        } - -        void EnterCombat(Unit* /*who*/){} - -        void MovementInform(uint32 type, uint32 id) -        { -            if (type != POINT_MOTION_TYPE) -                return; - -            if (id < amountWP) -            { -                ++WayPointId; -                newWaypoint = true; -            } -            else -            { -                me->setDeathState(JUST_DIED); -                me->RemoveCorpse(); -            } -        } - -        void UpdateAI(const uint32 /*diff*/) -        { -            if (newWaypoint) -            { -                me->GetMotionMaster()->MovePoint(WayPointId, wpPlainVision[WayPointId]); -                newWaypoint = false; -            } -        } -    }; - -}; - -/*##### -# -######*/ -  void AddSC_mulgore()  {      new npc_skorn_whitecloud();      new npc_kyle_frenzied(); -    new npc_plains_vision();  } diff --git a/src/server/scripts/Kalimdor/orgrimmar.cpp b/src/server/scripts/Kalimdor/orgrimmar.cpp index 5080daefbf9..5b8eaeb2c5c 100644 --- a/src/server/scripts/Kalimdor/orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/orgrimmar.cpp @@ -18,14 +18,12 @@  /* ScriptData  SDName: Orgrimmar -SD%Complete: 100 -SDComment: Quest support: 2460, 6566 +SD%Complete: 0 +SDComment: Quest support:  SDCategory: Orgrimmar  EndScriptData */  /* ContentData -npc_shenthul -npc_thrall_warchief  EndContentData */  #include "ScriptMgr.h" @@ -33,222 +31,6 @@ EndContentData */  #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) -    { -        if (quest->GetQuestId() == QUEST_SHATTERED_SALUTE) -        { -            CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->CanTalk = true; -            CAST_AI(npc_shenthul::npc_shenthulAI, creature->AI())->PlayerGUID = player->GetGUID(); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_shenthulAI (creature); -    } - -    struct npc_shenthulAI : public ScriptedAI -    { -        npc_shenthulAI(Creature* creature) : ScriptedAI(creature) {} - -        bool CanTalk; -        bool CanEmote; -        uint32 SaluteTimer; -        uint32 ResetTimer; -        uint64 PlayerGUID; - -        void Reset() -        { -            CanTalk = false; -            CanEmote = false; -            SaluteTimer = 6000; -            ResetTimer = 0; -            PlayerGUID = 0; -        } - -        void EnterCombat(Unit* /*who*/) {} - -        void UpdateAI(const uint32 diff) -        { -            if (CanEmote) -            { -                if (ResetTimer <= diff) -                { -                    if (Player* player = Unit::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) -        { -            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) -    { -        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) -    { -        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 -    { -        return new npc_thrall_warchiefAI (creature); -    } - -    struct npc_thrall_warchiefAI : public ScriptedAI -    { -        npc_thrall_warchiefAI(Creature* creature) : ScriptedAI(creature) {} - -        uint32 ChainLightningTimer; -        uint32 ShockTimer; - -        void Reset() -        { -            ChainLightningTimer = 2000; -            ShockTimer = 8000; -        } - -        void EnterCombat(Unit* /*who*/) {} - -        void UpdateAI(const uint32 diff) -        { -            if (!UpdateVictim()) -                return; - -            if (ChainLightningTimer <= diff) -            { -                DoCast(me->getVictim(), SPELL_CHAIN_LIGHTNING); -                ChainLightningTimer = 9000; -            } else ChainLightningTimer -= diff; - -            if (ShockTimer <= diff) -            { -                DoCast(me->getVictim(), 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/silithus.cpp b/src/server/scripts/Kalimdor/silithus.cpp index f9b16b907eb..d88a6a79543 100644 --- a/src/server/scripts/Kalimdor/silithus.cpp +++ b/src/server/scripts/Kalimdor/silithus.cpp @@ -19,14 +19,14 @@  /* ScriptData  SDName: Silithus  SD%Complete: 100 -SDComment: Quest support: 7785, 8304, 8507. +SDComment: Quest support: 7785, 8304.  SDCategory: Silithus  EndScriptData */  /* ContentData  npc_highlord_demitrian  npcs_rutgar_and_frankal -quest_a_pawn_on_the_eternal_pawn +go_wind_stone  EndContentData */  #include "ScriptMgr.h" @@ -1505,10 +1505,6 @@ class go_wind_stone : public GameObjectScript  void AddSC_silithus()  { -    new go_crystalline_tear(); -    new npc_anachronos_quest_trigger(); -    new npc_anachronos_the_ancient(); -    new mob_qiraj_war_spawn();      new npc_highlord_demitrian();      new npcs_rutgar_and_frankal();      new go_wind_stone(); diff --git a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp b/src/server/scripts/Kalimdor/stonetalon_mountains.cpp index 033274f8561..f734fd0e518 100644 --- a/src/server/scripts/Kalimdor/stonetalon_mountains.cpp +++ b/src/server/scripts/Kalimdor/stonetalon_mountains.cpp @@ -16,164 +16,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) -    { -        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) -    { -        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) -        { -            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) -        { -            summoned->AI()->AttackStart(me); -        } - -        void Reset(){} -    }; - -    bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) -    { -        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 -    { -        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/tanaris.cpp b/src/server/scripts/Kalimdor/tanaris.cpp index b7644395571..5571280f247 100644 --- a/src/server/scripts/Kalimdor/tanaris.cpp +++ b/src/server/scripts/Kalimdor/tanaris.cpp @@ -19,18 +19,14 @@  /* ScriptData  SDName: Tanaris  SD%Complete: 80 -SDComment: Quest support: 648, 1560, 2954, 4005, 10277, 10279(Special flight path). Noggenfogger vendor +SDComment: Quest support: 648, 10277, 10279(Special flight path).  SDCategory: Tanaris  EndScriptData */  /* ContentData -mob_aquementas  npc_custodian_of_time -npc_marin_noggenfogger  npc_steward_of_time -npc_stone_watcher_of_norgannon  npc_OOX17 -npc_tooga  EndContentData */  #include "ScriptMgr.h" @@ -279,39 +275,6 @@ public:  };  /*###### -## npc_marin_noggenfogger -######*/ - -class npc_marin_noggenfogger : public CreatureScript -{ -public: -    npc_marin_noggenfogger() : CreatureScript("npc_marin_noggenfogger") { } - -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        player->PlayerTalkClass->ClearMenus(); -        if (action == GOSSIP_ACTION_TRADE) -            player->GetSession()->SendListInventory(creature->GetGUID()); - -        return true; -    } - -    bool OnGossipHello(Player* player, Creature* creature) -    { -        if (creature->isQuestGiver()) -            player->PrepareQuestMenu(creature->GetGUID()); - -        if (creature->isVendor() && player->GetQuestRewardStatus(2662)) -            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; -    } - -}; - -/*######  ## npc_steward_of_time  ######*/ @@ -358,70 +321,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) -    { -        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) -    { -        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  ######*/ @@ -675,11 +574,7 @@ public:  void AddSC_tanaris()  { -    new mob_aquementas();      new npc_custodian_of_time(); -    new npc_marin_noggenfogger();      new npc_steward_of_time(); -    new npc_stone_watcher_of_norgannon();      new npc_OOX17(); -    new npc_tooga();  } diff --git a/src/server/scripts/Kalimdor/the_barrens.cpp b/src/server/scripts/Kalimdor/the_barrens.cpp index 9417e7993f7..05a3074f209 100644 --- a/src/server/scripts/Kalimdor/the_barrens.cpp +++ b/src/server/scripts/Kalimdor/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 */ @@ -686,10 +681,5 @@ public:  void AddSC_the_barrens()  { -    new npc_beaten_corpse(); -    new npc_gilthares(); -    new npc_sputtervalve(); -    new npc_taskmaster_fizzule(); -    new npc_twiggy_flathead();      new npc_wizzlecrank_shredder();  } diff --git a/src/server/scripts/Kalimdor/thousand_needles.cpp b/src/server/scripts/Kalimdor/thousand_needles.cpp index ec75d8fe2ac..a7c81e64810 100644 --- a/src/server/scripts/Kalimdor/thousand_needles.cpp +++ b/src/server/scripts/Kalimdor/thousand_needles.cpp @@ -16,448 +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) -    { -        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 -    { -        return new npc_kanatiAI(creature); -    } - -    struct npc_kanatiAI : public npc_escortAI -    { -        npc_kanatiAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() {} - -        void WaypointReached(uint32 waypointId) -        { -            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) -        { -            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) -    { -        if (quest->GetQuestId() == QUEST_FREE_AT_LAST) -        { -            creature->AI()->Talk(SAY_LAKO_START, player->GetGUID()); -            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 -    { -        return new npc_lakota_windsongAI(creature); -    } - -    struct npc_lakota_windsongAI : public npc_escortAI -    { -        npc_lakota_windsongAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() {} - -        void WaypointReached(uint32 waypointId) -        { -            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) -    { -        if (quest->GetQuestId() == QUEST_HOMEWARD) -        { -            creature->AI()->Talk(SAY_START, player->GetGUID()); -            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 -    { -        return new npc_paoka_swiftmountainAI(creature); -    } - -    struct npc_paoka_swiftmountainAI : public npc_escortAI -    { -        npc_paoka_swiftmountainAI(Creature* creature) : npc_escortAI(creature) { } - -        void Reset() {} - -        void WaypointReached(uint32 waypointId) -        { -            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) -    { -        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) -    { -        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 -    { -        return new npc_pluckyAI(creature); -    } - -    struct npc_pluckyAI : public ScriptedAI -    { -        npc_pluckyAI(Creature* creature) : ScriptedAI(creature) { NormFaction = creature->getFaction(); } - -        uint32 NormFaction; -        uint32 ResetTimer; - -        void Reset() -        { -            ResetTimer = 120000; - -            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) -        { -            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(const uint32 Diff) -        { -            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) -    { -        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 -    { -        return new npc_enraged_pantherAI(creature); -    } - -    struct npc_enraged_pantherAI : public ScriptedAI -    { -        npc_enraged_pantherAI(Creature* creature) : ScriptedAI(creature) {} - -        void Reset() -        { -            me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -            me->SetReactState(REACT_PASSIVE); -        } - -        void UpdateAI(const uint32 /*diff*/) -        { -            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/thunder_bluff.cpp b/src/server/scripts/Kalimdor/thunder_bluff.cpp index 1b10a3a204b..dab7b861019 100644 --- a/src/server/scripts/Kalimdor/thunder_bluff.cpp +++ b/src/server/scripts/Kalimdor/thunder_bluff.cpp @@ -48,30 +48,6 @@ class npc_cairne_bloodhoof : public CreatureScript  public:      npc_cairne_bloodhoof() : CreatureScript("npc_cairne_bloodhoof") { } -    bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) -    { -        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) -    { -        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      {          return new npc_cairne_bloodhoofAI (creature); diff --git a/src/server/scripts/Kalimdor/ungoro_crater.cpp b/src/server/scripts/Kalimdor/ungoro_crater.cpp index 801855e7249..7e69daed72e 100644 --- a/src/server/scripts/Kalimdor/ungoro_crater.cpp +++ b/src/server/scripts/Kalimdor/ungoro_crater.cpp @@ -16,333 +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) -    { -        if (quest->GetQuestId() == QUEST_CHASING_AME) -        { -            CAST_AI(npc_escortAI, (creature->AI()))->Start(false, false, player->GetGUID()); -            creature->AI()->Talk(SAY_READY, player->GetGUID()); -            creature->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); -            // Change faction so mobs attack -            creature->setFaction(113); -        } -        return true; -    } - -    CreatureAI* GetAI(Creature* creature) const -    { -        return new npc_ameAI(creature); -    } - -    struct npc_ameAI : public npc_escortAI -    { -        npc_ameAI(Creature* creature) : npc_escortAI(creature) {} - -        uint32 DemoralizingShoutTimer; - -        void WaypointReached(uint32 waypointId) -        { -            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->GetGUID()); -                        break; -                    case 28: -                        Talk(SAY_SEARCH, player->GetGUID()); -                        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->GetGUID()); -                        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->GetGUID()); -                        break; -                    case 55: -                        Talk(SAY_FINISH, player->GetGUID()); -                        player->GroupEventHappens(QUEST_CHASING_AME, me); -                        break; -                } -            } -        } - -        void Reset() -        { -            DemoralizingShoutTimer = 5000; -        } - -        void JustSummoned(Creature* summoned) -        { -            summoned->AI()->AttackStart(me); -        } - -        void JustDied(Unit* /*killer*/) -        { -            if (Player* player = GetPlayerForEscort()) -                player->FailQuest(QUEST_CHASING_AME); -        } - -        void UpdateAI(const uint32 diff) -        { -            npc_escortAI::UpdateAI(diff); -            if (!UpdateVictim()) -                return; - -            if (DemoralizingShoutTimer <= diff) -            { -                DoCast(me->getVictim(), 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) -    { -        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 -    { -        return new npc_ringoAI(creature); -    } - -    struct npc_ringoAI : public FollowerAI -    { -        npc_ringoAI(Creature* creature) : FollowerAI(creature) { } - -        uint32 FaintTimer; -        uint32 EndEventProgress; -        uint32 EndEventTimer; - -        uint64 SpraggleGUID; - -        void Reset() -        { -            FaintTimer = urand(30000, 60000); -            EndEventProgress = 0; -            EndEventTimer = 1000; -            SpraggleGUID = 0; -        } - -        void MoveInLineOfSight(Unit* who) -        { -            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) -        { -            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(const uint32 Diff) -        { -            if (!UpdateVictim()) -            { -                if (HasFollowState(STATE_FOLLOW_POSTEVENT)) -                { -                    if (EndEventTimer <= Diff) -                    { -                        Creature* spraggle = Creature::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/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 2bb2b1c3cd7..9acfb49efa5 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" @@ -1018,7 +1017,7 @@ class npc_meteor_strike_initial : public CreatureScript                      _meteorList.clear();                      for (uint8 i = 0; i < 4; i++)                      { -                        angle[i] = MapManager::NormalizeOrientation(angle[i]); +                        angle[i] = Position::NormalizeOrientation(angle[i]);                          me->SetOrientation(angle[i]);                          me->GetNearPosition(newPos, 10.0f, 0.0f); // Exact distance                          if (Creature* meteor = me->SummonCreature(NPC_METEOR_STRIKE_NORTH + i, newPos, TEMPSUMMON_TIMED_DESPAWN, 30000)) 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 35a22c6bf37..b0db72b53c5 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.t_guid && +            !pGrandChampion2->m_movementInfo.t_guid && +            !pGrandChampion3->m_movementInfo.t_guid)              return true;      } @@ -386,7 +386,7 @@ public:                  }              }else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.t_guid)                  return;              if (uiInterceptTimer <= uiDiff) @@ -530,7 +530,7 @@ public:                  uiFireBallTimer = 5000;              } else uiFireBallTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.t_guid)                  return;              if (uiFireBallTimer <= uiDiff) @@ -668,7 +668,7 @@ public:                  }              }else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.t_guid)                  return;              if (uiChainLightningTimer <= uiDiff) @@ -814,7 +814,7 @@ public:                  }              }else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.t_guid)                  return;              if (uiLightningArrowsTimer <= uiDiff) @@ -962,7 +962,7 @@ public:                  }              } else uiPhaseTimer -= uiDiff; -            if (!UpdateVictim() || me->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT)) +            if (!UpdateVictim() || me->m_movementInfo.t_guid)                  return;              if (uiEviscerateTimer <= uiDiff) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 40781169f44..8fc37e9f7da 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -1251,6 +1251,7 @@ class spell_deathbringer_blood_nova_targeting : public SpellScriptLoader                  OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);                  OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_deathbringer_blood_nova_targeting_SpellScript::FilterTargetsSubsequent, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);                  OnEffectHitTarget += SpellEffectFn(spell_deathbringer_blood_nova_targeting_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST); +                OnEffectHitTarget += SpellEffectFn(spell_deathbringer_blood_nova_targeting_SpellScript::HandleForceCast, EFFECT_0, SPELL_EFFECT_FORCE_CAST);              }              WorldObject* target; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index 8e7f891663e..d635854da8b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -358,7 +358,7 @@ class boss_lady_deathwhisper : public CreatureScript              void DamageTaken(Unit* /*damageDealer*/, uint32& damage)              {                  // phase transition -                if (events.GetPhaseMask() & PHASE_ONE_MASK && damage > me->GetPower(POWER_MANA)) +                if (events.GetPhaseMask() & PHASE_ONE_MASK && damage > (uint32)me->GetPower(POWER_MANA))                  {                      Talk(SAY_PHASE_2);                      Talk(EMOTE_PHASE_2); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp index 263d70c6a50..0c037904d2c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp @@ -304,7 +304,6 @@ class npc_coldflame : public CreatureScript                      {                          Position const* ownerPos = marrowgarAI->GetLastColdflamePosition();                          float ang = me->GetAngle(ownerPos) - static_cast<float>(M_PI); -                        MapManager::NormalizeOrientation(ang);                          me->SetOrientation(ang);                          owner->GetNearPosition(pos, 2.5f, 0.0f);                      } 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 ec5172aeb83..a2663074de8 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -383,25 +383,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: @@ -1535,7 +1516,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; @@ -2325,7 +2306,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*/) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp index 6d9450daf21..5ad7375f259 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp @@ -20,7 +20,6 @@  #include "SpellScript.h"  #include "SpellAuraEffects.h"  #include "oculus.h" -#include "MapManager.h"  enum Says  { @@ -121,7 +120,7 @@ public:                              coreEnergizeOrientation = me->GetOrientation();                              firstCoreEnergize = true;                          } else -                            coreEnergizeOrientation = MapManager::NormalizeOrientation(coreEnergizeOrientation - 2.0f); +                            coreEnergizeOrientation = Position::NormalizeOrientation(coreEnergizeOrientation - 2.0f);                          DoCast(me, SPELL_ENERGIZE_CORES_VISUAL);                          events.ScheduleEvent(EVENT_ENERGIZE_CORES_VISUAL, 5000); diff --git a/src/server/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt index 237b974aa9d..15d7dbd7e8d 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 2e911406979..00000000000 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.cpp +++ /dev/null @@ -1,785 +0,0 @@ -/* - * Copyright (C) 2008-2012 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 "Language.h" -#include "World.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 != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_EWT_A)); -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, 0); -    } -    else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_EWT_H)); -        ((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); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_EWT_A)); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            artkit = 1; -            SummonSupportUnitAtNorthpassTower(HORDE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_EWT, HORDE); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_EWT_H)); -            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::SendChangePhase() -{ -    // send this too, sometimes the slider disappears, dunno why :( -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -    // send these updates to only the ones in this objective -    uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -    // send this too, sometimes it resets :S -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_EWT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_EWT_A << uint32(bool(m_TowerState & EP_TS_A)); -    data << EP_EWT_H << uint32(bool(m_TowerState & EP_TS_H)); -    data << EP_EWT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); -    data << EP_EWT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); -    data << EP_EWT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_EWT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_EWT_A, bool(m_TowerState & EP_TS_A)); -    m_PvP->SendUpdateWorldState(EP_EWT_H, bool(m_TowerState & EP_TS_H)); -    m_PvP->SendUpdateWorldState(EP_EWT_N_A, bool(m_TowerState & EP_TS_N_A)); -    m_PvP->SendUpdateWorldState(EP_EWT_N_H, bool(m_TowerState & EP_TS_N_H)); -    m_PvP->SendUpdateWorldState(EP_EWT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_EWT::HandlePlayerEnter(Player* player) -{ -    if (OPvPCapturePoint::HandlePlayerEnter(player)) -    { -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -        uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -        return true; -    } -    return false; -} - -void OPvPCapturePointEP_EWT::HandlePlayerLeave(Player* player) -{ -    player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); -    OPvPCapturePoint::HandlePlayerLeave(player); -} - -void OPvPCapturePointEP_EWT::SummonSupportUnitAtNorthpassTower(uint32 team) -{ -    if (m_UnitsSummonedSide != team) -    { -        m_UnitsSummonedSide = team; -        const creature_type * ct = NULL; -        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].teamval, ct[i].map, ct[i].x, ct[i].y, ct[i].z, ct[i].o, 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 != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_NPT_A)); -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, 0); -    } -    else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_NPT_H)); -        ((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); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_NPT_A)); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            artkit = 1; -            SummonGO(HORDE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_NPT, HORDE); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_NPT_H)); -            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::SendChangePhase() -{ -    // send this too, sometimes the slider disappears, dunno why :( -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -    // send these updates to only the ones in this objective -    uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -    // send this too, sometimes it resets :S -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_NPT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_NPT_A << uint32(bool(m_TowerState & EP_TS_A)); -    data << EP_NPT_H << uint32(bool(m_TowerState & EP_TS_H)); -    data << EP_NPT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); -    data << EP_NPT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); -    data << EP_NPT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_NPT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_NPT_A, bool(m_TowerState & EP_TS_A)); -    m_PvP->SendUpdateWorldState(EP_NPT_H, bool(m_TowerState & EP_TS_H)); -    m_PvP->SendUpdateWorldState(EP_NPT_N_A, bool(m_TowerState & EP_TS_N_A)); -    m_PvP->SendUpdateWorldState(EP_NPT_N_H, bool(m_TowerState & EP_TS_N_H)); -    m_PvP->SendUpdateWorldState(EP_NPT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_NPT::HandlePlayerEnter(Player* player) -{ -    if (OPvPCapturePoint::HandlePlayerEnter(player)) -    { -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -        uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -        return true; -    } -    return false; -} - -void OPvPCapturePointEP_NPT::HandlePlayerLeave(Player* player) -{ -    player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); -    OPvPCapturePoint::HandlePlayerLeave(player); -} - -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 != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_CGT_A)); -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, 0); -    } -    else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_CGT_H)); -        ((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); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_CGT_A)); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            artkit = 1; -            LinkGraveYard(HORDE); -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_CGT, HORDE); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_CGT_H)); -            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::SendChangePhase() -{ -    // send this too, sometimes the slider disappears, dunno why :( -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -    // send these updates to only the ones in this objective -    uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -    // send this too, sometimes it resets :S -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_CGT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_CGT_A << uint32(bool(m_TowerState & EP_TS_A)); -    data << EP_CGT_H << uint32(bool(m_TowerState & EP_TS_H)); -    data << EP_CGT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); -    data << EP_CGT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); -    data << EP_CGT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_CGT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_CGT_A, bool(m_TowerState & EP_TS_A)); -    m_PvP->SendUpdateWorldState(EP_CGT_H, bool(m_TowerState & EP_TS_H)); -    m_PvP->SendUpdateWorldState(EP_CGT_N_A, bool(m_TowerState & EP_TS_N_A)); -    m_PvP->SendUpdateWorldState(EP_CGT_N_H, bool(m_TowerState & EP_TS_N_H)); -    m_PvP->SendUpdateWorldState(EP_CGT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_CGT::HandlePlayerEnter(Player* player) -{ -    if (OPvPCapturePoint::HandlePlayerEnter(player)) -    { -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -        uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -        return true; -    } -    return false; -} - -void OPvPCapturePointEP_CGT::HandlePlayerLeave(Player* player) -{ -    player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); -    OPvPCapturePoint::HandlePlayerLeave(player); -} - -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 != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_PWT_A)); -        ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, 0); -    } -    else if ( m_OldState == OBJECTIVESTATE_HORDE && m_OldState != m_State ) -    { -        sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_LOSE_PWT_H)); -        ((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); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_PWT_A)); -            break; -        case OBJECTIVESTATE_HORDE: -            m_TowerState = EP_TS_H; -            SummonFlightMaster(HORDE); -            artkit = 1; -            ((OutdoorPvPEP*)m_PvP)->SetControlledState(EP_PWT, HORDE); -            if (m_OldState != m_State) sWorld->SendZoneText(EP_GraveYardZone, sObjectMgr->GetTrinityStringForDBCLocale(LANG_OPVP_EP_CAPTURE_PWT_H)); -            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::SendChangePhase() -{ -    // send this too, sometimes the slider disappears, dunno why :( -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -    // send these updates to only the ones in this objective -    uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -    // send this too, sometimes it resets :S -    SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -} - -void OPvPCapturePointEP_PWT::FillInitialWorldStates(WorldPacket &data) -{ -    data << EP_PWT_A << uint32(bool(m_TowerState & EP_TS_A)); -    data << EP_PWT_H << uint32(bool(m_TowerState & EP_TS_H)); -    data << EP_PWT_N_A << uint32(bool(m_TowerState & EP_TS_N_A)); -    data << EP_PWT_N_H << uint32(bool(m_TowerState & EP_TS_N_H)); -    data << EP_PWT_N << uint32(bool(m_TowerState & EP_TS_N)); -} - -void OPvPCapturePointEP_PWT::UpdateTowerState() -{ -    m_PvP->SendUpdateWorldState(EP_PWT_A, bool(m_TowerState & EP_TS_A)); -    m_PvP->SendUpdateWorldState(EP_PWT_H, bool(m_TowerState & EP_TS_H)); -    m_PvP->SendUpdateWorldState(EP_PWT_N_A, bool(m_TowerState & EP_TS_N_A)); -    m_PvP->SendUpdateWorldState(EP_PWT_N_H, bool(m_TowerState & EP_TS_N_H)); -    m_PvP->SendUpdateWorldState(EP_PWT_N, bool(m_TowerState & EP_TS_N)); -} - -bool OPvPCapturePointEP_PWT::HandlePlayerEnter(Player* player) -{ -    if (OPvPCapturePoint::HandlePlayerEnter(player)) -    { -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 1); -        uint32 phase = (uint32)ceil((m_value + m_maxValue) / (2 * m_maxValue) * 100.0f); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, phase); -        player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, m_neutralValuePct); -        return true; -    } -    return false; -} - -void OPvPCapturePointEP_PWT::HandlePlayerLeave(Player* player) -{ -    player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_DISPLAY, 0); -    OPvPCapturePoint::HandlePlayerLeave(player); -} - -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, team, EP_PWT_FlightMaster.map, EP_PWT_FlightMaster.x, EP_PWT_FlightMaster.y, EP_PWT_FlightMaster.z, EP_PWT_FlightMaster.o); -        /* -        // 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; -    data << EP_UI_TOWER_SLIDER_DISPLAY << uint32(0); -    data << EP_UI_TOWER_SLIDER_POS << uint32(50); -    data << EP_UI_TOWER_SLIDER_N << uint32(100); -    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_UI_TOWER_SLIDER_DISPLAY, 0); -    player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_POS, 0); -    player->SendUpdateWorldState(EP_UI_TOWER_SLIDER_N, 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 -        { -            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 14712e0150d..00000000000 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPEP.h +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright (C) 2008-2012 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 "DBCStructure.h" -#include "OutdoorPvP.h" - -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_SLIDER_DISPLAY = 2426, -    EP_UI_TOWER_SLIDER_POS = 2427, -    EP_UI_TOWER_SLIDER_N = 2428, - -    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, 469, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f}, -    {17647, 469, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f}, -    {17647, 469, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f}, -    {17647, 469, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f}, -    {17647, 469, 0, 3169.91f, -4349.68f, 138.37f, 0.7444f} -}; - -const creature_type EP_EWT_Summons_H[EP_EWT_NUM_CREATURES] = -{ -    {17995, 67, 0, 3167.61f, -4352.09f, 138.20f, 4.5811f}, -    {17996, 67, 0, 3172.74f, -4352.99f, 139.14f, 4.9873f}, -    {17996, 67, 0, 3165.89f, -4354.46f, 138.67f, 3.7244f}, -    {17996, 67, 0, 3164.65f, -4350.26f, 138.22f, 2.4794f}, -    {17996, 67, 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, 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 SendChangePhase(); - -        void FillInitialWorldStates(WorldPacket & data); - -        // used when player is activated/inactivated in the area -        bool HandlePlayerEnter(Player* player); -        void HandlePlayerLeave(Player* player); - -    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 SendChangePhase(); - -        void FillInitialWorldStates(WorldPacket & data); - -        // used when player is activated/inactivated in the area -        bool HandlePlayerEnter(Player* player); -        void HandlePlayerLeave(Player* player); - -    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 SendChangePhase(); - -        void FillInitialWorldStates(WorldPacket & data); - -        // used when player is activated/inactivated in the area -        bool HandlePlayerEnter(Player* player); -        void HandlePlayerLeave(Player* player); - -    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 SendChangePhase(); - -        void FillInitialWorldStates(WorldPacket & data); - -        // used when player is activated/inactivated in the area -        bool HandlePlayerEnter(Player* player); -        void HandlePlayerLeave(Player* player); - -    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/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 0fe6c367a9a..84639322819 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -148,6 +148,129 @@ class spell_dru_insect_swarm : public SpellScriptLoader          }  }; +enum EclipseSpells +{ +    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, +}; + +// Wrath, Starfire, 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() +        { +            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() +        { +            OnEffectHitTarget += SpellEffectFn(spell_dru_eclipse_energize_SpellScript::HandleEnergize, EFFECT_1, SPELL_EFFECT_DUMMY); +        } +    }; + +    SpellScript* GetSpellScript() const +    { +        return new spell_dru_eclipse_energize_SpellScript; +    } +}; +  class spell_dru_lifebloom : public SpellScriptLoader  {      public: @@ -606,7 +729,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;              } @@ -720,4 +843,5 @@ void AddSC_druid_spell_scripts()      new spell_dru_swift_flight_passive();      new spell_dru_tiger_s_fury();      new spell_dru_t10_restoration_4p_bonus(); +    new spell_dru_eclipse_energize();  } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 77374932cbd..e0c35a96426 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1322,61 +1322,6 @@ class spell_gen_oracle_wolvar_reputation : 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* /*SpellEntry*/) -            { -                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() -            { -                OnEffectApply += AuraEffectApplyFn(spell_gen_damage_reduction_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); -                OnEffectRemove += AuraEffectRemoveFn(spell_gen_damage_reduction_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); -            } - -        }; - -        AuraScript* GetAuraScript() const -        { -            return new spell_gen_damage_reduction_AuraScript(); -        } -}; -  class spell_gen_luck_of_the_draw : public SpellScriptLoader  {      public: @@ -2942,12 +2887,13 @@ class spell_gen_mount : public SpellScriptLoader                              break;                          case 300:                              if (canFly) -                            { -                                if (_mount310 && target->Has310Flyer(false)) -                                    mount = _mount310; -                                else -                                    mount = _mount280; -                            } +                                mount = _mount280; +                            else +                                mount = _mount100; +                            break; +                        case 375: +                            if (canFly) +                                mount = _mount310;                              else                                  mount = _mount100;                              break; @@ -3133,6 +3079,35 @@ class spell_gen_gift_of_naaru : public SpellScriptLoader          }  }; +class spell_gen_increase_stats_buff : public SpellScriptLoader +{ +    public: +        spell_gen_increase_stats_buff(char const* scriptName) : SpellScriptLoader(scriptName) { } + +        class spell_gen_increase_stats_buff_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_gen_increase_stats_buff_SpellScript); + +            void HandleDummy(SpellEffIndex /*effIndex*/) +            { +                if (GetHitUnit()->IsInRaidWith(GetCaster())) +                    GetCaster()->CastSpell(GetCaster(), GetEffectValue() + 1, true); // raid buff +                else +                    GetCaster()->CastSpell(GetHitUnit(), GetEffectValue(), true); // single-target buff +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_gen_increase_stats_buff_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_gen_increase_stats_buff_SpellScript(); +        } +}; +  enum Replenishment  {      SPELL_REPLENISHMENT             = 57669, @@ -3217,7 +3192,6 @@ void AddSC_generic_spell_scripts()      new spell_gen_launch();      new spell_gen_vehicle_scaling();      new spell_gen_oracle_wolvar_reputation(); -    new spell_gen_damage_reduction_aura();      new spell_gen_luck_of_the_draw();      new spell_gen_dummy_trigger();      new spell_gen_spirit_healer_res(); @@ -3261,5 +3235,12 @@ void AddSC_generic_spell_scripts()      new spell_gen_upper_deck_create_foam_sword();      new spell_gen_bonked();      new spell_gen_gift_of_naaru(); +    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_replenishment();  } diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index cd096ebed5e..2e6729e591f 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -39,6 +39,27 @@ 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_CONJURE_REFRESHMENT               = 42955, +    SPELL_MAGE_FLAMESTRIKE                       = 2120, +    SPELL_MAGE_CHILLED_R1                        = 12484, +    SPELL_MAGE_CHILLED_R2                        = 12485, +    SPELL_MAGE_INCANTER_S_ABSORPTION_TRIGGERED   = 44413, +    SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK   = 86261, +    SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED       = 83098, +    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_FINGERS_OF_FROST                  = 44544, +}; + +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,  };  class spell_mage_blast_wave : public SpellScriptLoader @@ -52,21 +73,40 @@ class spell_mage_blast_wave : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellEntry*/)              { -                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()              { -                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 @@ -271,123 +311,451 @@ class spell_mage_frost_warding_trigger : public SpellScriptLoader          }  }; -class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript +class spell_mage_living_bomb : public SpellScriptLoader  {      public: -        enum Spells -        { -            SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413, -            SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394, -        }; - -        bool Validate(SpellInfo const* /*spellEntry*/) -        { -            return sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED) -                && sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1); -        } +        spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { } -        void Trigger(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) +        class spell_mage_living_bomb_AuraScript : public AuraScript          { -            Unit* target = GetTarget(); +            PrepareAuraScript(spell_mage_living_bomb_AuraScript); -            if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0)) +            bool Validate(SpellInfo const* spell)              { -                int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); -                target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); +                if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue()))) +                    return false; +                return true;              } -        } -}; -// Incanter's Absorption -class spell_mage_incanters_absorbtion_absorb : public SpellScriptLoader -{ -public: -    spell_mage_incanters_absorbtion_absorb() : SpellScriptLoader("spell_mage_incanters_absorbtion_absorb") { } +            void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            { +                AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); +                if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE) +                    return; -    class spell_mage_incanters_absorbtion_absorb_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript -    { -        PrepareAuraScript(spell_mage_incanters_absorbtion_absorb_AuraScript); +                if (Unit* caster = GetCaster()) +                    caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff); +            } -        void Register() +            void Register() +            { +                AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +            } +        }; + +        AuraScript* GetAuraScript() const          { -             AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_incanters_absorbtion_absorb_AuraScript::Trigger, EFFECT_0); +            return new spell_mage_living_bomb_AuraScript();          } -    }; +}; -    AuraScript* GetAuraScript() const -    { -        return new spell_mage_incanters_absorbtion_absorb_AuraScript(); -    } +enum ConeOfColdSpells +{ +    SPELL_CONE_OF_COLD_AURA_R1      = 11190, // Improved Cone of Cold Rank 1 aura +    SPELL_CONE_OF_COLD_AURA_R2      = 12489, // Improved Cone of Cold Rank 2 aura +    SPELL_CONE_OF_COLD_TRIGGER_R1   = 83301, // Improved Cone of Cold Rank 1 Trigger +    SPELL_CONE_OF_COLD_TRIGGER_R2   = 83302, // Improved Cone of Cold Rank 2 Trigger  }; -// Incanter's Absorption -class spell_mage_incanters_absorbtion_manashield : public SpellScriptLoader +// 120 Cone of Cold +/// Updated 4.3.4 +class spell_mage_cone_of_cold : public SpellScriptLoader  {  public: -    spell_mage_incanters_absorbtion_manashield() : SpellScriptLoader("spell_mage_incanters_absorbtion_manashield") { } +    spell_mage_cone_of_cold() : SpellScriptLoader("spell_mage_cone_of_cold") { } -    class spell_mage_incanters_absorbtion_manashield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript +    class spell_mage_cone_of_cold_SpellScript : public SpellScript      { -        PrepareAuraScript(spell_mage_incanters_absorbtion_manashield_AuraScript); +        PrepareSpellScript(spell_mage_cone_of_cold_SpellScript); + +        void HandleConeOfColdScript(SpellEffIndex /*effIndex*/) +        { +            Unit* caster = GetCaster(); +            if (Unit* unitTarget = GetHitUnit()) +            { +                if (caster->HasAura(SPELL_CONE_OF_COLD_AURA_R1)) // Improved Cone of Cold Rank 1 +                    unitTarget->CastSpell(unitTarget, SPELL_CONE_OF_COLD_TRIGGER_R1, true); +                else if (caster->HasAura(SPELL_CONE_OF_COLD_AURA_R2)) // Improved Cone of Cold Rank 2 +                        unitTarget->CastSpell(unitTarget, SPELL_CONE_OF_COLD_TRIGGER_R2, true); +            } +        }          void Register()          { -             AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_incanters_absorbtion_manashield_AuraScript::Trigger, EFFECT_0); +            OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold_SpellScript::HandleConeOfColdScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);          }      }; -    AuraScript* GetAuraScript() const +    SpellScript* GetSpellScript() const      { -        return new spell_mage_incanters_absorbtion_manashield_AuraScript(); +        return new spell_mage_cone_of_cold_SpellScript();      }  }; -class spell_mage_living_bomb : public SpellScriptLoader +// 42955 Conjure Refreshment +/// Updated 4.3.4 +struct ConjureRefreshmentData +{ +    uint32 minLevel; +    uint32 maxLevel; +    uint32 spellId; +}; + +uint8 const MAX_CONJURE_REFRESHMENT_SPELLS = 7; +const ConjureRefreshmentData _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 } +}; + +class spell_mage_conjure_refreshment : public SpellScriptLoader  {      public: -        spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { } +        spell_mage_conjure_refreshment() : SpellScriptLoader("spell_mage_conjure_refreshment") { } -        class spell_mage_living_bomb_AuraScript : public AuraScript +        class spell_mage_conjure_refreshment_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_mage_living_bomb_AuraScript); +            PrepareSpellScript(spell_mage_conjure_refreshment_SpellScript); -            bool Validate(SpellInfo const* spell) +            bool Validate(SpellInfo const* /*spellEntry*/)              { -                if (!sSpellMgr->GetSpellInfo(uint32(spell->Effects[EFFECT_1].CalcValue()))) -                    return false; +                for (uint8 i = 0; i < MAX_CONJURE_REFRESHMENT_SPELLS; ++i) +                    if (!sSpellMgr->GetSpellInfo(_conjureData[i].spellId)) +                        return false;                  return true;              } -            void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) +            bool Load()              { -                AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); -                if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE) -                    return; +                if (GetCaster()->GetTypeId() != TYPEID_PLAYER) +                    return false; +                return true; +            } -                if (Unit* caster = GetCaster()) -                    caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff); +            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()              { -                AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); +                OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          }; -        AuraScript* GetAuraScript() const +        SpellScript* GetSpellScript() const          { -            return new spell_mage_living_bomb_AuraScript(); +            return new spell_mage_conjure_refreshment_SpellScript();          }  }; +// 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* /*spellEntry*/) +           { +               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(); +       } +}; + +// 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(); +       } +}; + +// 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 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() +           { +                AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ice_barrier_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB, AURA_EFFECT_HANDLE_REAL); +           } +       }; + +       AuraScript* GetAuraScript() const +       { +           return new spell_mage_ice_barrier_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_INCANTER_S_ABSORPTION_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_INCANTER_S_ABSORPTION_KNOCKBACK, true); +           } + +           void Register() +           { +                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 +       { +           return new spell_mage_mana_shield_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_INCANTER_S_ABSORPTION_TRIGGERED, &bp, NULL, NULL, true); +               } +           } + +           void Register() +           { +               AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0); +           } +       }; + +       AuraScript* GetAuraScript() const +       { +           return new spell_mage_mage_ward_AuraScript(); +       } +}; + +// 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* /*spellEntry*/) +           { +               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(); +       } +}; + +// 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* /*spellEntry*/) +           { +               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_blast_wave();      new spell_mage_cold_snap(); +    new spell_mage_cone_of_cold(); +    new spell_mage_conjure_refreshment();      new spell_mage_frost_warding_trigger(); -    new spell_mage_incanters_absorbtion_absorb(); -    new spell_mage_incanters_absorbtion_manashield();      new spell_mage_polymorph_cast_visual();      new spell_mage_summon_water_elemental();      new spell_mage_living_bomb(); +    new spell_mage_blizzard(); +    new spell_mage_frostbolt(); +    new spell_mage_ice_barrier(); +    new spell_mage_mana_shield(); +    new spell_mage_mage_ward(); +    new spell_mage_replenish_mana(); +    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 58f94edb387..3faa4cebe23 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -54,7 +54,7 @@ enum PaladinSpells  };  // 31850 - Ardent Defender -class spell_pal_ardent_defender : public SpellScriptLoader +/*class spell_pal_ardent_defender : public SpellScriptLoader  {      public:          spell_pal_ardent_defender() : SpellScriptLoader("spell_pal_ardent_defender") { } @@ -77,7 +77,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; @@ -127,7 +127,7 @@ class spell_pal_ardent_defender : public SpellScriptLoader          {              return new spell_pal_ardent_defender_AuraScript();          } -}; +};*/  class spell_pal_blessing_of_faith : public SpellScriptLoader  { @@ -668,19 +668,53 @@ class spell_pal_divine_sacrifice : public SpellScriptLoader          }  }; +class spell_pal_sacred_shield : public SpellScriptLoader +{ +    public: +        spell_pal_sacred_shield() : SpellScriptLoader("spell_pal_sacred_shield") { } + +        class spell_pal_sacred_shield_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_pal_sacred_shield_SpellScript); + +            SpellCastResult CheckCast() +            { +                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() +            { +                OnCheckCast += SpellCheckCastFn(spell_pal_sacred_shield_SpellScript::CheckCast); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_pal_sacred_shield_SpellScript(); +        } +}; +  void AddSC_paladin_spell_scripts()  { -    new spell_pal_ardent_defender(); +    //new spell_pal_ardent_defender();      new spell_pal_blessing_of_faith();      new spell_pal_blessing_of_sanctuary(); +    new spell_pal_divine_sacrifice(); +    new spell_pal_exorcism_and_holy_wrath_damage();      new spell_pal_guarded_by_the_light(); +    new spell_pal_hand_of_sacrifice();      new spell_pal_holy_shock();      new spell_pal_judgement_of_command();      new spell_pal_divine_storm();      new spell_pal_divine_storm_dummy();      new spell_pal_lay_on_hands();      new spell_pal_righteous_defense(); -    new spell_pal_exorcism_and_holy_wrath_damage(); -    new spell_pal_hand_of_sacrifice(); -    new spell_pal_divine_sacrifice(); +    new spell_pal_sacred_shield();  } diff --git a/src/server/scripts/Spells/spell_pet.cpp b/src/server/scripts/Spells/spell_pet.cpp index 876d7c80a44..7c8006d9209 100644 --- a/src/server/scripts/Spells/spell_pet.cpp +++ b/src/server/scripts/Spells/spell_pet.cpp @@ -1347,24 +1347,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(); diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 2feb6e2b6ef..999140dd073 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -40,6 +40,13 @@ enum PriestSpells      PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT       = 3021,      PRIEST_ICON_ID_PAIN_AND_SUFFERING           = 2874,      PRIEST_SHADOW_WORD_DEATH                    = 32409, +    PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH      = 107903, +    PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH         = 107904, +    PRIEST_GLYPH_OF_SHADOW                      = 107906, +    PRIEST_LEAP_OF_FAITH                        = 73325, +    PRIEST_LEAP_OF_FAITH_TRIGGERED              = 92572, +    PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER         = 92833, +    PRIEST_LEAP_OF_FAITH_EFFECT                 = 92832  };  // Guardian Spirit @@ -99,6 +106,45 @@ class spell_pri_guardian_spirit : public SpellScriptLoader          }  }; +class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader +{ +public: +    spell_pri_leap_of_faith_effect_trigger() : SpellScriptLoader("spell_pri_leap_of_faith_effect_trigger") { } + +    class spell_pri_leap_of_faith_effect_trigger_SpellScript : public SpellScript +    { +        PrepareSpellScript(spell_pri_leap_of_faith_effect_trigger_SpellScript); + +        bool Validate(SpellInfo const* /*entry*/) +        { +            if (!sSpellMgr->GetSpellInfo(PRIEST_LEAP_OF_FAITH_EFFECT)) +                return false; +            return true; +        } + +        void HandleEffectDummy(SpellEffIndex /*effIndex*/) +        { +            Position destPos; +            GetHitDest()->GetPosition(&destPos); + +            SpellCastTargets targets; +            targets.SetDst(destPos); +            targets.SetUnitTarget(GetCaster()); +            GetHitUnit()->CastSpell(targets, sSpellMgr->GetSpellInfo(GetEffectValue()), NULL); +        } + +        void Register() +        { +            OnEffectHitTarget += SpellEffectFn(spell_pri_leap_of_faith_effect_trigger_SpellScript::HandleEffectDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +        } +    }; + +    SpellScript* GetSpellScript() const +    { +        return new spell_pri_leap_of_faith_effect_trigger_SpellScript(); +    } +}; +  class spell_pri_mana_burn : public SpellScriptLoader  {      public: @@ -300,6 +346,7 @@ enum PrayerOfMending  {      SPELL_T9_HEALING_2_PIECE = 67201,  }; +  // Prayer of Mending Heal  class spell_pri_prayer_of_mending_heal : public SpellScriptLoader  { @@ -450,9 +497,50 @@ class spell_pri_shadow_word_death : public SpellScriptLoader          }  }; +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* /*entry*/) +            { +                if (!sSpellMgr->GetSpellInfo(PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH) || +                    !sSpellMgr->GetSpellInfo(PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH)) +                    return false; +                return true; +            } + +            void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                GetTarget()->CastSpell(GetTarget(), GetTarget()->HasAura(PRIEST_GLYPH_OF_SHADOW) ? PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH, true); +            } + +            void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) +            { +                GetTarget()->RemoveAurasDueToSpell(GetTarget()->HasAura(PRIEST_GLYPH_OF_SHADOW) ? PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH : PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH); +            } + +            void Register() +            { +                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 +        { +            return new spell_pri_shadowform_AuraScript(); +        } +}; +  void AddSC_priest_spell_scripts()  {      new spell_pri_guardian_spirit(); +    new spell_pri_leap_of_faith_effect_trigger();      new spell_pri_mana_burn();      new spell_pri_pain_and_suffering_proc();      new spell_pri_penance(); @@ -462,4 +550,5 @@ void AddSC_priest_spell_scripts()      new spell_pri_vampiric_touch();      new spell_pri_renew();      new spell_pri_shadow_word_death(); +    new spell_pri_shadowform();  } diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 0294533bdcd..ee0dd44f008 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -26,12 +26,14 @@  #include "SpellScript.h"  #include "SpellAuraEffects.h" -enum RogueSpells +enum RogueData  {      ROGUE_SPELL_SHIV_TRIGGERED                   = 5940,      ROGUE_SPELL_GLYPH_OF_PREPARATION             = 56819,      ROGUE_SPELL_PREY_ON_THE_WEAK                 = 58670,      ROGUE_SPELL_CHEAT_DEATH_COOLDOWN             = 31231, + +    ROGUE_ICON_IMPROVED_RECUPERATE               = 4819  };  // Cheat Death @@ -339,6 +341,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; @@ -415,12 +420,61 @@ class spell_rog_shadowstep : public SpellScriptLoader          }  }; +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() +            { +                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, ROGUE_ICON_IMPROVED_RECUPERATE, EFFECT_0)) +                        baseAmount += auraEffect->GetAmount(); + +                    amount = CalculatePct(caster->GetMaxHealth(), float(baseAmount) / 1000.0f); +                } +            } + +            void Register() +            { +                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 +        { +            return new spell_rog_recuperate_AuraScript(); +        } +}; +  void AddSC_rogue_spell_scripts()  {      new spell_rog_cheat_death();      new spell_rog_nerves_of_steel();      new spell_rog_preparation();      new spell_rog_prey_on_the_weak(); +    new spell_rog_recuperate();      new spell_rog_shiv();      new spell_rog_deadly_poison();      new spell_rog_shadowstep(); diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 1ba962982e4..02c314fd472 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -30,14 +30,14 @@  enum ShamanSpells  { -    SHAMAN_SPELL_GLYPH_OF_MANA_TIDE        = 55441, -    SHAMAN_SPELL_MANA_TIDE_TOTEM           = 39609, -    SHAMAN_SPELL_FIRE_NOVA_R1              = 1535, +    SHAMAN_SPELL_FLAME_SHOCK               = 8050,      SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1    = 8349,      SHAMAN_SPELL_SATED                     = 57724,      SHAMAN_SPELL_EXHAUSTION                = 57723, +    HUNTER_SPELL_INSANITY                  = 95809, +    MAGE_SPELL_TEMPORAL_DISPLACEMENT       = 80354, -    SHAMAN_SPELL_STORM_EARTH_AND_FIRE      = 51483, +    SHAMAN_SPELL_EARTH_GRASP               = 51483,      EARTHBIND_TOTEM_SPELL_EARTHGRAB        = 64695,      // For Earthen Power @@ -48,54 +48,15 @@ enum ShamanSpells      ICON_ID_SHAMAN_LAVA_FLOW               = 3087,      SHAMAN_LAVA_FLOWS_R1                   = 51480, -    SHAMAN_LAVA_FLOWS_TRIGGERED_R1         = 64694, -}; - -// 51474 - Astral shift -class spell_sha_astral_shift : public SpellScriptLoader -{ -    public: -        spell_sha_astral_shift() : SpellScriptLoader("spell_sha_astral_shift") { } - -        class spell_sha_astral_shift_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_sha_astral_shift_AuraScript); - -            uint32 absorbPct; - -            bool Load() -            { -                absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(GetCaster()); -                return true; -            } - -            void CalculateAmount(AuraEffect const* /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/) -            { -                // Set absorbtion amount to unlimited -                amount = -1; -            } +    SHAMAN_LAVA_FLOWS_TRIGGERED_R1         = 65264, +    SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC  = 52752, -            void Absorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) -            { -                // reduces all damage taken while stun, fear or silence -                if (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_FLEEING | UNIT_FLAG_SILENCED) || (GetTarget()->GetUInt32Value(UNIT_FIELD_FLAGS) & (UNIT_FLAG_STUNNED) && GetTarget()->HasAuraWithMechanic(1<<MECHANIC_STUN))) -                    absorbAmount = CalculatePct(dmgInfo.GetDamage(), absorbPct); -            } - -            void Register() -            { -                 DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_astral_shift_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); -                 OnEffectAbsorb += AuraEffectAbsorbFn(spell_sha_astral_shift_AuraScript::Absorb, EFFECT_0); -            } -        }; - -        AuraScript* GetAuraScript() const -        { -            return new spell_sha_astral_shift_AuraScript(); -        } +    ICON_ID_SOOTHING_RAIN                  = 2011, +    SPELL_HEALING_STREAM_TOTEM_HEAL        = 52042,  };  // 1535 Fire Nova +/// Updated 4.3.4  class spell_sha_fire_nova : public SpellScriptLoader  {      public: @@ -105,46 +66,21 @@ class spell_sha_fire_nova : public SpellScriptLoader          {              PrepareSpellScript(spell_sha_fire_nova_SpellScript); -            bool Validate(SpellInfo const* spellEntry) -            { -                if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_FIRE_NOVA_R1) || sSpellMgr->GetFirstSpellInChain(SHAMAN_SPELL_FIRE_NOVA_R1) != sSpellMgr->GetFirstSpellInChain(spellEntry->Id)) -                    return false; - -                uint8 rank = sSpellMgr->GetSpellRank(spellEntry->Id); -                if (!sSpellMgr->GetSpellWithRank(SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, rank, true)) -                    return false; -                return true; -            } - -            SpellCastResult CheckFireTotem() -            { -                // fire totem -                if (!GetCaster()->m_SummonSlot[1]) -                { -                    SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_FIRE_TOTEM); -                    return SPELL_FAILED_CUSTOM_ERROR; -                } - -                return SPELL_CAST_OK; -            } -              void HandleDummy(SpellEffIndex /*effIndex*/)              { -                if (Unit* caster = GetCaster()) +                Unit* caster = GetCaster(); +                if (Unit* target = GetHitUnit())                  { -                    uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id); -                    if (uint32 spellId = sSpellMgr->GetSpellWithRank(SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, rank)) +                    if (target->HasAura(SHAMAN_SPELL_FLAME_SHOCK))                      { -                        Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[1]); -                        if (totem && totem->isTotem()) -                            caster->CastSpell(totem, spellId, true); +                        caster->CastSpell(target, SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1, true); +                        target->RemoveAurasDueToSpell(SHAMAN_SPELL_FLAME_SHOCK);                      }                  }              }              void Register()              { -                OnCheckCast += SpellCheckCastFn(spell_sha_fire_nova_SpellScript::CheckFireTotem);                  OnEffectHitTarget += SpellEffectFn(spell_sha_fire_nova_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);              }          }; @@ -155,55 +91,39 @@ class spell_sha_fire_nova : public SpellScriptLoader          }  }; -// 39610 Mana Tide Totem -class spell_sha_mana_tide_totem : public SpellScriptLoader +// 16191 Mana Tide +/// Updated 4.3.4 +class spell_sha_mana_tide : public SpellScriptLoader  {      public: -        spell_sha_mana_tide_totem() : SpellScriptLoader("spell_sha_mana_tide_totem") { } +        spell_sha_mana_tide() : SpellScriptLoader("spell_sha_mana_tide") { } -        class spell_sha_mana_tide_totem_SpellScript : public SpellScript +        class spell_sha_mana_tide_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_sha_mana_tide_totem_SpellScript); - -            bool Validate(SpellInfo const* /*spellEntry*/) -            { -                if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_GLYPH_OF_MANA_TIDE) || !sSpellMgr->GetSpellInfo(SHAMAN_SPELL_MANA_TIDE_TOTEM)) -                    return false; -                return true; -            } +            PrepareAuraScript(spell_sha_mana_tide_AuraScript); -            void HandleDummy(SpellEffIndex /*effIndex*/) +            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* unitTarget = GetHitUnit()) -                    { -                        if (unitTarget->getPowerType() == POWER_MANA) -                        { -                            int32 effValue = GetEffectValue(); -                            // Glyph of Mana Tide -                            if (Unit* owner = caster->GetOwner()) -                                if (AuraEffect* dummy = owner->GetAuraEffect(SHAMAN_SPELL_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, SHAMAN_SPELL_MANA_TIDE_TOTEM, &effBasePoints0, NULL, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID()); -                        } -                    } +                    if (Unit* owner = caster->GetOwner()) +                        amount = CalculatePct(owner->GetStat(STAT_SPIRIT), aurEff->GetAmount());              }              void Register()              { -                OnEffectHitTarget += SpellEffectFn(spell_sha_mana_tide_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_mana_tide_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_STAT);              }          }; -        SpellScript* GetSpellScript() const +        AuraScript* GetAuraScript() const          { -            return new spell_sha_mana_tide_totem_SpellScript(); +            return new spell_sha_mana_tide_AuraScript();          }  }; -// 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: @@ -237,8 +157,8 @@ class spell_sha_earthbind_totem : public SpellScriptLoader                  Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself();                  if (!owner)                      return; -                // Storm, Earth and Fire -                if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_STORM_EARTH_AND_FIRE, EFFECT_1)) +                // Earth's Grasp +                if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_EARTH_GRASP, EFFECT_1))                  {                      if (roll_chance_i(aurEff->GetAmount()))                          GetCaster()->CastSpell(GetCaster(), EARTHBIND_TOTEM_SPELL_EARTHGRAB, false); @@ -301,6 +221,7 @@ class spell_sha_earthen_power : public SpellScriptLoader          }  }; +/// Updated 4.3.4  class spell_sha_bloodlust : public SpellScriptLoader  {      public: @@ -320,6 +241,8 @@ class spell_sha_bloodlust : public SpellScriptLoader              void RemoveInvalidTargets(std::list<WorldObject*>& targets)              {                  targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED)); +                targets.remove_if(Trinity::UnitAuraCheck(true, HUNTER_SPELL_INSANITY)); +                targets.remove_if(Trinity::UnitAuraCheck(true, MAGE_SPELL_TEMPORAL_DISPLACEMENT));              }              void ApplyDebuff() @@ -343,6 +266,7 @@ class spell_sha_bloodlust : public SpellScriptLoader          }  }; +/// Updated 4.3.4  class spell_sha_heroism : public SpellScriptLoader  {      public: @@ -362,6 +286,8 @@ class spell_sha_heroism : public SpellScriptLoader              void RemoveInvalidTargets(std::list<WorldObject*>& targets)              {                  targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_EXHAUSTION)); +                targets.remove_if(Trinity::UnitAuraCheck(true, HUNTER_SPELL_INSANITY)); +                targets.remove_if(Trinity::UnitAuraCheck(true, MAGE_SPELL_TEMPORAL_DISPLACEMENT));              }              void ApplyDebuff() @@ -385,11 +311,7 @@ class spell_sha_heroism : public SpellScriptLoader          }  }; -enum AncestralAwakeningProc -{ -    SPELL_ANCESTRAL_AWAKENING_PROC   = 52752, -}; - +/// Updated 4.3.4  class spell_sha_ancestral_awakening_proc : public SpellScriptLoader  {      public: @@ -401,7 +323,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader              bool Validate(SpellInfo const* /*SpellEntry*/)              { -                if (!sSpellMgr->GetSpellInfo(SPELL_ANCESTRAL_AWAKENING_PROC)) +                if (!sSpellMgr->GetSpellInfo(SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC))                      return false;                  return true;              } @@ -410,7 +332,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader              {                  int32 damage = GetEffectValue();                  if (GetCaster() && GetHitUnit()) -                    GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true); +                    GetCaster()->CastCustomSpell(GetHitUnit(), SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC, &damage, NULL, NULL, true);              }              void Register() @@ -425,53 +347,7 @@ class spell_sha_ancestral_awakening_proc : public SpellScriptLoader          }  }; -enum CleansingTotemPulse -{ -    SPELL_CLEANSING_TOTEM_EFFECT   = 52025, -}; - -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* /*SpellEntry*/) -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_CLEANSING_TOTEM_EFFECT)) -                    return false; -                return true; -            } - -            void HandleDummy(SpellEffIndex /* effIndex */) -            { -                int32 bp = 1; -                if (GetCaster() && GetHitUnit() && GetOriginalCaster()) -                    GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_CLEANSING_TOTEM_EFFECT, NULL, &bp, NULL, true, NULL, NULL, GetOriginalCaster()->GetGUID()); -            } - -            void Register() -            { -                OnEffectHitTarget += SpellEffectFn(spell_sha_cleansing_totem_pulse_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -            } -        }; - -        SpellScript* GetSpellScript() const -        { -            return new spell_sha_cleansing_totem_pulse_SpellScript(); -        } -}; - -enum HealingStreamTotem -{ -    SPELL_GLYPH_OF_HEALING_STREAM_TOTEM     = 55456, -    ICON_ID_RESTORATIVE_TOTEMS              = 338, -    SPELL_HEALING_STREAM_TOTEM_HEAL         = 52042, -}; - +/// Updated 4.3.4  class spell_sha_healing_stream_totem : public SpellScriptLoader  {      public: @@ -483,9 +359,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader              bool Validate(SpellInfo const* /*SpellEntry*/)              { -                if (!sSpellMgr->GetSpellInfo(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM) || !sSpellMgr->GetSpellInfo(SPELL_HEALING_STREAM_TOTEM_HEAL)) -                    return false; -                return true; +                return sSpellMgr->GetSpellInfo(SPELL_HEALING_STREAM_TOTEM_HEAL);              }              void HandleDummy(SpellEffIndex /* effIndex */) @@ -500,14 +374,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, ICON_ID_RESTORATIVE_TOTEMS, 1)) +                            // Soothing Rains +                            if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, ICON_ID_SOOTHING_RAIN, EFFECT_0))                                  AddPct(damage, dummy->GetAmount()); -                            // Glyph of Healing Stream Totem -                            if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0)) -                                AddPct(damage, aurEff->GetAmount()); -                              damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL));                          }                          caster->CastCustomSpell(target, SPELL_HEALING_STREAM_TOTEM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); @@ -526,49 +396,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader          }  }; -enum ManaSpringTotem -{ -    SPELL_MANA_SPRING_TOTEM_ENERGIZE     = 52032, -}; - -class spell_sha_mana_spring_totem : public SpellScriptLoader -{ -    public: -        spell_sha_mana_spring_totem() : SpellScriptLoader("spell_sha_mana_spring_totem") { } - -        class spell_sha_mana_spring_totem_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_sha_mana_spring_totem_SpellScript); - -            bool Validate(SpellInfo const* /*SpellEntry*/) -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_MANA_SPRING_TOTEM_ENERGIZE)) -                    return false; -                return true; -            } - -            void HandleDummy(SpellEffIndex /* effIndex */) -            { -                int32 damage = GetEffectValue(); -                if (Unit* target = GetHitUnit()) -                    if (Unit* caster = GetCaster()) -                        if (target->getPowerType() == POWER_MANA) -                            caster->CastCustomSpell(target, SPELL_MANA_SPRING_TOTEM_ENERGIZE, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID()); -            } - -            void Register() -            { -                OnEffectHitTarget += SpellEffectFn(spell_sha_mana_spring_totem_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -            } - -        }; - -        SpellScript* GetSpellScript() const -        { -            return new spell_sha_mana_spring_totem_SpellScript(); -        } -}; - +/// Updated 4.3.4  class spell_sha_lava_lash : public SpellScriptLoader  {      public: @@ -613,6 +441,7 @@ class spell_sha_lava_lash : public SpellScriptLoader  };  // 1064 Chain Heal +/// Updated 4.3.4  class spell_sha_chain_heal : public SpellScriptLoader  {      public: @@ -626,6 +455,7 @@ class spell_sha_chain_heal : public SpellScriptLoader              {                  firstHeal = true;                  riptide = false; +                amount = 0;                  return true;              } @@ -637,6 +467,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());                      } @@ -644,7 +475,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() @@ -654,6 +488,7 @@ class spell_sha_chain_heal : public SpellScriptLoader              bool firstHeal;              bool riptide; +            uint32 amount;          };          SpellScript* GetSpellScript() const @@ -662,6 +497,7 @@ class spell_sha_chain_heal : public SpellScriptLoader          }  }; +/// Updated 4.3.4  class spell_sha_flame_shock : public SpellScriptLoader  {      public: @@ -683,15 +519,17 @@ 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, ICON_ID_SHAMAN_LAVA_FLOW, EFFECT_0))                      {                          if (sSpellMgr->GetFirstSpellInChain(SHAMAN_LAVA_FLOWS_R1) != sSpellMgr->GetFirstSpellInChain(aurEff->GetId()))                              return; -                        uint8 rank = sSpellMgr->GetSpellRank(aurEff->GetId()); -                        caster->CastSpell(caster, sSpellMgr->GetSpellWithRank(SHAMAN_LAVA_FLOWS_TRIGGERED_R1, rank), true); +                        int32 basepoints = aurEff->GetAmount(); +                        caster->CastCustomSpell(caster, SHAMAN_LAVA_FLOWS_TRIGGERED_R1, &basepoints, NULL, NULL, true);                      } +                }              }              void Register() @@ -706,65 +544,17 @@ class spell_sha_flame_shock : public SpellScriptLoader          }  }; -class spell_sha_sentry_totem : public SpellScriptLoader -{ -    public: -        spell_sha_sentry_totem() : SpellScriptLoader("spell_sha_sentry_totem") { } - -        class spell_sha_sentry_totem_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_sha_sentry_totem_AuraScript); - -            bool Validate(SpellInfo const* /*spell*/) -            { -                if (!sSpellMgr->GetSpellInfo(SHAMAN_BIND_SIGHT)) -                    return false; -                return true; -            } - -            void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -            { -                if (Unit* caster = GetCaster()) -                    if (Creature* totem = caster->GetMap()->GetCreature(caster->m_SummonSlot[4])) -                        if (totem->isTotem()) -                            caster->CastSpell(totem, SHAMAN_BIND_SIGHT, true); -            } - -            void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -            { -                if (Unit* caster = GetCaster()) -                    if (caster->GetTypeId() == TYPEID_PLAYER) -                        caster->ToPlayer()->StopCastingBindSight(); -            } - -            void Register() -            { -                 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); -            } -        }; - -        AuraScript* GetAuraScript() const -        { -            return new spell_sha_sentry_totem_AuraScript(); -        } -}; -  void AddSC_shaman_spell_scripts()  { -    new spell_sha_astral_shift();      new spell_sha_fire_nova(); -    new spell_sha_mana_tide_totem(); +    new spell_sha_mana_tide();      new spell_sha_earthbind_totem();      new spell_sha_earthen_power();      new spell_sha_bloodlust();      new spell_sha_heroism();      new spell_sha_ancestral_awakening_proc(); -    new spell_sha_cleansing_totem_pulse();      new spell_sha_healing_stream_totem(); -    new spell_sha_mana_spring_totem();      new spell_sha_lava_lash();      new spell_sha_chain_heal();      new spell_sha_flame_shock(); -    new spell_sha_sentry_totem();  } diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index f83056aa8b6..1150970e8fc 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -41,13 +41,19 @@ enum WarlockSpells      WARLOCK_HAUNT                           = 48181,      WARLOCK_HAUNT_HEAL                      = 48210,      WARLOCK_UNSTABLE_AFFLICTION_DISPEL      = 31117, -    WARLOCK_CURSE_OF_DOOM_EFFECT            = 18662, +    WARLOCK_BANE_OF_DOOM_EFFECT             = 18662,      WARLOCK_IMPROVED_HEALTH_FUNNEL_R1       = 18703,      WARLOCK_IMPROVED_HEALTH_FUNNEL_R2       = 18704,      WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1  = 60955,      WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2  = 60956, +    WARLOCK_SOULSHATTER                     = 32835, +    WARLOCK_LIFE_TAP_ENERGIZE               = 31818, +    WARLOCK_LIFE_TAP_ENERGIZE_2             = 32553, +    WARLOCK_IMPROVED_LIFE_TAP_ICON_ID       = 208, +    WARLOCK_MANA_FEED_ICON_ID               = 1982,  }; +/// Updated 4.3.4  class spell_warl_banish : public SpellScriptLoader  {  public: @@ -65,11 +71,13 @@ public:          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))                  { -                    //No need to remove old aura since its removed due to not stack by current Banish aura +                    // No need to remove old aura since its removed due to not stack by current Banish aura                      PreventHitDefaultEffect(EFFECT_0);                      PreventHitDefaultEffect(EFFECT_1);                      PreventHitDefaultEffect(EFFECT_2); @@ -100,6 +108,7 @@ public:  };  // 47193 Demonic Empowerment +/// Updated 4.3.4  class spell_warl_demonic_empowerment : public SpellScriptLoader  {      public: @@ -133,7 +142,6 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader                              SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER);                              int32 hp = int32(targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(targetCreature, spellInfo, 0)));                              targetCreature->CastCustomSpell(targetCreature, WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, &hp, NULL, NULL, true); -                            //unitTarget->CastSpell(unitTarget, 54441, true);                              break;                          }                          case CREATURE_FAMILY_FELGUARD: @@ -162,7 +170,7 @@ class spell_warl_demonic_empowerment : public SpellScriptLoader          }  }; -// 6201 Create Healthstone (and ranks) +// 6201 Create Healthstone  class spell_warl_create_healthstone : public SpellScriptLoader  {      public: @@ -242,6 +250,7 @@ uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellS  };  // 47422 Everlasting Affliction +/// Updated 4.3.4  class spell_warl_everlasting_affliction : public SpellScriptLoader  {      public: @@ -271,34 +280,8 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader          }  }; -// 18541 Ritual of Doom Effect -class spell_warl_ritual_of_doom_effect : public SpellScriptLoader -{ -public: -    spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { } - -    class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript -    { -        PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript); - -        void HandleDummy(SpellEffIndex /*effIndex*/) -        { -            Unit* caster = GetCaster(); -            caster->CastSpell(caster, GetEffectValue(), true); -        } - -        void Register() -        { -            OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); -        } -    }; - -    SpellScript* GetSpellScript() const -    { -        return new spell_warl_ritual_of_doom_effect_SpellScript(); -    } -}; - +// 27285 Seed of Corruption +/// Updated 4.3.4  class spell_warl_seed_of_corruption : public SpellScriptLoader  {      public: @@ -326,11 +309,8 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader          }  }; -enum Soulshatter -{ -    SPELL_SOULSHATTER   = 32835, -}; - +// 29858 Soulshatter +/// Updated 4.3.4  class spell_warl_soulshatter : public SpellScriptLoader  {      public: @@ -342,7 +322,7 @@ class spell_warl_soulshatter : public SpellScriptLoader              bool Validate(SpellInfo const* /*spell*/)              { -                if (!sSpellMgr->GetSpellInfo(SPELL_SOULSHATTER)) +                if (!sSpellMgr->GetSpellInfo(WARLOCK_SOULSHATTER))                      return false;                  return true;              } @@ -351,10 +331,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_SOULSHATTER, true); -                } +                        caster->CastSpell(target, WARLOCK_SOULSHATTER, true);              }              void Register() @@ -369,14 +347,8 @@ class spell_warl_soulshatter : public SpellScriptLoader          }  }; -enum LifeTap -{ -    SPELL_LIFE_TAP_ENERGIZE     = 31818, -    SPELL_LIFE_TAP_ENERGIZE_2   = 32553, -    ICON_ID_IMPROVED_LIFE_TAP   = 208, -    ICON_ID_MANA_FEED           = 1982, -}; - +// 1454 Life Tap +/// Updated 4.3.4  class spell_warl_life_tap : public SpellScriptLoader  {      public: @@ -393,7 +365,7 @@ class spell_warl_life_tap : public SpellScriptLoader              bool Validate(SpellInfo const* /*spell*/)              { -                if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE_2)) +                if (!sSpellMgr->GetSpellInfo(WARLOCK_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(WARLOCK_LIFE_TAP_ENERGIZE_2))                      return false;                  return true;              } @@ -403,34 +375,31 @@ 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);                      // Improved Life Tap mod -                    if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, ICON_ID_IMPROVED_LIFE_TAP, 0)) +                    if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_IMPROVED_LIFE_TAP_ICON_ID, 0))                          AddPct(mana, aurEff->GetAmount()); -                    caster->CastCustomSpell(target, SPELL_LIFE_TAP_ENERGIZE, &mana, NULL, NULL, false); +                    caster->CastCustomSpell(target, 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, ICON_ID_MANA_FEED, 0)) -                        manaFeedVal = aurEff->GetAmount(); - -                    if (manaFeedVal > 0) +                    if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_MANA_FEED_ICON_ID, 0))                      { +                        int32 manaFeedVal = aurEff->GetAmount();                          ApplyPct(manaFeedVal, mana); -                        caster->CastCustomSpell(caster, SPELL_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL); +                        caster->CastCustomSpell(caster, WARLOCK_LIFE_TAP_ENERGIZE_2, &manaFeedVal, NULL, NULL, true, NULL);                      }                  }              }              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;              } @@ -448,6 +417,8 @@ class spell_warl_life_tap : public SpellScriptLoader          }  }; +// 48018 Demonic Circle: Summon +/// Updated 4.3.4  class spell_warl_demonic_circle_summon : public SpellScriptLoader  {      public: @@ -499,6 +470,8 @@ 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: @@ -532,6 +505,8 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader          }  }; +// 48181 Haunt +/// Updated 4.3.4  class spell_warl_haunt : public SpellScriptLoader  {      public: @@ -591,6 +566,7 @@ class spell_warl_haunt : public SpellScriptLoader          }  }; +/// Updated 4.3.4  class spell_warl_unstable_affliction : public SpellScriptLoader  {      public: @@ -630,10 +606,12 @@ class spell_warl_unstable_affliction : public SpellScriptLoader          }  }; -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          { @@ -641,7 +619,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader              bool Validate(SpellInfo const* /*spell*/)              { -                if (!sSpellMgr->GetSpellInfo(WARLOCK_CURSE_OF_DOOM_EFFECT)) +                if (!sSpellMgr->GetSpellInfo(WARLOCK_BANE_OF_DOOM_EFFECT))                      return false;                  return true;              } @@ -661,7 +639,7 @@ class spell_warl_curse_of_doom : public SpellScriptLoader                      return;                  if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget())) -                    GetCaster()->CastSpell(GetTarget(), WARLOCK_CURSE_OF_DOOM_EFFECT, true, NULL, aurEff); +                    GetCaster()->CastSpell(GetTarget(), WARLOCK_BANE_OF_DOOM_EFFECT, true, NULL, aurEff);              }              void Register() @@ -676,6 +654,8 @@ class spell_warl_curse_of_doom : public SpellScriptLoader          }  }; +// 755 Health Funnel +/// Updated 4.3.4  class spell_warl_health_funnel : public SpellScriptLoader  {  public: @@ -724,7 +704,6 @@ void AddSC_warlock_spell_scripts()      new spell_warl_demonic_empowerment();      new spell_warl_create_healthstone();      new spell_warl_everlasting_affliction(); -    new spell_warl_ritual_of_doom_effect();      new spell_warl_seed_of_corruption();      new spell_warl_soulshatter();      new spell_warl_life_tap(); @@ -732,6 +711,6 @@ void AddSC_warlock_spell_scripts()      new spell_warl_demonic_circle_teleport();      new spell_warl_haunt();      new spell_warl_unstable_affliction(); -    new spell_warl_curse_of_doom(); +    new spell_warl_bane_of_doom();      new spell_warl_health_funnel();  } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index 613bf0fef5d..fd82171bc68 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -28,9 +28,21 @@  enum WarriorSpells  { -    WARRIOR_SPELL_LAST_STAND_TRIGGERED           = 12976, +    SPELL_LAST_STAND_TRIGGERED              = 12976, +    SPELL_DEEP_WOUNDS_RANK_1                = 12162, +    SPELL_DEEP_WOUNDS_RANK_2                = 12850, +    SPELL_DEEP_WOUNDS_RANK_3                = 12868, +    SPELL_DEEP_WOUNDS_RANK_PERIODIC         = 12721, +    SPELL_JUGGERNAUT_CRIT_BONUS_TALENT      = 64976, +    SPELL_JUGGERNAUT_CRIT_BONUS_BUFF        = 65156, +    SPELL_CHARGE                            = 34846, +    SPELL_SLAM                              = 50782, +    ICON_ID_SUDDEN_DEATH                    = 1989, +    SPELL_BLOODTHIRST_DAMAGE = 23881, +    SPELL_BLOODTHIRST = 23885,  }; +/// Updated 4.3.4  class spell_warr_last_stand : public SpellScriptLoader  {      public: @@ -42,7 +54,7 @@ class spell_warr_last_stand : public SpellScriptLoader              bool Validate(SpellInfo const* /*spellEntry*/)              { -                if (!sSpellMgr->GetSpellInfo(WARRIOR_SPELL_LAST_STAND_TRIGGERED)) +                if (!sSpellMgr->GetSpellInfo(SPELL_LAST_STAND_TRIGGERED))                      return false;                  return true;              } @@ -51,8 +63,8 @@ class spell_warr_last_stand : public SpellScriptLoader              {                  if (Unit* caster = GetCaster())                  { -                    int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(30)); -                    caster->CastCustomSpell(caster, WARRIOR_SPELL_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL); +                    int32 healthModSpellBasePoints0 = int32(caster->CountPctFromMaxHealth(GetEffectValue())); +                    caster->CastCustomSpell(caster, SPELL_LAST_STAND_TRIGGERED, &healthModSpellBasePoints0, NULL, NULL, true, NULL);                  }              } @@ -69,96 +81,7 @@ class spell_warr_last_stand : public SpellScriptLoader          }  }; -class spell_warr_improved_spell_reflection : public SpellScriptLoader -{ -    public: -        spell_warr_improved_spell_reflection() : SpellScriptLoader("spell_warr_improved_spell_reflection") { } - -        class spell_warr_improved_spell_reflection_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_warr_improved_spell_reflection_SpellScript); - -            void FilterTargets(std::list<WorldObject*>& unitList) -            { -                if (GetCaster()) -                    unitList.remove(GetCaster()); -            } - -            void Register() -            { -                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_improved_spell_reflection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); -            } -        }; - -        SpellScript* GetSpellScript() const -        { -            return new spell_warr_improved_spell_reflection_SpellScript(); -        } -}; - -enum DamageReductionAura -{ -    SPELL_BLESSING_OF_SANCTUARY         = 20911, -    SPELL_GREATER_BLESSING_OF_SANCTUARY = 25899, -    SPELL_RENEWED_HOPE                  = 63944, -    SPELL_DAMAGE_REDUCTION_AURA         = 68066, -}; - -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* /*SpellEntry*/) -        { -            if (!sSpellMgr->GetSpellInfo(SPELL_DAMAGE_REDUCTION_AURA)) -                return false; -            return true; -        } - -        void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -        { -            if (Unit* target = GetTarget()) -                target->CastSpell(target, SPELL_DAMAGE_REDUCTION_AURA, true); -        } - -        void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) -        { -            if (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->RemoveAurasDueToSpell(SPELL_DAMAGE_REDUCTION_AURA); -            } -        } - -        void Register() -        { -            OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); -            OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); -        } - -    }; - -    AuraScript* GetAuraScript() const -    { -        return new spell_warr_vigilance_AuraScript(); -    } -}; - -enum DeepWounds -{ -    SPELL_DEEP_WOUNDS_RANK_1         = 12162, -    SPELL_DEEP_WOUNDS_RANK_2         = 12850, -    SPELL_DEEP_WOUNDS_RANK_3         = 12868, -    SPELL_DEEP_WOUNDS_RANK_PERIODIC  = 12721, -}; - +/// Updated 4.3.4  class spell_warr_deep_wounds : public SpellScriptLoader  {      public: @@ -175,7 +98,7 @@ class spell_warr_deep_wounds : public SpellScriptLoader                  return true;              } -            void HandleDummy(SpellEffIndex /* effIndex */) +            void HandleDummy(SpellEffIndex /*effIndex*/)              {                  int32 damage = GetEffectValue();                  Unit* caster = GetCaster(); @@ -213,13 +136,7 @@ class spell_warr_deep_wounds : public SpellScriptLoader          }  }; -enum Charge -{ -    SPELL_JUGGERNAUT_CRIT_BONUS_TALENT      = 64976, -    SPELL_JUGGERNAUT_CRIT_BONUS_BUFF        = 65156, -    SPELL_CHARGE                            = 34846, -}; - +/// Updated 4.3.4  class spell_warr_charge : public SpellScriptLoader  {      public: @@ -235,7 +152,7 @@ class spell_warr_charge : public SpellScriptLoader                      return false;                  return true;              } -            void HandleDummy(SpellEffIndex /* effIndex */) +            void HandleDummy(SpellEffIndex /*effIndex*/)              {                  int32 chargeBasePoints0 = GetEffectValue();                  Unit* caster = GetCaster(); @@ -258,11 +175,7 @@ class spell_warr_charge : public SpellScriptLoader          }  }; -enum Slam -{ -    SPELL_SLAM      = 50783, -}; - +/// Updated 4.3.4  class spell_warr_slam : public SpellScriptLoader  {      public: @@ -278,7 +191,7 @@ class spell_warr_slam : public SpellScriptLoader                      return false;                  return true;              } -            void HandleDummy(SpellEffIndex /* effIndex */) +            void HandleDummy(SpellEffIndex /*effIndex*/)              {                  int32 bp0 = GetEffectValue();                  if (GetHitUnit()) @@ -297,13 +210,7 @@ class spell_warr_slam : public SpellScriptLoader          }  }; -enum Execute -{ -    SPELL_EXECUTE               = 20647, -    SPELL_GLYPH_OF_EXECUTION    = 58367, -    ICON_ID_SUDDEN_DEATH        = 1989, -}; - +/// Updated 4.3.4  class spell_warr_execute : public SpellScriptLoader  {      public: @@ -313,42 +220,35 @@ class spell_warr_execute : public SpellScriptLoader          {              PrepareSpellScript(spell_warr_execute_SpellScript); -            bool Validate(SpellInfo const* /*SpellEntry*/) -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_EXECUTE) || !sSpellMgr->GetSpellInfo(SPELL_GLYPH_OF_EXECUTION)) -                    return false; -                return true; -            } -            void HandleDummy(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, 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_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_EXECUTE,&bp,0,0,true,0,0,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()              { -                OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +                OnEffectHitTarget += SpellEffectFn(spell_warr_execute_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);              }          }; @@ -358,6 +258,7 @@ class spell_warr_execute : public SpellScriptLoader          }  }; +/// Updated 4.3.4  class spell_warr_concussion_blow : public SpellScriptLoader  {      public: @@ -367,7 +268,7 @@ class spell_warr_concussion_blow : public SpellScriptLoader          {              PrepareSpellScript(spell_warr_concussion_blow_SpellScript); -            void HandleDummy(SpellEffIndex /* effIndex */) +            void HandleDummy(SpellEffIndex /*effIndex*/)              {                  SetHitDamage(CalculatePct(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue()));              } @@ -384,11 +285,7 @@ class spell_warr_concussion_blow : public SpellScriptLoader          }  }; -enum Bloodthirst -{ -    SPELL_BLOODTHIRST = 23885, -}; - +/// Updated 4.3.4  class spell_warr_bloodthirst : public SpellScriptLoader  {      public: @@ -430,11 +327,7 @@ class spell_warr_bloodthirst : public SpellScriptLoader          }  }; -enum BloodthirstHeal -{ -    SPELL_BLOODTHIRST_DAMAGE = 23881, -}; - +/// Updated 4.3.4  class spell_warr_bloodthirst_heal : public SpellScriptLoader  {      public: @@ -447,7 +340,7 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader              void HandleHeal(SpellEffIndex /*effIndex*/)              {                  if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_BLOODTHIRST_DAMAGE)) -                    SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster()))); +                    SetHitHeal(GetCaster()->CountPctFromMaxHealth(spellInfo->Effects[EFFECT_1].CalcValue(GetCaster())) / 100);              }              void Register() @@ -462,56 +355,9 @@ class spell_warr_bloodthirst_heal : public SpellScriptLoader          }  }; -enum Overpower -{ -    SPELL_UNRELENTING_ASSAULT_RANK_1        = 46859, -    SPELL_UNRELENTING_ASSAULT_RANK_2        = 46860, -    SPELL_UNRELENTING_ASSAULT_TRIGGER_1     = 64849, -    SPELL_UNRELENTING_ASSAULT_TRIGGER_2     = 64850, -}; - -class spell_warr_overpower : public SpellScriptLoader -{ -public: -    spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { } - -    class spell_warr_overpower_SpellScript : public SpellScript -    { -        PrepareSpellScript(spell_warr_overpower_SpellScript); - -        void HandleEffect(SpellEffIndex /* effIndex */) -        { -            uint32 spellId = 0; -            if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_1)) -                spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_1; -            else if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_2)) -                spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_2; - -            if (!spellId) -                return; - -            if (Player* target = GetHitPlayer()) -                if (target->HasUnitState(UNIT_STATE_CASTING)) -                    target->CastSpell(target, spellId, true); -        } - -        void Register() -        { -            OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY); -        } -    }; - -    SpellScript* GetSpellScript() const -    { -        return new spell_warr_overpower_SpellScript(); -    } -}; -  void AddSC_warrior_spell_scripts()  {      new spell_warr_last_stand(); -    new spell_warr_improved_spell_reflection(); -    new spell_warr_vigilance();      new spell_warr_deep_wounds();      new spell_warr_charge();      new spell_warr_slam(); @@ -519,5 +365,4 @@ void AddSC_warrior_spell_scripts()      new spell_warr_concussion_blow();      new spell_warr_bloodthirst();      new spell_warr_bloodthirst_heal(); -    new spell_warr_overpower();  } diff --git a/src/server/scripts/World/item_scripts.cpp b/src/server/scripts/World/item_scripts.cpp index 535bebd9415..5e68507c9fa 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*/) +    bool OnUse(Player* player, Item* /*item*/, const SpellCastTargets & /*targets*/)      {          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 4524a3a9374..a5f6b4cfecf 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 36657dc76c3..ebd56c2afe4 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -1297,7 +1297,7 @@ public:              case GOSSIP_OPTION_LEARNDUALSPEC:                  if (player->GetSpecsCount() == 1 && !(player->getLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)))                  { -                    if (!player->HasEnoughMoney(10000000)) +                    if (!player->HasEnoughMoney(uint64(10000000)))                      {                          player->SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0);                          player->PlayerTalkClass->SendCloseGossip(); @@ -1305,7 +1305,7 @@ public:                      }                      else                      { -                        player->ModifyMoney(-10000000); +                        player->ModifyMoney(int64(-10000000));                          // Cast spells that teach dual spec                          // Both are also ImplicitTarget self and must be cast by player @@ -2565,11 +2565,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)  | 
