aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/CMakeLists.txt2
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt2
-rw-r--r--src/server/scripts/Commands/cs_account.cpp34
-rw-r--r--src/server/scripts/Commands/cs_disable.cpp32
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp10
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp168
-rw-r--r--src/server/scripts/Commands/cs_mmaps.cpp294
-rw-r--r--src/server/scripts/Commands/cs_modify.cpp9
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp44
-rw-r--r--src/server/scripts/Commands/cs_rbac.cpp780
-rw-r--r--src/server/scripts/Commands/cs_reload.cpp91
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp13
-rw-r--r--src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp7
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp11
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp14
-rw-r--r--src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp12
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp75
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp5
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp31
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp7
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp7
-rw-r--r--src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp7
-rw-r--r--src/server/scripts/Kalimdor/CMakeLists.txt6
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp9
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp (renamed from src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp (renamed from src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp (renamed from src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp)0
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp4
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp2
-rw-r--r--src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp2
-rw-r--r--src/server/scripts/Kalimdor/Firelands/firelands.h2
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp4
-rw-r--r--src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp5
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp9
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp32
-rw-r--r--src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp4
-rw-r--r--src/server/scripts/Kalimdor/zone_desolace.cpp108
-rw-r--r--src/server/scripts/Kalimdor/zone_thunder_bluff.cpp3
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp4
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp6
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp6
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp2
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp11
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp11
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp41
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp8
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp68
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp9
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp6
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp2
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp22
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp8
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp38
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp27
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp13
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp259
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp13
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp5
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp73
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp5
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp6
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp5
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp3
-rw-r--r--src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp4
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp13
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp34
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp10
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp5
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp4
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp8
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp6
-rw-r--r--src/server/scripts/Northrend/zone_borean_tundra.cpp4
-rw-r--r--src/server/scripts/Northrend/zone_crystalsong_forest.cpp7
-rw-r--r--src/server/scripts/Northrend/zone_dalaran.cpp4
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp20
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp10
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp3
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_supremus.cpp7
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp3
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp62
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp3
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp13
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp7
-rw-r--r--src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp3
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp10
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp7
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp75
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp161
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp280
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp555
-rw-r--r--src/server/scripts/Spells/spell_holiday.cpp87
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp78
-rw-r--r--src/server/scripts/Spells/spell_item.cpp576
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp362
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp251
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp269
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp207
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp98
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp329
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp373
-rw-r--r--src/server/scripts/World/achievement_scripts.cpp25
-rw-r--r--src/server/scripts/World/npcs_special.cpp11
110 files changed, 5603 insertions, 913 deletions
diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt
index 5ccd244ef7f..a32a42b8172 100644
--- a/src/server/scripts/CMakeLists.txt
+++ b/src/server/scripts/CMakeLists.txt
@@ -45,6 +45,8 @@ message("")
include_directories(
${CMAKE_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour
+ ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast
${CMAKE_SOURCE_DIR}/dep/g3dlite/include
${CMAKE_SOURCE_DIR}/dep/SFMT
${CMAKE_SOURCE_DIR}/dep/zlib
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index 97e9b35e6cd..83e97b2c80d 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -35,6 +35,7 @@ set(scripts_STAT_SRCS
Commands/cs_modify.cpp
Commands/cs_npc.cpp
Commands/cs_quest.cpp
+ Commands/cs_rbac.cpp
Commands/cs_reload.cpp
Commands/cs_reset.cpp
Commands/cs_tele.cpp
@@ -42,6 +43,7 @@ set(scripts_STAT_SRCS
Commands/cs_server.cpp
Commands/cs_titles.cpp
Commands/cs_wp.cpp
+ Commands/cs_mmaps.cpp
# Commands/cs_pdump.cpp
# Commands/cs_channel.cpp
# Commands/cs_pet.cpp
diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index 3a20a03bb4a..4dc44bbfc58 100644
--- a/src/server/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
@@ -106,7 +106,7 @@ public:
if (!accountName || !password)
return false;
- AccountOpResult result = AccountMgr::CreateAccount(std::string(accountName), std::string(password));
+ AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password));
switch (result)
{
case AOR_OK:
@@ -503,36 +503,8 @@ public:
return false;
}
- // If gmRealmID is -1, delete all values for the account id, else, insert values for the specific realmID
- PreparedStatement* stmt;
-
- if (gmRealmID == -1)
- {
- stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS);
-
- stmt->setUInt32(0, targetAccountId);
- }
- else
- {
- stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_ACCOUNT_ACCESS_BY_REALM);
-
- stmt->setUInt32(0, targetAccountId);
- stmt->setUInt32(1, realmID);
- }
-
- LoginDatabase.Execute(stmt);
-
- if (gm != 0)
- {
- stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_ACCESS);
-
- stmt->setUInt32(0, targetAccountId);
- stmt->setUInt8(1, uint8(gm));
- stmt->setInt32(2, gmRealmID);
-
- LoginDatabase.Execute(stmt);
- }
-
+ RBACData* rbac = isAccountNameGiven ? NULL : handler->getSelectedPlayer()->GetSession()->GetRBACData();
+ sAccountMgr->UpdateAccountAccess(rbac, targetAccountId, uint8(gm), gmRealmID);
handler->PSendSysMessage(LANG_YOU_CHANGE_SECURITY, targetAccountName.c_str(), gm);
return true;
diff --git a/src/server/scripts/Commands/cs_disable.cpp b/src/server/scripts/Commands/cs_disable.cpp
index 37e282cac8e..34738777c85 100644
--- a/src/server/scripts/Commands/cs_disable.cpp
+++ b/src/server/scripts/Commands/cs_disable.cpp
@@ -48,6 +48,7 @@ public:
{ "achievement_criteria", SEC_ADMINISTRATOR, true, &HandleRemoveDisableAchievementCriteriaCommand, "", NULL },
{ "outdoorpvp", SEC_ADMINISTRATOR, true, &HandleRemoveDisableOutdoorPvPCommand, "", NULL },
{ "vmap", SEC_ADMINISTRATOR, true, &HandleRemoveDisableVmapCommand, "", NULL },
+ { "mmap", SEC_ADMINISTRATOR, true, &HandleRemoveDisableMMapCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand addDisableCommandTable[] =
@@ -59,6 +60,7 @@ public:
{ "achievement_criteria", SEC_ADMINISTRATOR, true, &HandleAddDisableAchievementCriteriaCommand, "", NULL },
{ "outdoorpvp", SEC_ADMINISTRATOR, true, &HandleAddDisableOutdoorPvPCommand, "", NULL },
{ "vmap", SEC_ADMINISTRATOR, true, &HandleAddDisableVmapCommand, "", NULL },
+ { "mmap", SEC_ADMINISTRATOR, true, &HandleAddDisableMMapCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand disableCommandTable[] =
@@ -172,6 +174,17 @@ public:
disableTypeStr = "vmap";
break;
}
+ case DISABLE_TYPE_MMAP:
+ {
+ if (!sMapStore.LookupEntry(entry))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_NOMAPFOUND);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ disableTypeStr = "mmap";
+ break;
+ }
default:
break;
}
@@ -256,6 +269,14 @@ public:
return HandleAddDisables(handler, args, DISABLE_TYPE_VMAP);
}
+ static bool HandleAddDisableMMapCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ return HandleAddDisables(handler, args, DISABLE_TYPE_MMAP);
+ }
+
static bool HandleRemoveDisables(ChatHandler* handler, char const* args, uint8 disableType)
{
char* entryStr = strtok((char*)args, " ");
@@ -289,6 +310,9 @@ public:
case DISABLE_TYPE_VMAP:
disableTypeStr = "vmap";
break;
+ case DISABLE_TYPE_MMAP:
+ disableTypeStr = "mmap";
+ break;
}
PreparedStatement* stmt = NULL;
@@ -367,6 +391,14 @@ public:
return HandleRemoveDisables(handler, args, DISABLE_TYPE_VMAP);
}
+
+ static bool HandleRemoveDisableMMapCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ return HandleRemoveDisables(handler, args, DISABLE_TYPE_MMAP);
+ }
};
void AddSC_disable_commandscript()
diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp
index 7f39a8fc024..aa9d9308bcd 100644
--- a/src/server/scripts/Commands/cs_lfg.cpp
+++ b/src/server/scripts/Commands/cs_lfg.cpp
@@ -28,12 +28,12 @@ void GetPlayerInfo(ChatHandler* handler, Player* player)
return;
uint64 guid = player->GetGUID();
- LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(guid);
+ lfg::LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(guid);
- std::string const& state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid));
handler->PSendSysMessage(LANG_LFG_PLAYER_INFO, player->GetName().c_str(),
- state.c_str(), uint8(dungeons.size()), sLFGMgr->ConcatenateDungeons(dungeons).c_str(),
- sLFGMgr->GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str());
+ state.c_str(), uint8(dungeons.size()), lfg::ConcatenateDungeons(dungeons).c_str(),
+ lfg::GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str());
}
class lfg_commandscript : public CommandScript
@@ -87,7 +87,7 @@ public:
}
uint64 guid = grp->GetGUID();
- std::string const& state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ std::string const& state = lfg::GetStateString(sLFGMgr->GetState(guid));
handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(),
state.c_str(), sLFGMgr->GetDungeon(guid));
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index a1098cff5d3..3acfe9c14ba 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -33,6 +33,8 @@
#include "ace/INET_Addr.h"
#include "Player.h"
#include "Pet.h"
+#include "LFG.h"
+#include "GroupMgr.h"
class misc_commandscript : public CommandScript
{
@@ -46,6 +48,8 @@ public:
{ "leader", SEC_ADMINISTRATOR, false, &HandleGroupLeaderCommand, "", NULL },
{ "disband", SEC_ADMINISTRATOR, false, &HandleGroupDisbandCommand, "", NULL },
{ "remove", SEC_ADMINISTRATOR, false, &HandleGroupRemoveCommand, "", NULL },
+ { "join", SEC_ADMINISTRATOR, false, &HandleGroupJoinCommand, "", NULL },
+ { "list", SEC_ADMINISTRATOR, false, &HandleGroupListCommand, "", NULL },
{ NULL, 0, false, NULL, "", NULL }
};
static ChatCommand petCommandTable[] =
@@ -1545,6 +1549,8 @@ public:
std::string userName = handler->GetTrinityString(LANG_ERROR);
std::string eMail = handler->GetTrinityString(LANG_ERROR);
+ std::string muteReason = "";
+ std::string muteBy = "";
std::string lastIp = handler->GetTrinityString(LANG_ERROR);
uint32 security = 0;
std::string lastLogin = handler->GetTrinityString(LANG_ERROR);
@@ -1561,6 +1567,8 @@ public:
security = fields[1].GetUInt8();
eMail = fields[2].GetString();
muteTime = fields[5].GetUInt64();
+ muteReason = fields[6].GetString();
+ muteBy = fields[7].GetString();
if (eMail.empty())
eMail = "-";
@@ -1622,7 +1630,7 @@ public:
}
if (muteTime > 0)
- handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str());
+ handler->PSendSysMessage(LANG_PINFO_MUTE, secsToTimeString(muteTime - time(NULL), true).c_str(), muteBy.c_str(), muteReason.c_str());
if (banTime >= 0)
handler->PSendSysMessage(LANG_PINFO_BAN, banTime > 0 ? secsToTimeString(banTime - time(NULL), true).c_str() : "permanently", bannedby.c_str(), banreason.c_str());
@@ -1734,6 +1742,23 @@ public:
else
handler->PSendSysMessage(LANG_PINFO_MAP_OFFLINE, map->name, areaName.c_str());
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUILD_MEMBER_EXTENDED);
+ stmt->setUInt32(0, GUID_LOPART(targetGuid));
+
+ result = CharacterDatabase.Query(stmt);
+ if (result)
+ {
+ Field* fields = result->Fetch();
+
+ uint32 guildId = fields[0].GetUInt32();
+ std::string guildName = fields[1].GetString();
+ std::string guildRank = fields[2].GetString();
+ std::string note = fields[3].GetString();
+ std::string officeNote = fields[4].GetString();
+
+ handler->PSendSysMessage(LANG_PINFO_GUILD_INFO, guildName.c_str(), guildId, guildRank.c_str(), note.c_str(), officeNote.c_str());
+ }
+
return true;
}
@@ -1803,6 +1828,11 @@ public:
return false;
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
+ std::string muteBy = "";
+ if (handler->GetSession())
+ muteBy = handler->GetSession()->GetPlayerName();
+ else
+ muteBy = "Console";
if (target)
{
@@ -1810,7 +1840,7 @@ public:
int64 muteTime = time(NULL) + notSpeakTime * MINUTE;
target->GetSession()->m_muteTime = muteTime;
stmt->setInt64(0, muteTime);
- ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteReasonStr.c_str());
+ ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notSpeakTime, muteBy.c_str(), muteReasonStr.c_str());
}
else
{
@@ -1819,7 +1849,9 @@ public:
stmt->setInt64(0, muteTime);
}
- stmt->setUInt32(1, accountId);
+ stmt->setString(1, muteReasonStr.c_str());
+ stmt->setString(2, muteBy.c_str());
+ stmt->setUInt32(3, accountId);
LoginDatabase.Execute(stmt);
std::string nameLink = handler->playerLink(targetName);
@@ -1862,7 +1894,9 @@ public:
PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
stmt->setInt64(0, 0);
- stmt->setUInt32(1, accountId);
+ stmt->setString(1, "");
+ stmt->setString(2, "");
+ stmt->setUInt32(3, accountId);
LoginDatabase.Execute(stmt);
if (target)
@@ -2723,6 +2757,132 @@ public:
return true;
}
+ static bool HandleGroupJoinCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* playerSource = NULL;
+ Player* playerTarget = NULL;
+ Group* groupSource = NULL;
+ Group* groupTarget = NULL;
+ uint64 guidSource = 0;
+ uint64 guidTarget = 0;
+ char* nameplgrStr = strtok((char*)args, " ");
+ char* nameplStr = strtok(NULL, " ");
+
+ if (handler->GetPlayerGroupAndGUIDByName(nameplgrStr, playerSource, groupSource, guidSource, true))
+ {
+ if (groupSource)
+ {
+ if (handler->GetPlayerGroupAndGUIDByName(nameplStr, playerTarget, groupTarget, guidTarget, true))
+ {
+ if (!groupTarget && playerTarget->GetGroup() != groupSource)
+ {
+ if (!groupSource->IsFull())
+ {
+ groupSource->AddMember(playerTarget);
+ groupSource->BroadcastGroupUpdate();
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_JOINED, playerTarget->GetName().c_str(), playerSource->GetName().c_str());
+ return true;
+ }
+ else
+ {
+ // group is full
+ handler->PSendSysMessage(LANG_GROUP_FULL);
+ return true;
+ }
+ }
+ else
+ {
+ // group is full or target player already in a group
+ handler->PSendSysMessage(LANG_GROUP_ALREADY_IN_GROUP, playerTarget->GetName().c_str());
+ return true;
+ }
+ }
+ }
+ else
+ {
+ // specified source player is not in a group
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, playerSource->GetName().c_str());
+ return true;
+ }
+ }
+
+ return true;
+ }
+
+ static bool HandleGroupListCommand(ChatHandler* handler, char const* args)
+ {
+ Player* playerTarget;
+ uint64 guidTarget;
+ std::string nameTarget;
+
+ uint32 parseGUID = MAKE_NEW_GUID(atol((char*)args), 0, HIGHGUID_PLAYER);
+
+ if (sObjectMgr->GetPlayerNameByGUID(parseGUID, nameTarget))
+ {
+ playerTarget = sObjectMgr->GetPlayerByLowGUID(parseGUID);
+ guidTarget = parseGUID;
+ }
+ else if (!handler->extractPlayerTarget((char*)args, &playerTarget, &guidTarget, &nameTarget))
+ return false;
+
+ Group* groupTarget = NULL;
+ if (playerTarget)
+ groupTarget = playerTarget->GetGroup();
+
+ if (!groupTarget)
+ {
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GROUP_MEMBER);
+ stmt->setUInt32(0, guidTarget);
+ PreparedQueryResult resultGroup = CharacterDatabase.Query(stmt);
+ if (resultGroup)
+ groupTarget = sGroupMgr->GetGroupByDbStoreId((*resultGroup)[0].GetUInt32());
+ }
+
+ if (groupTarget)
+ {
+ handler->PSendSysMessage(LANG_GROUP_TYPE, (groupTarget->isRaidGroup() ? "raid" : "party"));
+ Group::MemberSlotList const& members = groupTarget->GetMemberSlots();
+ for (Group::MemberSlotList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
+ {
+ Group::MemberSlot const& slot = *itr;
+
+ std::string flags;
+ if (slot.flags & MEMBER_FLAG_ASSISTANT)
+ flags = "Assistant";
+
+ if (slot.flags & MEMBER_FLAG_MAINTANK)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainTank");
+ }
+
+ if (slot.flags & MEMBER_FLAG_MAINASSIST)
+ {
+ if (!flags.empty())
+ flags.append(", ");
+ flags.append("MainAssist");
+ }
+
+ if (flags.empty())
+ flags = "None";
+
+ Player* p = ObjectAccessor::FindPlayer((*itr).guid);
+ const char* onlineState = (p && p->IsInWorld()) ? "online" : "offline";
+
+ handler->PSendSysMessage(LANG_GROUP_PLAYER_NAME_GUID, slot.name.c_str(), onlineState,
+ GUID_LOPART(slot.guid), flags.c_str(), lfg::GetRolesString(slot.roles).c_str());
+ }
+ }
+ else
+ handler->PSendSysMessage(LANG_GROUP_NOT_IN_GROUP, nameTarget.c_str());
+
+ return true;
+ }
+
static bool HandlePlayAllCommand(ChatHandler* handler, char const* args)
{
if (!*args)
diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp
new file mode 100644
index 00000000000..97861133983
--- /dev/null
+++ b/src/server/scripts/Commands/cs_mmaps.cpp
@@ -0,0 +1,294 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+* @file cs_mmaps.cpp
+* @brief .mmap related commands
+*
+* This file contains the CommandScripts for all
+* mmap sub-commands
+*/
+
+#include "ScriptMgr.h"
+#include "Chat.h"
+#include "ObjectMgr.h"
+#include "Player.h"
+#include "PointMovementGenerator.h"
+#include "PathGenerator.h"
+#include "MMapFactory.h"
+#include "Map.h"
+#include "TargetedMovementGenerator.h"
+#include "GridNotifiers.h"
+#include "GridNotifiersImpl.h"
+#include "CellImpl.h"
+
+class mmaps_commandscript : public CommandScript
+{
+public:
+ mmaps_commandscript() : CommandScript("mmaps_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand mmapCommandTable[] =
+ {
+ { "path", SEC_ADMINISTRATOR, false, &HandleMmapPathCommand, "", NULL },
+ { "loc", SEC_ADMINISTRATOR, false, &HandleMmapLocCommand, "", NULL },
+ { "loadedtiles", SEC_ADMINISTRATOR, false, &HandleMmapLoadedTilesCommand, "", NULL },
+ { "stats", SEC_ADMINISTRATOR, false, &HandleMmapStatsCommand, "", NULL },
+ { "testarea", SEC_ADMINISTRATOR, false, &HandleMmapTestArea, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "mmap", SEC_ADMINISTRATOR, true, NULL, "", mmapCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ static bool HandleMmapPathCommand(ChatHandler* handler, char const* args)
+ {
+ if (!MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId()))
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ handler->PSendSysMessage("mmap path:");
+
+ // units
+ Player* player = handler->GetSession()->GetPlayer();
+ Unit* target = handler->getSelectedUnit();
+ if (!player || !target)
+ {
+ handler->PSendSysMessage("Invalid target/source selection.");
+ return true;
+ }
+
+ char* para = strtok((char*)args, " ");
+
+ bool useStraightPath = false;
+ if (para && strcmp(para, "true") == 0)
+ useStraightPath = true;
+
+ // unit locations
+ float x, y, z;
+ player->GetPosition(x, y, z);
+
+ // path
+ PathGenerator path(target);
+ path.SetUseStraightPath(useStraightPath);
+ bool result = path.CalculatePath(x, y, z);
+
+ PointsArray pointPath = path.GetPath();
+ handler->PSendSysMessage("%s's path to %s:", target->GetName().c_str(), player->GetName().c_str());
+ handler->PSendSysMessage("Building: %s", useStraightPath ? "StraightPath" : "SmoothPath");
+ handler->PSendSysMessage("Result: %s - Length: "SIZEFMTD" - Type: %u", (result ? "true" : "false"), pointPath.size(), path.GetPathType());
+
+ Vector3 start = path.GetStartPosition();
+ Vector3 end = path.GetEndPosition();
+ Vector3 actualEnd = path.GetActualEndPosition();
+
+ handler->PSendSysMessage("StartPosition (%.3f, %.3f, %.3f)", start.x, start.y, start.z);
+ handler->PSendSysMessage("EndPosition (%.3f, %.3f, %.3f)", end.x, end.y, end.z);
+ handler->PSendSysMessage("ActualEndPosition (%.3f, %.3f, %.3f)", actualEnd.x, actualEnd.y, actualEnd.z);
+
+ if (!player->isGameMaster())
+ handler->PSendSysMessage("Enable GM mode to see the path points.");
+
+ for (uint32 i = 0; i < pointPath.size(); ++i)
+ player->SummonCreature(VISUAL_WAYPOINT, pointPath[i].x, pointPath[i].y, pointPath[i].z, 0, TEMPSUMMON_TIMED_DESPAWN, 9000);
+
+ return true;
+ }
+
+ static bool HandleMmapLocCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->PSendSysMessage("mmap tileloc:");
+
+ // grid tile location
+ Player* player = handler->GetSession()->GetPlayer();
+
+ int32 gx = 32 - player->GetPositionX() / SIZE_OF_GRIDS;
+ int32 gy = 32 - player->GetPositionY() / SIZE_OF_GRIDS;
+
+ handler->PSendSysMessage("%03u%02i%02i.mmtile", player->GetMapId(), gy, gx);
+ handler->PSendSysMessage("gridloc [%i,%i]", gx, gy);
+
+ // calculate navmesh tile location
+ dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId());
+ dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(handler->GetSession()->GetPlayer()->GetMapId(), player->GetInstanceId());
+ if (!navmesh || !navmeshquery)
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ float const* min = navmesh->getParams()->orig;
+ float x, y, z;
+ player->GetPosition(x, y, z);
+ float location[VERTEX_SIZE] = {y, z, x};
+ float extents[VERTEX_SIZE] = {3.0f, 5.0f, 3.0f};
+
+ int32 tilex = int32((y - min[0]) / SIZE_OF_GRIDS);
+ int32 tiley = int32((x - min[2]) / SIZE_OF_GRIDS);
+
+ handler->PSendSysMessage("Calc [%02i,%02i]", tilex, tiley);
+
+ // navmesh poly -> navmesh tile location
+ dtQueryFilter filter = dtQueryFilter();
+ dtPolyRef polyRef = INVALID_POLYREF;
+ navmeshquery->findNearestPoly(location, extents, &filter, &polyRef, NULL);
+
+ if (polyRef == INVALID_POLYREF)
+ handler->PSendSysMessage("Dt [??,??] (invalid poly, probably no tile loaded)");
+ else
+ {
+ dtMeshTile const* tile;
+ dtPoly const* poly;
+ navmesh->getTileAndPolyByRef(polyRef, &tile, &poly);
+ if (tile)
+ handler->PSendSysMessage("Dt [%02i,%02i]", tile->header->x, tile->header->y);
+ else
+ handler->PSendSysMessage("Dt [??,??] (no tile loaded)");
+ }
+
+ return true;
+ }
+
+ static bool HandleMmapLoadedTilesCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ uint32 mapid = handler->GetSession()->GetPlayer()->GetMapId();
+ dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(mapid);
+ dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(mapid, handler->GetSession()->GetPlayer()->GetInstanceId());
+ if (!navmesh || !navmeshquery)
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ handler->PSendSysMessage("mmap loadedtiles:");
+
+ for (int32 i = 0; i < navmesh->getMaxTiles(); ++i)
+ {
+ dtMeshTile const* tile = navmesh->getTile(i);
+ if (!tile || !tile->header)
+ continue;
+
+ handler->PSendSysMessage("[%02i,%02i]", tile->header->x, tile->header->y);
+ }
+
+ return true;
+ }
+
+ static bool HandleMmapStatsCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ uint32 mapId = handler->GetSession()->GetPlayer()->GetMapId();
+ handler->PSendSysMessage("mmap stats:");
+ handler->PSendSysMessage(" global mmap pathfinding is %sabled", MMAP::MMapFactory::IsPathfindingEnabled(mapId) ? "en" : "dis");
+
+ MMAP::MMapManager* manager = MMAP::MMapFactory::createOrGetMMapManager();
+ handler->PSendSysMessage(" %u maps loaded with %u tiles overall", manager->getLoadedMapsCount(), manager->getLoadedTilesCount());
+
+ dtNavMesh const* navmesh = manager->GetNavMesh(handler->GetSession()->GetPlayer()->GetMapId());
+ if (!navmesh)
+ {
+ handler->PSendSysMessage("NavMesh not loaded for current map.");
+ return true;
+ }
+
+ uint32 tileCount = 0;
+ uint32 nodeCount = 0;
+ uint32 polyCount = 0;
+ uint32 vertCount = 0;
+ uint32 triCount = 0;
+ uint32 triVertCount = 0;
+ uint32 dataSize = 0;
+ for (int32 i = 0; i < navmesh->getMaxTiles(); ++i)
+ {
+ dtMeshTile const* tile = navmesh->getTile(i);
+ if (!tile || !tile->header)
+ continue;
+
+ tileCount++;
+ nodeCount += tile->header->bvNodeCount;
+ polyCount += tile->header->polyCount;
+ vertCount += tile->header->vertCount;
+ triCount += tile->header->detailTriCount;
+ triVertCount += tile->header->detailVertCount;
+ dataSize += tile->dataSize;
+ }
+
+ handler->PSendSysMessage("Navmesh stats:");
+ handler->PSendSysMessage(" %u tiles loaded", tileCount);
+ handler->PSendSysMessage(" %u BVTree nodes", nodeCount);
+ handler->PSendSysMessage(" %u polygons (%u vertices)", polyCount, vertCount);
+ handler->PSendSysMessage(" %u triangles (%u vertices)", triCount, triVertCount);
+ handler->PSendSysMessage(" %.2f MB of data (not including pointers)", ((float)dataSize / sizeof(unsigned char)) / 1048576);
+
+ return true;
+ }
+
+ static bool HandleMmapTestArea(ChatHandler* handler, char const* /*args*/)
+ {
+ float radius = 40.0f;
+ WorldObject* object = handler->GetSession()->GetPlayer();
+
+ CellCoord pair(Trinity::ComputeCellCoord(object->GetPositionX(), object->GetPositionY()));
+ Cell cell(pair);
+ cell.SetNoCreate();
+
+ std::list<Creature*> creatureList;
+
+ Trinity::AnyUnitInObjectRangeCheck go_check(object, radius);
+ Trinity::CreatureListSearcher<Trinity::AnyUnitInObjectRangeCheck> go_search(object, creatureList, go_check);
+ TypeContainerVisitor<Trinity::CreatureListSearcher<Trinity::AnyUnitInObjectRangeCheck>, GridTypeMapContainer> go_visit(go_search);
+
+ // Get Creatures
+ cell.Visit(pair, go_visit, *(object->GetMap()), *object, radius);
+
+ if (!creatureList.empty())
+ {
+ handler->PSendSysMessage("Found "SIZEFMTD" Creatures.", creatureList.size());
+
+ uint32 paths = 0;
+ uint32 uStartTime = getMSTime();
+
+ float gx, gy, gz;
+ object->GetPosition(gx, gy, gz);
+ for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
+ {
+ PathGenerator path(*itr);
+ path.CalculatePath(gx, gy, gz);
+ ++paths;
+ }
+
+ uint32 uPathLoadTime = getMSTimeDiff(uStartTime, getMSTime());
+ handler->PSendSysMessage("Generated %i paths in %i ms", paths, uPathLoadTime);
+ }
+ else
+ handler->PSendSysMessage("No creatures in %f yard range.", radius);
+
+ return true;
+ }
+};
+
+void AddSC_mmaps_commandscript()
+{
+ new mmaps_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp
index 907ddd2f6f2..466cd318b68 100644
--- a/src/server/scripts/Commands/cs_modify.cpp
+++ b/src/server/scripts/Commands/cs_modify.cpp
@@ -1048,9 +1048,12 @@ public:
ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, handler->GetNameLink().c_str(), uint32(moneyToAdd));
if (moneyToAdd >= MAX_MONEY_AMOUNT)
- target->SetMoney(MAX_MONEY_AMOUNT);
- else
- target->ModifyMoney(moneyToAdd);
+ moneyToAdd = MAX_MONEY_AMOUNT;
+
+ if (targetMoney >= uint64(MAX_MONEY_AMOUNT) - moneyToAdd)
+ moneyToAdd -= targetMoney;
+
+ target->ModifyMoney(moneyToAdd);
}
sLog->outDebug(LOG_FILTER_GENERAL, handler->GetTrinityString(LANG_NEW_MONEY), uint32(targetMoney), int32(moneyToAdd), uint32(target->GetMoney()));
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 0217aea1149..6653439b703 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -33,6 +33,42 @@ EndScriptData */
#include "Player.h"
#include "Pet.h"
+struct NpcFlagText
+{
+ uint32 flag;
+ int32 text;
+};
+
+#define NPCFLAG_COUNT 24
+
+const NpcFlagText npcFlagTexts[NPCFLAG_COUNT] =
+{
+ { UNIT_NPC_FLAG_AUCTIONEER, LANG_NPCINFO_AUCTIONEER },
+ { UNIT_NPC_FLAG_BANKER, LANG_NPCINFO_BANKER },
+ { UNIT_NPC_FLAG_BATTLEMASTER, LANG_NPCINFO_BATTLEMASTER },
+ { UNIT_NPC_FLAG_FLIGHTMASTER, LANG_NPCINFO_FLIGHTMASTER },
+ { UNIT_NPC_FLAG_GOSSIP, LANG_NPCINFO_GOSSIP },
+ { UNIT_NPC_FLAG_GUILD_BANKER, LANG_NPCINFO_GUILD_BANKER },
+ { UNIT_NPC_FLAG_INNKEEPER, LANG_NPCINFO_INNKEEPER },
+ { UNIT_NPC_FLAG_PETITIONER, LANG_NPCINFO_PETITIONER },
+ { UNIT_NPC_FLAG_PLAYER_VEHICLE, LANG_NPCINFO_PLAYER_VEHICLE },
+ { UNIT_NPC_FLAG_QUESTGIVER, LANG_NPCINFO_QUESTGIVER },
+ { UNIT_NPC_FLAG_REPAIR, LANG_NPCINFO_REPAIR },
+ { UNIT_NPC_FLAG_SPELLCLICK, LANG_NPCINFO_SPELLCLICK },
+ { UNIT_NPC_FLAG_SPIRITGUIDE, LANG_NPCINFO_SPIRITGUIDE },
+ { UNIT_NPC_FLAG_SPIRITHEALER, LANG_NPCINFO_SPIRITHEALER },
+ { UNIT_NPC_FLAG_STABLEMASTER, LANG_NPCINFO_STABLEMASTER },
+ { UNIT_NPC_FLAG_TABARDDESIGNER, LANG_NPCINFO_TABARDDESIGNER },
+ { UNIT_NPC_FLAG_TRAINER, LANG_NPCINFO_TRAINER },
+ { UNIT_NPC_FLAG_TRAINER_CLASS, LANG_NPCINFO_TRAINER_CLASS },
+ { UNIT_NPC_FLAG_TRAINER_PROFESSION, LANG_NPCINFO_TRAINER_PROFESSION },
+ { UNIT_NPC_FLAG_VENDOR, LANG_NPCINFO_VENDOR },
+ { UNIT_NPC_FLAG_VENDOR_AMMO, LANG_NPCINFO_VENDOR_AMMO },
+ { UNIT_NPC_FLAG_VENDOR_FOOD, LANG_NPCINFO_VENDOR_FOOD },
+ { UNIT_NPC_FLAG_VENDOR_POISON, LANG_NPCINFO_VENDOR_POISON },
+ { UNIT_NPC_FLAG_VENDOR_REAGENT, LANG_NPCINFO_VENDOR_REAGENT }
+};
+
class npc_commandscript : public CommandScript
{
public:
@@ -623,11 +659,9 @@ public:
handler->PSendSysMessage(LANG_NPCINFO_POSITION, float(target->GetPositionX()), float(target->GetPositionY()), float(target->GetPositionZ()));
handler->PSendSysMessage(LANG_NPCINFO_AIINFO, target->GetAIName().c_str(), target->GetScriptName().c_str());
- if (npcflags & UNIT_NPC_FLAG_VENDOR)
- handler->SendSysMessage(LANG_NPCINFO_VENDOR);
-
- if (npcflags & UNIT_NPC_FLAG_TRAINER)
- handler->SendSysMessage(LANG_NPCINFO_TRAINER);
+ for (uint8 i = 0; i < NPCFLAG_COUNT; i++)
+ if (npcflags & npcFlagTexts[i].flag)
+ handler->PSendSysMessage(npcFlagTexts[i].text, npcFlagTexts[i].flag);
return true;
}
diff --git a/src/server/scripts/Commands/cs_rbac.cpp b/src/server/scripts/Commands/cs_rbac.cpp
new file mode 100644
index 00000000000..092aabb0045
--- /dev/null
+++ b/src/server/scripts/Commands/cs_rbac.cpp
@@ -0,0 +1,780 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 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
+Name: rbac_commandscript
+%Complete: 100
+Comment: All role based access control related commands (including account related)
+Category: commandscripts
+EndScriptData */
+
+#include "RBAC.h"
+#include "Config.h"
+#include "Chat.h"
+#include "Language.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+
+struct RBACCommandData
+{
+ RBACCommandData(): id(0), realmId(0), rbac(NULL), needDelete(false) { }
+ uint32 id;
+ int32 realmId;
+ RBACData* rbac;
+ bool needDelete;
+};
+
+class rbac_commandscript : public CommandScript
+{
+public:
+ rbac_commandscript() : CommandScript("rbac_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand rbacGroupsCommandTable[] =
+ {
+ { "add", SEC_ADMINISTRATOR, true, &HandleRBACGroupAddCommand, "", NULL },
+ { "remove", SEC_ADMINISTRATOR, true, &HandleRBACGroupRemoveCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACGroupListCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacRolesCommandTable[] =
+ {
+ { "grant", SEC_ADMINISTRATOR, true, &HandleRBACRoleGrantCommand, "", NULL },
+ { "deny", SEC_ADMINISTRATOR, true, &HandleRBACRoleDenyCommand, "", NULL },
+ { "revoke", SEC_ADMINISTRATOR, true, &HandleRBACRoleRevokeCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACRoleListCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacPermsCommandTable[] =
+ {
+ { "grant", SEC_ADMINISTRATOR, true, &HandleRBACPermGrantCommand, "", NULL },
+ { "deny", SEC_ADMINISTRATOR, true, &HandleRBACPermDenyCommand, "", NULL },
+ { "revoke", SEC_ADMINISTRATOR, true, &HandleRBACPermRevokeCommand, "", NULL },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACPermListCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacListCommandTable[] =
+ {
+ { "groups", SEC_ADMINISTRATOR, true, &HandleRBACListGroupsCommand, "", NULL },
+ { "roles", SEC_ADMINISTRATOR, true, &HandleRBACListRolesCommand, "", NULL },
+ { "permissions", SEC_ADMINISTRATOR, true, &HandleRBACListPermissionsCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacAccountCommandTable[] =
+ {
+ { "group", SEC_ADMINISTRATOR, true, NULL, "", rbacGroupsCommandTable },
+ { "role", SEC_ADMINISTRATOR, true, NULL, "", rbacRolesCommandTable },
+ { "permission", SEC_ADMINISTRATOR, true, NULL, "", rbacPermsCommandTable },
+ { "", SEC_ADMINISTRATOR, true, &HandleRBACAccountPermissionCommand, "", NULL },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacCommandTable[] =
+ {
+ { "account", SEC_ADMINISTRATOR, true, NULL, "", rbacAccountCommandTable },
+ { "list", SEC_ADMINISTRATOR, true, NULL, "", rbacListCommandTable },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "rbac", SEC_ADMINISTRATOR, true, NULL, "", rbacCommandTable },
+ { NULL, SEC_ADMINISTRATOR, false, NULL, "", NULL }
+ };
+
+ return commandTable;
+ }
+
+ static RBACCommandData* ReadParams(ChatHandler* handler, char const* args, bool checkParams = true)
+ {
+ if (!args)
+ return NULL;
+
+ char* param1 = strtok((char*)args, " ");
+ char* param2 = strtok(NULL, " ");
+ char* param3 = strtok(NULL, " ");
+
+ int32 realmId = -1;
+ uint32 accountId = 0;
+ std::string accountName;
+ uint32 id = 0;
+ RBACCommandData* data = NULL;
+ RBACData* rdata = NULL;
+ bool useSelectedPlayer = false;
+
+ if (checkParams)
+ {
+ if (!param3)
+ {
+ if (param2)
+ realmId = atoi(param2);
+
+ if (param1)
+ id = atoi(param1);
+
+ useSelectedPlayer = true;
+ }
+ else
+ {
+ id = atoi(param2);
+ realmId = atoi(param3);
+ }
+
+ if (!id)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+
+ if (realmId < -1 || !realmId)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_REALM, realmId);
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+ }
+ else if (!param1)
+ useSelectedPlayer = true;
+
+ if (useSelectedPlayer)
+ {
+ Player* player = handler->getSelectedPlayer();
+ if (!player)
+ return NULL;
+
+ rdata = player->GetSession()->GetRBACData();
+ accountId = rdata->GetId();
+ AccountMgr::GetName(accountId, accountName);
+ }
+ else
+ {
+ accountName = param1;
+
+ if (AccountMgr::normalizeString(accountName))
+ accountId = AccountMgr::GetId(accountName);
+
+ if (!accountId)
+ {
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+ }
+
+ if (checkParams && handler->HasLowerSecurityAccount(NULL, accountId, true))
+ return NULL;
+
+ data = new RBACCommandData();
+
+ if (!rdata)
+ {
+ data->rbac = new RBACData(accountId, accountName, ConfigMgr::GetIntDefault("RealmID", 0));
+ data->rbac->LoadFromDB();
+ data->needDelete = true;
+ }
+ else
+ data->rbac = rdata;
+
+ data->id = id;
+ data->realmId = realmId;
+ return data;
+ }
+
+ static bool HandleRBACGroupAddCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->AddGroup(command->id, command->realmId);
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_IN_LIST, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_ADDED, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACGroupRemoveCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->RemoveGroup(command->id, command->realmId);
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_REVOKE_NOT_IN_LIST:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_NOT_IN_LIST, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_GROUP_REMOVED, command->id, group->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACGroupListCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_GROUP_LIST_HEADER, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACGroupContainer const& groups = command->rbac->GetGroups();
+ if (groups.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACGroupContainer::const_iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, group->GetId(), group->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleGrantCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->GrantRole(command->id, command->realmId);
+ RBACRole const* role = sAccountMgr->GetRBACRole(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_GRANTED_IN_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_DENIED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_GRANTED_IN_DENIED_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_GRANTED, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleDenyCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->DenyRole(command->id, command->realmId);
+ RBACRole const* role = sAccountMgr->GetRBACRole(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_DENIED_IN_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_GRANTED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_DENIED_IN_GRANTED_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_DENIED, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleRevokeCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->RevokeRole(command->id, command->realmId);
+ RBACRole const* role = sAccountMgr->GetRBACRole(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_REVOKE_NOT_IN_LIST:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_REVOKED_NOT_IN_LIST, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_ROLE_REVOKED, command->id, role->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACRoleListCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_ROLE_LIST_HEADER_GRANTED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACGroupContainer const& granted = command->rbac->GetGrantedRoles();
+ if (granted.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACRoleContainer::const_iterator it = granted.begin(); it != granted.end(); ++it)
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_ROLE_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACGroupContainer const& denied = command->rbac->GetDeniedRoles();
+ if (denied.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACRoleContainer::const_iterator it = denied.begin(); it != denied.end(); ++it)
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermGrantCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->GrantPermission(command->id, command->realmId);
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_DENIED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermDenyCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->DenyPermission(command->id, command->realmId);
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_IN_GRANTED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermRevokeCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ RBACCommandResult result = command->rbac->RevokePermission(command->id, command->realmId);
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case RBAC_CANT_REVOKE_NOT_IN_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermListCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_PERM_LIST_HEADER_GRANTED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACPermissionContainer const& granted = command->rbac->GetGrantedPermissions();
+ if (!granted.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (granted.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_PERM_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACPermissionContainer const& denied = command->rbac->GetDeniedPermissions();
+ if (!denied.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (denied.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACAccountPermissionCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_PERM_LIST_GLOBAL, command->rbac->GetId(), command->rbac->GetName().c_str());
+ RBACPermissionContainer const& permissions = command->rbac->GetPermissions();
+ if (!permissions.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (permissions.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ if (command->needDelete)
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACListGroupsCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 id = 0;
+ if (char* param1 = strtok((char*)args, " "))
+ id = atoi(param1);
+
+ if (!id)
+ {
+ RBACGroupsContainer const& groups = sAccountMgr->GetRBACGroupList();
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_GROUPS_HEADER));
+ for (RBACGroupsContainer::const_iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ RBACGroup const* group = it->second;
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, group->GetId(), group->GetName().c_str());
+ }
+ }
+ else
+ {
+ RBACGroup const* group = sAccountMgr->GetRBACGroup(id);
+ if (!group)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_GROUPS_HEADER));
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, group->GetId(), group->GetName().c_str());
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER));
+ RBACRoleContainer const& roles = group->GetRoles();
+ if (roles.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (RBACRoleContainer::const_iterator it = roles.begin(); it != roles.end(); ++it)
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(*it);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+ }
+
+ return true;
+ }
+
+ static bool HandleRBACListRolesCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 id = 0;
+ if (char* param1 = strtok((char*)args, " "))
+ id = atoi(param1);
+
+ if (!id)
+ {
+ RBACRolesContainer const& roles = sAccountMgr->GetRBACRoleList();
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER));
+ for (RBACRolesContainer::const_iterator it = roles.begin(); it != roles.end(); ++it)
+ {
+ RBACRole const* role = it->second;
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ }
+ }
+ else
+ {
+ RBACRole const* role = sAccountMgr->GetRBACRole(id);
+ if (!role)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_ROLES_HEADER));
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, role->GetId(), role->GetName().c_str());
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ RBACPermissionContainer const& permissions = role->GetPermissions();
+ if (!permissions.any())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (uint32 i = 0; i < RBAC_PERM_MAX; ++i)
+ if (permissions.test(i))
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(i);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+ }
+
+ return true;
+ }
+
+ static bool HandleRBACListPermissionsCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 id = 0;
+ if (char* param1 = strtok((char*)args, " "))
+ id = atoi(param1);
+
+ if (!id)
+ {
+ RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ for (RBACPermissionsContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
+ {
+ RBACPermission const* permission = it->second;
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+ else
+ {
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(id);
+ if (!permission)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+
+ return true;
+ }
+};
+
+void AddSC_rbac_commandscript()
+{
+ new rbac_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp
index f5f998bbf0d..52721f9866d 100644
--- a/src/server/scripts/Commands/cs_reload.cpp
+++ b/src/server/scripts/Commands/cs_reload.cpp
@@ -452,54 +452,53 @@ public:
cInfo->dynamicflags = fields[33].GetUInt32();
cInfo->family = fields[34].GetUInt8();
cInfo->trainer_type = fields[35].GetUInt8();
- cInfo->trainer_spell = fields[36].GetUInt32();
- cInfo->trainer_class = fields[37].GetUInt8();
- cInfo->trainer_race = fields[38].GetUInt8();
- cInfo->minrangedmg = fields[39].GetFloat();
- cInfo->maxrangedmg = fields[40].GetFloat();
- cInfo->rangedattackpower = fields[41].GetUInt16();
- cInfo->type = fields[42].GetUInt8();
- cInfo->type_flags = fields[43].GetUInt32();
- cInfo->lootid = fields[44].GetUInt32();
- cInfo->pickpocketLootId = fields[45].GetUInt32();
- cInfo->SkinLootId = fields[46].GetUInt32();
+ cInfo->trainer_class = fields[36].GetUInt8();
+ cInfo->trainer_race = fields[37].GetUInt8();
+ cInfo->minrangedmg = fields[38].GetFloat();
+ cInfo->maxrangedmg = fields[39].GetFloat();
+ cInfo->rangedattackpower = fields[40].GetUInt16();
+ cInfo->type = fields[41].GetUInt8();
+ cInfo->type_flags = fields[42].GetUInt32();
+ cInfo->lootid = fields[43].GetUInt32();
+ cInfo->pickpocketLootId = fields[44].GetUInt32();
+ cInfo->SkinLootId = fields[45].GetUInt32();
for (uint8 i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
- cInfo->resistance[i] = fields[47 + i -1].GetUInt16();
-
- cInfo->spells[0] = fields[53].GetUInt32();
- cInfo->spells[1] = fields[54].GetUInt32();
- cInfo->spells[2] = fields[55].GetUInt32();
- cInfo->spells[3] = fields[56].GetUInt32();
- cInfo->spells[4] = fields[57].GetUInt32();
- cInfo->spells[5] = fields[58].GetUInt32();
- cInfo->spells[6] = fields[59].GetUInt32();
- cInfo->spells[7] = fields[60].GetUInt32();
- cInfo->PetSpellDataId = fields[61].GetUInt32();
- cInfo->VehicleId = fields[62].GetUInt32();
- cInfo->mingold = fields[63].GetUInt32();
- cInfo->maxgold = fields[64].GetUInt32();
- cInfo->AIName = fields[65].GetString();
- cInfo->MovementType = fields[66].GetUInt8();
- cInfo->InhabitType = fields[67].GetUInt8();
- cInfo->HoverHeight = fields[68].GetFloat();
- cInfo->ModHealth = fields[69].GetFloat();
- cInfo->ModMana = fields[70].GetFloat();
- 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());
+ cInfo->resistance[i] = fields[46 + i -1].GetUInt16();
+
+ cInfo->spells[0] = fields[52].GetUInt32();
+ cInfo->spells[1] = fields[53].GetUInt32();
+ cInfo->spells[2] = fields[54].GetUInt32();
+ cInfo->spells[3] = fields[55].GetUInt32();
+ cInfo->spells[4] = fields[56].GetUInt32();
+ cInfo->spells[5] = fields[57].GetUInt32();
+ cInfo->spells[6] = fields[58].GetUInt32();
+ cInfo->spells[7] = fields[59].GetUInt32();
+ cInfo->PetSpellDataId = fields[60].GetUInt32();
+ cInfo->VehicleId = fields[61].GetUInt32();
+ cInfo->mingold = fields[62].GetUInt32();
+ cInfo->maxgold = fields[63].GetUInt32();
+ cInfo->AIName = fields[64].GetString();
+ cInfo->MovementType = fields[65].GetUInt8();
+ cInfo->InhabitType = fields[66].GetUInt8();
+ cInfo->HoverHeight = fields[67].GetFloat();
+ cInfo->ModHealth = fields[68].GetFloat();
+ cInfo->ModMana = fields[69].GetFloat();
+ cInfo->ModManaExtra = 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());
sObjectMgr->CheckCreatureTemplate(cInfo);
}
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
index d7441d6311b..3c6369003ec 100644
--- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
*
* This program is free software; you can redistribute it and/or modify it
@@ -16,6 +16,11 @@
*/
#include "baradin_hold.h"
+#include "InstanceScript.h"
+#include "ScriptMgr.h"
+#include "Player.h"
+#include "ObjectAccessor.h"
+#include "ScriptedCreature.h"
enum Texts
{
@@ -74,7 +79,7 @@ class boss_alizabal : public CreatureScript
{
public:
boss_alizabal() : CreatureScript("boss_alizabal") { }
-
+
struct boss_alizabalAI : public BossAI
{
boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL)
@@ -137,7 +142,7 @@ class boss_alizabal : public CreatureScript
}
}
- void MovementInform(uint32 type, uint32 pointId)
+ void MovementInform(uint32 /*type*/, uint32 pointId)
{
switch (pointId)
{
@@ -248,7 +253,7 @@ class boss_alizabal : public CreatureScript
break;
}
}
-
+
DoMeleeAttackIfReady();
}
};
diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
index 9bbfebecf2c..0e2b7107548 100644
--- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
+++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp
@@ -15,7 +15,9 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include"baradin_hold.h"
+#include "baradin_hold.h"
+#include "InstanceScript.h"
+#include "ScriptMgr.h"
DoorData const doorData[] =
{
@@ -94,7 +96,8 @@ public:
default:
break;
}
- return NULL;
+
+ return 0;
}
void OnGameObjectRemove(GameObject* go)
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
index 0aeba151385..fa1ab5528ca 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_broodlord_lashlayer.cpp
@@ -101,10 +101,13 @@ public:
if (KnockBack_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_KNOCKBACK);
- //Drop 50% aggro
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -50);
+ if (Unit* target = me->getVictim())
+ {
+ DoCast(target, SPELL_KNOCKBACK);
+ // Drop 50% aggro
+ if (DoGetThreat(target))
+ DoModifyThreatPercent(target, -50);
+ }
KnockBack_Timer = urand(15000, 30000);
} else KnockBack_Timer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp
index 7ca74f4ed4f..4c36d78667b 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_firemaw.cpp
@@ -68,24 +68,26 @@ public:
//ShadowFlame_Timer
if (ShadowFlame_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_SHADOWFLAME);
+ DoCastVictim(SPELL_SHADOWFLAME);
ShadowFlame_Timer = urand(15000, 18000);
} else ShadowFlame_Timer -= diff;
//WingBuffet_Timer
if (WingBuffet_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_WINGBUFFET);
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -75);
-
+ if (Unit* target = me->getVictim())
+ {
+ DoCast(target, SPELL_WINGBUFFET);
+ if (DoGetThreat(target))
+ DoModifyThreatPercent(target, -75);
+ }
WingBuffet_Timer = 25000;
} else WingBuffet_Timer -= diff;
//FlameBuffet_Timer
if (FlameBuffet_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_FLAMEBUFFET);
+ DoCastVictim(SPELL_FLAMEBUFFET);
FlameBuffet_Timer = 5000;
} else FlameBuffet_Timer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp
index a1659330a6f..57215e3f43d 100644
--- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_flamegor.cpp
@@ -76,17 +76,19 @@ public:
//ShadowFlame_Timer
if (ShadowFlame_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_SHADOWFLAME);
+ DoCastVictim(SPELL_SHADOWFLAME);
ShadowFlame_Timer = urand(15000, 22000);
} else ShadowFlame_Timer -= diff;
//WingBuffet_Timer
if (WingBuffet_Timer <= diff)
{
- DoCast(me->getVictim(), SPELL_WINGBUFFET);
- if (DoGetThreat(me->getVictim()))
- DoModifyThreatPercent(me->getVictim(), -75);
-
+ if (Unit* target = me->getVictim())
+ {
+ DoCast(target, SPELL_WINGBUFFET);
+ if (DoGetThreat(target))
+ DoModifyThreatPercent(target, -75);
+ }
WingBuffet_Timer = 25000;
} else WingBuffet_Timer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
index 6985ad2c4ad..f508266434b 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter2.cpp
@@ -160,7 +160,7 @@ public:
## npc_koltira_deathweaver
######*/
-enum eKoltira
+enum Koltira
{
SAY_BREAKOUT1 = 0,
SAY_BREAKOUT2 = 1,
@@ -180,10 +180,9 @@ enum eKoltira
NPC_CRIMSON_ACOLYTE = 29007,
NPC_HIGH_INQUISITOR_VALROTH = 29001,
- NPC_KOLTIRA_ALT = 28447,
//not sure about this id
- //NPC_DEATH_KNIGHT_MOUNT = 29201,
+ //NPC_DEATH_KNIGHT_MOUNT = 29201,
MODEL_DEATH_KNIGHT_MOUNT = 25278
};
@@ -198,17 +197,12 @@ public:
{
creature->SetStandState(UNIT_STAND_STATE_STAND);
- if (npc_escortAI* pEscortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI()))
- pEscortAI->Start(false, false, player->GetGUID());
+ if (npc_escortAI* escortAI = CAST_AI(npc_koltira_deathweaver::npc_koltira_deathweaverAI, creature->AI()))
+ escortAI->Start(false, false, player->GetGUID());
}
return true;
}
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_koltira_deathweaverAI(creature);
- }
-
struct npc_koltira_deathweaverAI : public npc_escortAI
{
npc_koltira_deathweaverAI(Creature* creature) : npc_escortAI(creature)
@@ -216,20 +210,17 @@ public:
me->SetReactState(REACT_DEFENSIVE);
}
- uint32 m_uiWave;
- uint32 m_uiWave_Timer;
- uint64 m_uiValrothGUID;
-
void Reset()
{
if (!HasEscortState(STATE_ESCORT_ESCORTING))
{
- m_uiWave = 0;
- m_uiWave_Timer = 3000;
- m_uiValrothGUID = 0;
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ wave = 0;
+ waveTimer = 3000;
+ valrothGUID = 0;
me->LoadEquipment(0, true);
- me->RemoveAura(SPELL_ANTI_MAGIC_ZONE);
+ me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
+ me->RemoveAurasDueToSpell(SPELL_KOLTIRA_TRANSFORM);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
@@ -239,22 +230,21 @@ public:
{
case 0:
Talk(SAY_BREAKOUT1);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
break;
case 1:
me->SetStandState(UNIT_STAND_STATE_KNEEL);
break;
case 2:
me->SetStandState(UNIT_STAND_STATE_STAND);
- //me->UpdateEntry(NPC_KOLTIRA_ALT); //unclear if we must update or not
DoCast(me, SPELL_KOLTIRA_TRANSFORM);
me->LoadEquipment(me->GetEquipmentId());
break;
case 3:
SetEscortPaused(true);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
me->SetStandState(UNIT_STAND_STATE_KNEEL);
Talk(SAY_BREAKOUT2);
- DoCast(me, SPELL_ANTI_MAGIC_ZONE); // cast again that makes bubble up
+ DoCast(me, SPELL_ANTI_MAGIC_ZONE);
break;
case 4:
SetRun(true);
@@ -274,9 +264,8 @@ public:
summoned->AI()->AttackStart(player);
if (summoned->GetEntry() == NPC_HIGH_INQUISITOR_VALROTH)
- m_uiValrothGUID = summoned->GetGUID();
+ valrothGUID = summoned->GetGUID();
- summoned->AddThreat(me, 0.0f);
summoned->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
}
@@ -292,51 +281,51 @@ public:
if (HasEscortState(STATE_ESCORT_PAUSED))
{
- if (m_uiWave_Timer <= uiDiff)
+ if (waveTimer <= uiDiff)
{
- switch (m_uiWave)
+ switch (wave)
{
case 0:
Talk(SAY_BREAKOUT3);
SummonAcolyte(3);
- m_uiWave_Timer = 20000;
+ waveTimer = 20000;
break;
case 1:
Talk(SAY_BREAKOUT4);
SummonAcolyte(3);
- m_uiWave_Timer = 20000;
+ waveTimer = 20000;
break;
case 2:
Talk(SAY_BREAKOUT5);
SummonAcolyte(4);
- m_uiWave_Timer = 20000;
+ waveTimer = 20000;
break;
case 3:
Talk(SAY_BREAKOUT6);
me->SummonCreature(NPC_HIGH_INQUISITOR_VALROTH, 1642.329f, -6045.818f, 127.583f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1000);
- m_uiWave_Timer = 1000;
+ waveTimer = 1000;
break;
case 4:
{
- Creature* temp = Unit::GetCreature(*me, m_uiValrothGUID);
+ Creature* temp = Unit::GetCreature(*me, valrothGUID);
if (!temp || !temp->isAlive())
{
Talk(SAY_BREAKOUT8);
- m_uiWave_Timer = 5000;
+ waveTimer = 5000;
}
else
{
- m_uiWave_Timer = 2500;
- return; //return, we don't want m_uiWave to increment now
+ waveTimer = 2500;
+ return;
}
break;
}
case 5:
Talk(SAY_BREAKOUT9);
me->RemoveAurasDueToSpell(SPELL_ANTI_MAGIC_ZONE);
- // i do not know why the armor will also be removed
- m_uiWave_Timer = 2500;
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ waveTimer = 2500;
break;
case 6:
Talk(SAY_BREAKOUT10);
@@ -344,14 +333,24 @@ public:
break;
}
- ++m_uiWave;
+ ++wave;
}
else
- m_uiWave_Timer -= uiDiff;
+ waveTimer -= uiDiff;
}
}
+
+ private:
+ uint8 wave;
+ uint32 waveTimer;
+ uint64 valrothGUID;
+
};
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_koltira_deathweaverAI(creature);
+ }
};
//Scarlet courier
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
index 58e130ce644..19660cec4af 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -66,8 +66,8 @@ enum eMisc
Position const PosMove[2] =
{
- { 299.4884f, 92.76137f, 105.6335f },
- { 314.8673f, 90.30210f, 101.6459f }
+ { 299.4884f, 92.76137f, 105.6335f, 0.0f },
+ { 314.8673f, 90.30210f, 101.6459f, 0.0f }
};
class boss_kirtonos_the_herald : public CreatureScript
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
index c186ada72b7..73b52c4185f 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp
@@ -345,10 +345,12 @@ public:
return new boss_alythessAI (creature);
};
- struct boss_alythessAI : public Scripted_NoMovementAI
+ struct boss_alythessAI : public ScriptedAI
{
- boss_alythessAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ boss_alythessAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
instance = creature->GetInstanceScript();
IntroStepCounter = 10;
}
@@ -418,9 +420,7 @@ public:
void AttackStart(Unit* who)
{
if (!me->isInCombat())
- {
- Scripted_NoMovementAI::AttackStart(who);
- }
+ ScriptedAI::AttackStart(who);
}
void MoveInLineOfSight(Unit* who)
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index a8755c16418..742c80bea39 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -780,8 +780,9 @@ public:
if (AgonyCurseTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!target) target = me->getVictim();
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
+ if (!target)
+ target = me->getVictim();
DoCast(target, SPELL_AGONY_CURSE);
AgonyCurseTimer = 20000;
} else AgonyCurseTimer -= diff;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
index 7718b3682f8..3d9cb69cbae 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp
@@ -392,11 +392,13 @@ public:
return new mob_kiljaeden_controllerAI (creature);
}
- struct mob_kiljaeden_controllerAI : public Scripted_NoMovementAI
+ struct mob_kiljaeden_controllerAI : public ScriptedAI
{
- mob_kiljaeden_controllerAI(Creature* creature) : Scripted_NoMovementAI(creature), summons(me)
+ mob_kiljaeden_controllerAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
instance = creature->GetInstanceScript();
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -492,11 +494,13 @@ public:
return new boss_kiljaedenAI (creature);
}
- struct boss_kiljaedenAI : public Scripted_NoMovementAI
+ struct boss_kiljaedenAI : public ScriptedAI
{
- boss_kiljaedenAI(Creature* creature) : Scripted_NoMovementAI(creature), summons(me)
+ boss_kiljaedenAI(Creature* creature) : ScriptedAI(creature), summons(me)
{
instance = creature->GetInstanceScript();
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -520,7 +524,7 @@ public:
void InitializeAI()
{
- Scripted_NoMovementAI::InitializeAI();
+ // Scripted_NoMovementAI::InitializeAI();
}
void Reset()
@@ -615,7 +619,8 @@ public:
void EnterEvadeMode()
{
- Scripted_NoMovementAI::EnterEvadeMode();
+ ScriptedAI::EnterEvadeMode();
+
summons.DespawnAll();
// Reset the controller
@@ -999,9 +1004,12 @@ public:
return new mob_felfire_portalAI (creature);
}
- struct mob_felfire_portalAI : public Scripted_NoMovementAI
+ struct mob_felfire_portalAI : public ScriptedAI
{
- mob_felfire_portalAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_felfire_portalAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint32 uiSpawnFiendTimer;
@@ -1100,9 +1108,12 @@ public:
return new mob_armageddonAI (creature);
}
- struct mob_armageddonAI : public Scripted_NoMovementAI
+ struct mob_armageddonAI : public ScriptedAI
{
- mob_armageddonAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_armageddonAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint8 spell;
uint32 uiTimer;
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index 5eb79258005..b45e55e0605 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
@@ -213,10 +213,11 @@ public:
return new boss_muruAI (creature);
}
- struct boss_muruAI : public Scripted_NoMovementAI
+ struct boss_muruAI : public ScriptedAI
{
- boss_muruAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me)
+ boss_muruAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
@@ -377,10 +378,11 @@ public:
return new npc_muru_portalAI (creature);
}
- struct npc_muru_portalAI : public Scripted_NoMovementAI
+ struct npc_muru_portalAI : public ScriptedAI
{
- npc_muru_portalAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me)
+ npc_muru_portalAI(Creature* creature) : ScriptedAI(creature), Summons(creature)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
index 1b2512ccf63..f1cb7b4116a 100644
--- a/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
@@ -201,8 +201,11 @@ class boss_akilzon : public CreatureScript
//dealdamege
for (std::list<Unit*>::const_iterator i = tempUnitMap.begin(); i != tempUnitMap.end(); ++i)
{
- if (!Cloud->IsWithinDist(*i, 6, false))
- Cloud->CastCustomSpell(*i, 43137, &bp0, NULL, NULL, true, 0, 0, me->GetGUID());
+ if (Unit* target = (*i))
+ {
+ if (!Cloud->IsWithinDist(target, 6, false))
+ Cloud->CastCustomSpell(target, 43137, &bp0, NULL, NULL, true, 0, 0, me->GetGUID());
+ }
}
// visual
float x, y, z;
diff --git a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
index 432768a51de..33cb5f649d7 100644
--- a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
@@ -551,9 +551,12 @@ public:
return new npc_infused_crystalAI (creature);
}
- struct npc_infused_crystalAI : public Scripted_NoMovementAI
+ struct npc_infused_crystalAI : public ScriptedAI
{
- npc_infused_crystalAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_infused_crystalAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint32 EndTimer;
uint32 WaveTimer;
diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
index ee22b766154..c8bc82be245 100644
--- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp
@@ -254,9 +254,12 @@ public:
return new npc_andorhal_towerAI (creature);
}
- struct npc_andorhal_towerAI : public Scripted_NoMovementAI
+ struct npc_andorhal_towerAI : public ScriptedAI
{
- npc_andorhal_towerAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_andorhal_towerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
void MoveInLineOfSight(Unit* who)
{
diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt
index 44f48a1c35e..6f145d3e9a4 100644
--- a/src/server/scripts/Kalimdor/CMakeLists.txt
+++ b/src/server/scripts/Kalimdor/CMakeLists.txt
@@ -38,11 +38,11 @@ set(scripts_STAT_SRCS
Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h
Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp
Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp
- Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp
- Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp
+ Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
+ Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp
- Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp
+ Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
index 36f6f94b324..c28d70e2634 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp
@@ -1369,8 +1369,7 @@ public:
forcemove = false;
if (forcemove)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
me->Attack(target, false);
}
if (MoveTimer <= diff)
@@ -1409,11 +1408,11 @@ public:
return new alliance_riflemanAI(creature);
}
- struct alliance_riflemanAI : public Scripted_NoMovementAI
+ struct alliance_riflemanAI : public ScriptedAI
{
- alliance_riflemanAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ alliance_riflemanAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
uint32 ExplodeTimer;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
index fad5736e18f..fad5736e18f 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_epoch.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
index 8c2861db299..8c2861db299 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
index d7d9beaedd4..d7d9beaedd4 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
index ea372621026..7ac8d4e783b 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/boss_chrono_lord_deja.cpp
@@ -124,8 +124,8 @@ public:
//Arcane Discharge
if (ArcaneDischarge_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- DoCast(target, SPELL_ARCANE_DISCHARGE);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, SPELL_ARCANE_DISCHARGE);
ArcaneDischarge_Timer = 20000+rand()%10000;
} else ArcaneDischarge_Timer -= diff;
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
index 9c17ed10d9c..78b655bb73b 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/DarkPortal/instance_dark_portal.cpp
@@ -122,7 +122,7 @@ public:
bool IsEncounterInProgress() const
{
- if (const_cast<instance_dark_portal_InstanceMapScript*>(this)->GetData(TYPE_MEDIVH) == IN_PROGRESS)
+ if (GetData(TYPE_MEDIVH) == IN_PROGRESS)
return true;
return false;
diff --git a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
index 1dc70c5e505..b7816242afc 100644
--- a/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
+++ b/src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp
@@ -298,7 +298,7 @@ class npc_blazing_monstrosity : public CreatureScript
passenger->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
// Hack to relocate vehicle on vehicle so exiting players are not moved under map
- Movement::MoveSplineInit init(*passenger);
+ Movement::MoveSplineInit init(passenger);
init.DisableTransportPathTransformations();
init.MoveTo(0.6654003f, 0.0f, 1.9815f);
init.SetFacing(0.0f);
diff --git a/src/server/scripts/Kalimdor/Firelands/firelands.h b/src/server/scripts/Kalimdor/Firelands/firelands.h
index 330158d6c94..cf12892b2c9 100644
--- a/src/server/scripts/Kalimdor/Firelands/firelands.h
+++ b/src/server/scripts/Kalimdor/Firelands/firelands.h
@@ -19,7 +19,7 @@
#define FIRELANDS_H_
#include "Map.h"
-#include "Creature.h"
+#include "CreatureAI.h"
#define FirelandsScriptName "instance_firelands"
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
index 1ea0ee0a343..2169320621b 100644
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp
@@ -86,8 +86,8 @@ public:
return true;
}
protected:
- InstanceScript* _instance;
Unit* _owner;
+ InstanceScript* _instance;
};
class boss_earthrager_ptah : public CreatureScript
@@ -262,8 +262,8 @@ public:
}
protected:
- bool _hasDispersed;
uint8 _summonDeaths;
+ bool _hasDispersed;
};
CreatureAI* GetAI(Creature* creature) const
diff --git a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
index 285d893fe41..c69a696827e 100644
--- a/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
+++ b/src/server/scripts/Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp
@@ -197,11 +197,12 @@ class npc_buru_egg : public CreatureScript
public:
npc_buru_egg() : CreatureScript("npc_buru_egg") { }
- struct npc_buru_eggAI : public Scripted_NoMovementAI
+ struct npc_buru_eggAI : public ScriptedAI
{
- npc_buru_eggAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_buru_eggAI(Creature* creature) : ScriptedAI(creature)
{
_instance = me->GetInstanceScript();
+ SetCombatMovement(false);
}
void EnterCombat(Unit* attacker)
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
index 2a9ea4ba4fc..a16e9cfa89d 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp
@@ -274,10 +274,11 @@ public:
for (uint8 i = 0; i < 10; ++i)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- Creature* Summoned = me->SummonCreature(15621, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000);
- if (Summoned && target)
- Summoned->AI()->AttackStart(target);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (Creature* Summoned = me->SummonCreature(15621, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 90000))
+ Summoned->AI()->AttackStart(target);
+ }
}
}
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
index 3da1fc1dc5c..b5fbd644592 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp
@@ -156,13 +156,15 @@ public:
return new eye_of_cthunAI (creature);
}
- struct eye_of_cthunAI : public Scripted_NoMovementAI
+ struct eye_of_cthunAI : public ScriptedAI
{
- eye_of_cthunAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ eye_of_cthunAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
if (!instance)
sLog->outError(LOG_FILTER_TSCR, "No Instance eye_of_cthunAI");
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -460,9 +462,9 @@ public:
return new cthunAI (creature);
}
- struct cthunAI : public Scripted_NoMovementAI
+ struct cthunAI : public ScriptedAI
{
- cthunAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ cthunAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -916,15 +918,17 @@ public:
return new eye_tentacleAI (creature);
}
- struct eye_tentacleAI : public Scripted_NoMovementAI
+ struct eye_tentacleAI : public ScriptedAI
{
- eye_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ eye_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
if (Creature* pPortal = me->SummonCreature(MOB_SMALL_PORTAL, *me, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
+
+ SetCombatMovement(false);
}
uint32 MindflayTimer;
@@ -989,9 +993,9 @@ public:
return new claw_tentacleAI (creature);
}
- struct claw_tentacleAI : public Scripted_NoMovementAI
+ struct claw_tentacleAI : public ScriptedAI
{
- claw_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ claw_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -1099,9 +1103,9 @@ public:
return new giant_claw_tentacleAI (creature);
}
- struct giant_claw_tentacleAI : public Scripted_NoMovementAI
+ struct giant_claw_tentacleAI : public ScriptedAI
{
- giant_claw_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ giant_claw_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -1218,9 +1222,9 @@ public:
return new giant_eye_tentacleAI (creature);
}
- struct giant_eye_tentacleAI : public Scripted_NoMovementAI
+ struct giant_eye_tentacleAI : public ScriptedAI
{
- giant_eye_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ giant_eye_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
@@ -1282,9 +1286,9 @@ public:
return new flesh_tentacleAI (creature);
}
- struct flesh_tentacleAI : public Scripted_NoMovementAI
+ struct flesh_tentacleAI : public ScriptedAI
{
- flesh_tentacleAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ flesh_tentacleAI(Creature* creature) : ScriptedAI(creature)
{
SetCombatMovement(false);
}
diff --git a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
index 80fdc111911..52d59efd0df 100644
--- a/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
+++ b/src/server/scripts/Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp
@@ -137,9 +137,7 @@ public:
{
if (SpawnHatchlings_Timer <= diff)
{
- Unit* target = NULL;
- target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->GetTypeId() == TYPEID_PLAYER)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
{
DoCast(target, SPELL_ROOT);
diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp
index 0ecf5e51c1f..f4c0eed481e 100644
--- a/src/server/scripts/Kalimdor/zone_desolace.cpp
+++ b/src/server/scripts/Kalimdor/zone_desolace.cpp
@@ -37,7 +37,6 @@ EndContentData */
enum DyingKodo
{
- // signed for 9999
SAY_SMEED_HOME = 0,
QUEST_KODO = 5561,
@@ -49,7 +48,7 @@ enum DyingKodo
NPC_TAMED_KODO = 11627,
SPELL_KODO_KOMBO_ITEM = 18153,
- SPELL_KODO_KOMBO_PLAYER_BUFF = 18172, //spells here have unclear function, but using them at least for visual parts and checks
+ SPELL_KODO_KOMBO_PLAYER_BUFF = 18172,
SPELL_KODO_KOMBO_DESPAWN_BUFF = 18377,
SPELL_KODO_KOMBO_GOSSIP = 18362
@@ -64,110 +63,55 @@ public:
{
if (player->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) && creature->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
{
- //the expected quest objective
- player->TalkedToCreature(creature->GetEntry(), creature->GetGUID());
-
+ player->TalkedToCreature(creature->GetEntry(), 0);
player->RemoveAurasDueToSpell(SPELL_KODO_KOMBO_PLAYER_BUFF);
- creature->GetMotionMaster()->MoveIdle();
}
player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID());
return true;
}
- bool EffectDummyCreature(Unit* pCaster, uint32 spellId, uint32 effIndex, Creature* creatureTarget)
- {
- //always check spellid and effectindex
- if (spellId == SPELL_KODO_KOMBO_ITEM && effIndex == 0)
- {
- //no effect if player/creature already have aura from spells
- if (pCaster->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) || creatureTarget->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
- return true;
-
- if (creatureTarget->GetEntry() == NPC_AGED_KODO ||
- creatureTarget->GetEntry() == NPC_DYING_KODO ||
- creatureTarget->GetEntry() == NPC_ANCIENT_KODO)
- {
- pCaster->CastSpell(pCaster, SPELL_KODO_KOMBO_PLAYER_BUFF, true);
-
- creatureTarget->UpdateEntry(NPC_TAMED_KODO);
- creatureTarget->CastSpell(creatureTarget, SPELL_KODO_KOMBO_DESPAWN_BUFF, false);
-
- if (creatureTarget->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
- creatureTarget->GetMotionMaster()->MoveIdle();
-
- creatureTarget->GetMotionMaster()->MoveFollow(pCaster, PET_FOLLOW_DIST, creatureTarget->GetFollowAngle());
- }
-
- //always return true when we are handling this spell and effect
- return true;
- }
- return false;
- }
-
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_aged_dying_ancient_kodoAI(creature);
- }
-
struct npc_aged_dying_ancient_kodoAI : public ScriptedAI
{
- npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) { Reset(); }
-
- uint32 DespawnTimer;
+ npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) {}
- void Reset()
+ void MoveInLineOfSight(Unit* who)
{
- DespawnTimer = 0;
+ if (who->GetEntry() == NPC_SMEED && me->IsWithinDistInMap(who, 10.0f) && !me->HasAura(SPELL_KODO_KOMBO_GOSSIP))
+ {
+ me->GetMotionMaster()->Clear();
+ DoCast(me, SPELL_KODO_KOMBO_GOSSIP, true);
+ if (Creature* smeed = who->ToCreature())
+ smeed->AI()->Talk(SAY_SMEED_HOME);
+ }
}
- void MoveInLineOfSight(Unit* who)
+ void SpellHit(Unit* caster, SpellInfo const* spell)
{
- if (who->GetEntry() == NPC_SMEED)
+ if (spell->Id == SPELL_KODO_KOMBO_ITEM)
{
- if (me->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP))
- return;
-
- if (me->IsWithinDistInMap(who, 10.0f))
+ if (!(caster->HasAura(SPELL_KODO_KOMBO_PLAYER_BUFF) || me->HasAura(SPELL_KODO_KOMBO_DESPAWN_BUFF))
+ && (me->GetEntry() == NPC_AGED_KODO || me->GetEntry() == NPC_DYING_KODO || me->GetEntry() == NPC_ANCIENT_KODO))
{
- if (Creature* talker = who->ToCreature())
- talker->AI()->Talk(SAY_SMEED_HOME);
+ caster->CastSpell(caster, SPELL_KODO_KOMBO_PLAYER_BUFF, true);
+ DoCast(me, SPELL_KODO_KOMBO_DESPAWN_BUFF, true);
- //spell have no implemented effect (dummy), so useful to notify spellHit
- DoCast(me, SPELL_KODO_KOMBO_GOSSIP, true);
+ me->UpdateEntry(NPC_TAMED_KODO);
+ me->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, me->GetFollowAngle());
}
}
- }
-
- void SpellHit(Unit* /*pCaster*/, SpellInfo const* pSpell)
- {
- if (pSpell->Id == SPELL_KODO_KOMBO_GOSSIP)
+ else if (spell->Id == SPELL_KODO_KOMBO_GOSSIP)
{
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- DespawnTimer = 60000;
+ me->DespawnOrUnsummon(60000);
}
}
-
- void UpdateAI(const uint32 diff)
- {
- //timer should always be == 0 unless we already updated entry of creature. Then not expect this updated to ever be in combat.
- if (DespawnTimer && DespawnTimer <= diff)
- {
- if (!me->getVictim() && me->isAlive())
- {
- Reset();
- me->setDeathState(JUST_DIED);
- me->Respawn();
- return;
- }
- } else DespawnTimer -= diff;
-
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
- }
};
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_aged_dying_ancient_kodoAI(creature);
+ }
};
diff --git a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
index 1139122f73b..52887928d0a 100644
--- a/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
+++ b/src/server/scripts/Kalimdor/zone_thunder_bluff.cpp
@@ -81,8 +81,7 @@ public:
if (BerserkerChargeTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_BERSERKER_CHARGE);
BerserkerChargeTimer = 25000;
} else BerserkerChargeTimer -= diff;
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
index d484e2a4279..bb08b48ab4a 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp
@@ -182,9 +182,9 @@ class mob_amanitar_mushrooms : public CreatureScript
public:
mob_amanitar_mushrooms() : CreatureScript("mob_amanitar_mushrooms") { }
- struct mob_amanitar_mushroomsAI : public Scripted_NoMovementAI
+ struct mob_amanitar_mushroomsAI : public ScriptedAI
{
- mob_amanitar_mushroomsAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_amanitar_mushroomsAI(Creature* creature) : ScriptedAI(creature) {}
EventMap events;
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
index 7893fb7c984..2f731017646 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp
@@ -254,9 +254,9 @@ class mob_nadox_eggs : public CreatureScript
public:
mob_nadox_eggs() : CreatureScript("mob_nadox_eggs") { }
- struct mob_nadox_eggsAI : public Scripted_NoMovementAI
+ struct mob_nadox_eggsAI : public ScriptedAI
{
- mob_nadox_eggsAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_nadox_eggsAI(Creature* creature) : ScriptedAI(creature)
{
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
creature->UpdateAllStats();
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
index 7f6709b34fa..38c409ee706 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp
@@ -322,5 +322,5 @@ public:
void AddSC_boss_volazj()
{
- new boss_volazj;
+ new boss_volazj();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
index c36bcf9708f..732216420f9 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp
@@ -523,15 +523,17 @@ class npc_jedogas_aufseher_trigger : public CreatureScript
public:
npc_jedogas_aufseher_trigger() : CreatureScript("npc_jedogas_aufseher_trigger") { }
- struct npc_jedogas_aufseher_triggerAI : public Scripted_NoMovementAI
+ struct npc_jedogas_aufseher_triggerAI : public ScriptedAI
{
- npc_jedogas_aufseher_triggerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_jedogas_aufseher_triggerAI(Creature* creature) : ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
bRemoved = false;
bRemoved2 = false;
bCasted = false;
bCasted2 = false;
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
index 8f77cc7ec6f..53d0ddd6c19 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp
@@ -424,7 +424,7 @@ public:
void AddSC_boss_taldaram()
{
- new boss_taldaram;
- new mob_taldaram_flamesphere;
- new prince_taldaram_sphere;
+ new boss_taldaram();
+ new mob_taldaram_flamesphere();
+ new prince_taldaram_sphere();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
index db4959ae670..26a4aeeca01 100644
--- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp
@@ -336,5 +336,5 @@ public:
void AddSC_instance_ahnkahet()
{
- new instance_ahnkahet;
+ new instance_ahnkahet();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
index 1442ff265f4..06a640be6e4 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp
@@ -360,5 +360,5 @@ public:
void AddSC_boss_anub_arak()
{
- new boss_anub_arak;
+ new boss_anub_arak();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
index 6c707a8388f..e7decdc10fd 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp
@@ -198,5 +198,5 @@ public:
void AddSC_boss_hadronox()
{
- new boss_hadronox;
+ new boss_hadronox();
}
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
index 7873cadd096..875aafe9826 100644
--- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp
@@ -213,5 +213,5 @@ public:
void AddSC_instance_azjol_nerub()
{
- new instance_azjol_nerub;
+ new instance_azjol_nerub();
}
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
index f5864fe7b8f..3021e628063 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp
@@ -1480,10 +1480,11 @@ public:
return new mob_twilight_eggsAI(creature);
}
- struct mob_twilight_eggsAI : public Scripted_NoMovementAI
+ struct mob_twilight_eggsAI : public ScriptedAI
{
- mob_twilight_eggsAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_twilight_eggsAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
@@ -1602,11 +1603,11 @@ public:
return new npc_twilight_fissureAI(creature);
}
- struct npc_twilight_fissureAI : public Scripted_NoMovementAI
+ struct npc_twilight_fissureAI : public ScriptedAI
{
- npc_twilight_fissureAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_twilight_fissureAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
uint32 VoidBlast_Timer;
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
index 205a0b10d69..70c1141b6e6 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp
@@ -61,9 +61,7 @@ enum Phases
{
PHASE_ALL = 0,
PHASE_INTRO = 1,
- PHASE_COMBAT = 2,
-
- PHASE_INTRO_MASK = 1 << PHASE_INTRO,
+ PHASE_COMBAT = 2
};
class boss_baltharus_the_warborn : public CreatureScript
@@ -166,15 +164,16 @@ class boss_baltharus_the_warborn : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ bool introPhase = events.IsInPhase(PHASE_INTRO);
+ if (!UpdateVictim() && !introPhase)
return;
- if (!(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (!introPhase)
me->SetHealth(instance->GetData(DATA_BALTHARUS_SHARED_HEALTH));
events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (me->HasUnitState(UNIT_STATE_CASTING) && !introPhase)
return;
while (uint32 eventId = events.ExecuteEvent())
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
index 13e4e5b51d5..d84091e3cc7 100644
--- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
+++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp
@@ -164,12 +164,7 @@ enum Phases
PHASE_INTRO = 1,
PHASE_ONE = 2,
PHASE_TWO = 3,
- PHASE_THREE = 4,
-
- PHASE_INTRO_MASK = 1 << PHASE_INTRO,
- PHASE_ONE_MASK = 1 << PHASE_ONE,
- PHASE_TWO_MASK = 1 << PHASE_TWO,
- PHASE_THREE_MASK = 1 << PHASE_THREE
+ PHASE_THREE = 4
};
enum Misc
@@ -324,7 +319,7 @@ class boss_halion : public CreatureScript
void EnterEvadeMode()
{
// Phase 1: We always can evade. Phase 2 & 3: We can evade if and only if the controller tells us to.
- if ((events.GetPhaseMask() & PHASE_ONE_MASK) || _canEvade)
+ if (events.IsInPhase(PHASE_ONE) || _canEvade)
generic_halionAI::EnterEvadeMode();
}
@@ -368,7 +363,7 @@ class boss_halion : public CreatureScript
void DamageTaken(Unit* attacker, uint32& damage)
{
- if (me->HealthBelowPctDamaged(75, damage) && (events.GetPhaseMask() & PHASE_ONE_MASK))
+ if (me->HealthBelowPctDamaged(75, damage) && events.IsInPhase(PHASE_ONE))
{
events.SetPhase(PHASE_TWO);
Talk(SAY_PHASE_TWO);
@@ -382,7 +377,7 @@ class boss_halion : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ if (events.IsInPhase(PHASE_THREE))
{
// Don't consider copied damage.
if (!me->InSamePhase(attacker))
@@ -395,7 +390,7 @@ class boss_halion : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_TWO))
return;
generic_halionAI::UpdateAI(diff);
@@ -527,7 +522,7 @@ class boss_twilight_halion : public CreatureScript
void DamageTaken(Unit* attacker, uint32& damage)
{
- if (me->HealthBelowPctDamaged(50, damage) && (events.GetPhaseMask() & PHASE_TWO_MASK))
+ if (me->HealthBelowPctDamaged(50, damage) && events.IsInPhase(PHASE_TWO))
{
events.SetPhase(PHASE_THREE);
me->CastStop();
@@ -536,7 +531,7 @@ class boss_twilight_halion : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ if (events.IsInPhase(PHASE_THREE))
{
// Don't consider copied damage.
if (!me->InSamePhase(attacker))
@@ -692,7 +687,7 @@ class npc_halion_controller : public CreatureScript
// The isInCombat() check is needed because that check should be false when Halion is
// not engaged, while it would return true without as UpdateVictim() checks for
// combat state.
- if (!(_events.GetPhaseMask() & PHASE_INTRO_MASK) && me->isInCombat() && !UpdateVictim())
+ if (!(_events.IsInPhase(PHASE_INTRO)) && me->isInCombat() && !UpdateVictim())
{
EnterEvadeMode();
return;
@@ -977,11 +972,13 @@ class npc_meteor_strike_initial : public CreatureScript
public:
npc_meteor_strike_initial() : CreatureScript("npc_meteor_strike_initial") { }
- struct npc_meteor_strike_initialAI : public Scripted_NoMovementAI
+ struct npc_meteor_strike_initialAI : public ScriptedAI
{
- npc_meteor_strike_initialAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ npc_meteor_strike_initialAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript())
- { }
+ {
+ SetCombatMovement(false);
+ }
void DoAction(int32 const action)
{
@@ -1049,13 +1046,15 @@ class npc_meteor_strike : public CreatureScript
public:
npc_meteor_strike() : CreatureScript("npc_meteor_strike") { }
- struct npc_meteor_strikeAI : public Scripted_NoMovementAI
+ struct npc_meteor_strikeAI : public ScriptedAI
{
- npc_meteor_strikeAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ npc_meteor_strikeAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript())
{
_range = 5.0f;
_spawnCount = 0;
+
+ SetCombatMovement(false);
}
void DoAction(int32 const action)
@@ -1118,11 +1117,13 @@ class npc_combustion_consumption : public CreatureScript
public:
npc_combustion_consumption() : CreatureScript("npc_combustion_consumption") { }
- struct npc_combustion_consumptionAI : public Scripted_NoMovementAI
+ struct npc_combustion_consumptionAI : public ScriptedAI
{
- npc_combustion_consumptionAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ npc_combustion_consumptionAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript()), _summonerGuid(0)
{
+ SetCombatMovement(false);
+
switch (me->GetEntry())
{
case NPC_COMBUSTION:
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
index e44f5fba1b8..17b804ca31e 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp
@@ -154,9 +154,7 @@ enum Phases
{
// Anub'arak
PHASE_MELEE = 1,
- PHASE_SUBMERGED = 2,
-
- PHASE_MASK_MELEE = 1 << PHASE_MELEE
+ PHASE_SUBMERGED = 2
};
class boss_anubarak_trial : public CreatureScript
@@ -403,7 +401,7 @@ class boss_anubarak_trial : public CreatureScript
}
- if (HealthBelowPct(30) && events.GetPhaseMask() & PHASE_MASK_MELEE && !_reachedPhase3)
+ if (HealthBelowPct(30) && events.IsInPhase(PHASE_MELEE) && !_reachedPhase3)
{
_reachedPhase3 = true;
DoCastAOE(SPELL_LEECHING_SWARM);
@@ -411,7 +409,7 @@ class boss_anubarak_trial : public CreatureScript
Talk(SAY_LEECHING_SWARM);
}
- if (events.GetPhaseMask() & PHASE_MASK_MELEE)
+ if (events.IsInPhase(PHASE_MELEE))
DoMeleeAttackIfReady();
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
index 82cff5ff01f..a44938e0f82 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp
@@ -18,8 +18,9 @@
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
-#include "trial_of_the_crusader.h"
#include "SpellScript.h"
+#include "Player.h"
+#include "trial_of_the_crusader.h"
enum Yells
{
@@ -69,7 +70,6 @@ enum BossSpells
SPELL_FEL_INFERNO = 67047,
SPELL_FEL_STREAK = 66494,
SPELL_LORD_HITTIN = 66326, // special effect preventing more specific spells be cast on the same player within 10 seconds
- SPELL_MISTRESS_KISS_DEBUFF = 66334,
SPELL_MISTRESS_KISS_DAMAGE_SILENCE = 66359
};
@@ -223,10 +223,11 @@ class mob_legion_flame : public CreatureScript
public:
mob_legion_flame() : CreatureScript("mob_legion_flame") { }
- struct mob_legion_flameAI : public Scripted_NoMovementAI
+ struct mob_legion_flameAI : public ScriptedAI
{
- mob_legion_flameAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_legion_flameAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
_instance = creature->GetInstanceScript();
}
@@ -258,10 +259,11 @@ class mob_infernal_volcano : public CreatureScript
public:
mob_infernal_volcano() : CreatureScript("mob_infernal_volcano") { }
- struct mob_infernal_volcanoAI : public Scripted_NoMovementAI
+ struct mob_infernal_volcanoAI : public ScriptedAI
{
- mob_infernal_volcanoAI(Creature* creature) : Scripted_NoMovementAI(creature), _summons(me)
+ mob_infernal_volcanoAI(Creature* creature) : ScriptedAI(creature), _summons(me)
{
+ SetCombatMovement(false);
}
void Reset()
@@ -533,6 +535,21 @@ class spell_mistress_kiss : public SpellScriptLoader
}
};
+class MistressKissTargetSelector
+{
+ public:
+ MistressKissTargetSelector() { }
+
+ bool operator()(WorldObject* unit) const
+ {
+ if (unit->GetTypeId() == TYPEID_PLAYER)
+ if (unit->ToPlayer()->getPowerType() == POWER_MANA)
+ return false;
+
+ return true;
+ }
+};
+
class spell_mistress_kiss_area : public SpellScriptLoader
{
public:
@@ -542,44 +559,27 @@ class spell_mistress_kiss_area : public SpellScriptLoader
{
PrepareSpellScript(spell_mistress_kiss_area_SpellScript)
- bool Load()
+ void FilterTargets(std::list<WorldObject*>& targets)
{
- if (GetCaster())
- if (sSpellMgr->GetSpellIdForDifficulty(SPELL_MISTRESS_KISS_DEBUFF, GetCaster()))
- return true;
- return false;
- }
+ // get a list of players with mana
+ targets.remove_if(MistressKissTargetSelector());
+ if (targets.empty())
+ return;
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetHitUnit();
- if (caster && target)
- caster->CastSpell(target, SPELL_MISTRESS_KISS_DEBUFF, true);
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
}
- void FilterTargets(std::list<WorldObject*>& targets)
+ void HandleScript(SpellEffIndex /*effIndex*/)
{
- // get a list of players with mana
- std::list<WorldObject*> _targets;
- for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
- if ((*itr)->ToUnit()->getPowerType() == POWER_MANA)
- _targets.push_back(*itr);
-
- // pick a random target and kiss him
- if (WorldObject* _target = Trinity::Containers::SelectRandomContainerElement(_targets))
- {
- // correctly fill "targets" for the visual effect
- targets.clear();
- targets.push_back(_target);
- if (Unit* caster = GetCaster())
- caster->CastSpell(_target->ToUnit(), SPELL_MISTRESS_KISS_DEBUFF, true);
- }
+ GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
}
void Register()
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mistress_kiss_area_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_mistress_kiss_area_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
index 03a305356c4..95f59903141 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp
@@ -146,10 +146,7 @@ enum Phases
{
PHASE_MOBILE = 1,
PHASE_STATIONARY = 2,
- PHASE_SUBMERGED = 3,
-
- PHASE_MASK_MOBILE = 1 << PHASE_MOBILE,
- PHASE_MASK_STATIONARY = 1 << PHASE_STATIONARY
+ PHASE_SUBMERGED = 3
};
class boss_gormok : public CreatureScript
@@ -624,9 +621,9 @@ struct boss_jormungarAI : public BossAI
return;
}
}
- if (events.GetPhaseMask() & PHASE_MASK_MOBILE)
+ if (events.IsInPhase(PHASE_MOBILE))
DoMeleeAttackIfReady();
- if (events.GetPhaseMask() & PHASE_MASK_STATIONARY)
+ if (events.IsInPhase(PHASE_STATIONARY))
DoSpellAttackIfReady(SpitSpell);
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
index 9b6f4a6a0da..2509c3d0d59 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -654,11 +654,11 @@ class mob_bullet_controller : public CreatureScript
public:
mob_bullet_controller() : CreatureScript("mob_bullet_controller") { }
- struct mob_bullet_controllerAI : public Scripted_NoMovementAI
+ struct mob_bullet_controllerAI : public ScriptedAI
{
- mob_bullet_controllerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_bullet_controllerAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
void Reset()
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index 261eb854aa3..5d261fd3804 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -118,7 +118,7 @@ class boss_bronjahm : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{
- if (events.GetPhaseMask() & (1 << PHASE_1) && !HealthAbovePct(30))
+ if (events.IsInPhase(PHASE_1) && !HealthAbovePct(30))
{
events.SetPhase(PHASE_2);
DoCast(me, SPELL_TELEPORT);
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
index 160d45f5140..cc25e450340 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
@@ -52,11 +52,7 @@ enum Phases
{
PHASE_ONE = 1,
PHASE_TWO = 2,
- PHASE_THREE = 3,
-
- PHASE_ONE_MASK = 1 << PHASE_ONE,
- PHASE_TWO_MASK = 1 << PHASE_TWO,
- PHASE_THREE_MASK = 1 << PHASE_THREE,
+ PHASE_THREE = 3
};
enum MiscData
@@ -136,7 +132,7 @@ enum Events
void DamageTaken(Unit* /*attacker*/, uint32& /*uiDamage*/)
{
- if (events.GetPhaseMask() & PHASE_ONE_MASK && !HealthAbovePct(66))
+ if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(66))
{
events.SetPhase(PHASE_TWO);
Talk(SAY_PHASE2);
@@ -146,7 +142,7 @@ enum Events
return;
}
- if (events.GetPhaseMask() & PHASE_TWO_MASK && !HealthAbovePct(33))
+ if (events.IsInPhase(PHASE_TWO) && !HealthAbovePct(33))
{
events.SetPhase(PHASE_THREE);
Talk(SAY_PHASE3);
@@ -162,12 +158,12 @@ enum Events
if (type != EFFECT_MOTION_TYPE || id != POINT_FORGE)
return;
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_TWO))
{
DoCast(me, SPELL_FORGE_BLADE);
SetEquipmentSlots(false, EQUIP_ID_SWORD);
}
- if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ if (events.IsInPhase(PHASE_THREE))
{
me->RemoveAurasDueToSpell(SPELL_FORGE_BLADE_HELPER);
DoCast(me, SPELL_FORGE_MACE);
@@ -226,15 +222,15 @@ enum Events
break;
case EVENT_JUMP:
me->AttackStop();
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_TWO))
me->GetMotionMaster()->MoveJump(northForgePos.GetPositionX(), northForgePos.GetPositionY(), northForgePos.GetPositionZ(), 25.0f, 15.0f);
- else if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ else if (events.IsInPhase(PHASE_THREE))
me->GetMotionMaster()->MoveJump(southForgePos.GetPositionX(), southForgePos.GetPositionY(), southForgePos.GetPositionZ(), 25.0f, 15.0f);
break;
case EVENT_RESUME_ATTACK:
- if (events.GetPhaseMask() & PHASE_TWO_MASK)
+ if (events.IsInPhase(PHASE_THREE))
events.ScheduleEvent(EVENT_CHILLING_WAVE, 5000, 0, PHASE_TWO);
- else if (events.GetPhaseMask() & PHASE_THREE_MASK)
+ else if (events.IsInPhase(PHASE_THREE))
events.ScheduleEvent(EVENT_DEEP_FREEZE, 10000, 0, PHASE_THREE);
AttackStart(me->getVictim());
break;
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
index 783cc266509..165cd8d647a 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
@@ -94,7 +94,7 @@ enum Phases
PHASE_NONE = 0,
PHASE_INTRO = 1,
PHASE_COMBAT = 2,
- PHASE_OUTRO = 3,
+ PHASE_OUTRO = 3
};
enum Actions
@@ -168,7 +168,7 @@ class boss_tyrannus : public CreatureScript
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
return;
- if (victim && me->Attack(victim, true) && !(events.GetPhaseMask() & (1 << PHASE_INTRO)))
+ if (victim && me->Attack(victim, true) && !events.IsInPhase(PHASE_INTRO))
me->GetMotionMaster()->MoveChase(victim);
}
@@ -217,7 +217,7 @@ class boss_tyrannus : public CreatureScript
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & (1 << PHASE_INTRO)))
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO))
return;
events.Update(diff);
@@ -337,7 +337,7 @@ class boss_rimefang : public CreatureScript
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim() && !(_events.GetPhaseMask() & (1 << PHASE_COMBAT)))
+ if (!UpdateVictim() && !_events.IsInPhase(PHASE_COMBAT))
return;
_events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
index c8caa3976e4..ab0c44aa6d0 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp
@@ -46,6 +46,7 @@ enum Spells
SPELL_FRENZIED_BLOODTHIRST_VISUAL = 71949,
SPELL_VAMPIRIC_BITE = 71726,
SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_PLR = 70879,
+ SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL = 70872,
SPELL_FRENZIED_BLOODTHIRST = 70877,
SPELL_UNCONTROLLABLE_FRENZY = 70923,
SPELL_PRESENCE_OF_THE_DARKFALLEN = 71952,
@@ -698,6 +699,42 @@ class spell_blood_queen_bloodbolt : public SpellScriptLoader
}
};
+// 70871 - Essence of the Blood Queen
+class spell_blood_queen_essence_of_the_blood_queen : public SpellScriptLoader
+{
+ public:
+ spell_blood_queen_essence_of_the_blood_queen() : SpellScriptLoader("spell_blood_queen_essence_of_the_blood_queen") { }
+
+ class spell_blood_queen_essence_of_the_blood_queen_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_blood_queen_essence_of_the_blood_queen_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL))
+ return false;
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_ESSENCE_OF_THE_BLOOD_QUEEN_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), TRIGGERED_FULL_MASK, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_blood_queen_essence_of_the_blood_queen_AuraScript::OnProc, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_blood_queen_essence_of_the_blood_queen_AuraScript();
+ }
+};
+
class spell_blood_queen_pact_of_the_darkfallen : public SpellScriptLoader
{
public:
@@ -849,6 +886,7 @@ void AddSC_boss_blood_queen_lana_thel()
new spell_blood_queen_vampiric_bite();
new spell_blood_queen_frenzied_bloodthirst();
new spell_blood_queen_bloodbolt();
+ new spell_blood_queen_essence_of_the_blood_queen();
new spell_blood_queen_pact_of_the_darkfallen();
new spell_blood_queen_pact_of_the_darkfallen_dmg();
new spell_blood_queen_pact_of_the_darkfallen_dmg_target();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index ce1166663f3..c92f10e8b95 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -185,9 +185,7 @@ enum Phases
{
PHASE_INTRO_A = 1,
PHASE_INTRO_H = 2,
- PHASE_COMBAT = 3,
-
- PHASE_INTRO_MASK = (1 << PHASE_INTRO_A) | (1 << PHASE_INTRO_H),
+ PHASE_COMBAT = 3
};
enum Actions
@@ -415,9 +413,16 @@ class boss_deathbringer_saurfang : public CreatureScript
}
}
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
+ {
+ if (spell->Id == SPELL_BLOOD_LINK_POWER)
+ if (Aura* bloodPower = me->GetAura(SPELL_BLOOD_POWER))
+ bloodPower->RecalculateAmountOfEffects();
+ }
+
void UpdateAI(uint32 const diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (!UpdateVictim() && !(events.IsInPhase(PHASE_INTRO_A) || events.IsInPhase(PHASE_INTRO_H)))
return;
events.Update(diff);
@@ -605,7 +610,7 @@ class npc_high_overlord_saurfang_icc : public CreatureScript
case ACTION_START_EVENT:
{
// Prevent crashes
- if (_events.GetPhaseMask() & PHASE_INTRO_MASK)
+ if (_events.IsInPhase(PHASE_INTRO_A) || _events.IsInPhase(PHASE_INTRO_H))
return;
GetCreatureListWithEntryInGrid(_guardList, me, NPC_SE_KOR_KRON_REAVER, 20.0f);
@@ -814,7 +819,7 @@ class npc_muradin_bronzebeard_icc : public CreatureScript
case ACTION_START_EVENT:
{
// Prevent crashes
- if (_events.GetPhaseMask() & PHASE_INTRO_MASK)
+ if (_events.IsInPhase(PHASE_INTRO_A) || _events.IsInPhase(PHASE_INTRO_H))
return;
_events.SetPhase(PHASE_INTRO_A);
@@ -1004,8 +1009,6 @@ class spell_deathbringer_blood_link : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
GetHitUnit()->CastCustomSpell(SPELL_BLOOD_LINK_POWER, SPELLVALUE_BASE_POINT0, GetEffectValue(), GetHitUnit(), true);
- if (Aura* bloodPower = GetHitUnit()->GetAura(SPELL_BLOOD_POWER))
- bloodPower->RecalculateAmountOfEffects();
PreventHitDefaultEffect(EFFECT_0);
}
@@ -1093,13 +1096,6 @@ class spell_deathbringer_blood_power : public SpellScriptLoader
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_0, SPELL_AURA_MOD_SCALE);
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_deathbringer_blood_power_AuraScript::RecalculateHook, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
}
-
- bool Load()
- {
- if (GetUnitOwner()->getPowerType() != POWER_ENERGY)
- return false;
- return true;
- }
};
SpellScript* GetSpellScript() const
@@ -1251,7 +1247,6 @@ 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 2b7c9c62f6b..8854a8d1f1a 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
@@ -160,10 +160,7 @@ enum Phases
PHASE_ALL = 0,
PHASE_INTRO = 1,
PHASE_ONE = 2,
- PHASE_TWO = 3,
-
- PHASE_INTRO_MASK = 1 << PHASE_INTRO,
- PHASE_ONE_MASK = 1 << PHASE_ONE,
+ PHASE_TWO = 3
};
enum DeprogrammingData
@@ -259,7 +256,7 @@ class boss_lady_deathwhisper : public CreatureScript
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
return;
- if (victim && me->Attack(victim, true) && !(events.GetPhaseMask() & PHASE_ONE_MASK))
+ if (victim && me->Attack(victim, true) && !events.IsInPhase(PHASE_ONE))
me->GetMotionMaster()->MoveChase(victim);
}
@@ -358,7 +355,7 @@ class boss_lady_deathwhisper : public CreatureScript
void DamageTaken(Unit* /*damageDealer*/, uint32& damage)
{
// phase transition
- if (events.GetPhaseMask() & PHASE_ONE_MASK && damage > (uint32)me->GetPower(POWER_MANA))
+ if (events.IsInPhase(PHASE_ONE) && damage > uint32(me->GetPower(POWER_MANA)))
{
Talk(SAY_PHASE_2);
Talk(EMOTE_PHASE_2);
@@ -406,12 +403,12 @@ class boss_lady_deathwhisper : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if ((!UpdateVictim() && !(events.GetPhaseMask() & PHASE_INTRO_MASK)) || !CheckInRoom())
+ if ((!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) || !CheckInRoom())
return;
events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_INTRO_MASK))
+ if (me->HasUnitState(UNIT_STATE_CASTING) && !events.IsInPhase(PHASE_INTRO))
return;
while (uint32 eventId = events.ExecuteEvent())
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index 4c18821d2f7..d7b8408b7c4 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
@@ -20,8 +20,9 @@
#include "ScriptedCreature.h"
#include "SpellAuras.h"
#include "MapManager.h"
-#include "icecrown_citadel.h"
+#include "MoveSplineInit.h"
#include "Player.h"
+#include "icecrown_citadel.h"
enum ScriptTexts
{
@@ -53,7 +54,7 @@ enum Spells
SPELL_COLDFLAME_SUMMON = 69147,
};
-uint32 const boneSpikeSummonId[3] = {69062, 72669, 72670};
+uint32 const BoneSpikeSummonId[3] = {69062, 72669, 72670};
enum Events
{
@@ -78,7 +79,46 @@ enum MovementPoints
POINT_TARGET_COLDFLAME = 36672631,
};
-#define DATA_COLDFLAME_GUID 0
+enum MiscInfo
+{
+ DATA_COLDFLAME_GUID = 0,
+
+ // Manual marking for targets hit by Bone Slice as no aura exists for this purpose
+ // These units are the tanks in this encounter
+ // and should be immune to Bone Spike Graveyard
+ DATA_SPIKE_IMMUNE = 1,
+ //DATA_SPIKE_IMMUNE_1, = 2, // Reserved & used
+ //DATA_SPIKE_IMMUNE_2, = 3, // Reserved & used
+
+ ACTION_CLEAR_SPIKE_IMMUNITIES = 1,
+
+ MAX_BONE_SPIKE_IMMUNE = 3,
+};
+
+class BoneSpikeTargetSelector : public std::unary_function<Unit*, bool>
+{
+ public:
+ BoneSpikeTargetSelector(UnitAI* ai) : _ai(ai) { }
+
+ bool operator()(Unit* unit) const
+ {
+ if (unit->GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ if (unit->HasAura(SPELL_IMPALED))
+ return false;
+
+ // Check if it is one of the tanks soaking Bone Slice
+ for (uint32 i = 0; i < MAX_BONE_SPIKE_IMMUNE; ++i)
+ if (unit->GetGUID() == _ai->GetGUID(DATA_SPIKE_IMMUNE + i))
+ return false;
+
+ return true;
+ }
+
+ private:
+ UnitAI* _ai;
+};
class boss_lord_marrowgar : public CreatureScript
{
@@ -103,11 +143,12 @@ class boss_lord_marrowgar : public CreatureScript
me->RemoveAurasDueToSpell(SPELL_BONE_STORM);
me->RemoveAurasDueToSpell(SPELL_BERSERK);
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
- events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(10000, 15000), EVENT_GROUP_SPECIAL);
+ events.ScheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, 15000, EVENT_GROUP_SPECIAL);
events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL);
events.ScheduleEvent(EVENT_WARN_BONE_STORM, urand(45000, 50000));
events.ScheduleEvent(EVENT_ENRAGE, 600000);
_boneSlice = false;
+ _boneSpikeImmune.clear();
}
void EnterCombat(Unit* /*who*/)
@@ -199,18 +240,18 @@ class boss_lord_marrowgar : public CreatureScript
if (!unit)
unit = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true);
if (unit)
- me->GetMotionMaster()->MovePoint(POINT_TARGET_BONESTORM_PLAYER, unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
+ me->GetMotionMaster()->MovePoint(POINT_TARGET_BONESTORM_PLAYER, *unit);
break;
}
case EVENT_BONE_STORM_END:
if (me->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE)
me->GetMotionMaster()->MovementExpired();
- DoStartMovement(me->getVictim());
+ me->GetMotionMaster()->MoveChase(me->getVictim());
me->SetSpeed(MOVE_RUN, _baseSpeed, true);
events.CancelEvent(EVENT_BONE_STORM_MOVE);
events.ScheduleEvent(EVENT_ENABLE_BONE_SLICE, 10000);
if (!IsHeroic())
- events.RescheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, urand(15000, 20000), EVENT_GROUP_SPECIAL);
+ events.RescheduleEvent(EVENT_BONE_SPIKE_GRAVEYARD, 15000, EVENT_GROUP_SPECIAL);
break;
case EVENT_ENABLE_BONE_SLICE:
_boneSlice = true;
@@ -239,7 +280,7 @@ class boss_lord_marrowgar : public CreatureScript
return;
// lock movement
- DoStartNoMovement(me->getVictim());
+ me->GetMotionMaster()->MoveIdle();
}
Position const* GetLastColdflamePosition() const
@@ -247,23 +288,51 @@ class boss_lord_marrowgar : public CreatureScript
return &_coldflameLastPos;
}
- uint64 GetGUID(int32 type/* = 0 */) const
+ uint64 GetGUID(int32 type /*= 0 */) const
{
- if (type == DATA_COLDFLAME_GUID)
- return _coldflameTarget;
+ switch (type)
+ {
+ case DATA_COLDFLAME_GUID:
+ return _coldflameTarget;
+ case DATA_SPIKE_IMMUNE + 0:
+ case DATA_SPIKE_IMMUNE + 1:
+ case DATA_SPIKE_IMMUNE + 2:
+ {
+ uint32 index = uint32(type - DATA_SPIKE_IMMUNE);
+ if (index < _boneSpikeImmune.size())
+ return _boneSpikeImmune[index];
+
+ break;
+ }
+ }
+
return 0LL;
}
- void SetGUID(uint64 guid, int32 type/* = 0 */)
+ void SetGUID(uint64 guid, int32 type /*= 0 */)
{
- if (type != DATA_COLDFLAME_GUID)
+ switch (type)
+ {
+ case DATA_COLDFLAME_GUID:
+ _coldflameTarget = guid;
+ break;
+ case DATA_SPIKE_IMMUNE:
+ _boneSpikeImmune.push_back(guid);
+ break;
+ }
+ }
+
+ void DoAction(int32 const action)
+ {
+ if (action != ACTION_CLEAR_SPIKE_IMMUNITIES)
return;
- _coldflameTarget = guid;
+ _boneSpikeImmune.clear();
}
private:
Position _coldflameLastPos;
+ std::vector<uint64> _boneSpikeImmune;
uint64 _coldflameTarget;
uint32 _boneStormDuration;
float _baseSpeed;
@@ -295,18 +364,17 @@ class npc_coldflame : public CreatureScript
if (owner->GetTypeId() != TYPEID_UNIT)
return;
- Creature* creOwner = owner->ToCreature();
Position pos;
- // random target case
+ if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, owner->GetAI()))
+ pos.Relocate(marrowgarAI->GetLastColdflamePosition());
+ else
+ pos.Relocate(owner);
+
if (owner->HasAura(SPELL_BONE_STORM))
{
- if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, creOwner->AI()))
- {
- Position const* ownerPos = marrowgarAI->GetLastColdflamePosition();
- float ang = me->GetAngle(ownerPos) - static_cast<float>(M_PI);
- me->SetOrientation(ang);
- owner->GetNearPosition(pos, 2.5f, 0.0f);
- }
+ float ang = Position::NormalizeOrientation(pos.GetAngle(me));
+ me->SetOrientation(ang);
+ owner->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 5.0f - owner->GetObjectSize(), ang);
}
else
{
@@ -317,12 +385,14 @@ class npc_coldflame : public CreatureScript
return;
}
- me->SetOrientation(owner->GetAngle(target));
- owner->GetNearPosition(pos, owner->GetObjectSize() / 2.0f, 0.0f);
+ float ang = Position::NormalizeOrientation(pos.GetAngle(target));
+ me->SetOrientation(ang);
+ owner->GetNearPoint2D(pos.m_positionX, pos.m_positionY, 15.0f - owner->GetObjectSize(), ang);
}
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 450);
+ DoCast(SPELL_COLDFLAME_SUMMON);
+ _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 500);
}
void UpdateAI(uint32 const diff)
@@ -332,10 +402,10 @@ class npc_coldflame : public CreatureScript
if (_events.ExecuteEvent() == EVENT_COLDFLAME_TRIGGER)
{
Position newPos;
- me->GetNearPosition(newPos, 5.5f, 0.0f);
+ me->GetNearPosition(newPos, 5.0f, 0.0f);
me->NearTeleportTo(newPos.GetPositionX(), newPos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
DoCast(SPELL_COLDFLAME_SUMMON);
- _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 450);
+ _events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 500);
}
}
@@ -354,11 +424,13 @@ class npc_bone_spike : public CreatureScript
public:
npc_bone_spike() : CreatureScript("npc_bone_spike") { }
- struct npc_bone_spikeAI : public Scripted_NoMovementAI
+ struct npc_bone_spikeAI : public ScriptedAI
{
- npc_bone_spikeAI(Creature* creature) : Scripted_NoMovementAI(creature), _hasTrappedUnit(false)
+ npc_bone_spikeAI(Creature* creature) : ScriptedAI(creature), _hasTrappedUnit(false)
{
ASSERT(creature->GetVehicleKit());
+
+ SetCombatMovement(false);
}
void JustDied(Unit* /*killer*/)
@@ -384,6 +456,24 @@ class npc_bone_spike : public CreatureScript
_hasTrappedUnit = true;
}
+ void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply)
+ {
+ if (!apply)
+ return;
+
+ /// @HACK - Change passenger offset to the one taken directly from sniffs
+ /// Remove this when proper calculations are implemented.
+ /// This fixes healing spiked people
+ Movement::MoveSplineInit init(passenger);
+ init.DisableTransportPathTransformations();
+ init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
+ init.Launch();
+
+ /// @WORKAROUND - Clear ON VEHICLE state to allow healing (Invalid target errors)
+ /// Current rule for applying this state is questionable (seatFlags & VEHICLE_SEAT_FLAG_ALLOW_TURNING ???)
+ passenger->ClearUnitState(UNIT_STATE_ONVEHICLE);
+ }
+
void UpdateAI(uint32 const diff)
{
if (!_hasTrappedUnit)
@@ -486,16 +576,24 @@ class spell_marrowgar_coldflame_damage : public SpellScriptLoader
{
PrepareAuraScript(spell_marrowgar_coldflame_damage_AuraScript);
- void OnPeriodic(AuraEffect const* /*aurEff*/)
+ bool CanBeAppliedOn(Unit* target)
{
- if (DynamicObject* owner = GetDynobjOwner())
- if (GetTarget()->GetExactDist2d(owner) >= owner->GetRadius() || GetTarget()->HasAura(SPELL_IMPALED))
- PreventDefaultAction();
+ if (target->HasAura(SPELL_IMPALED))
+ return false;
+
+ if (target->GetExactDist2d(GetOwner()) > GetSpellInfo()->Effects[EFFECT_0].CalcRadius())
+ return false;
+
+ if (Aura* aur = target->GetAura(GetId()))
+ if (aur->GetOwner() != GetOwner())
+ return false;
+
+ return true;
}
void Register()
{
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_marrowgar_coldflame_damage_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_marrowgar_coldflame_damage_AuraScript::CanBeAppliedOn);
}
};
@@ -514,9 +612,23 @@ class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader
{
PrepareSpellScript(spell_marrowgar_bone_spike_graveyard_SpellScript);
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ for (uint32 i = 0; i < 3; ++i)
+ if (!sSpellMgr->GetSpellInfo(BoneSpikeSummonId[i]))
+ return false;
+
+ return true;
+ }
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->IsAIEnabled;
+ }
+
SpellCastResult CheckCast()
{
- return GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_TOPAGGRO, 1, 0.0f, true, -SPELL_IMPALED) ? SPELL_CAST_OK : SPELL_FAILED_NO_VALID_TARGETS;
+ return GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, BoneSpikeTargetSelector(GetCaster()->GetAI())) ? SPELL_CAST_OK : SPELL_FAILED_NO_VALID_TARGETS;
}
void HandleSpikes(SpellEffIndex effIndex)
@@ -524,22 +636,22 @@ class spell_marrowgar_bone_spike_graveyard : public SpellScriptLoader
PreventHitDefaultEffect(effIndex);
if (Creature* marrowgar = GetCaster()->ToCreature())
{
- bool didHit = false;
CreatureAI* marrowgarAI = marrowgar->AI();
uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1);
- for (uint8 i = 0; i < boneSpikeCount; ++i)
- {
- // select any unit but not the tank
- Unit* target = marrowgarAI->SelectTarget(SELECT_TARGET_RANDOM, 1, 150.0f, true, -SPELL_IMPALED);
- if (!target)
- break;
- didHit = true;
- target->CastCustomSpell(boneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true);
+ std::list<Unit*> targets;
+ marrowgarAI->SelectTargetList(targets, BoneSpikeTargetSelector(marrowgarAI), boneSpikeCount, SELECT_TARGET_RANDOM);
+ if (targets.empty())
+ return;
+
+ uint32 i = 0;
+ for (std::list<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr, ++i)
+ {
+ Unit* target = *itr;
+ target->CastCustomSpell(BoneSpikeSummonId[i], SPELLVALUE_BASE_POINT0, 0, target, true);
}
- if (didHit)
- marrowgarAI->Talk(SAY_BONESPIKE);
+ marrowgarAI->Talk(SAY_BONESPIKE);
}
}
@@ -582,6 +694,58 @@ class spell_marrowgar_bone_storm : public SpellScriptLoader
}
};
+class spell_marrowgar_bone_slice : public SpellScriptLoader
+{
+ public:
+ spell_marrowgar_bone_slice() : SpellScriptLoader("spell_marrowgar_bone_slice") { }
+
+ class spell_marrowgar_bone_slice_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_marrowgar_bone_slice_SpellScript);
+
+ bool Load()
+ {
+ _targetCount = 0;
+ return true;
+ }
+
+ void ClearSpikeImmunities()
+ {
+ GetCaster()->GetAI()->DoAction(ACTION_CLEAR_SPIKE_IMMUNITIES);
+ }
+
+ void CountTargets(std::list<WorldObject*>& targets)
+ {
+ _targetCount = std::min<uint32>(targets.size(), GetSpellInfo()->MaxAffectedTargets);
+ }
+
+ void SplitDamage()
+ {
+ // Mark the unit as hit, even if the spell missed or was dodged/parried
+ GetCaster()->GetAI()->SetGUID(GetHitUnit()->GetGUID(), DATA_SPIKE_IMMUNE);
+
+ if (!_targetCount)
+ return; // This spell can miss all targets
+
+ SetHitDamage(GetHitDamage() / _targetCount);
+ }
+
+ void Register()
+ {
+ BeforeCast += SpellCastFn(spell_marrowgar_bone_slice_SpellScript::ClearSpikeImmunities);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_marrowgar_bone_slice_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ OnHit += SpellHitFn(spell_marrowgar_bone_slice_SpellScript::SplitDamage);
+ }
+
+ uint32 _targetCount;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_marrowgar_bone_slice_SpellScript();
+ }
+};
+
void AddSC_boss_lord_marrowgar()
{
new boss_lord_marrowgar();
@@ -592,4 +756,5 @@ void AddSC_boss_lord_marrowgar()
new spell_marrowgar_coldflame_damage();
new spell_marrowgar_bone_spike_graveyard();
new spell_marrowgar_bone_storm();
+ new spell_marrowgar_bone_slice();
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index 05bf7b9794a..103c72e947d 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -145,10 +145,7 @@ enum Phases
PHASE_ROTFACE = 2,
PHASE_COMBAT_1 = 4,
PHASE_COMBAT_2 = 5,
- PHASE_COMBAT_3 = 6,
-
- PHASE_MASK_COMBAT = (1 << PHASE_COMBAT_1) | (1 << PHASE_COMBAT_2) | (1 << PHASE_COMBAT_3),
- PHASE_MASK_NOT_SELF = (1 << PHASE_FESTERGUT) | (1 << PHASE_ROTFACE)
+ PHASE_COMBAT_3 = 6
};
enum Points
@@ -233,7 +230,7 @@ class boss_professor_putricide : public CreatureScript
void Reset()
{
- if (!(events.GetPhaseMask() & PHASE_MASK_NOT_SELF))
+ if (!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)))
instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, NOT_STARTED);
instance->SetData(DATA_NAUSEA_ACHIEVEMENT, uint32(true));
@@ -252,7 +249,7 @@ class boss_professor_putricide : public CreatureScript
void EnterCombat(Unit* who)
{
- if (events.GetPhaseMask() & PHASE_MASK_NOT_SELF)
+ if (events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT))
return;
if (!instance->CheckRequiredBosses(DATA_PROFESSOR_PUTRICIDE, who->ToPlayer()))
@@ -282,7 +279,7 @@ class boss_professor_putricide : public CreatureScript
{
_JustReachedHome();
me->SetWalk(false);
- if (events.GetPhaseMask() & PHASE_MASK_COMBAT)
+ if (events.IsInPhase(PHASE_COMBAT_1) || events.IsInPhase(PHASE_COMBAT_2) || events.IsInPhase(PHASE_COMBAT_3))
instance->SetBossState(DATA_PROFESSOR_PUTRICIDE, FAIL);
}
@@ -568,7 +565,7 @@ class boss_professor_putricide : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if ((!(events.GetPhaseMask() & PHASE_MASK_NOT_SELF) && !UpdateVictim()) || !CheckInRoom())
+ if ((!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)) && !UpdateVictim()) || !CheckInRoom())
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 45c5302bfe8..1c6ed848158 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -576,11 +576,12 @@ class npc_ice_tomb : public CreatureScript
public:
npc_ice_tomb() : CreatureScript("npc_ice_tomb") { }
- struct npc_ice_tombAI : public Scripted_NoMovementAI
+ struct npc_ice_tombAI : public ScriptedAI
{
- npc_ice_tombAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_ice_tombAI(Creature* creature) : ScriptedAI(creature)
{
_trappedPlayerGUID = 0;
+ SetCombatMovement(false);
}
void Reset()
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 962e12a2461..7ced791f44c 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -145,6 +145,7 @@ enum Spells
SPELL_RESTORE_SOUL = 72595,
SPELL_RESTORE_SOULS = 73650, // Heroic
SPELL_DARK_HUNGER = 69383, // Passive proc healing
+ SPELL_DARK_HUNGER_HEAL = 69384,
SPELL_DESTROY_SOUL = 74086, // Used when Terenas Menethil dies
SPELL_SOUL_RIP = 69397, // Deals increasing damage
SPELL_SOUL_RIP_DAMAGE = 69398,
@@ -278,20 +279,10 @@ enum Phases
PHASE_THREE = 4,
PHASE_TRANSITION = 5,
PHASE_FROSTMOURNE = 6, // only set on heroic mode when all players are sent into frostmourne
- PHASE_OUTRO = 7,
-
- PHASE_MASK_INTRO = 1 << PHASE_INTRO,
- PHASE_MASK_ONE = 1 << PHASE_ONE,
- PHASE_MASK_TWO = 1 << PHASE_TWO,
- PHASE_MASK_THREE = 1 << PHASE_THREE,
- PHASE_MASK_TRANSITION = 1 << PHASE_TRANSITION,
- PHASE_MASK_NO_CAST_CHECK = (1 << PHASE_TRANSITION) | (1 << PHASE_FROSTMOURNE) | (1 << PHASE_OUTRO),
- PHASE_MASK_FROSTMOURNE = 1 << PHASE_FROSTMOURNE,
- PHASE_MASK_OUTRO = 1 << PHASE_OUTRO,
- PHASE_MASK_NO_VICTIM = (1 << PHASE_INTRO) | (1 << PHASE_OUTRO) | (1 << PHASE_FROSTMOURNE),
+ PHASE_OUTRO = 7
};
-#define PHASE_TWO_THREE (events.GetPhaseMask() & PHASE_MASK_TWO ? PHASE_TWO : PHASE_THREE)
+#define PHASE_TWO_THREE (events.IsInPhase(PHASE_TWO) ? PHASE_TWO : PHASE_THREE)
Position const CenterPosition = {503.6282f, -2124.655f, 840.8569f, 0.0f};
Position const TirionIntro = {489.2970f, -2124.840f, 840.8569f, 0.0f};
@@ -569,7 +560,7 @@ class boss_the_lich_king : public CreatureScript
void KilledUnit(Unit* victim)
{
- if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode() && !(events.GetPhaseMask() & PHASE_MASK_OUTRO))
+ if (victim->GetTypeId() == TYPEID_PLAYER && !me->IsInEvadeMode() && !events.IsInPhase(PHASE_OUTRO))
Talk(SAY_LK_KILL);
}
@@ -649,7 +640,7 @@ class boss_the_lich_king : public CreatureScript
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
{
- if (events.GetPhaseMask() & PHASE_MASK_ONE && !HealthAbovePct(70))
+ if (events.IsInPhase(PHASE_ONE) && !HealthAbovePct(70))
{
events.SetPhase(PHASE_TRANSITION);
me->SetReactState(REACT_PASSIVE);
@@ -658,7 +649,7 @@ class boss_the_lich_king : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_MASK_TWO && !HealthAbovePct(40))
+ if (events.IsInPhase(PHASE_TWO) && !HealthAbovePct(40))
{
events.SetPhase(PHASE_TRANSITION);
me->SetReactState(REACT_PASSIVE);
@@ -667,7 +658,7 @@ class boss_the_lich_king : public CreatureScript
return;
}
- if (events.GetPhaseMask() & PHASE_MASK_THREE && !HealthAbovePct(10))
+ if (events.IsInPhase(PHASE_THREE) && !HealthAbovePct(10))
{
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
@@ -738,7 +729,7 @@ class boss_the_lich_king : public CreatureScript
summon->SetReactState(REACT_PASSIVE);
summon->SetSpeed(MOVE_FLIGHT, 0.5f);
summon->GetMotionMaster()->MoveRandom(10.0f);
- if (!(events.GetPhaseMask() & PHASE_MASK_FROSTMOURNE))
+ if (!events.IsInPhase(PHASE_FROSTMOURNE))
summon->m_Events.AddEvent(new VileSpiritActivateEvent(summon), summon->m_Events.CalculateTime(15000));
return;
}
@@ -853,14 +844,14 @@ class boss_the_lich_king : public CreatureScript
void UpdateAI(uint32 const diff)
{
// check phase first to prevent updating victim and entering evade mode when not wanted
- if (!(events.GetPhaseMask() & PHASE_MASK_NO_VICTIM))
+ if (!(events.IsInPhase(PHASE_OUTRO) || events.IsInPhase(PHASE_INTRO) || events.IsInPhase(PHASE_FROSTMOURNE)))
if (!UpdateVictim())
return;
events.Update(diff);
// during Remorseless Winter phases The Lich King is channeling a spell, but we must continue casting other spells
- if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK))
+ if (me->HasUnitState(UNIT_STATE_CASTING) && !(events.IsInPhase(PHASE_TRANSITION) || events.IsInPhase(PHASE_OUTRO) || events.IsInPhase(PHASE_FROSTMOURNE)))
return;
while (uint32 eventId = events.ExecuteEvent())
@@ -916,7 +907,7 @@ class boss_the_lich_king : public CreatureScript
break;
case EVENT_INFEST:
DoCast(me, SPELL_INFEST);
- events.ScheduleEvent(EVENT_INFEST, urand(21000, 24000), 0, (events.GetPhaseMask() & PHASE_MASK_ONE) ? PHASE_ONE : PHASE_TWO);
+ events.ScheduleEvent(EVENT_INFEST, urand(21000, 24000), 0, events.IsInPhase(PHASE_ONE) ? PHASE_ONE : PHASE_TWO);
break;
case EVENT_NECROTIC_PLAGUE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, NecroticPlagueTargetCheck(me, NECROTIC_PLAGUE_LK, NECROTIC_PLAGUE_PLR)))
@@ -985,7 +976,7 @@ class boss_the_lich_king : public CreatureScript
break;
case EVENT_START_ATTACK:
me->SetReactState(REACT_AGGRESSIVE);
- if (events.GetPhaseMask() & PHASE_MASK_FROSTMOURNE)
+ if (events.IsInPhase(PHASE_FROSTMOURNE))
events.SetPhase(PHASE_THREE);
break;
case EVENT_VILE_SPIRITS:
@@ -1233,7 +1224,7 @@ class npc_tirion_fordring_tft : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if (!UpdateVictim() && !(_events.GetPhaseMask() & (PHASE_MASK_INTRO | PHASE_MASK_OUTRO)))
+ if (!UpdateVictim() && !(_events.IsInPhase(PHASE_OUTRO) || _events.IsInPhase(PHASE_INTRO)))
return;
_events.Update(diff);
@@ -2827,8 +2818,6 @@ class spell_the_lich_king_vile_spirit_damage_target_search : public SpellScriptL
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_vile_spirit_damage_target_search_SpellScript::CheckTargetCount, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
}
-
- Unit* _target;
};
SpellScript* GetSpellScript() const
@@ -2989,6 +2978,41 @@ class spell_the_lich_king_restore_soul : public SpellScriptLoader
}
};
+class spell_the_lich_king_dark_hunger : public SpellScriptLoader
+{
+ public:
+ spell_the_lich_king_dark_hunger() : SpellScriptLoader("spell_the_lich_king_dark_hunger") { }
+
+ class spell_the_lich_king_dark_hunger_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_the_lich_king_dark_hunger_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DARK_HUNGER_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 heal = int32(eventInfo.GetDamageInfo()->GetDamage() / 2);
+ GetTarget()->CastCustomSpell(SPELL_DARK_HUNGER_HEAL, SPELLVALUE_BASE_POINT0, heal, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_the_lich_king_dark_hunger_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_the_lich_king_dark_hunger_AuraScript();
+ }
+};
+
class spell_the_lich_king_in_frostmourne_room : public SpellScriptLoader
{
public:
@@ -3234,6 +3258,7 @@ void AddSC_boss_the_lich_king()
new spell_the_lich_king_lights_favor();
new spell_the_lich_king_soul_rip();
new spell_the_lich_king_restore_soul();
+ new spell_the_lich_king_dark_hunger();
new spell_the_lich_king_in_frostmourne_room();
new spell_the_lich_king_summon_spirit_bomb();
new spell_the_lich_king_trigger_vile_spirit();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 12868094b2e..5621f9b7a50 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -664,10 +664,11 @@ class npc_frost_freeze_trap : public CreatureScript
public:
npc_frost_freeze_trap() : CreatureScript("npc_frost_freeze_trap") { }
- struct npc_frost_freeze_trapAI: public Scripted_NoMovementAI
+ struct npc_frost_freeze_trapAI: public ScriptedAI
{
- npc_frost_freeze_trapAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_frost_freeze_trapAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
}
void DoAction(int32 const action)
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
index 536c2af2bd8..99d3bfe59b0 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_grobbulus.cpp
@@ -125,11 +125,11 @@ public:
return new npc_grobbulus_poison_cloudAI(creature);
}
- struct npc_grobbulus_poison_cloudAI : public Scripted_NoMovementAI
+ struct npc_grobbulus_poison_cloudAI : public ScriptedAI
{
- npc_grobbulus_poison_cloudAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_grobbulus_poison_cloudAI(Creature* creature) : ScriptedAI(creature)
{
- Reset();
+ SetCombatMovement(false);
}
uint32 Cloud_Timer;
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
index 955c6b801af..fd5841a7727 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp
@@ -191,11 +191,12 @@ class mob_chaotic_rift : public CreatureScript
public:
mob_chaotic_rift() : CreatureScript("mob_chaotic_rift") { }
- struct mob_chaotic_riftAI : public Scripted_NoMovementAI
+ struct mob_chaotic_riftAI : public ScriptedAI
{
- mob_chaotic_riftAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_chaotic_riftAI(Creature* creature) : ScriptedAI(creature)
{
instance = me->GetInstanceScript();
+ SetCombatMovement(false);
}
InstanceScript* instance;
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
index 6f017884063..dc0ffcd2c63 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp
@@ -198,8 +198,7 @@ public:
summoned->CastSpell(summoned, DUNGEON_MODE(SPELL_SPARK_VISUAL_TRIGGER, H_SPELL_SPARK_VISUAL_TRIGGER), true);
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
summoned->SetInCombatWith(target);
summoned->GetMotionMaster()->Clear();
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
index 7fbf5f3ee79..8accb3182ce 100644
--- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
+++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp
@@ -117,9 +117,7 @@ public:
{
if (PartingSorrowTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
-
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_PARTING_SORROW);
PartingSorrowTimer = urand(30000, 40000);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
index 1f96848fa0a..e5ab119e3dc 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp
@@ -176,10 +176,7 @@ enum EncounterPhases
{
PHASE_NORMAL = 0,
PHASE_ROLE_PLAY = 1,
- PHASE_BIG_BANG = 2,
-
- PHASE_MASK_NO_UPDATE = (1 << PHASE_ROLE_PLAY) | (1 << PHASE_BIG_BANG),
- PHASE_MASK_NO_CAST_CHECK = 1 << PHASE_ROLE_PLAY,
+ PHASE_BIG_BANG = 2
};
enum AchievmentInfo
@@ -343,7 +340,7 @@ class boss_algalon_the_observer : public CreatureScript
DoCast(me, SPELL_RIDE_THE_LIGHTNING, true);
me->GetMotionMaster()->MovePoint(POINT_ALGALON_LAND, AlgalonLandPos);
me->SetHomePosition(AlgalonLandPos);
- Movement::MoveSplineInit init(*me);
+ Movement::MoveSplineInit init(me);
init.MoveTo(AlgalonLandPos.GetPositionX(), AlgalonLandPos.GetPositionY(), AlgalonLandPos.GetPositionZ());
init.SetOrientationFixed(true);
init.Launch();
@@ -542,12 +539,12 @@ class boss_algalon_the_observer : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if ((!(events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim()) || !CheckInRoom())
+ if ((!(events.IsInPhase(PHASE_ROLE_PLAY) || events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim()) || !CheckInRoom())
return;
events.Update(diff);
- if (!(events.GetPhaseMask() & PHASE_MASK_NO_CAST_CHECK))
+ if (!events.IsInPhase(PHASE_ROLE_PLAY))
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
@@ -772,7 +769,7 @@ class npc_living_constellation : public CreatureScript
void UpdateAI(uint32 const diff)
{
- if (!(_events.GetPhaseMask() & PHASE_MASK_NO_UPDATE) && !UpdateVictim())
+ if (!(_events.IsInPhase(PHASE_ROLE_PLAY) || _events.IsInPhase(PHASE_BIG_BANG)) && !UpdateVictim())
return;
_events.Update(diff);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
index 4db3b58c53f..0a873bc5792 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_freya.cpp
@@ -216,10 +216,12 @@ class npc_iron_roots : public CreatureScript
public:
npc_iron_roots() : CreatureScript("npc_iron_roots") { }
- struct npc_iron_rootsAI : public Scripted_NoMovementAI
+ struct npc_iron_rootsAI : public ScriptedAI
{
- npc_iron_rootsAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_iron_rootsAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
me->ApplySpellImmune(0, IMMUNITY_ID, 49560, true); // Death Grip
me->setFaction(14);
@@ -1337,10 +1339,11 @@ class npc_sun_beam : public CreatureScript
public:
npc_sun_beam() : CreatureScript("npc_sun_beam") { }
- struct npc_sun_beamAI : public Scripted_NoMovementAI
+ struct npc_sun_beamAI : public ScriptedAI
{
- npc_sun_beamAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_sun_beamAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetReactState(REACT_PASSIVE);
DoCastAOE(SPELL_FREYA_UNSTABLE_ENERGY_VISUAL, true);
DoCast(SPELL_FREYA_UNSTABLE_ENERGY);
@@ -1358,10 +1361,11 @@ class npc_healthy_spore : public CreatureScript
public:
npc_healthy_spore() : CreatureScript("npc_healthy_spore") { }
- struct npc_healthy_sporeAI : public Scripted_NoMovementAI
+ struct npc_healthy_sporeAI : public ScriptedAI
{
- npc_healthy_sporeAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_healthy_sporeAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_PC);
me->SetReactState(REACT_PASSIVE);
DoCast(me, SPELL_HEALTHY_SPORE_VISUAL);
@@ -1397,10 +1401,12 @@ class npc_eonars_gift : public CreatureScript
public:
npc_eonars_gift() : CreatureScript("npc_eonars_gift") { }
- struct npc_eonars_giftAI : public Scripted_NoMovementAI
+ struct npc_eonars_giftAI : public ScriptedAI
{
- npc_eonars_giftAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_eonars_giftAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
lifeBindersGiftTimer = 12000;
DoCast(me, SPELL_GROW);
DoCast(me, SPELL_PHEROMONES, true);
@@ -1435,10 +1441,12 @@ class npc_nature_bomb : public CreatureScript
public:
npc_nature_bomb() : CreatureScript("npc_nature_bomb") { }
- struct npc_nature_bombAI : public Scripted_NoMovementAI
+ struct npc_nature_bombAI : public ScriptedAI
{
- npc_nature_bombAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_nature_bombAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
bombTimer = urand(8000, 10000);
DoCast(SPELL_OBJECT_BOMB);
}
@@ -1475,10 +1483,12 @@ class npc_unstable_sun_beam : public CreatureScript
public:
npc_unstable_sun_beam() : CreatureScript("npc_unstable_sun_beam") { }
- struct npc_unstable_sun_beamAI : public Scripted_NoMovementAI
+ struct npc_unstable_sun_beamAI : public ScriptedAI
{
- npc_unstable_sun_beamAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_unstable_sun_beamAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
+
despawnTimer = urand(7000, 12000);
instance = me->GetInstanceScript();
DoCast(me, SPELL_PHOTOSYNTHESIS);
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
index 79edede01df..b51c6994dd5 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp
@@ -739,10 +739,11 @@ class npc_mole_machine_trigger : public CreatureScript
public:
npc_mole_machine_trigger() : CreatureScript("npc_mole_machine_trigger") { }
- struct npc_mole_machine_triggerAI : public Scripted_NoMovementAI
+ struct npc_mole_machine_triggerAI : public ScriptedAI
{
- npc_mole_machine_triggerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_mole_machine_triggerAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED);
}
@@ -818,10 +819,11 @@ class npc_devouring_flame : public CreatureScript
public:
npc_devouring_flame() : CreatureScript("npc_devouring_flame") { }
- struct npc_devouring_flameAI : public Scripted_NoMovementAI
+ struct npc_devouring_flameAI : public ScriptedAI
{
- npc_devouring_flameAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_devouring_flameAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_PACIFIED);
}
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
index 43d19d78f8a..1ae6a35403b 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
@@ -451,11 +451,12 @@ class mob_xt002_heart : public CreatureScript
public:
mob_xt002_heart() : CreatureScript("mob_xt002_heart") { }
- struct mob_xt002_heartAI : public Scripted_NoMovementAI
+ struct mob_xt002_heartAI : public ScriptedAI
{
- mob_xt002_heartAI(Creature* creature) : Scripted_NoMovementAI(creature),
+ mob_xt002_heartAI(Creature* creature) : ScriptedAI(creature),
_instance(creature->GetInstanceScript())
{
+ SetCombatMovement(false);
}
void UpdateAI(uint32 const /*diff*/) { }
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
index f579fb2b93c..dbf2058546f 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp
@@ -154,7 +154,7 @@ public:
Talk(YELL_DEAD_1);
}
- if (events.GetPhaseMask() & (1 << PHASE_EVENT))
+ if (events.IsInPhase(PHASE_EVENT))
damage = 0;
}
@@ -206,7 +206,7 @@ public:
void UpdateAI(const uint32 diff)
{
- if (!UpdateVictim() && !(events.GetPhaseMask() & (1 << PHASE_EVENT)))
+ if (!UpdateVictim() && !events.IsInPhase(PHASE_EVENT))
return;
events.Update(diff);
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
index 5a38d163da3..1442dddb120 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp
@@ -459,11 +459,13 @@ public:
return new npc_ritual_channelerAI(creature);
}
- struct npc_ritual_channelerAI : public Scripted_NoMovementAI
+ struct npc_ritual_channelerAI : public ScriptedAI
{
- npc_ritual_channelerAI(Creature* creature) :Scripted_NoMovementAI(creature)
+ npc_ritual_channelerAI(Creature* creature) :ScriptedAI(creature)
{
instance = creature->GetInstanceScript();
+
+ SetCombatMovement(false);
}
InstanceScript* instance;
@@ -554,7 +556,7 @@ class spell_paralyze_pinnacle : public SpellScriptLoader
void FilterTargets(std::list<WorldObject*>& unitList)
{
- unitList.remove_if (RitualTargetCheck(GetCaster()));
+ unitList.remove_if(RitualTargetCheck(GetCaster()));
}
void Register()
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
index 613b8ebf8dc..688e7d818df 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/boss_toravon.cpp
@@ -234,9 +234,9 @@ class mob_frozen_orb_stalker : public CreatureScript
public:
mob_frozen_orb_stalker() : CreatureScript("mob_frozen_orb_stalker") { }
- struct mob_frozen_orb_stalkerAI : public Scripted_NoMovementAI
+ struct mob_frozen_orb_stalkerAI : public ScriptedAI
{
- mob_frozen_orb_stalkerAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_frozen_orb_stalkerAI(Creature* creature) : ScriptedAI(creature)
{
creature->SetVisible(false);
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE|UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
@@ -244,6 +244,8 @@ class mob_frozen_orb_stalker : public CreatureScript
instance = creature->GetInstanceScript();
spawned = false;
+
+ SetCombatMovement(false);
}
void UpdateAI(const uint32 /*diff*/)
diff --git a/src/server/scripts/Northrend/zone_borean_tundra.cpp b/src/server/scripts/Northrend/zone_borean_tundra.cpp
index 8e7507bce61..760156dc1c3 100644
--- a/src/server/scripts/Northrend/zone_borean_tundra.cpp
+++ b/src/server/scripts/Northrend/zone_borean_tundra.cpp
@@ -2207,9 +2207,9 @@ class npc_warmage_coldarra : public CreatureScript
public:
npc_warmage_coldarra() : CreatureScript("npc_warmage_coldarra") { }
- struct npc_warmage_coldarraAI : public Scripted_NoMovementAI
+ struct npc_warmage_coldarraAI : public ScriptedAI
{
- npc_warmage_coldarraAI(Creature* creature) : Scripted_NoMovementAI(creature){}
+ npc_warmage_coldarraAI(Creature* creature) : ScriptedAI(creature) {}
uint32 m_uiTimer; //Timer until recast
diff --git a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
index d12b5176b15..963778dd802 100644
--- a/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
+++ b/src/server/scripts/Northrend/zone_crystalsong_forest.cpp
@@ -49,9 +49,12 @@ class npc_warmage_violetstand : public CreatureScript
public:
npc_warmage_violetstand() : CreatureScript("npc_warmage_violetstand") { }
- struct npc_warmage_violetstandAI : public Scripted_NoMovementAI
+ struct npc_warmage_violetstandAI : public ScriptedAI
{
- npc_warmage_violetstandAI(Creature* creature) : Scripted_NoMovementAI(creature){}
+ npc_warmage_violetstandAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint64 uiTargetGUID;
diff --git a/src/server/scripts/Northrend/zone_dalaran.cpp b/src/server/scripts/Northrend/zone_dalaran.cpp
index 6a104e28a1f..fad88d84d4f 100644
--- a/src/server/scripts/Northrend/zone_dalaran.cpp
+++ b/src/server/scripts/Northrend/zone_dalaran.cpp
@@ -55,9 +55,9 @@ class npc_mageguard_dalaran : public CreatureScript
public:
npc_mageguard_dalaran() : CreatureScript("npc_mageguard_dalaran") { }
- struct npc_mageguard_dalaranAI : public Scripted_NoMovementAI
+ struct npc_mageguard_dalaranAI : public ScriptedAI
{
- npc_mageguard_dalaranAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_mageguard_dalaranAI(Creature* creature) : ScriptedAI(creature)
{
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
creature->ApplySpellImmune(0, IMMUNITY_DAMAGE, SPELL_SCHOOL_NORMAL, true);
diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index 098fa80a3d3..70210844394 100644
--- a/src/server/scripts/Northrend/zone_icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
@@ -264,9 +264,12 @@ class npc_guardian_pavilion : public CreatureScript
public:
npc_guardian_pavilion() : CreatureScript("npc_guardian_pavilion") { }
- struct npc_guardian_pavilionAI : public Scripted_NoMovementAI
+ struct npc_guardian_pavilionAI : public ScriptedAI
{
- npc_guardian_pavilionAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_guardian_pavilionAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
void MoveInLineOfSight(Unit* who)
{
@@ -370,9 +373,12 @@ class npc_tournament_training_dummy : public CreatureScript
public:
npc_tournament_training_dummy(): CreatureScript("npc_tournament_training_dummy"){}
- struct npc_tournament_training_dummyAI : Scripted_NoMovementAI
+ struct npc_tournament_training_dummyAI : ScriptedAI
{
- npc_tournament_training_dummyAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_tournament_training_dummyAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
EventMap events;
bool isVulnerable;
@@ -584,13 +590,15 @@ class npc_blessed_banner : public CreatureScript
public:
npc_blessed_banner() : CreatureScript("npc_blessed_banner") { }
- struct npc_blessed_bannerAI : public Scripted_NoMovementAI
+ struct npc_blessed_bannerAI : public ScriptedAI
{
- npc_blessed_bannerAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me)
+ npc_blessed_bannerAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
HalofSpawned = false;
PhaseCount = 0;
Summons.DespawnAll();
+
+ SetCombatMovement(false);
}
EventMap events;
diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
index 3a56a0bfed2..53d51e1fd6c 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp
@@ -187,9 +187,7 @@ public:
void RevertThreatOnTarget(uint64 guid)
{
- Unit* unit = NULL;
- unit = Unit::GetUnit(*me, guid);
- if (unit)
+ if (Unit* unit = Unit::GetUnit(*me, guid))
{
if (DoGetThreat(unit))
DoModifyThreatPercent(unit, -100);
@@ -279,8 +277,7 @@ public:
{
if (Phase1)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->isAlive())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
Phase1 = false;
@@ -308,7 +305,8 @@ public:
AcidGeyserTimer = 1000;
PhaseChangeTimer = 30000;
}
- } else // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
+ }
+ else // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage
{
if (TargetGUID)
RevertThreatOnTarget(TargetGUID);
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index b8003761cc7..a91d25fa984 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -422,8 +422,7 @@ public:
Glaive->InterruptNonMeleeSpells(true);
DoCast(me, SPELL_FLAME_ENRAGE, true);
DoResetThreat();
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->isAlive())
+ if (SelectTarget(SELECT_TARGET_RANDOM, 0))
{
me->AddThreat(me->getVictim(), 5000000.0f);
AttackStart(me->getVictim());
diff --git a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
index 6bc6633e49e..2fac33760e2 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_supremus.cpp
@@ -272,9 +272,12 @@ public:
return new npc_volcanoAI (creature);
}
- struct npc_volcanoAI : public Scripted_NoMovementAI
+ struct npc_volcanoAI : public ScriptedAI
{
- npc_volcanoAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ npc_volcanoAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
void Reset()
{
diff --git a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
index 6c28b058cf7..2dc0517dc49 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_teron_gorefiend.cpp
@@ -468,8 +468,7 @@ public:
if (CrushingShadowsTimer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target && target->isAlive())
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_CRUSHING_SHADOWS);
CrushingShadowsTimer = urand(10, 26) * 1000;
} else CrushingShadowsTimer -= diff;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
index d9ad35f9552..5037f1c4964 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp
@@ -227,9 +227,7 @@ public:
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
{
AttackStart(target);
GetAdvisors();
@@ -360,12 +358,8 @@ public:
{
if (instance)
{
- Creature* Karathress = NULL;
- Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)));
-
- if (Karathress)
- if (!me->isAlive() && Karathress)
- CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath();
+ if (Creature* Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS))))
+ CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventSharkkisDeath();
}
}
@@ -383,12 +377,8 @@ public:
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
- {
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
AttackStart(target);
- }
}
//Return since we have no target
@@ -445,12 +435,13 @@ public:
pet_id = CREATURE_FATHOM_SPOREBAT;
}
//DoCast(me, spell_id, true);
- Creature* Pet = DoSpawnCreature(pet_id, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000);
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (Pet && target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
{
- Pet->AI()->AttackStart(target);
- SummonedPet = Pet->GetGUID();
+ if (Creature* Pet = DoSpawnCreature(pet_id, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 15000))
+ {
+ Pet->AI()->AttackStart(target);
+ SummonedPet = Pet->GetGUID();
+ }
}
} else Pet_Timer -= diff;
@@ -500,12 +491,8 @@ public:
{
if (instance)
{
- Creature* Karathress = NULL;
- Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)));
-
- if (Karathress)
- if (!me->isAlive() && Karathress)
- CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath();
+ if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)))
+ CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventTidalvessDeath();
}
}
@@ -524,12 +511,8 @@ public:
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
- {
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
AttackStart(target);
- }
}
//Return since we have no target
@@ -627,12 +610,8 @@ public:
{
if (instance)
{
- Creature* Karathress = NULL;
- Karathress = (Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)));
-
- if (Karathress)
- if (!me->isAlive() && Karathress)
- CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath();
+ if (Creature* Karathress = Unit::GetCreature((*me), instance->GetData64(DATA_KARATHRESS)))
+ CAST_AI(boss_fathomlord_karathress::boss_fathomlord_karathressAI, Karathress->AI())->EventCaribdisDeath();
}
}
@@ -650,12 +629,8 @@ public:
//Only if not incombat check if the event is started
if (!me->isInCombat() && instance && instance->GetData(DATA_KARATHRESSEVENT))
{
- Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER));
-
- if (target)
- {
+ if (Unit* target = Unit::GetUnit(*me, instance->GetData64(DATA_KARATHRESSEVENT_STARTER)))
AttackStart(target);
- }
}
//Return since we have no target
@@ -697,11 +672,8 @@ public:
Cyclone->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
Cyclone->setFaction(me->getFaction());
Cyclone->CastSpell(Cyclone, SPELL_CYCLONE_CYCLONE, true);
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
- {
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
Cyclone->AI()->AttackStart(target);
- }
}
} else Cyclone_Timer -= diff;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
index b31292c4b00..ec85fe7293d 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp
@@ -272,8 +272,7 @@ public:
//VileSludge_Timer
if (VileSludge_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_VILE_SLUDGE);
VileSludge_Timer = 15000;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index 788de7753ff..c9d0ab08e1c 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -78,10 +78,11 @@ public:
return new boss_the_lurker_belowAI (creature);
}
- struct boss_the_lurker_belowAI : public Scripted_NoMovementAI
+ struct boss_the_lurker_belowAI : public ScriptedAI
{
- boss_the_lurker_belowAI(Creature* creature) : Scripted_NoMovementAI(creature), Summons(me)
+ boss_the_lurker_belowAI(Creature* creature) : ScriptedAI(creature), Summons(me)
{
+ SetCombatMovement(false);
instance = creature->GetInstanceScript();
}
@@ -152,11 +153,10 @@ public:
Summons.DespawnAll();
}
- void EnterCombat(Unit* who)
+ void EnterCombat(Unit* /*who*/)
{
if (instance)
instance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS);
- Scripted_NoMovementAI::EnterCombat(who);
}
void MoveInLineOfSight(Unit* who)
@@ -368,10 +368,11 @@ public:
return new mob_coilfang_ambusherAI (creature);
}
- struct mob_coilfang_ambusherAI : public Scripted_NoMovementAI
+ struct mob_coilfang_ambusherAI : public ScriptedAI
{
- mob_coilfang_ambusherAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ mob_coilfang_ambusherAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
}
uint32 MultiShotTimer;
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
index 9476bb28f8e..06ea83881c8 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
@@ -184,10 +184,9 @@ public:
for (uint8 i = 0; i < 10; ++i)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- Creature* Murloc = me->SummonCreature(NPC_TIDEWALKER_LURKER, MurlocCords[i][0], MurlocCords[i][1], MurlocCords[i][2], MurlocCords[i][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000);
- if (target && Murloc)
- Murloc->AI()->AttackStart(target);
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ if (Creature* Murloc = me->SummonCreature(NPC_TIDEWALKER_LURKER, MurlocCords[i][0], MurlocCords[i][1], MurlocCords[i][2], MurlocCords[i][3], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 10000))
+ Murloc->AI()->AttackStart(target);
}
Talk(EMOTE_EARTHQUAKE);
Earthquake = false;
diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
index 83596c46936..e2b2425dcfc 100644
--- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
+++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp
@@ -519,8 +519,7 @@ public:
//GreaterPolymorph_Timer
if (GreaterPolymorph_Timer <= diff)
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
DoCast(target, SPELL_GREATER_POLYMORPH);
GreaterPolymorph_Timer = urand(15000, 20000);
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
index 01ca1636c6b..9ec6691839b 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp
@@ -245,11 +245,13 @@ class boss_high_astromancer_solarian : public CreatureScript
}
else
{
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0);
- if (!me->HasInArc(2.5f, target))
- target = me->getVictim();
- if (target)
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ {
+ if (!me->HasInArc(2.5f, target))
+ target = me->getVictim();
+
DoCast(target, SPELL_ARCANE_MISSILES);
+ }
}
ArcaneMissiles_Timer = 3000;
}
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
index 07d563cd762..c4111f59d65 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp
@@ -1404,9 +1404,12 @@ class mob_kael_flamestrike : public CreatureScript
: CreatureScript("mob_kael_flamestrike")
{
}
- struct mob_kael_flamestrikeAI : public Scripted_NoMovementAI
+ struct mob_kael_flamestrikeAI : public ScriptedAI
{
- mob_kael_flamestrikeAI(Creature* creature) : Scripted_NoMovementAI(creature) {}
+ mob_kael_flamestrikeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ SetCombatMovement(false);
+ }
uint32 Timer;
bool Casting;
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index 0a016f0923c..a1bfc0a090a 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -661,6 +661,7 @@ class npc_karynaku : public CreatureScript
/*####
# npc_overlord_morghor
+# this whole script is wrong and needs a rewrite.even the illidan npc used is the wrong one.npc id 23467 may be the correct one
####*/
enum eOverlordData
{
@@ -766,7 +767,7 @@ public:
Player* player = Unit::GetPlayer(*me, PlayerGUID);
Creature* Illi = Creature::GetCreature(*me, IllidanGUID);
- if (!player || !Illi)
+ if (!player)
{
EnterEvadeMode();
return 0;
@@ -794,14 +795,21 @@ public:
return 2000;
break;
case 5:
- Illi->SetVisible(true);
- Illi->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ if (Illi)
+ {
+ Illi->SetVisible(true);
+ Illi->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Illi->SetDisplayId(21526);
+ }
return 350;
break;
case 6:
- Illi->CastSpell(Illi, SPELL_ONE, true);
- Illi->SetTarget(me->GetGUID());
- me->SetTarget(IllidanGUID);
+ if (Illi)
+ {
+ Illi->CastSpell(Illi, SPELL_ONE, true);
+ Illi->SetTarget(me->GetGUID());
+ me->SetTarget(IllidanGUID);
+ }
return 2000;
break;
case 7:
@@ -810,10 +818,15 @@ public:
break;
case 8:
me->SetUInt32Value(UNIT_FIELD_BYTES_1, 8);
- return 9000;
+ return 2500;
+ break;
+ case 9:
+ // missing text "Lord Illidan, this is the Dragonmaw that I, and others, have told you about. He will lead us to victory!"
+ return 5000;
break;
case 10:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_1);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_1);
return 5000;
break;
case 11:
@@ -821,42 +834,53 @@ public:
return 6000;
break;
case 12:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_2);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_2);
return 5500;
break;
case 13:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_3);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_3);
return 4000;
break;
case 14:
- Illi->SetTarget(PlayerGUID);
+ if (Illi)
+ Illi->SetTarget(PlayerGUID);
return 1500;
break;
case 15:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_4);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_4);
return 1500;
break;
case 16:
- Illi->CastSpell(player, SPELL_TWO, true);
+ if (Illi)
+ Illi->CastSpell(player, SPELL_TWO, true);
player->RemoveAurasDueToSpell(SPELL_THREE);
player->RemoveAurasDueToSpell(SPELL_FOUR);
return 5000;
break;
case 17:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_5);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_5);
return 5000;
break;
case 18:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_6);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_6);
return 5000;
break;
case 19:
- Illi->AI()->Talk(LORD_ILLIDAN_SAY_7);
+ if (Illi)
+ Illi->AI()->Talk(LORD_ILLIDAN_SAY_7);
return 5000;
break;
case 20:
- Illi->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- Illi->SetDisableGravity(true);
+ if (Illi)
+ {
+ Illi->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
+ Illi->SetDisableGravity(true);
+ }
return 500;
break;
case 21:
@@ -864,8 +888,11 @@ public:
return 500;
break;
case 22:
- Illi->SetVisible(false);
- Illi->setDeathState(JUST_DIED);
+ if (Illi)
+ {
+ Illi->SetVisible(false);
+ Illi->setDeathState(JUST_DIED);
+ }
return 1000;
break;
case 23:
@@ -886,7 +913,7 @@ public:
break;
case 27:
{
- Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50);
+ Unit* Yarzill = me->FindNearestCreature(C_YARZILL, 50.0f);
if (Yarzill)
Yarzill->SetTarget(PlayerGUID);
return 500;
@@ -921,9 +948,11 @@ public:
}
break;
case 32:
- me->GetMotionMaster()->MovePoint(0, -5085.77f, 577.231f, 86.6719f); return 5000;
+ me->GetMotionMaster()->MovePoint(0, -5085.77f, 577.231f, 86.6719f);
+ return 5000;
break;
case 33:
+ me->SetTarget(0);
Reset();
return 100;
break;
@@ -940,7 +969,7 @@ public:
if (ConversationTimer <= diff)
{
- if (Event && IllidanGUID && PlayerGUID)
+ if (Event && PlayerGUID)
ConversationTimer = NextStep(++Step);
} else ConversationTimer -= diff;
}
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 5b43a46cb1f..f5a6bb61120 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -31,12 +31,14 @@ enum DeathKnightSpells
SPELL_DK_ANTI_MAGIC_SHELL_TALENT = 51052,
SPELL_DK_BLACK_ICE_R1 = 49140,
SPELL_DK_BLOOD_BOIL_TRIGGERED = 65658,
+ SPELL_DK_BLOOD_GORGED_HEAL = 50454,
SPELL_DK_CORPSE_EXPLOSION_TRIGGERED = 43999,
SPELL_DK_CORPSE_EXPLOSION_VISUAL = 51270,
SPELL_DK_DEATH_COIL_DAMAGE = 47632,
SPELL_DK_DEATH_COIL_HEAL = 47633,
SPELL_DK_DEATH_STRIKE_HEAL = 45470,
SPELL_DK_GHOUL_EXPLODE = 47496,
+ SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE = 58625,
SPELL_DK_RUNIC_POWER_ENERGIZE = 49088,
SPELL_DK_SCOURGE_STRIKE_TRIGGERED = 70890,
SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1 = 49189,
@@ -251,6 +253,58 @@ class spell_dk_blood_boil : public SpellScriptLoader
}
};
+// 50453 - Bloodworms Health Leech
+class spell_dk_blood_gorged : public SpellScriptLoader
+{
+ public:
+ spell_dk_blood_gorged() : SpellScriptLoader("spell_dk_blood_gorged") { }
+
+ class spell_dk_blood_gorged_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_blood_gorged_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DK_BLOOD_GORGED_HEAL))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetTarget()->GetOwner();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 1.5f);
+ GetTarget()->CastCustomSpell(SPELL_DK_BLOOD_GORGED_HEAL, SPELLVALUE_BASE_POINT0, bp, _procTarget, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dk_blood_gorged_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dk_blood_gorged_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_blood_gorged_AuraScript();
+ }
+};
+
// 49158 - Corpse Explosion (51325, 51326, 51327, 51328)
class spell_dk_corpse_explosion : public SpellScriptLoader
{
@@ -584,6 +638,55 @@ class spell_dk_ghoul_explode : public SpellScriptLoader
}
};
+// 48792 - Icebound Fortitude
+class spell_dk_icebound_fortitude : public SpellScriptLoader
+{
+ public:
+ spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { }
+
+ class spell_dk_icebound_fortitude_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ int32 value = amount;
+ uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
+
+ if (defValue > 400)
+ value -= int32((defValue - 400) * 0.15);
+
+ // Glyph of Icebound Fortitude
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE, EFFECT_0))
+ {
+ int32 valMax = -aurEff->GetAmount();
+ if (value > valMax)
+ value = valMax;
+ }
+ amount = value;
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_icebound_fortitude_AuraScript();
+ }
+};
+
// 50365, 50371 - Improved Blood Presence
class spell_dk_improved_blood_presence : public SpellScriptLoader
{
@@ -677,6 +780,33 @@ class spell_dk_improved_unholy_presence : public SpellScriptLoader
}
};
+// 59754 Rune Tap - Party
+class spell_dk_rune_tap_party : public SpellScriptLoader
+{
+ public:
+ spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { }
+
+ class spell_dk_rune_tap_party_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dk_rune_tap_party_SpellScript);
+
+ void CheckTargets(std::list<WorldObject*>& targets)
+ {
+ targets.remove(GetCaster());
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party_SpellScript::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dk_rune_tap_party_SpellScript();
+ }
+};
+
// 55090 - Scourge Strike (55265, 55270, 55271)
class spell_dk_scourge_strike : public SpellScriptLoader
{
@@ -784,6 +914,33 @@ class spell_dk_spell_deflection : public SpellScriptLoader
}
};
+// 55233 - Vampiric Blood
+class spell_dk_vampiric_blood : public SpellScriptLoader
+{
+ public:
+ spell_dk_vampiric_blood() : SpellScriptLoader("spell_dk_vampiric_blood") { }
+
+ class spell_dk_vampiric_blood_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dk_vampiric_blood_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = GetUnitOwner()->CountPctFromMaxHealth(amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dk_vampiric_blood_AuraScript();
+ }
+};
+
// 52284 - Will of the Necropolis
class spell_dk_will_of_the_necropolis : public SpellScriptLoader
{
@@ -854,6 +1011,7 @@ void AddSC_deathknight_spell_scripts()
new spell_dk_anti_magic_shell_self();
new spell_dk_anti_magic_zone();
new spell_dk_blood_boil();
+ new spell_dk_blood_gorged();
new spell_dk_corpse_explosion();
new spell_dk_death_coil();
new spell_dk_death_gate();
@@ -861,9 +1019,12 @@ void AddSC_deathknight_spell_scripts()
new spell_dk_death_pact();
new spell_dk_death_strike();
new spell_dk_ghoul_explode();
+ new spell_dk_icebound_fortitude();
new spell_dk_improved_blood_presence();
new spell_dk_improved_unholy_presence();
+ new spell_dk_rune_tap_party();
new spell_dk_scourge_strike();
new spell_dk_spell_deflection();
+ new spell_dk_vampiric_blood();
new spell_dk_will_of_the_necropolis();
}
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index b5b4937a14c..8fd44544fb8 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -39,10 +39,15 @@ enum DruidSpells
SPELL_DRUID_SOLAR_ECLIPSE = 48517,
SPELL_DRUID_LUNAR_ECLIPSE = 48518,
SPELL_DRUID_ENRAGE_MOD_DAMAGE = 51185,
+ SPELL_DRUID_GLYPH_OF_TYPHOON = 62135,
+ SPELL_DRUID_IDOL_OF_FERAL_SHADOWS = 34241,
+ SPELL_DRUID_IDOL_OF_WORSHIP = 60774,
SPELL_DRUID_INCREASED_MOONFIRE_DURATION = 38414,
SPELL_DRUID_KING_OF_THE_JUNGLE = 48492,
SPELL_DRUID_LIFEBLOOM_ENERGIZE = 64372,
SPELL_DRUID_LIFEBLOOM_FINAL_HEAL = 33778,
+ SPELL_DRUID_LIVING_SEED_HEAL = 48503,
+ SPELL_DRUID_LIVING_SEED_PROC = 48504,
SPELL_DRUID_NATURES_SPLENDOR = 57865,
SPELL_DRUID_SURVIVAL_INSTINCTS = 50322,
SPELL_DRUID_SAVAGE_ROAR = 62071,
@@ -160,6 +165,35 @@ class spell_dru_eclipse_energize : public SpellScriptLoader
}
};
+// -1850 - Dash
+class spell_dru_dash : public SpellScriptLoader
+{
+ public:
+ spell_dru_dash() : SpellScriptLoader("spell_dru_dash") { }
+
+ class spell_dru_dash_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_dash_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ // do not set speed if not in cat form
+ if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT)
+ amount = 0;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_dash_AuraScript();
+ }
+};
+
// -5229 - Enrage
class spell_dru_enrage : public SpellScriptLoader
{
@@ -240,6 +274,69 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader
}
};
+// 34246 - Idol of the Emerald Queen
+// 60779 - Idol of Lush Moss
+class spell_dru_idol_lifebloom : public SpellScriptLoader
+{
+ public:
+ spell_dru_idol_lifebloom() : SpellScriptLoader("spell_dru_idol_lifebloom") { }
+
+ class spell_dru_idol_lifebloom_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_idol_lifebloom_AuraScript);
+
+ void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
+ {
+ if (!spellMod)
+ {
+ spellMod = new SpellModifier(GetAura());
+ spellMod->op = SPELLMOD_DOT;
+ spellMod->type = SPELLMOD_FLAT;
+ spellMod->spellId = GetId();
+ spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask;
+ }
+ spellMod->value = aurEff->GetAmount() / 7;
+ }
+
+ void Register()
+ {
+ DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_idol_lifebloom_AuraScript();
+ }
+};
+
+// 29166 - Innervate
+class spell_dru_innervate : public SpellScriptLoader
+{
+ public:
+ spell_dru_innervate() : SpellScriptLoader("spell_dru_innervate") { }
+
+ class spell_dru_innervate_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_innervate_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = CalculatePct(int32(GetUnitOwner()->GetCreatePowers(POWER_MANA) / aurEff->GetTotalTicks()), amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_innervate_AuraScript();
+ }
+};
+
// -5570 - Insect Swarm
class spell_dru_insect_swarm : public SpellScriptLoader
{
@@ -351,6 +448,77 @@ class spell_dru_lifebloom : public SpellScriptLoader
}
};
+// -48496 - Living Seed
+class spell_dru_living_seed : public SpellScriptLoader
+{
+ public:
+ spell_dru_living_seed() : SpellScriptLoader("spell_dru_living_seed") { }
+
+ class spell_dru_living_seed_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_living_seed_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_PROC))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 amount = CalculatePct(eventInfo.GetHealInfo()->GetHeal(), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_PROC, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_living_seed_AuraScript();
+ }
+};
+
+// 48504 - Living Seed (Proc)
+class spell_dru_living_seed_proc : public SpellScriptLoader
+{
+ public:
+ spell_dru_living_seed_proc() : SpellScriptLoader("spell_dru_living_seed_proc") { }
+
+ class spell_dru_living_seed_proc_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_living_seed_proc_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_DRUID_LIVING_SEED_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastCustomSpell(SPELL_DRUID_LIVING_SEED_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_dru_living_seed_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_living_seed_proc_AuraScript();
+ }
+};
+
// 69366 - Moonkin Form passive
class spell_dru_moonkin_form_passive : public SpellScriptLoader
{
@@ -395,6 +563,33 @@ class spell_dru_moonkin_form_passive : public SpellScriptLoader
}
};
+// 48391 - Owlkin Frenzy
+class spell_dru_owlkin_frenzy : public SpellScriptLoader
+{
+ public:
+ spell_dru_owlkin_frenzy() : SpellScriptLoader("spell_dru_owlkin_frenzy") { }
+
+ class spell_dru_owlkin_frenzy_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_owlkin_frenzy_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ amount = CalculatePct(GetUnitOwner()->GetCreatePowers(POWER_MANA), amount);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_owlkin_frenzy_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_PERIODIC_ENERGIZE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_owlkin_frenzy_AuraScript();
+ }
+};
+
// -16972 - Predatory Strikes
class spell_dru_predatory_strikes : public SpellScriptLoader
{
@@ -468,6 +663,54 @@ class spell_dru_primal_tenacity : public SpellScriptLoader
}
};
+// -1079 - Rip
+class spell_dru_rip : public SpellScriptLoader
+{
+ public:
+ spell_dru_rip() : SpellScriptLoader("spell_dru_rip") { }
+
+ class spell_dru_rip_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_dru_rip_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+
+ if (Unit* caster = GetCaster())
+ {
+ // 0.01 * $AP * cp
+ uint8 cp = caster->ToPlayer()->GetComboPoints();
+
+ // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs
+ if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0))
+ amount += cp * idol->GetAmount();
+ // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs
+ else if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0))
+ amount += cp * idol->GetAmount();
+
+ amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp));
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_rip_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_dru_rip_AuraScript();
+ }
+};
+
// 62606 - Savage Defense
class spell_dru_savage_defense : public SpellScriptLoader
{
@@ -777,6 +1020,35 @@ class spell_dru_tiger_s_fury : public SpellScriptLoader
}
};
+// -61391 - Typhoon
+class spell_dru_typhoon : public SpellScriptLoader
+{
+ public:
+ spell_dru_typhoon() : SpellScriptLoader("spell_dru_typhoon") { }
+
+ class spell_dru_typhoon_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_dru_typhoon_SpellScript);
+
+ void HandleKnockBack(SpellEffIndex effIndex)
+ {
+ // Glyph of Typhoon
+ if (GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_TYPHOON))
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_dru_typhoon_SpellScript::HandleKnockBack, EFFECT_0, SPELL_EFFECT_KNOCK_BACK);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_dru_typhoon_SpellScript();
+ }
+};
+
// 70691 - Item T10 Restoration 4P Bonus
class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
{
@@ -834,14 +1106,21 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
void AddSC_druid_spell_scripts()
{
+ new spell_dru_dash();
new spell_dru_eclipse_energize();
new spell_dru_enrage();
new spell_dru_glyph_of_starfire();
+ new spell_dru_idol_lifebloom();
+ new spell_dru_innervate();
new spell_dru_insect_swarm();
new spell_dru_lifebloom();
+ new spell_dru_living_seed();
+ new spell_dru_living_seed_proc();
new spell_dru_moonkin_form_passive();
+ new spell_dru_owlkin_frenzy();
new spell_dru_predatory_strikes();
new spell_dru_primal_tenacity();
+ new spell_dru_rip();
new spell_dru_savage_defense();
new spell_dru_savage_roar();
new spell_dru_starfall_aoe();
@@ -849,5 +1128,6 @@ void AddSC_druid_spell_scripts()
new spell_dru_survival_instincts();
new spell_dru_swift_flight_passive();
new spell_dru_tiger_s_fury();
+ new spell_dru_typhoon();
new spell_dru_t10_restoration_4p_bonus();
}
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 54cb346a033..74334f192f4 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -72,6 +72,97 @@ class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
}
};
+// 28764 - Adaptive Warding (Frostfire Regalia Set)
+enum AdaptiveWarding
+{
+ SPELL_GEN_ADAPTIVE_WARDING_FIRE = 28765,
+ SPELL_GEN_ADAPTIVE_WARDING_NATURE = 28768,
+ SPELL_GEN_ADAPTIVE_WARDING_FROST = 28766,
+ SPELL_GEN_ADAPTIVE_WARDING_SHADOW = 28769,
+ SPELL_GEN_ADAPTIVE_WARDING_ARCANE = 28770
+};
+
+class spell_gen_adaptive_warding : public SpellScriptLoader
+{
+ public:
+ spell_gen_adaptive_warding() : SpellScriptLoader("spell_gen_adaptive_warding") { }
+
+ class spell_gen_adaptive_warding_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_adaptive_warding_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_NATURE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_ARCANE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
+ return false;
+
+ // find Mage Armor
+ if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, 0x10000000, 0x0, 0x0))
+ return false;
+
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_NORMAL:
+ case SPELL_SCHOOL_HOLY:
+ return false;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ uint32 spellId = 0;
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_FIRE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ spellId = SPELL_GEN_ADAPTIVE_WARDING_ARCANE;
+ break;
+ default:
+ return;
+ }
+ GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_adaptive_warding_AuraScript();
+ }
+};
+
// 41337 Aura of Anger
class spell_gen_aura_of_anger : public SpellScriptLoader
{
@@ -226,6 +317,245 @@ class spell_gen_cannibalize : public SpellScriptLoader
}
};
+// 63845 - Create Lance
+enum CreateLanceSpells
+{
+ SPELL_CREATE_LANCE_ALLIANCE = 63914,
+ SPELL_CREATE_LANCE_HORDE = 63919
+};
+
+class spell_gen_create_lance : public SpellScriptLoader
+{
+ public:
+ spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { }
+
+ class spell_gen_create_lance_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_create_lance_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Player* target = GetHitPlayer())
+ {
+ if (target->GetTeam() == ALLIANCE)
+ GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true);
+ else
+ GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_create_lance_SpellScript();
+ }
+};
+
+// 28702 - Netherbloom
+enum Netherbloom
+{
+ SPELL_NETHERBLOOM_POLLEN_1 = 28703
+};
+
+class spell_gen_netherbloom : public SpellScriptLoader
+{
+ public:
+ spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { }
+
+ class spell_gen_netherbloom_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_netherbloom_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ for (uint8 i = 0; i < 5; ++i)
+ if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Unit* target = GetHitUnit())
+ {
+ // 25% chance of casting a random buff
+ if (roll_chance_i(75))
+ return;
+
+ // triggered spells are 28703 to 28707
+ // Note: some sources say, that there was the possibility of
+ // receiving a debuff. However, this seems to be removed by a patch.
+
+ // don't overwrite an existing aura
+ for (uint8 i = 0; i < 5; ++i)
+ if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i))
+ return;
+
+ target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_netherbloom_SpellScript();
+ }
+};
+
+// 28720 - Nightmare Vine
+enum NightmareVine
+{
+ SPELL_NIGHTMARE_POLLEN = 28721
+};
+
+class spell_gen_nightmare_vine : public SpellScriptLoader
+{
+ public:
+ spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { }
+
+ class spell_gen_nightmare_vine_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_nightmare_vine_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ if (Unit* target = GetHitUnit())
+ {
+ // 25% chance of casting Nightmare Pollen
+ if (roll_chance_i(25))
+ target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_nightmare_vine_SpellScript();
+ }
+};
+
+// 27539 - Obsidian Armor
+enum ObsidianArmor
+{
+ SPELL_GEN_OBSIDIAN_ARMOR_HOLY = 27536,
+ SPELL_GEN_OBSIDIAN_ARMOR_FIRE = 27533,
+ SPELL_GEN_OBSIDIAN_ARMOR_NATURE = 27538,
+ SPELL_GEN_OBSIDIAN_ARMOR_FROST = 27534,
+ SPELL_GEN_OBSIDIAN_ARMOR_SHADOW = 27535,
+ SPELL_GEN_OBSIDIAN_ARMOR_ARCANE = 27540
+};
+
+class spell_gen_obsidian_armor : public SpellScriptLoader
+{
+ public:
+ spell_gen_obsidian_armor() : SpellScriptLoader("spell_gen_obsidian_armor") { }
+
+ class spell_gen_obsidian_armor_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_obsidian_armor_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_HOLY) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FIRE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_NATURE) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_FROST) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_SHADOW) ||
+ !sSpellMgr->GetSpellInfo(SPELL_GEN_OBSIDIAN_ARMOR_ARCANE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
+ return false;
+
+ if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL)
+ return false;
+
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ uint32 spellId = 0;
+ switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
+ {
+ case SPELL_SCHOOL_HOLY:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY;
+ break;
+ case SPELL_SCHOOL_FIRE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE;
+ break;
+ case SPELL_SCHOOL_NATURE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE;
+ break;
+ case SPELL_SCHOOL_FROST:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST;
+ break;
+ case SPELL_SCHOOL_SHADOW:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW;
+ break;
+ case SPELL_SCHOOL_ARCANE:
+ spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE;
+ break;
+ default:
+ return;
+ }
+ GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_obsidian_armor_AuraScript();
+ }
+};
+
// 45472 Parachute
enum ParachuteSpells
{
@@ -1322,68 +1652,6 @@ class spell_gen_oracle_wolvar_reputation : public SpellScriptLoader
}
};
-class spell_gen_luck_of_the_draw : public SpellScriptLoader
-{
- public:
- spell_gen_luck_of_the_draw() : SpellScriptLoader("spell_gen_luck_of_the_draw") { }
-
- class spell_gen_luck_of_the_draw_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_luck_of_the_draw_AuraScript);
-
- bool Load()
- {
- return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER;
- }
-
- // cheap hax to make it have update calls
- void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude)
- {
- isPeriodic = true;
- amplitude = 5 * IN_MILLISECONDS;
- }
-
- void Update(AuraEffect* /*effect*/)
- {
- if (Player* owner = GetUnitOwner()->ToPlayer())
- {
- const LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(owner->GetGUID());
- LfgDungeonSet::const_iterator itr = dungeons.begin();
-
- if (itr == dungeons.end())
- {
- Remove(AURA_REMOVE_BY_DEFAULT);
- return;
- }
-
-
- LFGDungeonData const* randomDungeon = sLFGMgr->GetLFGDungeon(*itr);
- if (Group* group = owner->GetGroup())
- if (Map const* map = owner->GetMap())
- if (group->isLFGGroup())
- if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
- if (LFGDungeonData const* dungeon = sLFGMgr->GetLFGDungeon(dungeonId))
- if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty())
- if (randomDungeon && randomDungeon->type == LFG_TYPE_RANDOM)
- return; // in correct dungeon
-
- Remove(AURA_REMOVE_BY_DEFAULT);
- }
- }
-
- void Register()
- {
- DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_luck_of_the_draw_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
- OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_luck_of_the_draw_AuraScript::Update, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_gen_luck_of_the_draw_AuraScript();
- }
-};
-
enum DummyTrigger
{
SPELL_PERSISTANT_SHIELD_TRIGGERED = 26470,
@@ -3163,13 +3431,172 @@ class spell_gen_replenishment : public SpellScriptLoader
}
};
+enum RunningWildMountIds
+{
+ RUNNING_WILD_MODEL_MALE = 29422,
+ RUNNING_WILD_MODEL_FEMALE = 29423,
+ SPELL_ALTERED_FORM = 97709,
+};
+
+class spell_gen_running_wild : public SpellScriptLoader
+{
+ public:
+ spell_gen_running_wild() : SpellScriptLoader("spell_gen_running_wild") { }
+
+ class spell_gen_running_wild_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_gen_running_wild_AuraScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_MALE))
+ return false;
+ if (!sCreatureDisplayInfoStore.LookupEntry(RUNNING_WILD_MODEL_FEMALE))
+ return false;
+ return true;
+ }
+
+ void HandleMount(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ PreventDefaultAction();
+
+ target->Mount(target->getGender() == GENDER_FEMALE ? RUNNING_WILD_MODEL_FEMALE : RUNNING_WILD_MODEL_MALE, 0, 0);
+
+ // cast speed aura
+ if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount()))
+ target->CastSpell(target, mountCapability->SpeedModSpell, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_gen_running_wild_AuraScript::HandleMount, EFFECT_1, SPELL_AURA_MOUNTED, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ class spell_gen_running_wild_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_running_wild_SpellScript);
+
+ bool Validate(SpellInfo const* /*spell*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ALTERED_FORM))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ // Definitely not a good thing, but currently the only way to do something at cast start
+ // Should be replaced as soon as possible with a new hook: BeforeCastStart
+ GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
+ return false;
+ }
+
+ void Register()
+ {
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_gen_running_wild_AuraScript();
+ }
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_running_wild_SpellScript();
+ }
+};
+
+class spell_gen_two_forms : public SpellScriptLoader
+{
+ public:
+ spell_gen_two_forms() : SpellScriptLoader("spell_gen_two_forms") { }
+
+ class spell_gen_two_forms_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_two_forms_SpellScript);
+
+ SpellCastResult CheckCast()
+ {
+ if (GetCaster()->isInCombat())
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ // Player cannot transform to human form if he is forced to be worgen for some reason (Darkflight)
+ if (GetCaster()->GetAuraEffectsByType(SPELL_AURA_WORGEN_ALTERED_FORM).size() > 1)
+ {
+ SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
+ return SPELL_FAILED_CUSTOM_ERROR;
+ }
+
+ return SPELL_CAST_OK;
+ }
+
+ void HandleTransform(SpellEffIndex effIndex)
+ {
+ Unit* target = GetHitUnit();
+ PreventHitDefaultEffect(effIndex);
+ if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM))
+ target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM);
+ else // Basepoints 1 for this aura control whether to trigger transform transition animation or not.
+ target->CastCustomSpell(SPELL_ALTERED_FORM, SPELLVALUE_BASE_POINT0, 1, target, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ OnCheckCast += SpellCheckCastFn(spell_gen_two_forms_SpellScript::CheckCast);
+ OnEffectHitTarget += SpellEffectFn(spell_gen_two_forms_SpellScript::HandleTransform, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_two_forms_SpellScript();
+ }
+};
+
+class spell_gen_darkflight : public SpellScriptLoader
+{
+ public:
+ spell_gen_darkflight() : SpellScriptLoader("spell_gen_darkflight") { }
+
+ class spell_gen_darkflight_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_darkflight_SpellScript);
+
+ void TriggerTransform()
+ {
+ GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
+ }
+
+ void Register()
+ {
+ AfterCast += SpellCastFn(spell_gen_darkflight_SpellScript::TriggerTransform);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_darkflight_SpellScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
+ new spell_gen_adaptive_warding();
new spell_gen_aura_of_anger();
new spell_gen_av_drekthar_presence();
new spell_gen_burn_brutallus();
new spell_gen_cannibalize();
+ new spell_gen_create_lance();
+ new spell_gen_netherbloom();
+ new spell_gen_nightmare_vine();
+ new spell_gen_obsidian_armor();
new spell_gen_parachute();
new spell_gen_pet_summoned();
new spell_gen_remove_flight_auras();
@@ -3192,7 +3619,6 @@ void AddSC_generic_spell_scripts()
new spell_gen_launch();
new spell_gen_vehicle_scaling();
new spell_gen_oracle_wolvar_reputation();
- new spell_gen_luck_of_the_draw();
new spell_gen_dummy_trigger();
new spell_gen_spirit_healer_res();
new spell_gen_gadgetzan_transporter_backfire();
@@ -3243,4 +3669,7 @@ void AddSC_generic_spell_scripts()
new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance");
new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance");
new spell_gen_replenishment();
+ new spell_gen_running_wild();
+ new spell_gen_two_forms();
+ new spell_gen_darkflight();
}
diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp
index d883b4d7da7..dbfc2b44501 100644
--- a/src/server/scripts/Spells/spell_holiday.cpp
+++ b/src/server/scripts/Spells/spell_holiday.cpp
@@ -303,27 +303,10 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader
void HandleScript(SpellEffIndex /*effIndex*/)
{
- Unit* caster = GetCaster();
-
if (Player* target = GetHitPlayer())
{
- uint32 spellId = 0;
- switch (urand(0, 2))
- {
- case 0:
- spellId = SPELL_CREATE_MISTLETOE;
- break;
- case 1:
- spellId = SPELL_CREATE_HOLLY;
- break;
- case 2:
- spellId = SPELL_CREATE_SNOWFLAKES;
- break;
- default:
- return;
- }
-
- caster->CastSpell(target, spellId, true);
+ uint32 spellId = RAND(SPELL_CREATE_HOLLY, SPELL_CREATE_MISTLETOE, SPELL_CREATE_SNOWFLAKES);
+ GetCaster()->CastSpell(target, spellId, true);
}
}
@@ -339,6 +322,71 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader
}
};
+// 26275 - PX-238 Winter Wondervolt TRAP
+enum PX238WinterWondervolt
+{
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1 = 26157,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2 = 26272,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3 = 26273,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4 = 26274
+};
+
+class spell_winter_veil_px_238_winter_wondervolt : public SpellScriptLoader
+{
+ public:
+ spell_winter_veil_px_238_winter_wondervolt() : SpellScriptLoader("spell_winter_veil_px_238_winter_wondervolt") { }
+
+ class spell_winter_veil_px_238_winter_wondervolt_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_winter_veil_px_238_winter_wondervolt_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3) ||
+ !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ uint32 const spells[4] =
+ {
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3,
+ SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4
+ };
+
+ if (Unit* target = GetHitUnit())
+ {
+ for (uint8 i = 0; i < 4; ++i)
+ if (target->HasAura(spells[i]))
+ return;
+
+ GetCaster()->CastSpell(target, spells[urand(0, 3)], true);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_winter_veil_px_238_winter_wondervolt_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+
+ private:
+
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_winter_veil_px_238_winter_wondervolt_SpellScript();
+ }
+};
+
void AddSC_holiday_spell_scripts()
{
// Love is in the Air
@@ -349,4 +397,5 @@ void AddSC_holiday_spell_scripts()
new spell_hallow_end_tricky_treat();
// Winter Veil
new spell_winter_veil_mistletoe();
+ new spell_winter_veil_px_238_winter_wondervolt();
}
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index a9b21807899..891a7daaa1f 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -33,12 +33,15 @@
enum HunterSpells
{
SPELL_HUNTER_ASPECT_OF_THE_BEAST_PET = 61669,
+ SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE = 34075,
SPELL_HUNTER_BESTIAL_WRATH = 19574,
SPELL_HUNTER_CHIMERA_SHOT_SERPENT = 53353,
SPELL_HUNTER_CHIMERA_SHOT_VIPER = 53358,
SPELL_HUNTER_CHIMERA_SHOT_SCORPID = 53359,
+ SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER = 56851,
SPELL_HUNTER_INVIGORATION_TRIGGERED = 53398,
SPELL_HUNTER_MASTERS_CALL_TRIGGERED = 62305,
+ SPELL_HUNTER_MISDIRECTION_PROC = 35079,
SPELL_HUNTER_PET_LAST_STAND_TRIGGERED = 53479,
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX = 55709,
SPELL_HUNTER_PET_HEART_OF_THE_PHOENIX_TRIGGERED = 54114,
@@ -99,6 +102,50 @@ class spell_hun_aspect_of_the_beast : public SpellScriptLoader
}
};
+// 34074 - Aspect of the Viper
+class spell_hun_ascpect_of_the_viper : public SpellScriptLoader
+{
+ public:
+ spell_hun_ascpect_of_the_viper() : SpellScriptLoader("spell_hun_ascpect_of_the_viper") { }
+
+ class spell_hun_ascpect_of_the_viper_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_ascpect_of_the_viper_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ uint32 maxMana = GetTarget()->GetMaxPower(POWER_MANA);
+ int32 mana = CalculatePct(maxMana, GetTarget()->GetAttackTime(RANGED_ATTACK) / 1000.0f);
+
+ if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER, EFFECT_0))
+ AddPct(mana, glyph->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_HUNTER_ASPECT_OF_THE_VIPER_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_hun_ascpect_of_the_viper_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_OBS_MOD_POWER);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_hun_ascpect_of_the_viper_AuraScript();
+ }
+};
+
// 53209 - Chimera Shot
class spell_hun_chimera_shot : public SpellScriptLoader
{
@@ -358,16 +405,35 @@ class spell_hun_misdirection : public SpellScriptLoader
{
PrepareAuraScript(spell_hun_misdirection_AuraScript);
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_MISDIRECTION_PROC))
+ return false;
+ return true;
+ }
+
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (Unit* caster = GetCaster())
- if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
- caster->SetReducedThreatPercent(0, 0);
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
+ GetTarget()->ResetRedirectThreat();
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return GetTarget()->GetRedirectThreatTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_HUNTER_MISDIRECTION_PROC, true, NULL, aurEff);
}
void Register()
{
AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_hun_misdirection_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_hun_misdirection_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
}
};
@@ -377,7 +443,7 @@ class spell_hun_misdirection : public SpellScriptLoader
}
};
-// 35079 - Misdirection proc
+// 35079 - Misdirection (Proc)
class spell_hun_misdirection_proc : public SpellScriptLoader
{
public:
@@ -389,8 +455,7 @@ class spell_hun_misdirection_proc : public SpellScriptLoader
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- if (GetCaster())
- GetCaster()->SetReducedThreatPercent(0, 0);
+ GetTarget()->ResetRedirectThreat();
}
void Register()
@@ -740,6 +805,7 @@ class spell_hun_target_only_pet_and_owner : public SpellScriptLoader
void AddSC_hunter_spell_scripts()
{
new spell_hun_aspect_of_the_beast();
+ new spell_hun_ascpect_of_the_viper();
new spell_hun_chimera_shot();
new spell_hun_disengage();
new spell_hun_invigoration();
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index b4e06cb6b48..b8e17f4ecca 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -73,6 +73,150 @@ class spell_item_trigger_spell : public SpellScriptLoader
}
};
+// 26400 - Arcane Shroud
+class spell_item_arcane_shroud : public SpellScriptLoader
+{
+ public:
+ spell_item_arcane_shroud() : SpellScriptLoader("spell_item_arcane_shroud") { }
+
+ class spell_item_arcane_shroud_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_arcane_shroud_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ int32 diff = GetUnitOwner()->getLevel() - 60;
+ if (diff > 0)
+ amount += 2 * diff;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_arcane_shroud_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_arcane_shroud_AuraScript();
+ }
+};
+
+// 64411 - Blessing of Ancient Kings (Val'anyr, Hammer of Ancient Kings)
+enum BlessingOfAncientKings
+{
+ SPELL_PROTECTION_OF_ANCIENT_KINGS = 64413
+};
+
+class spell_item_blessing_of_ancient_kings : public SpellScriptLoader
+{
+ public:
+ spell_item_blessing_of_ancient_kings() : SpellScriptLoader("spell_item_blessing_of_ancient_kings") { }
+
+ class spell_item_blessing_of_ancient_kings_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_blessing_of_ancient_kings_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PROTECTION_OF_ANCIENT_KINGS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f));
+ if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0, eventInfo.GetActor()->GetGUID()))
+ {
+ // The shield can grow to a maximum size of 20,000 damage absorbtion
+ protEff->SetAmount(std::min<int32>(protEff->GetAmount() + absorb, 20000));
+
+ // Refresh and return to prevent replacing the aura
+ aurEff->GetBase()->RefreshDuration();
+ }
+ else
+ GetTarget()->CastCustomSpell(SPELL_PROTECTION_OF_ANCIENT_KINGS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_blessing_of_ancient_kings_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_blessing_of_ancient_kings_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_blessing_of_ancient_kings_AuraScript();
+ }
+};
+
+// 8342 - Defibrillate (Goblin Jumper Cables) have 33% chance on success
+// 22999 - Defibrillate (Goblin Jumper Cables XL) have 50% chance on success
+// 54732 - Defibrillate (Gnomish Army Knife) have 67% chance on success
+enum Defibrillate
+{
+ SPELL_GOBLIN_JUMPER_CABLES_FAIL = 8338,
+ SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL = 23055
+};
+
+class spell_item_defibrillate : public SpellScriptLoader
+{
+ public:
+ spell_item_defibrillate(char const* name, uint8 chance, uint32 failSpell = 0) : SpellScriptLoader(name), _chance(chance), _failSpell(failSpell) { }
+
+ class spell_item_defibrillate_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_defibrillate_SpellScript);
+
+ public:
+ spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell) : SpellScript(), _chance(chance), _failSpell(failSpell) { }
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (_failSpell && !sSpellMgr->GetSpellInfo(_failSpell))
+ return false;
+ return true;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ if (roll_chance_i(_chance))
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (_failSpell)
+ GetCaster()->CastSpell(GetCaster(), _failSpell, true, GetCastItem());
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_defibrillate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_RESURRECT);
+ }
+
+ private:
+ uint8 _chance;
+ uint32 _failSpell;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_defibrillate_SpellScript(_chance, _failSpell);
+ }
+
+ private:
+ uint8 _chance;
+ uint32 _failSpell;
+};
+
// http://www.wowhead.com/item=6522 Deviate Fish
// 8063 Deviate Fish
enum DeviateFishSpells
@@ -357,6 +501,47 @@ class spell_item_mingos_fortune_generator : public SpellScriptLoader
}
};
+// 71875, 71877 - Item - Black Bruise: Necrotic Touch Proc
+enum NecroticTouch
+{
+ SPELL_ITEM_NECROTIC_TOUCH_PROC = 71879
+};
+
+class spell_item_necrotic_touch : public SpellScriptLoader
+{
+ public:
+ spell_item_necrotic_touch() : SpellScriptLoader("spell_item_necrotic_touch") { }
+
+ class spell_item_necrotic_touch_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_necrotic_touch_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ITEM_NECROTIC_TOUCH_PROC))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ int32 bp = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_ITEM_NECROTIC_TOUCH_PROC, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_item_necrotic_touch_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_necrotic_touch_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=10720 Gnomish Net-o-Matic Projector
// 13120 Net-o-Matic
enum NetOMaticSpells
@@ -464,6 +649,35 @@ class spell_item_noggenfogger_elixir : public SpellScriptLoader
}
};
+// 17512 - Piccolo of the Flaming Fire
+class spell_item_piccolo_of_the_flaming_fire : public SpellScriptLoader
+{
+ public:
+ spell_item_piccolo_of_the_flaming_fire() : SpellScriptLoader("spell_item_piccolo_of_the_flaming_fire") { }
+
+ class spell_item_piccolo_of_the_flaming_fire_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_piccolo_of_the_flaming_fire_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (Player* target = GetHitPlayer())
+ target->HandleEmoteCommand(EMOTE_STATE_DANCE);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_piccolo_of_the_flaming_fire_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_piccolo_of_the_flaming_fire_SpellScript();
+ }
+};
+
// http://www.wowhead.com/item=6657 Savory Deviate Delight
// 8213 Savory Deviate Delight
enum SavoryDeviateDelight
@@ -522,6 +736,262 @@ class spell_item_savory_deviate_delight : public SpellScriptLoader
}
};
+// 48129 - Scroll of Recall
+// 60320 - Scroll of Recall II
+// 60321 - Scroll of Recall III
+enum ScrollOfRecall
+{
+ SPELL_SCROLL_OF_RECALL_I = 48129,
+ SPELL_SCROLL_OF_RECALL_II = 60320,
+ SPELL_SCROLL_OF_RECALL_III = 60321,
+ SPELL_LOST = 60444,
+ SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1 = 60323,
+ SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1 = 60328,
+};
+
+class spell_item_scroll_of_recall : public SpellScriptLoader
+{
+ public:
+ spell_item_scroll_of_recall() : SpellScriptLoader("spell_item_scroll_of_recall") { }
+
+ class spell_item_scroll_of_recall_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_scroll_of_recall_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ Unit* caster = GetCaster();
+ uint8 maxSafeLevel = 0;
+ switch (GetSpellInfo()->Id)
+ {
+ case SPELL_SCROLL_OF_RECALL_I: // Scroll of Recall
+ maxSafeLevel = 40;
+ break;
+ case SPELL_SCROLL_OF_RECALL_II: // Scroll of Recall II
+ maxSafeLevel = 70;
+ break;
+ case SPELL_SCROLL_OF_RECALL_III: // Scroll of Recal III
+ maxSafeLevel = 80;
+ break;
+ default:
+ break;
+ }
+
+ if (caster->getLevel() > maxSafeLevel)
+ {
+ caster->CastSpell(caster, SPELL_LOST, true);
+
+ // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335
+ uint32 spellId = SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1;
+ if (GetCaster()->ToPlayer()->GetTeam() == HORDE)
+ spellId = SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1;
+
+ GetCaster()->CastSpell(GetCaster(), spellId + urand(0, 7), true);
+
+ PreventHitDefaultEffect(effIndex);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_scroll_of_recall_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_scroll_of_recall_SpellScript();
+ }
+};
+
+// 71169 - Shadow's Fate (Shadowmourne questline)
+enum ShadowsFate
+{
+ SPELL_SOUL_FEAST = 71203,
+ QUEST_A_FEAST_OF_SOULS = 24547
+};
+
+class spell_item_shadows_fate : public SpellScriptLoader
+{
+ public:
+ spell_item_shadows_fate() : SpellScriptLoader("spell_item_shadows_fate") { }
+
+ class spell_item_shadows_fate_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadows_fate_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SOUL_FEAST))
+ return false;
+ if (!sObjectMgr->GetQuestTemplate(QUEST_A_FEAST_OF_SOULS))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetCaster();
+ return _procTarget && _procTarget->GetTypeId() == TYPEID_PLAYER && _procTarget->ToPlayer()->GetQuestStatus(QUEST_A_FEAST_OF_SOULS) == QUEST_STATUS_INCOMPLETE;
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_SOUL_FEAST, true);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_shadows_fate_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_shadows_fate_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadows_fate_AuraScript();
+ }
+};
+
+enum Shadowmourne
+{
+ SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE = 71904,
+ SPELL_SHADOWMOURNE_SOUL_FRAGMENT = 71905,
+ SPELL_SHADOWMOURNE_VISUAL_LOW = 72521,
+ SPELL_SHADOWMOURNE_VISUAL_HIGH = 72523,
+ SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF = 73422,
+};
+
+// 71903 - Item - Shadowmourne Legendary
+class spell_item_shadowmourne : public SpellScriptLoader
+{
+ public:
+ spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { }
+
+ class spell_item_shadowmourne_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadowmourne_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_SOUL_FRAGMENT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (GetTarget()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) // cant collect shards while under effect of Chaos Bane buff
+ return false;
+ return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->isAlive();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_SHADOWMOURNE_SOUL_FRAGMENT, true, NULL, aurEff);
+
+ // this can't be handled in AuraScript of SoulFragments because we need to know victim
+ if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT))
+ {
+ if (soulFragments->GetStackAmount() >= 10)
+ {
+ GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, NULL, aurEff);
+ soulFragments->Remove();
+ }
+ }
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_item_shadowmourne_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_item_shadowmourne_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadowmourne_AuraScript();
+ }
+};
+
+// 71905 - Soul Fragment
+class spell_item_shadowmourne_soul_fragment : public SpellScriptLoader
+{
+ public:
+ spell_item_shadowmourne_soul_fragment() : SpellScriptLoader("spell_item_shadowmourne_soul_fragment") { }
+
+ class spell_item_shadowmourne_soul_fragment_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_shadowmourne_soul_fragment_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
+ return false;
+ return true;
+ }
+
+ void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ switch (GetStackAmount())
+ {
+ case 1:
+ target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true);
+ break;
+ case 6:
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
+ target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true);
+ break;
+ case 10:
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
+ target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
+ target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY));
+ AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_soul_fragment_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_shadowmourne_soul_fragment_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=7734 Six Demon Bag
// 14537 Six Demon Bag
enum SixDemonBagSpells
@@ -593,6 +1063,35 @@ class spell_item_six_demon_bag : public SpellScriptLoader
}
};
+// 28862 - The Eye of Diminution
+class spell_item_the_eye_of_diminution : public SpellScriptLoader
+{
+ public:
+ spell_item_the_eye_of_diminution() : SpellScriptLoader("spell_item_the_eye_of_diminution") { }
+
+ class spell_item_the_eye_of_diminution_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_item_the_eye_of_diminution_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ int32 diff = GetUnitOwner()->getLevel() - 60;
+ if (diff > 0)
+ amount += diff;
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_the_eye_of_diminution_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_item_the_eye_of_diminution_AuraScript();
+ }
+};
+
// http://www.wowhead.com/item=44012 Underbelly Elixir
// 59640 Underbelly Elixir
enum UnderbellyElixirSpells
@@ -646,70 +1145,6 @@ class spell_item_underbelly_elixir : public SpellScriptLoader
}
};
-enum eShadowmourneVisuals
-{
- SPELL_SHADOWMOURNE_VISUAL_LOW = 72521,
- SPELL_SHADOWMOURNE_VISUAL_HIGH = 72523,
- SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF = 73422,
-};
-
-class spell_item_shadowmourne : public SpellScriptLoader
-{
-public:
- spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { }
-
- class spell_item_shadowmourne_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_item_shadowmourne_AuraScript);
-
- bool Validate(SpellInfo const* /*spellEntry*/)
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_LOW) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_VISUAL_HIGH) || !sSpellMgr->GetSpellInfo(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF))
- return false;
- return true;
- }
-
- void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- switch (GetStackAmount())
- {
- case 1:
- target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true);
- break;
- case 6:
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
- target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true);
- break;
- case 10:
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
- target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true);
- break;
- default:
- break;
- }
- }
-
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_LOW);
- target->RemoveAurasDueToSpell(SPELL_SHADOWMOURNE_VISUAL_HIGH);
- }
-
- void Register()
- {
- AfterEffectApply += AuraEffectApplyFn(spell_item_shadowmourne_AuraScript::OnStackChange, EFFECT_0, SPELL_AURA_MOD_STAT, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAL | AURA_EFFECT_HANDLE_REAPPLY));
- AfterEffectRemove += AuraEffectRemoveFn(spell_item_shadowmourne_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_REAL);
- }
- };
-
- AuraScript* GetAuraScript() const
- {
- return new spell_item_shadowmourne_AuraScript();
- }
-};
-
enum AirRifleSpells
{
SPELL_AIR_RIFLE_HOLD_VISUAL = 65582,
@@ -2030,17 +2465,28 @@ void AddSC_item_spell_scripts()
// 23075 Mithril Mechanical Dragonling
new spell_item_trigger_spell("spell_item_mithril_mechanical_dragonling", SPELL_MITHRIL_MECHANICAL_DRAGONLING);
+ new spell_item_arcane_shroud();
+ new spell_item_blessing_of_ancient_kings();
+ new spell_item_defibrillate("spell_item_goblin_jumper_cables", 67, SPELL_GOBLIN_JUMPER_CABLES_FAIL);
+ new spell_item_defibrillate("spell_item_goblin_jumper_cables_xl", 50, SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL);
+ new spell_item_defibrillate("spell_item_gnomish_army_knife", 33);
new spell_item_deviate_fish();
new spell_item_flask_of_the_north();
new spell_item_gnomish_death_ray();
new spell_item_make_a_wish();
new spell_item_mingos_fortune_generator();
+ new spell_item_necrotic_touch();
new spell_item_net_o_matic();
new spell_item_noggenfogger_elixir();
+ new spell_item_piccolo_of_the_flaming_fire();
new spell_item_savory_deviate_delight();
+ new spell_item_scroll_of_recall();
+ new spell_item_shadows_fate();
+ new spell_item_shadowmourne();
+ new spell_item_shadowmourne_soul_fragment();
new spell_item_six_demon_bag();
+ new spell_item_the_eye_of_diminution();
new spell_item_underbelly_elixir();
- new spell_item_shadowmourne();
new spell_item_red_rider_air_rifle();
new spell_item_create_heart_candy();
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index 8c33117bb96..cd3673c17de 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -25,45 +25,47 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "Pet.h"
enum MageSpells
{
+ SPELL_MAGE_BURNOUT = 29077,
+ SPELL_MAGE_COLD_SNAP = 11958,
+ SPELL_MAGE_FOCUS_MAGIC_PROC = 54648,
+ SPELL_MAGE_FROST_WARDING_R1 = 11189,
+ SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776,
+ SPELL_MAGE_INCANTERS_ABSORBTION_R1 = 44394,
+ SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED = 44413,
+ SPELL_MAGE_IGNITE = 12654,
+ SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077,
+ SPELL_MAGE_SQUIRREL_FORM = 32813,
+ SPELL_MAGE_GIRAFFE_FORM = 32816,
+ SPELL_MAGE_SERPENT_FORM = 32817,
+ SPELL_MAGE_DRAGONHAWK_FORM = 32818,
+ SPELL_MAGE_WORGEN_FORM = 32819,
+ SPELL_MAGE_SHEEP_FORM = 32820,
+ SPELL_MAGE_GLYPH_OF_ETERNAL_WATER = 70937,
+ SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908,
+ SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907,
+ SPELL_MAGE_GLYPH_OF_BLAST_WAVE = 62126,
+
SPELL_MAGE_FLAMESTRIKE = 2120,
SPELL_MAGE_CHILLED_R1 = 12484,
SPELL_MAGE_CHILLED_R2 = 12485,
- SPELL_MAGE_COLD_SNAP = 11958,
-
SPELL_MAGE_CONE_OF_COLD_AURA_R1 = 11190,
SPELL_MAGE_CONE_OF_COLD_AURA_R2 = 12489,
SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1 = 83301,
SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2 = 83302,
- SPELL_MAGE_FROST_WARDING_R1 = 28332,
- SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776,
-
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_INCANTER_S_ABSORPTION_TRIGGERED = 44413,
- SPELL_MAGE_INCANTER_S_ABSORPTION_KNOCKBACK = 86261,
-
- SPELL_MAGE_SQUIRREL_FORM = 32813,
- SPELL_MAGE_GIRAFFE_FORM = 32816,
- SPELL_MAGE_SERPENT_FORM = 32817,
- SPELL_MAGE_DRAGONHAWK_FORM = 32818,
- SPELL_MAGE_WORGEN_FORM = 32819,
- SPELL_MAGE_SHEEP_FORM = 32820,
-
SPELL_MAGE_IMPROVED_MANA_GEM_TRIGGERED = 83098,
- SPELL_MAGE_GLYPH_OF_ETERNAL_WATER = 70937,
- SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT = 70908,
- SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY = 70907,
-
SPELL_MAGE_FINGERS_OF_FROST = 44544
};
@@ -76,6 +78,31 @@ enum MageIcons
ICON_MAGE_IMPROVED_MANA_GEM = 1036
};
+// Incanter's Absorbtion
+class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript
+{
+ public:
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1))
+ return false;
+ return true;
+ }
+
+ void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
+ {
+ Unit* target = GetTarget();
+
+ if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
+ target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ }
+ }
+};
+
// 11113 - Blast Wave
class spell_mage_blast_wave : public SpellScriptLoader
{
@@ -130,6 +157,51 @@ class spell_mage_blast_wave : public SpellScriptLoader
}
};
+// -44449 - Burnout
+class spell_mage_burnout : public SpellScriptLoader
+{
+ public:
+ spell_mage_burnout() : SpellScriptLoader("spell_mage_burnout") { }
+
+ class spell_mage_burnout_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_burnout_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_BURNOUT))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
+ mana = CalculatePct(mana, aurEff->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_MAGE_BURNOUT, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_burnout_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_burnout_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_burnout_AuraScript();
+ }
+};
+
// 42208 - Blizzard
/// Updated 4.3.4
class spell_mage_blizzard : public SpellScriptLoader
@@ -327,29 +399,47 @@ class spell_mage_conjure_refreshment : public SpellScriptLoader
}
};
-// -6143, -543 - Frost Warding
-class spell_mage_frost_warding_trigger : public SpellScriptLoader
+// -543 - Fire Ward
+// -6143 - Frost Ward
+class spell_mage_fire_frost_ward : public SpellScriptLoader
{
public:
- spell_mage_frost_warding_trigger() : SpellScriptLoader("spell_mage_frost_warding_trigger") { }
+ spell_mage_fire_frost_ward() : SpellScriptLoader("spell_mage_fire_frost_ward") { }
- class spell_mage_frost_warding_trigger_AuraScript : public AuraScript
+ class spell_mage_fire_frost_ward_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript
{
- PrepareAuraScript(spell_mage_frost_warding_trigger_AuraScript);
+ PrepareAuraScript(spell_mage_fire_frost_ward_AuraScript);
bool Validate(SpellInfo const* /*spellInfo*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))
return false;
return true;
}
- void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+ }
+ }
+
+ void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
{
Unit* target = GetTarget();
if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0))
{
- int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue();
+ int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // SPELL_EFFECT_DUMMY with NO_TARGET
if (roll_chance_i(chance))
{
@@ -364,13 +454,66 @@ class spell_mage_frost_warding_trigger : public SpellScriptLoader
void Register()
{
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_frost_warding_trigger_AuraScript::Absorb, EFFECT_0);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_fire_frost_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Absorb, EFFECT_0);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Trigger, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_fire_frost_ward_AuraScript();
+ }
+};
+
+// 54646 - Focus Magic
+class spell_mage_focus_magic : public SpellScriptLoader
+{
+ public:
+ spell_mage_focus_magic() : SpellScriptLoader("spell_mage_focus_magic") { }
+
+ class spell_mage_focus_magic_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_focus_magic_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FOCUS_MAGIC_PROC))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetCaster();
+ return _procTarget && _procTarget->isAlive();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_MAGE_FOCUS_MAGIC_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_focus_magic_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_focus_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_SPELL_CRIT_CHANCE);
}
+
+ private:
+ Unit* _procTarget;
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_frost_warding_trigger_AuraScript();
+ return new spell_mage_focus_magic_AuraScript();
}
};
@@ -483,77 +626,170 @@ class spell_mage_ice_barrier : public SpellScriptLoader
}
};
-// 1463 - Mana Shield
-/// Updated 4.3.4
-class spell_mage_mana_shield : public SpellScriptLoader
+// -11119 - Ignite
+class spell_mage_ignite : public SpellScriptLoader
{
public:
- spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
+ spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { }
- class spell_mage_mana_shield_AuraScript : public AuraScript
+ class spell_mage_ignite_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_ignite_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ SpellInfo const* igniteDot = sSpellMgr->GetSpellInfo(SPELL_MAGE_IGNITE);
+ int32 pct = 8 * GetSpellInfo()->GetRank();
+
+ int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks());
+ amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE);
+ GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_ignite_AuraScript();
+ }
+};
+
+// 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_mana_shield_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);
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true);
}
}
- void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL)
- GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_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);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0);
}
};
AuraScript* GetAuraScript() const
{
- return new spell_mage_mana_shield_AuraScript();
+ return new spell_mage_mage_ward_AuraScript();
}
};
-// 543 - Mage Ward
+// 1463 - Mana Shield
/// Updated 4.3.4
-class spell_mage_mage_ward : public SpellScriptLoader
+class spell_mage_mana_shield : public SpellScriptLoader
{
- public:
- spell_mage_mage_ward() : SpellScriptLoader("spell_mage_mage_ward") { }
+ public:
+ spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { }
- class spell_mage_mage_ward_AuraScript : public AuraScript
+ class spell_mage_mana_shield_AuraScript : public AuraScript
{
- PrepareAuraScript(spell_mage_mage_ward_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);
+ GetTarget()->CastCustomSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true);
}
}
+ void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL)
+ GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_INCANTERS_ABSORBTION_R1, true);
+ }
+
void Register()
{
- AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_mage_ward_AuraScript::HandleAbsorb, EFFECT_0);
+ 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_mage_ward_AuraScript();
+ return new spell_mage_mana_shield_AuraScript();
}
};
+// -29074 - Master of Elements
+class spell_mage_master_of_elements : public SpellScriptLoader
+{
+ public:
+ spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { }
+
+ class spell_mage_master_of_elements_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_mage_master_of_elements_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetSpellInfo(); // eventInfo.GetSpellInfo()
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 mana = int32(eventInfo.GetDamageInfo()->GetSpellInfo()->CalcPowerCost(GetTarget(), eventInfo.GetDamageInfo()->GetSchoolMask()));
+ mana = CalculatePct(mana, aurEff->GetAmount());
+
+ if (mana > 0)
+ GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_mage_master_of_elements_AuraScript();
+ }
+};
+
enum SilvermoonPolymorph
{
NPC_AUROSALIA = 18744
@@ -669,6 +905,14 @@ class spell_mage_summon_water_elemental : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
+
+ if (Player* player = caster->ToPlayer())
+ if (Guardian* elemental = player->GetGuardianPet())
+ // Check if the pet we are going to unsummon is the mage's water elemental
+ if (elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_TEMPORARY)->Effects[EFFECT_0].MiscValue) ||
+ elemental->GetEntry() == uint32(sSpellMgr->GetSpellInfo(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT)->Effects[EFFECT_0].MiscValue))
+ elemental->UnSummon();
+
// Glyph of Eternal Water
if (caster->HasAura(SPELL_MAGE_GLYPH_OF_ETERNAL_WATER))
caster->CastSpell(caster, SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT, true);
@@ -748,15 +992,19 @@ void AddSC_mage_spell_scripts()
{
new spell_mage_blast_wave();
new spell_mage_blizzard();
+ new spell_mage_burnout();
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_fire_frost_ward();
+ new spell_mage_focus_magic();
new spell_mage_frostbolt();
- new spell_mage_living_bomb();
new spell_mage_ice_barrier();
- new spell_mage_mana_shield();
+ new spell_mage_ignite();
+ new spell_mage_living_bomb();
new spell_mage_mage_ward();
+ new spell_mage_mana_shield();
+ new spell_mage_master_of_elements();
new spell_mage_polymorph_cast_visual();
new spell_mage_replenish_mana();
new spell_mage_summon_water_elemental();
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index 47592630a11..ac9b861f584 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -31,6 +31,7 @@ enum PaladinSpells
{
SPELL_PALADIN_DIVINE_PLEA = 54428,
SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF = 67480,
+ SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE = 57319,
SPELL_PALADIN_HOLY_SHOCK_R1 = 20473,
SPELL_PALADIN_HOLY_SHOCK_R1_DAMAGE = 25912,
@@ -45,12 +46,25 @@ enum PaladinSpells
SPELL_PALADIN_DIVINE_STORM_DUMMY = 54171,
SPELL_PALADIN_DIVINE_STORM_HEAL = 54172,
+ SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE = 25997,
+
SPELL_PALADIN_FORBEARANCE = 25771,
SPELL_PALADIN_AVENGING_WRATH_MARKER = 61987,
SPELL_PALADIN_IMMUNE_SHIELD_MARKER = 61988,
SPELL_PALADIN_HAND_OF_SACRIFICE = 6940,
- SPELL_PALADIN_DIVINE_SACRIFICE = 64205
+ SPELL_PALADIN_DIVINE_SACRIFICE = 64205,
+
+ SPELL_PALADIN_DIVINE_PURPOSE_PROC = 90174,
+
+ SPELL_PALADIN_GLYPH_OF_SALVATION = 63225,
+
+ SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT = 31790,
+
+ SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS = 25742,
+
+ SPELL_GENERIC_ARENA_DAMPENING = 74410,
+ SPELL_GENERIC_BATTLEGROUND_DAMPENING = 74411
};
// 31850 - Ardent Defender
@@ -185,8 +199,8 @@ class spell_pal_blessing_of_faith : public SpellScriptLoader
}
};
-// 20911 Blessing of Sanctuary
-// 25899 Greater Blessing of Sanctuary
+// 20911 - Blessing of Sanctuary
+// 25899 - Greater Blessing of Sanctuary
class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
{
public:
@@ -200,6 +214,8 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
{
if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF))
return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE))
+ return false;
return true;
}
@@ -216,10 +232,23 @@ class spell_pal_blessing_of_sanctuary : public SpellScriptLoader
target->RemoveAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY_BUFF, GetCasterGUID());
}
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return GetTarget()->getPowerType() == POWER_MANA;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_BLESSING_OF_SANCTUARY_ENERGIZE, true, NULL, aurEff);
+ }
+
void Register()
{
AfterEffectApply += AuraEffectApplyFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
AfterEffectRemove += AuraEffectRemoveFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ DoCheckProc += AuraCheckProcFn(spell_pal_blessing_of_sanctuary_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pal_blessing_of_sanctuary_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
};
@@ -410,6 +439,43 @@ class spell_pal_exorcism_and_holy_wrath_damage : public SpellScriptLoader
}
};
+// -9799 - Eye for an Eye
+class spell_pal_eye_for_an_eye : public SpellScriptLoader
+{
+ public:
+ spell_pal_eye_for_an_eye() : SpellScriptLoader("spell_pal_eye_for_an_eye") { }
+
+ class spell_pal_eye_for_an_eye_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_eye_for_an_eye_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE))
+ return false;
+ return true;
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ // return damage % to attacker but < 50% own total health
+ int32 damage = int32(std::min(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()), GetTarget()->GetMaxHealth() / 2));
+ GetTarget()->CastCustomSpell(SPELL_PALADIN_EYE_FOR_AN_EYE_DAMAGE, SPELLVALUE_BASE_POINT0, damage, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pal_eye_for_an_eye_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_eye_for_an_eye_AuraScript();
+ }
+};
+
// 63521 - Guarded by The Light
class spell_pal_guarded_by_the_light : public SpellScriptLoader
{
@@ -490,6 +556,39 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader
}
};
+// 1038 - Hand of Salvation
+class spell_pal_hand_of_salvation : public SpellScriptLoader
+{
+ public:
+ spell_pal_hand_of_salvation() : SpellScriptLoader("spell_pal_hand_of_salvation") { }
+
+ class spell_pal_hand_of_salvation_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_hand_of_salvation_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ // Glyph of Salvation
+ if (caster->GetGUID() == GetUnitOwner()->GetGUID())
+ if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_PALADIN_GLYPH_OF_SALVATION, EFFECT_0))
+ amount -= aurEff->GetAmount();
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_hand_of_salvation_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_hand_of_salvation_AuraScript();
+ }
+};
+
// -20473 - Holy Shock
class spell_pal_holy_shock : public SpellScriptLoader
{
@@ -656,6 +755,13 @@ class spell_pal_righteous_defense : public SpellScriptLoader
{
PrepareSpellScript(spell_pal_righteous_defense_SpellScript);
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT))
+ return false;
+ return true;
+ }
+
SpellCastResult CheckCast()
{
Unit* caster = GetCaster();
@@ -673,9 +779,27 @@ class spell_pal_righteous_defense : public SpellScriptLoader
return SPELL_CAST_OK;
}
+ void HandleTriggerSpellLaunch(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void HandleTriggerSpellHit(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ if (Unit* target = GetHitUnit())
+ GetCaster()->CastSpell(target, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, true);
+ }
+
void Register()
{
OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast);
+ //! WORKAROUND
+ //! target select will be executed in hitphase of effect 0
+ //! so we must handle trigger spell also in hit phase (default execution in launch phase)
+ //! see issue #3718
+ OnEffectLaunchTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellLaunch, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
+ OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellHit, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
}
};
@@ -719,18 +843,139 @@ class spell_pal_sacred_shield : public SpellScriptLoader
}
};
+// 85256 - Templar's Verdict
+/// Updated 4.3.4
+class spell_pal_templar_s_verdict : public SpellScriptLoader
+{
+ public:
+ spell_pal_templar_s_verdict() : SpellScriptLoader("spell_pal_templar_s_verdict") { }
+
+ class spell_pal_templar_s_verdict_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pal_templar_s_verdict_SpellScript);
+
+ bool Validate (SpellInfo const* /*spellEntry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_DIVINE_PURPOSE_PROC))
+ return false;
+
+ return true;
+ }
+
+ bool Load()
+ {
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ return false;
+
+ if (GetCaster()->ToPlayer()->getClass() != CLASS_PALADIN)
+ return false;
+
+ return true;
+ }
+
+ void ChangeDamage(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ int32 damage = GetHitDamage();
+
+ if (caster->HasAura(SPELL_PALADIN_DIVINE_PURPOSE_PROC))
+ damage *= 7.5; // 7.5*30% = 225%
+ else
+ {
+ switch (caster->GetPower(POWER_HOLY_POWER))
+ {
+ case 0: // 1 Holy Power
+ damage = damage;
+ break;
+ case 1: // 2 Holy Power
+ damage *= 3; // 3*30 = 90%
+ break;
+ case 2: // 3 Holy Power
+ damage *= 7.5; // 7.5*30% = 225%
+ break;
+ }
+ }
+
+ SetHitDamage(damage);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_pal_templar_s_verdict_SpellScript::ChangeDamage, EFFECT_0, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pal_templar_s_verdict_SpellScript();
+ }
+};
+
+// 20154, 21084 - Seal of Righteousness - melee proc dummy (addition ${$MWS*(0.022*$AP+0.044*$SPH)} damage)
+class spell_pal_seal_of_righteousness : public SpellScriptLoader
+{
+ public:
+ spell_pal_seal_of_righteousness() : SpellScriptLoader("spell_pal_seal_of_righteousness") { }
+
+ class spell_pal_seal_of_righteousness_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pal_seal_of_righteousness_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ float ap = GetTarget()->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 holy = GetTarget()->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_HOLY);
+ holy += eventInfo.GetProcTarget()->SpellBaseDamageBonusTaken(SPELL_SCHOOL_MASK_HOLY);
+ int32 bp = int32((ap * 0.022f + 0.044f * holy) * GetTarget()->GetAttackTime(BASE_ATTACK) / 1000);
+ GetTarget()->CastCustomSpell(SPELL_PALADIN_SEAL_OF_RIGHTEOUSNESS, SPELLVALUE_BASE_POINT0, bp, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pal_seal_of_righteousness_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pal_seal_of_righteousness_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pal_seal_of_righteousness_AuraScript();
+ }
+};
+
+
void AddSC_paladin_spell_scripts()
{
//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_divine_storm();
+ new spell_pal_divine_storm_dummy();
new spell_pal_exorcism_and_holy_wrath_damage();
+ new spell_pal_eye_for_an_eye();
new spell_pal_guarded_by_the_light();
new spell_pal_hand_of_sacrifice();
+ new spell_pal_hand_of_salvation();
new spell_pal_holy_shock();
new spell_pal_judgement_of_command();
new spell_pal_lay_on_hands();
new spell_pal_righteous_defense();
new spell_pal_sacred_shield();
+ new spell_pal_templar_s_verdict();
+ new spell_pal_seal_of_righteousness();
}
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index b47eff816a3..c2bfc913893 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -29,29 +29,122 @@
enum PriestSpells
{
+ SPELL_PRIEST_DIVINE_AEGIS = 47753,
SPELL_PRIEST_EMPOWERED_RENEW = 63544,
+ SPELL_PRIEST_GLYPH_OF_LIGHTWELL = 55673,
+ SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL = 56161,
SPELL_PRIEST_GLYPH_OF_SHADOW = 107906,
SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL = 48153,
SPELL_PRIEST_LEAP_OF_FAITH = 73325,
- SPELL_PRIEST_LEAP_OF_FAITH_TRIGGERED = 92572,
- SPELL_PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER = 92833,
SPELL_PRIEST_LEAP_OF_FAITH_EFFECT = 92832,
+ SPELL_PRIEST_LEAP_OF_FAITH_EFFECT_TRIGGER = 92833,
+ SPELL_PRIEST_LEAP_OF_FAITH_TRIGGERED = 92572,
+ SPELL_PRIEST_MANA_LEECH_PROC = 34650,
SPELL_PRIEST_PENANCE_R1 = 47540,
SPELL_PRIEST_PENANCE_R1_DAMAGE = 47758,
SPELL_PRIEST_PENANCE_R1_HEAL = 47757,
- SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
SPELL_PRIEST_REFLECTIVE_SHIELD_R1 = 33201,
- SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
+ SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED = 33619,
SPELL_PRIEST_SHADOWFORM_VISUAL_WITHOUT_GLYPH = 107903,
SPELL_PRIEST_SHADOWFORM_VISUAL_WITH_GLYPH = 107904,
+ SPELL_PRIEST_SHADOW_WORD_DEATH = 32409,
SPELL_PRIEST_T9_HEALING_2P = 67201,
- SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085
+ SPELL_PRIEST_VAMPIRIC_TOUCH_DISPEL = 64085,
};
enum PriestSpellIcons
{
+ PRIEST_ICON_ID_BORROWED_TIME = 2899,
PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT = 3021,
- PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874
+ PRIEST_ICON_ID_PAIN_AND_SUFFERING = 2874,
+};
+
+// -47509 - Divine Aegis
+class spell_pri_divine_aegis : public SpellScriptLoader
+{
+ public:
+ spell_pri_divine_aegis() : SpellScriptLoader("spell_pri_divine_aegis") { }
+
+ class spell_pri_divine_aegis_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_divine_aegis_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_DIVINE_AEGIS))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetProcTarget();
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 absorb = CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount());
+
+ // Multiple effects stack, so let's try to find this aura.
+ if (AuraEffect const* aegis = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PRIEST_DIVINE_AEGIS, EFFECT_0))
+ absorb += aegis->GetAmount();
+
+ absorb = std::min(absorb, eventInfo.GetProcTarget()->getLevel() * 125);
+
+ GetTarget()->CastCustomSpell(SPELL_PRIEST_DIVINE_AEGIS, SPELLVALUE_BASE_POINT0, absorb, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_divine_aegis_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pri_divine_aegis_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_divine_aegis_AuraScript();
+ }
+};
+
+// 55680 - Glyph of Prayer of Healing
+class spell_pri_glyph_of_prayer_of_healing : public SpellScriptLoader
+{
+ public:
+ spell_pri_glyph_of_prayer_of_healing() : SpellScriptLoader("spell_pri_glyph_of_prayer_of_healing") { }
+
+ class spell_pri_glyph_of_prayer_of_healing_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_glyph_of_prayer_of_healing_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL))
+ return false;
+ return true;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL);
+ int32 heal = int32(CalculatePct(int32(eventInfo.GetHealInfo()->GetHeal()), aurEff->GetAmount()) / triggeredSpellInfo->GetMaxTicks());
+ GetTarget()->CastCustomSpell(SPELL_PRIEST_GLYPH_OF_PRAYER_OF_HEALING_HEAL, SPELLVALUE_BASE_POINT0, heal, eventInfo.GetProcTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectProc += AuraEffectProcFn(spell_pri_glyph_of_prayer_of_healing_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_glyph_of_prayer_of_healing_AuraScript();
+ }
};
// 47788 - Guardian Spirit
@@ -151,6 +244,38 @@ class spell_pri_leap_of_faith_effect_trigger : public SpellScriptLoader
}
};
+// -7001 - Lightwell Renew
+class spell_pri_lightwell_renew : public SpellScriptLoader
+{
+ public:
+ spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { }
+
+ class spell_pri_lightwell_renew_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_lightwell_renew_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ // Bonus from Glyph of Lightwell
+ if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPH_OF_LIGHTWELL, EFFECT_0))
+ AddPct(amount, modHealing->GetAmount());
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_lightwell_renew_AuraScript();
+ }
+};
+
// 8129 - Mana Burn
class spell_pri_mana_burn : public SpellScriptLoader
{
@@ -179,6 +304,57 @@ class spell_pri_mana_burn : public SpellScriptLoader
}
};
+// 28305 - Mana Leech (Passive) (Priest Pet Aura)
+class spell_pri_mana_leech : public SpellScriptLoader
+{
+ public:
+ spell_pri_mana_leech() : SpellScriptLoader("spell_pri_mana_leech") { }
+
+ class spell_pri_mana_leech_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_mana_leech_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_MANA_LEECH_PROC))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetTarget()->GetOwner();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_PRIEST_MANA_LEECH_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_pri_mana_leech_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_pri_mana_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_mana_leech_AuraScript();
+ }
+};
+
// 49821 - Mind Sear
class spell_pri_mind_sear : public SpellScriptLoader
{
@@ -307,6 +483,82 @@ class spell_pri_penance : public SpellScriptLoader
}
};
+// -17 - Power Word: Shield
+class spell_pri_power_word_shield : public SpellScriptLoader
+{
+ public:
+ spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { }
+
+ class spell_pri_power_word_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_pri_power_word_shield_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1))
+ return false;
+ return true;
+ }
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ // Borrowed Time
+ if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1))
+ bonus += CalculatePct(1.0f, borrowedTime->GetAmount());
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+
+ // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :)
+ // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage
+ bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus);
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+
+ // Twin Disciplines
+ if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, GetCasterGUID()))
+ AddPct(amount, twinDisciplines->GetAmount());
+
+ // Focused Power
+ amount *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT);
+ }
+ }
+
+ void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)
+ {
+ Unit* target = GetTarget();
+ if (dmgInfo.GetAttacker() == target)
+ return;
+
+ if (Unit* caster = GetCaster())
+ if (AuraEffect* talentAurEff = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))
+ {
+ int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount());
+ target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_pri_power_word_shield_AuraScript();
+ }
+};
+
// 33110 - Prayer of Mending Heal
class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
{
@@ -545,12 +797,17 @@ class spell_pri_vampiric_touch : public SpellScriptLoader
void AddSC_priest_spell_scripts()
{
+ new spell_pri_divine_aegis();
+ new spell_pri_glyph_of_prayer_of_healing();
new spell_pri_guardian_spirit();
new spell_pri_leap_of_faith_effect_trigger();
+ new spell_pri_lightwell_renew();
new spell_pri_mana_burn();
+ new spell_pri_mana_leech();
new spell_pri_mind_sear();
new spell_pri_pain_and_suffering_proc();
new spell_pri_penance();
+ new spell_pri_power_word_shield();
new spell_pri_prayer_of_mending_heal();
new spell_pri_reflective_shield_trigger();
new spell_pri_renew();
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 14d1c1a2f98..b19f5e2cbed 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -28,10 +28,13 @@
enum RogueSpells
{
+ SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK = 22482,
SPELL_ROGUE_CHEAT_DEATH_COOLDOWN = 31231,
SPELL_ROGUE_GLYPH_OF_PREPARATION = 56819,
SPELL_ROGUE_PREY_ON_THE_WEAK = 58670,
- SPELL_ROGUE_SHIV_TRIGGERED = 5940
+ SPELL_ROGUE_SHIV_TRIGGERED = 5940,
+ SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933,
+ SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628,
};
enum RogueSpellIcons
@@ -39,6 +42,61 @@ enum RogueSpellIcons
ICON_ROGUE_IMPROVED_RECUPERATE = 4819
};
+// 13877, 33735, (check 51211, 65956) - Blade Flurry
+class spell_rog_blade_flurry : public SpellScriptLoader
+{
+ public:
+ spell_rog_blade_flurry() : SpellScriptLoader("spell_rog_blade_flurry") { }
+
+ class spell_rog_blade_flurry_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_blade_flurry_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ if (eventInfo.GetDamageInfo())
+ {
+ int32 damage = eventInfo.GetDamageInfo()->GetDamage();
+ GetTarget()->CastCustomSpell(SPELL_ROGUE_BLADE_FLURRY_EXTRA_ATTACK, SPELLVALUE_BASE_POINT0, damage, _procTarget, true, NULL, aurEff);
+ }
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_rog_blade_flurry_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_rog_blade_flurry_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_blade_flurry_AuraScript();
+ }
+};
+
// 31228 - Cheat Death
class spell_rog_cheat_death : public SpellScriptLoader
{
@@ -404,6 +462,58 @@ class spell_rog_recuperate : public SpellScriptLoader
}
};
+// -1943 - Rupture
+class spell_rog_rupture : public SpellScriptLoader
+{
+ public:
+ spell_rog_rupture() : SpellScriptLoader("spell_rog_rupture") { }
+
+ class spell_rog_rupture_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_rupture_AuraScript);
+
+ bool Load()
+ {
+ Unit* caster = GetCaster();
+ return caster && caster->GetTypeId() == TYPEID_PLAYER;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ canBeRecalculated = false;
+
+ float const attackpowerPerCombo[6] =
+ {
+ 0.0f,
+ 0.015f, // 1 point: ${($m1 + $b1*1 + 0.015 * $AP) * 4} damage over 8 secs
+ 0.024f, // 2 points: ${($m1 + $b1*2 + 0.024 * $AP) * 5} damage over 10 secs
+ 0.03f, // 3 points: ${($m1 + $b1*3 + 0.03 * $AP) * 6} damage over 12 secs
+ 0.03428571f, // 4 points: ${($m1 + $b1*4 + 0.03428571 * $AP) * 7} damage over 14 secs
+ 0.0375f // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs
+ };
+
+ uint8 cp = caster->ToPlayer()->GetComboPoints();
+ if (cp > 5)
+ cp = 5;
+
+ amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_rupture_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_rupture_AuraScript();
+ }
+};
+
// 5938 - Shiv
class spell_rog_shiv : public SpellScriptLoader
{
@@ -445,13 +555,108 @@ class spell_rog_shiv : public SpellScriptLoader
}
};
+// 57934 - Tricks of the Trade
+class spell_rog_tricks_of_the_trade : public SpellScriptLoader
+{
+ public:
+ spell_rog_tricks_of_the_trade() : SpellScriptLoader("spell_rog_tricks_of_the_trade") { }
+
+ class spell_rog_tricks_of_the_trade_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_tricks_of_the_trade_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _redirectTarget = NULL;
+ return true;
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEFAULT)
+ GetTarget()->ResetRedirectThreat();
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _redirectTarget = GetTarget()->GetRedirectThreatTarget();
+ return _redirectTarget;
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ Unit* target = GetTarget();
+ target->CastSpell(_redirectTarget, SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST, true);
+ target->CastSpell(target, SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC, true);
+ Remove(AURA_REMOVE_BY_DEFAULT); // maybe handle by proc charges
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ DoCheckProc += AuraCheckProcFn(spell_rog_tricks_of_the_trade_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_rog_tricks_of_the_trade_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _redirectTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_tricks_of_the_trade_AuraScript();
+ }
+};
+
+// 59628 - Tricks of the Trade (Proc)
+class spell_rog_tricks_of_the_trade_proc : public SpellScriptLoader
+{
+ public:
+ spell_rog_tricks_of_the_trade_proc() : SpellScriptLoader("spell_rog_tricks_of_the_trade_proc") { }
+
+ class spell_rog_tricks_of_the_trade_proc_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_rog_tricks_of_the_trade_proc_AuraScript);
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ GetTarget()->ResetRedirectThreat();
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_rog_tricks_of_the_trade_proc_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_rog_tricks_of_the_trade_proc_AuraScript();
+ }
+};
+
void AddSC_rogue_spell_scripts()
{
+ new spell_rog_blade_flurry();
new spell_rog_cheat_death();
new spell_rog_deadly_poison();
new spell_rog_nerves_of_steel();
new spell_rog_preparation();
new spell_rog_prey_on_the_weak();
new spell_rog_recuperate();
+ new spell_rog_rupture();
new spell_rog_shiv();
+ new spell_rog_tricks_of_the_trade();
+ new spell_rog_tricks_of_the_trade_proc();
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index e2e3f5a52e7..045227a8f99 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -34,9 +34,14 @@ enum ShamanSpells
SPELL_MAGE_TEMPORAL_DISPLACEMENT = 80354,
SPELL_SHAMAN_ANCESTRAL_AWAKENING_PROC = 52752,
SPELL_SHAMAN_BIND_SIGHT = 6277,
+ SPELL_SHAMAN_EARTH_SHIELD_HEAL = 379,
SPELL_SHAMAN_EXHAUSTION = 57723,
SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1 = 8349,
SPELL_SHAMAN_FLAME_SHOCK = 8050,
+ SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD = 63279,
+ SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM = 55456,
+ SPELL_SHAMAN_GLYPH_OF_MANA_TIDE = 55441,
+ SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM = 62132,
SPELL_SHAMAN_LAVA_FLOWS_R1 = 51480,
SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 65264,
SPELL_SHAMAN_SATED = 57724,
@@ -193,6 +198,68 @@ class spell_sha_chain_heal : public SpellScriptLoader
}
};
+// -974 - Earth Shield
+class spell_sha_earth_shield : public SpellScriptLoader
+{
+ public:
+ spell_sha_earth_shield() : SpellScriptLoader("spell_sha_earth_shield") { }
+
+ class spell_sha_earth_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_sha_earth_shield_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD))
+ return false;
+ return true;
+ }
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool & /*canBeRecalculated*/)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ amount = caster->SpellHealingBonusDone(GetUnitOwner(), GetSpellInfo(), amount, HEAL);
+ amount = GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, HEAL);
+
+ // Glyph of Earth Shield
+ //! WORKAROUND
+ //! this glyph is a proc
+ if (AuraEffect* glyph = caster->GetAuraEffect(SPELL_SHAMAN_GLYPH_OF_EARTH_SHIELD, EFFECT_0))
+ AddPct(amount, glyph->GetAmount());
+ }
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+
+ //! HACK due to currenct proc system implementation
+ if (Player* player = GetTarget()->ToPlayer())
+ if (player->HasSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL))
+ return;
+
+ GetTarget()->CastCustomSpell(SPELL_SHAMAN_EARTH_SHIELD_HEAL, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), true, NULL, aurEff, GetCasterGUID());
+
+ if (Player* player = GetTarget()->ToPlayer())
+ player->AddSpellCooldown(SPELL_SHAMAN_EARTH_SHIELD_HEAL, 0, time(NULL) + 3);
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_sha_earth_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_sha_earth_shield_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_sha_earth_shield_AuraScript();
+ }
+};
+
// 6474 - Earthbind Totem - Fix Talent:Earthen Power, Earth's Grasp
/// Updated 4.3.4
class spell_sha_earthbind_totem : public SpellScriptLoader
@@ -549,11 +616,41 @@ class spell_sha_mana_tide_totem : public SpellScriptLoader
}
};
+// -51490 - Thunderstorm
+class spell_sha_thunderstorm : public SpellScriptLoader
+{
+ public:
+ spell_sha_thunderstorm() : SpellScriptLoader("spell_sha_thunderstorm") { }
+
+ class spell_sha_thunderstorm_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_thunderstorm_SpellScript);
+
+ void HandleKnockBack(SpellEffIndex effIndex)
+ {
+ // Glyph of Thunderstorm
+ if (GetCaster()->HasAura(SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM))
+ PreventHitDefaultEffect(effIndex);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sha_thunderstorm_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_thunderstorm_SpellScript();
+ }
+};
+
void AddSC_shaman_spell_scripts()
{
new spell_sha_ancestral_awakening_proc();
new spell_sha_bloodlust();
new spell_sha_chain_heal();
+ new spell_sha_earth_shield();
new spell_sha_earthbind_totem();
new spell_sha_earthen_power();
new spell_sha_fire_nova();
@@ -562,4 +659,5 @@ void AddSC_shaman_spell_scripts()
new spell_sha_heroism();
new spell_sha_lava_lash();
new spell_sha_mana_tide_totem();
+ new spell_sha_thunderstorm();
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 21dea0b726b..92d8e940a22 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -25,29 +25,41 @@
#include "ScriptMgr.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
+#include "SpellAuras.h"
enum WarlockSpells
{
SPELL_WARLOCK_BANE_OF_DOOM_EFFECT = 18662,
+ SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT = 18662,
+ SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
- SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
- SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
- SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD = 54508,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER = 54509,
SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS = 54435,
+ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER = 54443,
+ SPELL_WARLOCK_DEMON_SOUL_IMP = 79459,
+ SPELL_WARLOCK_DEMON_SOUL_FELHUNTER = 79460,
+ SPELL_WARLOCK_DEMON_SOUL_FELGUARD = 79452,
+ SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS = 79453,
+ SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER = 79454,
+ SPELL_WARLOCK_FEL_SYNERGY_HEAL = 54181,
+ SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE = 63106,
+ SPELL_WARLOCK_HAUNT = 48181,
+ SPELL_WARLOCK_HAUNT_HEAL = 48210,
+ SPELL_WARLOCK_IMMOLATE = 348,
SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692,
SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
- SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1 = 60955,
SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2 = 60956,
- SPELL_WARLOCK_HAUNT = 48181,
- SPELL_WARLOCK_HAUNT_HEAL = 48210,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1 = 18703,
+ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2 = 18704,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE = 31818,
SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 = 32553,
+ SPELL_WARLOCK_SIPHON_LIFE_HEAL = 63106,
SPELL_WARLOCK_SOULSHATTER = 32835,
+ SPELL_WARLOCK_UNSTABLE_AFFLICTION = 30108,
SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL = 31117
};
@@ -112,6 +124,41 @@ class spell_warl_banish : public SpellScriptLoader
}
};
+// 17962 - Conflagrate - Updated to 4.3.4
+class spell_warl_conflagrate : public SpellScriptLoader
+{
+ public:
+ spell_warl_conflagrate() : SpellScriptLoader("spell_warl_conflagrate") { }
+
+ class spell_warl_conflagrate_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_conflagrate_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_IMMOLATE))
+ return false;
+ return true;
+ }
+
+ void HandleHit(SpellEffIndex /*effIndex*/)
+ {
+ if (AuraEffect const* aurEff = GetHitUnit()->GetAuraEffect(SPELL_WARLOCK_IMMOLATE, EFFECT_2, GetCaster()->GetGUID()))
+ SetHitDamage(CalculatePct(aurEff->GetAmount(), GetSpellInfo()->Effects[EFFECT_1].CalcValue(GetCaster())));
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_conflagrate_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_conflagrate_SpellScript();
+ }
+};
+
// 6201 - Create Healthstone
class spell_warl_create_healthstone : public SpellScriptLoader
{
@@ -332,6 +379,73 @@ class spell_warl_demonic_circle_teleport : public SpellScriptLoader
}
};
+// 77801 - Demon Soul - Updated to 4.3.4
+class spell_warl_demon_soul : public SpellScriptLoader
+{
+ public:
+ spell_warl_demon_soul() : SpellScriptLoader("spell_warl_demon_soul") { }
+
+ class spell_warl_demon_soul_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_demon_soul_SpellScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_IMP))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELHUNTER))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_FELGUARD))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER))
+ return false;
+ return true;
+ }
+
+ void OnHitTarget(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (Creature* targetCreature = GetHitCreature())
+ {
+ if (targetCreature->isPet())
+ {
+ CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry());
+ switch (ci->family)
+ {
+ case CREATURE_FAMILY_SUCCUBUS:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_SUCCUBUS);
+ break;
+ case CREATURE_FAMILY_VOIDWALKER:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_VOIDWALKER);
+ break;
+ case CREATURE_FAMILY_FELGUARD:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELGUARD);
+ break;
+ case CREATURE_FAMILY_FELHUNTER:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_FELHUNTER);
+ break;
+ case CREATURE_FAMILY_IMP:
+ caster->CastSpell(caster, SPELL_WARLOCK_DEMON_SOUL_IMP);
+ break;
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_demon_soul_SpellScript::OnHitTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_demon_soul_SpellScript;
+ }
+};
+
// 47193 - Demonic Empowerment
/// Updated 4.3.4
class spell_warl_demonic_empowerment : public SpellScriptLoader
@@ -426,6 +540,86 @@ class spell_warl_everlasting_affliction : public SpellScriptLoader
}
};
+// 77799 - Fel Flame - Updated to 4.3.4
+class spell_warl_fel_flame : public SpellScriptLoader
+{
+ public:
+ spell_warl_fel_flame() : SpellScriptLoader("spell_warl_fel_flame") { }
+
+ class spell_warl_fel_flame_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warl_fel_flame_SpellScript);
+
+ void OnHitTarget(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ Unit* target = GetHitUnit();
+ Aura* aura = target->GetAura(SPELL_WARLOCK_UNSTABLE_AFFLICTION, caster->GetGUID());
+ if (!aura)
+ aura = target->GetAura(SPELL_WARLOCK_IMMOLATE, caster->GetGUID());
+
+ if (!aura)
+ return;
+
+ int32 newDuration = aura->GetDuration() + GetSpellInfo()->Effects[EFFECT_1].CalcValue() * 1000;
+ aura->SetDuration(std::min(newDuration, aura->GetMaxDuration()));
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warl_fel_flame_SpellScript::OnHitTarget, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warl_fel_flame_SpellScript;
+ }
+};
+
+// -47230 - Fel Synergy
+class spell_warl_fel_synergy : public SpellScriptLoader
+{
+ public:
+ spell_warl_fel_synergy() : SpellScriptLoader("spell_warl_fel_synergy") { }
+
+ class spell_warl_fel_synergy_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_fel_synergy_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_FEL_SYNERGY_HEAL))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return GetTarget()->GetGuardianPet() && eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 heal = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
+ GetTarget()->CastCustomSpell(SPELL_WARLOCK_FEL_SYNERGY_HEAL, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); // TARGET_UNIT_PET
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warl_fel_synergy_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warl_fel_synergy_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_fel_synergy_AuraScript();
+ }
+};
+
// 48181 - Haunt
/// Updated 4.3.4
class spell_warl_haunt : public SpellScriptLoader
@@ -601,6 +795,34 @@ class spell_warl_life_tap : 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
@@ -630,6 +852,92 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader
}
};
+// -7235 - Shadow Ward
+class spell_warl_shadow_ward : public SpellScriptLoader
+{
+ public:
+ spell_warl_shadow_ward() : SpellScriptLoader("spell_warl_shadow_ward") { }
+
+ class spell_warl_shadow_ward_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_shadow_ward_AuraScript);
+
+ void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = false;
+ if (Unit* caster = GetCaster())
+ {
+ // +80.68% from sp bonus
+ float bonus = 0.8068f;
+
+ bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
+ bonus *= caster->CalculateLevelPenalty(GetSpellInfo());
+
+ amount += int32(bonus);
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_shadow_ward_AuraScript();
+ }
+};
+
+// 63108 - Siphon Life
+class spell_warl_siphon_life : public SpellScriptLoader
+{
+ public:
+ spell_warl_siphon_life() : SpellScriptLoader("spell_warl_siphon_life") { }
+
+ class spell_warl_siphon_life_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_siphon_life_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_SIPHON_LIFE_HEAL))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE))
+ return false;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ return eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+
+ int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount()));
+ // Glyph of Siphon Life
+ if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0))
+ AddPct(amount, glyph->GetAmount());
+
+ GetTarget()->CastCustomSpell(SPELL_WARLOCK_SIPHON_LIFE_HEAL, SPELLVALUE_BASE_POINT0, amount, GetTarget(), true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_siphon_life_AuraScript();
+ }
+};
+
// 29858 - Soulshatter
/// Updated 4.3.4
class spell_warl_soulshatter : public SpellScriptLoader
@@ -713,15 +1021,22 @@ void AddSC_warlock_spell_scripts()
{
new spell_warl_bane_of_doom();
new spell_warl_banish();
+ new spell_warl_conflagrate();
new spell_warl_create_healthstone();
new spell_warl_demonic_circle_summon();
new spell_warl_demonic_circle_teleport();
new spell_warl_demonic_empowerment();
+ new spell_warl_demon_soul();
new spell_warl_everlasting_affliction();
+ new spell_warl_fel_flame();
+ new spell_warl_fel_synergy();
new spell_warl_haunt();
new spell_warl_health_funnel();
new spell_warl_life_tap();
+ new spell_warl_ritual_of_doom_effect();
new spell_warl_seed_of_corruption();
+ new spell_warl_shadow_ward();
+ new spell_warl_siphon_life();
new spell_warl_soulshatter();
new spell_warl_unstable_affliction();
}
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 909e90beaad..9e2cb8aad71 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -35,10 +35,26 @@ enum WarriorSpells
SPELL_WARRIOR_DEEP_WOUNDS_RANK_2 = 12850,
SPELL_WARRIOR_DEEP_WOUNDS_RANK_3 = 12868,
SPELL_WARRIOR_DEEP_WOUNDS_RANK_PERIODIC = 12721,
+ SPELL_WARRIOR_EXECUTE = 20647,
+ SPELL_WARRIOR_GLYPH_OF_EXECUTION = 58367,
+ SPELL_WARRIOR_GLYPH_OF_VIGILANCE = 63326,
SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_BUFF = 65156,
SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT = 64976,
SPELL_WARRIOR_LAST_STAND_TRIGGERED = 12976,
- SPELL_WARRIOR_SLAM = 50782
+ SPELL_WARRIOR_SLAM = 50782,
+ SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK = 26654,
+ SPELL_WARRIOR_TAUNT = 355,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1 = 46859,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2 = 46860,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1 = 64849,
+ SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2 = 64850,
+ SPELL_WARRIOR_VIGILANCE_PROC = 50725,
+ SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT = 59665,
+
+ SPELL_PALADIN_BLESSING_OF_SANCTUARY = 20911,
+ SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY = 25899,
+ SPELL_PRIEST_RENEWED_HOPE = 63944,
+ SPELL_GEN_DAMAGE_REDUCTION_AURA = 68066,
};
enum WarriorSpellIcons
@@ -286,6 +302,62 @@ class spell_warr_execute : public SpellScriptLoader
}
};
+// 59725 - Improved Spell Reflection
+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();
+ }
+};
+
+// 5246 - Intimidating Shout
+class spell_warr_intimidating_shout : public SpellScriptLoader
+{
+ public:
+ spell_warr_intimidating_shout() : SpellScriptLoader("spell_warr_intimidating_shout") { }
+
+ class spell_warr_intimidating_shout_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_intimidating_shout_SpellScript);
+
+ void FilterTargets(std::list<WorldObject*>& unitList)
+ {
+ unitList.remove(GetExplTargetWorldObject());
+ }
+
+ void Register()
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_intimidating_shout_SpellScript();
+ }
+};
+
/// Updated 4.3.4
class spell_warr_last_stand : public SpellScriptLoader
{
@@ -325,6 +397,121 @@ class spell_warr_last_stand : public SpellScriptLoader
}
};
+// 7384, 7887, 11584, 11585 - Overpower
+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_WARRIOR_UNRELENTING_ASSAULT_RANK_1))
+ spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1;
+ else if (GetCaster()->HasAura(SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2))
+ spellId = SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_2;
+
+ if (!spellId)
+ return;
+
+ if (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();
+ }
+};
+
+// -772 - Rend
+class spell_warr_rend : public SpellScriptLoader
+{
+ public:
+ spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { }
+
+ class spell_warr_rend_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_rend_AuraScript);
+
+ void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)
+ {
+ if (Unit* caster = GetCaster())
+ {
+ canBeRecalculated = false;
+
+ // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick
+ float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
+ int32 mws = caster->GetAttackTime(BASE_ATTACK);
+ float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE);
+ float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE);
+ float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f;
+ amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb));
+
+ // "If used while your target is above 75% health, Rend does 35% more damage."
+ // as for 3.1.3 only ranks above 9 (wrong tooltip?)
+ if (GetSpellInfo()->GetRank() >= 9)
+ {
+ if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster))
+ AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster));
+ }
+ }
+ }
+
+ void Register()
+ {
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_rend_AuraScript();
+ }
+};
+
+// 64380, 65941 - Shattering Throw
+class spell_warr_shattering_throw : public SpellScriptLoader
+{
+ public:
+ spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { }
+
+ class spell_warr_shattering_throw_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_shattering_throw_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ // remove shields, will still display immune to damage part
+ if (Unit* target = GetHitUnit())
+ target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_shattering_throw_SpellScript();
+ }
+};
+
/// Updated 4.3.4
class spell_warr_slam : public SpellScriptLoader
{
@@ -361,6 +548,182 @@ class spell_warr_slam : public SpellScriptLoader
}
};
+// 12328, 18765, 35429 - Sweeping Strikes
+class spell_warr_sweeping_strikes : public SpellScriptLoader
+{
+ public:
+ spell_warr_sweeping_strikes() : SpellScriptLoader("spell_warr_sweeping_strikes") { }
+
+ class spell_warr_sweeping_strikes_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_sweeping_strikes_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ _procTarget = eventInfo.GetActor()->SelectNearbyTarget(eventInfo.GetProcTarget());
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_SWEEPING_STRIKES_EXTRA_ATTACK, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ DoCheckProc += AuraCheckProcFn(spell_warr_sweeping_strikes_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warr_sweeping_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_sweeping_strikes_AuraScript();
+ }
+};
+
+// 50720 - Vigilance
+class spell_warr_vigilance : public SpellScriptLoader
+{
+ public:
+ spell_warr_vigilance() : SpellScriptLoader("spell_warr_vigilance") { }
+
+ class spell_warr_vigilance_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warr_vigilance_AuraScript);
+
+ bool Validate(SpellInfo const* /*spellInfo*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_GLYPH_OF_VIGILANCE))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_PROC))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT))
+ return false;
+ if (!sSpellMgr->GetSpellInfo(SPELL_GEN_DAMAGE_REDUCTION_AURA))
+ return false;
+ return true;
+ }
+
+ bool Load()
+ {
+ _procTarget = NULL;
+ return true;
+ }
+
+ void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ target->CastSpell(target, SPELL_GEN_DAMAGE_REDUCTION_AURA, true);
+
+ if (Unit* caster = GetCaster())
+ target->CastSpell(caster, SPELL_WARRIOR_VIGILANCE_REDIRECT_THREAT, true);
+ }
+
+ void HandleAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ //! WORKAROUND
+ //! this glyph is a proc
+ if (Unit* caster = GetCaster())
+ {
+ if (AuraEffect const* glyph = caster->GetAuraEffect(SPELL_WARRIOR_GLYPH_OF_VIGILANCE, EFFECT_0))
+ GetTarget()->ModifyRedirectThreat(glyph->GetAmount());
+ }
+ }
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ Unit* target = GetTarget();
+ if (target->HasAura(SPELL_GEN_DAMAGE_REDUCTION_AURA) &&
+ !(target->HasAura(SPELL_PALADIN_BLESSING_OF_SANCTUARY) ||
+ target->HasAura(SPELL_PALADIN_GREATER_BLESSING_OF_SANCTUARY) ||
+ target->HasAura(SPELL_PRIEST_RENEWED_HOPE)))
+ {
+ target->RemoveAurasDueToSpell(SPELL_GEN_DAMAGE_REDUCTION_AURA);
+ }
+
+ target->ResetRedirectThreat();
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ _procTarget = GetCaster();
+ return _procTarget;
+ }
+
+ void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(_procTarget, SPELL_WARRIOR_VIGILANCE_PROC, true, NULL, aurEff);
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ AfterEffectApply += AuraEffectApplyFn(spell_warr_vigilance_AuraScript::HandleAfterApply, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ OnEffectRemove += AuraEffectRemoveFn(spell_warr_vigilance_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ DoCheckProc += AuraCheckProcFn(spell_warr_vigilance_AuraScript::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_warr_vigilance_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
+
+ private:
+ Unit* _procTarget;
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warr_vigilance_AuraScript();
+ }
+};
+
+// 50725 Vigilance
+class spell_warr_vigilance_trigger : public SpellScriptLoader
+{
+ public:
+ spell_warr_vigilance_trigger() : SpellScriptLoader("spell_warr_vigilance_trigger") { }
+
+ class spell_warr_vigilance_trigger_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_vigilance_trigger_SpellScript);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+
+ // Remove Taunt cooldown
+ if (Player* target = GetHitPlayer())
+ target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_vigilance_trigger_SpellScript();
+ }
+};
+
void AddSC_warrior_spell_scripts()
{
new spell_warr_bloodthirst();
@@ -369,6 +732,14 @@ void AddSC_warrior_spell_scripts()
new spell_warr_concussion_blow();
new spell_warr_deep_wounds();
new spell_warr_execute();
+ new spell_warr_improved_spell_reflection();
+ new spell_warr_intimidating_shout();
new spell_warr_last_stand();
+ new spell_warr_overpower();
+ new spell_warr_rend();
+ new spell_warr_shattering_throw();
new spell_warr_slam();
+ new spell_warr_sweeping_strikes();
+ new spell_warr_vigilance();
+ new spell_warr_vigilance_trigger();
}
diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp
index 41a32185620..d0ffe5214db 100644
--- a/src/server/scripts/World/achievement_scripts.cpp
+++ b/src/server/scripts/World/achievement_scripts.cpp
@@ -315,6 +315,30 @@ class achievement_not_even_a_scratch : public AchievementCriteriaScript
}
};
+enum FlirtWithDisaster
+{
+ AURA_PERFUME_FOREVER = 70235,
+ AURA_PERFUME_ENCHANTRESS = 70234,
+ AURA_PERFUME_VICTORY = 70233,
+};
+
+class achievement_flirt_with_disaster_perf_check : public AchievementCriteriaScript
+{
+ public:
+ achievement_flirt_with_disaster_perf_check() : AchievementCriteriaScript("achievement_flirt_with_disaster_perf_check") { }
+
+ bool OnCheck(Player* player, Unit* /*target*/)
+ {
+ if (!player)
+ return false;
+
+ if (player->HasAura(AURA_PERFUME_FOREVER) || player->HasAura(AURA_PERFUME_ENCHANTRESS) || player->HasAura(AURA_PERFUME_VICTORY))
+ return true;
+
+ return false;
+ }
+};
+
void AddSC_achievement_scripts()
{
new achievement_resilient_victory();
@@ -333,4 +357,5 @@ void AddSC_achievement_scripts()
new achievement_bg_sa_defense_of_ancients();
new achievement_tilted();
new achievement_not_even_a_scratch();
+ new achievement_flirt_with_disaster_perf_check();
}
diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp
index e5f2c060109..777de92bc3b 100644
--- a/src/server/scripts/World/npcs_special.cpp
+++ b/src/server/scripts/World/npcs_special.cpp
@@ -1981,10 +1981,11 @@ class npc_training_dummy : public CreatureScript
public:
npc_training_dummy() : CreatureScript("npc_training_dummy") { }
- struct npc_training_dummyAI : Scripted_NoMovementAI
+ struct npc_training_dummyAI : ScriptedAI
{
- npc_training_dummyAI(Creature* creature) : Scripted_NoMovementAI(creature)
+ npc_training_dummyAI(Creature* creature) : ScriptedAI(creature)
{
+ SetCombatMovement(false);
entry = creature->GetEntry();
}
@@ -2015,12 +2016,6 @@ public:
damage = 0;
}
- void EnterCombat(Unit* /*who*/)
- {
- if (entry != NPC_ADVANCED_TARGET_DUMMY && entry != NPC_TARGET_DUMMY)
- return;
- }
-
void UpdateAI(uint32 const diff)
{
if (!UpdateVictim())