aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_account.cpp8
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp78
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp20
-rw-r--r--src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp2
-rw-r--r--src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp18
-rw-r--r--src/server/scripts/Kalimdor/the_barrens.cpp2
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp2
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp279
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp12
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp22
-rw-r--r--src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h5
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp3
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp4
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp11
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp39
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp2
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp100
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp125
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp83
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp2
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp25
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp2
-rwxr-xr-xsrc/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h1
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp6
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp57
-rw-r--r--src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h11
-rw-r--r--src/server/scripts/Northrend/borean_tundra.cpp2
-rw-r--r--src/server/scripts/Northrend/icecrown.cpp46
-rw-r--r--src/server/scripts/Northrend/zuldrak.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp2
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp55
-rw-r--r--src/server/scripts/Spells/spell_item.cpp2
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp3
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp40
-rwxr-xr-xsrc/server/scripts/World/achievement_scripts.cpp45
-rw-r--r--src/server/scripts/World/go_scripts.cpp4
40 files changed, 750 insertions, 388 deletions
diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp
index c63e47fbc50..17bc0daec5b 100644
--- a/src/server/scripts/Commands/cs_account.cpp
+++ b/src/server/scripts/Commands/cs_account.cpp
@@ -282,11 +282,7 @@ public:
return false;
}
- std::string password_old = old_pass;
- std::string password_new = new_pass;
- std::string password_new_c = new_pass_c;
-
- if (!sAccountMgr->CheckPassword(handler->GetSession()->GetAccountId(), password_old))
+ if (!sAccountMgr->CheckPassword(handler->GetSession()->GetAccountId(), std::string(old_pass)))
{
handler->SendSysMessage(LANG_COMMAND_WRONGOLDPASSWORD);
handler->SetSentErrorMessage(true);
@@ -300,7 +296,7 @@ public:
return false;
}
- AccountOpResult result = sAccountMgr->ChangePassword(handler->GetSession()->GetAccountId(), password_new);
+ AccountOpResult result = sAccountMgr->ChangePassword(handler->GetSession()->GetAccountId(), std::string(new_pass));
switch(result)
{
case AOR_OK:
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index a3e862c0812..55b85a888d2 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -261,15 +261,58 @@ public:
if (ifs.bad())
return false;
+ // remove comments from file
+ std::stringstream parsedStream;
+ while (!ifs.eof())
+ {
+ char commentToken[2];
+ ifs.get(commentToken[0]);
+ if (commentToken[0] == '/' && !ifs.eof())
+ {
+ ifs.get(commentToken[1]);
+ // /* comment
+ if (commentToken[1] == '*')
+ {
+ while (!ifs.eof())
+ {
+ ifs.get(commentToken[0]);
+ if (commentToken[0] == '*' && !ifs.eof())
+ {
+ ifs.get(commentToken[1]);
+ if (commentToken[1] == '/')
+ break;
+ else
+ ifs.putback(commentToken[1]);
+ }
+ }
+ continue;
+ }
+ // line comment
+ else if (commentToken[1] == '/')
+ {
+ std::string str;
+ getline(ifs,str);
+ continue;
+ }
+ // regular data
+ else
+ {
+ ifs.putback(commentToken[1]);
+ }
+ }
+ parsedStream.put(commentToken[0]);
+ }
+ ifs.close();
+
uint32 opcode;
- ifs >> opcode;
+ parsedStream >> opcode;
WorldPacket data(opcode, 0);
- while (!ifs.eof())
+ while (!parsedStream.eof())
{
std::string type;
- ifs >> type;
+ parsedStream >> type;
if (type == "")
break;
@@ -277,37 +320,37 @@ public:
if (type == "uint8")
{
uint16 val1;
- ifs >> val1;
+ parsedStream >> val1;
data << uint8(val1);
}
else if (type == "uint16")
{
uint16 val2;
- ifs >> val2;
+ parsedStream >> val2;
data << val2;
}
else if (type == "uint32")
{
uint32 val3;
- ifs >> val3;
+ parsedStream >> val3;
data << val3;
}
else if (type == "uint64")
{
uint64 val4;
- ifs >> val4;
+ parsedStream >> val4;
data << val4;
}
else if (type == "float")
{
float val5;
- ifs >> val5;
+ parsedStream >> val5;
data << val5;
}
else if (type == "string")
{
std::string val6;
- ifs >> val6;
+ parsedStream >> val6;
data << val6;
}
else if (type == "appitsguid")
@@ -350,7 +393,7 @@ public:
{
data << uint64(unit->GetGUID());
}
- else if (type == "pos")
+ else if (type == "itspos")
{
data << unit->GetPositionX();
data << unit->GetPositionY();
@@ -368,7 +411,6 @@ public:
break;
}
}
- ifs.close();
sLog->outDebug(LOG_FILTER_NETWORKIO, "Sending opcode %u", data.GetOpcode());
data.hexlike();
player->GetSession()->SendPacket(&data);
@@ -1012,20 +1054,19 @@ public:
handler->PSendSysMessage(LANG_TOO_BIG_INDEX, Opcode, GUID_LOPART(guid), target->GetValuesCount());
return false;
}
- uint32 iValue;
- float fValue;
+
bool isint32 = true;
if (pz)
isint32 = (bool)atoi(pz);
if (isint32)
{
- iValue = (uint32)atoi(py);
+ uint32 iValue = (uint32)atoi(py);
target->SetUInt32Value(Opcode , iValue);
handler->PSendSysMessage(LANG_SET_UINT_FIELD, GUID_LOPART(guid), Opcode, iValue);
}
else
{
- fValue = (float)atof(py);
+ float fValue = (float)atof(py);
target->SetFloatValue(Opcode , fValue);
handler->PSendSysMessage(LANG_SET_FLOAT_FIELD, GUID_LOPART(guid), Opcode, fValue);
}
@@ -1060,20 +1101,19 @@ public:
handler->PSendSysMessage(LANG_TOO_BIG_INDEX, Opcode, GUID_LOPART(guid), target->GetValuesCount());
return false;
}
- uint32 iValue;
- float fValue;
+
bool isint32 = true;
if (pz)
isint32 = (bool)atoi(pz);
if (isint32)
{
- iValue = target->GetUInt32Value(Opcode);
+ uint32 iValue = target->GetUInt32Value(Opcode);
handler->PSendSysMessage(LANG_GET_UINT_FIELD, GUID_LOPART(guid), Opcode, iValue);
}
else
{
- fValue = target->GetFloatValue(Opcode);
+ float fValue = target->GetFloatValue(Opcode);
handler->PSendSysMessage(LANG_GET_FLOAT_FIELD, GUID_LOPART(guid), Opcode, fValue);
}
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index 4dbc47de4ce..184e24c1488 100644
--- a/src/server/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
@@ -199,7 +199,7 @@ public:
}
static bool HandleWpUnLoadCommand(ChatHandler* handler, const char* /*args*/)
{
- uint32 guidlow = 0;
+
Creature* target = handler->getSelectedCreature();
if (!target)
@@ -208,11 +208,13 @@ public:
return true;
}
+ uint32 guidlow = target->GetDBTableGUIDLow();
+
if (target->GetCreatureAddon())
{
if (target->GetCreatureAddon()->path_id != 0)
{
- WorldDatabase.PExecute("DELETE FROM creature_addon WHERE guid = %u", target->GetGUIDLow());
+ WorldDatabase.PExecute("DELETE FROM creature_addon WHERE guid = %u", guidlow);
target->UpdateWaypointID(0);
WorldDatabase.PExecute("UPDATE creature SET MovementType = '%u' WHERE guid = '%u'", IDLE_MOTION_TYPE, guidlow);
target->LoadPath(0);
@@ -373,8 +375,6 @@ public:
return true;
}
- float coord;
-
if (arg_str_2 == "setid")
{
uint32 newid = atoi(arg_3);
@@ -394,33 +394,29 @@ public:
if (arg_str_2 == "posx")
{
- coord = (float)(atof(arg_3));
WorldDatabase.PExecute("UPDATE waypoint_scripts SET x='%f' WHERE guid='%u'",
- coord, id);
+ (float)(atof(arg_3)), id);
handler->PSendSysMessage("|cff00ff00Waypoint script:|r|cff00ffff %u|r|cff00ff00 position_x updated.|r", id);
return true;
}
else if (arg_str_2 == "posy")
{
- coord = (float)(atof(arg_3));
WorldDatabase.PExecute("UPDATE waypoint_scripts SET y='%f' WHERE guid='%u'",
- coord, id);
+ (float)(atof(arg_3)), id);
handler->PSendSysMessage("|cff00ff00Waypoint script: %u position_y updated.|r", id);
return true;
}
else if (arg_str_2 == "posz")
{
- coord = (float)(atof(arg_3));
WorldDatabase.PExecute("UPDATE waypoint_scripts SET z='%f' WHERE guid='%u'",
- coord, id);
+ (float)(atof(arg_3)), id);
handler->PSendSysMessage("|cff00ff00Waypoint script: |r|cff00ffff%u|r|cff00ff00 position_z updated.|r", id);
return true;
}
else if (arg_str_2 == "orientation")
{
- coord = (float)(atof(arg_3));
WorldDatabase.PExecute("UPDATE waypoint_scripts SET o='%f' WHERE guid='%u'",
- coord, id);
+ (float)(atof(arg_3)), id);
handler->PSendSysMessage("|cff00ff00Waypoint script: |r|cff00ffff%u|r|cff00ff00 orientation updated.|r", id);
return true;
}
diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
index dfa28111935..c8a38164126 100644
--- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
+++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp
@@ -189,7 +189,7 @@ public:
std::vector<Unit*> targets;
std::list<HostileReference *> t_list = me->getThreatManager().getThreatList();
- if (!t_list.size())
+ if (t_list.empty())
return;
//store the threat list in a different container
diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
index 493e4b8f28e..7faa8df44bf 100644
--- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
+++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp
@@ -297,7 +297,7 @@ public:
uint64 prisonerGUID;
- void SetGUID(const uint64 guid, int32 /*id*/)
+ void SetGUID(uint64 guid, int32 /*id*/)
{
if (!prisonerGUID)
prisonerGUID = guid;
@@ -883,7 +883,7 @@ public:
uint64 minerGUID;
- void SetGUID(const uint64 guid, int32 /*id*/)
+ void SetGUID(uint64 guid, int32 /*id*/)
{
minerGUID = guid;
}
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index cf1e8e9ab62..75fa999825d 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -32,12 +32,12 @@ EndScriptData */
#define SAY_WATCH -1309018
#define SAY_WATCH_WHISPER -1309019 //is this text for real? easter egg?
-#define SPELL_CHARGE 24315
-#define SPELL_CLEAVE 20691
+#define SPELL_CHARGE 24408
+#define SPELL_CLEAVE 7160
#define SPELL_FEAR 29321
-#define SPELL_WHIRLWIND 24236
-#define SPELL_MORTAL_STRIKE 24573
-#define SPELL_ENRAGE 23537
+#define SPELL_WHIRLWIND 15589
+#define SPELL_MORTAL_STRIKE 16856
+#define SPELL_ENRAGE 24318
#define SPELL_WATCH 24314
#define SPELL_LEVEL_UP 24312
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
index 12540d6d7fb..b99cd3b180f 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_thekal.cpp
@@ -32,25 +32,25 @@ EndScriptData */
enum eSpells
{
SPELL_MORTALCLEAVE = 22859,
- SPELL_SILENCE = 23207,
- SPELL_FRENZY = 23342,
+ SPELL_SILENCE = 22666,
+ SPELL_FRENZY = 8269,
SPELL_FORCEPUNCH = 24189,
- SPELL_CHARGE = 24408,
- SPELL_ENRAGE = 23537,
+ SPELL_CHARGE = 24193,
+ SPELL_ENRAGE = 8269,
SPELL_SUMMONTIGERS = 24183,
SPELL_TIGER_FORM = 24169,
SPELL_RESURRECT = 24173, //We will not use this spell.
//Zealot Lor'Khan Spells
- SPELL_SHIELD = 25020,
+ SPELL_SHIELD = 25045,
SPELL_BLOODLUST = 24185,
SPELL_GREATERHEAL = 24208,
- SPELL_DISARM = 22691,
+ SPELL_DISARM = 6713,
-//Zealot Lor'Khan Spells
+//Zealot Zath Spells
SPELL_SWEEPINGSTRIKES = 18765,
- SPELL_SINISTERSTRIKE = 15667,
- SPELL_GOUGE = 24698,
+ SPELL_SINISTERSTRIKE = 15581,
+ SPELL_GOUGE = 12540,
SPELL_KICK = 15614,
SPELL_BLIND = 21060,
};
diff --git a/src/server/scripts/Kalimdor/the_barrens.cpp b/src/server/scripts/Kalimdor/the_barrens.cpp
index f341e47c5e8..4fb76c9c610 100644
--- a/src/server/scripts/Kalimdor/the_barrens.cpp
+++ b/src/server/scripts/Kalimdor/the_barrens.cpp
@@ -490,7 +490,7 @@ public:
if (Wave_Timer <= diff)
{
- if (AffrayChallenger[Wave] && Wave < 6 && !EventBigWill)
+ if (Wave < 6 && AffrayChallenger[Wave] && !EventBigWill)
{
DoScriptText(SAY_TWIGGY_FLATHEAD_FRAY, me);
Creature* creature = Unit::GetCreature((*me), AffrayChallenger[Wave]);
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 a4ded3f65b0..e3f6bbbfdd0 100644
--- a/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
+++ b/src/server/scripts/Northrend/AzjolNerub/ahnkahet/boss_prince_taldaram.cpp
@@ -195,7 +195,7 @@ public:
case NORMAL:
if (uiBloodthirstTimer <= diff)
{
- DoCast(me->getVictim(), SPELL_BLOODTHIRST);
+ DoCast(me, SPELL_BLOODTHIRST);
uiBloodthirstTimer = 10*IN_MILLISECONDS;
} else uiBloodthirstTimer -= diff;
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 44385ea83e2..6d1c2b5d991 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp
@@ -25,8 +25,7 @@ EndScriptData */
// Known bugs:
// - They should be floating but they aren't respecting the floor =(
-// - Lacks the powering up effect that leads to Empowering
-// - There's a workaround for the shared life effect
+// - Hardcoded bullets spawner
#include "ScriptPCH.h"
#include "trial_of_the_crusader.h"
@@ -48,26 +47,26 @@ enum Yells
enum Equipment
{
- EQUIP_MAIN_1 = 49303,
- EQUIP_OFFHAND_1 = 47146,
- EQUIP_RANGED_1 = 47267,
- EQUIP_MAIN_2 = 45990,
- EQUIP_OFFHAND_2 = 47470,
- EQUIP_RANGED_2 = 47267,
- EQUIP_DONE = EQUIP_NO_CHANGE,
+ EQUIP_MAIN_1 = 9423,
+ EQUIP_MAIN_2 = 37377,
};
enum Summons
{
- NPC_DARK_ESSENCE = 34567,
- NPC_LIGHT_ESSENCE = 34568,
-
NPC_UNLEASHED_DARK = 34628,
NPC_UNLEASHED_LIGHT = 34630,
+
+ // Future Development
+ NPC_BULLET_CONTROLLER = 34743, // Npc controller for all bullets
+
+ NPC_BULLET_STALKER_DARK = 34704, // Npc spawner for dark bullets
+ NPC_BULLET_STALKER_LIGHT = 34720, // Npc spawner for light bullets
};
enum BossSpells
{
+ SPELL_CONTROLLER_PERIODIC = 66149, // Future Development
+
SPELL_LIGHT_TWIN_SPIKE = 66075,
SPELL_LIGHT_SURGE = 65766,
SPELL_LIGHT_SHIELD = 65858,
@@ -79,6 +78,7 @@ enum BossSpells
SPELL_DARK_SURGE = 65768,
SPELL_DARK_SHIELD = 65874,
SPELL_DARK_TWIN_PACT = 65875,
+ SPELL_POWER_TWINS = 65879,
SPELL_DARK_VORTEX = 66058,
SPELL_DARK_TOUCH = 67282,
@@ -93,12 +93,19 @@ enum BossSpells
SPELL_UNLEASHED_DARK = 65808,
SPELL_UNLEASHED_LIGHT = 65795,
- //PowerUp 67604
+
+ SPELL_TWIN_EMPATHY_1 = 66132,
+ SPELL_TWIN_EMPATHY_2 = 66133,
+
+ SPELL_POWERING_UP = 67590,
+ SPELL_SURGE_OF_SPEED = 65828,
};
#define SPELL_DARK_ESSENCE_HELPER RAID_MODE<uint32>(65684, 67176, 67177, 67178)
#define SPELL_LIGHT_ESSENCE_HELPER RAID_MODE<uint32>(65686, 67222, 67223, 67224)
+#define SPELL_POWERING_UP_HELPER RAID_MODE(67590, 67602, 67603, 67604)
+
#define SPELL_EMPOWERED_DARK_HELPER RAID_MODE<uint32>(65724,67213,67214,67215)
#define SPELL_EMPOWERED_LIGHT_HELPER RAID_MODE<uint32>(65748, 67216, 67217, 67218)
@@ -122,9 +129,12 @@ struct boss_twin_baseAI : public ScriptedAI
InstanceScript* m_pInstance;
SummonList Summons;
+ AuraStateType m_uiAuraState;
+
uint8 m_uiStage;
bool m_bIsBerserk;
uint8 m_uiWaveCount;
+ uint32 m_uiWeapon;
uint32 m_uiColorballsTimer;
uint32 m_uiSpecialAbilityTimer;
uint32 m_uiSpikeTimer;
@@ -135,6 +145,7 @@ struct boss_twin_baseAI : public ScriptedAI
int32 m_uiVortexEmote;
uint32 m_uiSisterNpcId;
uint32 m_uiColorballNpcId;
+ uint32 m_uiMyEmphatySpellId;
uint32 m_uiEssenceNpcId;
uint32 m_uiMyEssenceSpellId;
uint32 m_uiOtherEssenceSpellId;
@@ -152,6 +163,7 @@ struct boss_twin_baseAI : public ScriptedAI
void Reset() {
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_PASSIVE);
+ me->ModifyAuraState(m_uiAuraState, true);
/* Uncomment this once that they are flying above the ground
me->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING);
me->SetFlying(true); */
@@ -172,7 +184,6 @@ struct boss_twin_baseAI : public ScriptedAI
if (m_pInstance)
{
m_pInstance->SetData(TYPE_VALKIRIES, FAIL);
- m_pInstance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetMaxHealth());
}
me->DespawnOrUnsummon();
}
@@ -190,7 +201,6 @@ struct boss_twin_baseAI : public ScriptedAI
case 1:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_OOC_NOT_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
- me->SetInCombatWithZone();
break;
}
}
@@ -223,45 +233,16 @@ struct boss_twin_baseAI : public ScriptedAI
{
case NPC_LIGHT_ESSENCE:
m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_LIGHT_ESSENCE_HELPER);
+ m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP_HELPER);
break;
case NPC_DARK_ESSENCE:
m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DARK_ESSENCE_HELPER);
+ m_pInstance->DoRemoveAurasDueToSpellOnPlayers(SPELL_POWERING_UP_HELPER);
break;
}
Summons.Despawn(summoned);
}
- void DamageTaken(Unit* pDoneBy, uint32 &uiDamage)
- {
- if (!me || !me->isAlive())
- return;
-
- if (pDoneBy->GetGUID() == me->GetGUID())
- return;
-
- if (pDoneBy->GetTypeId() == TYPEID_PLAYER)
- {
- if (pDoneBy->HasAura(m_uiOtherEssenceSpellId))
- uiDamage += uiDamage/2;
- if (pDoneBy->HasAura(m_uiEmpoweredWeaknessSpellId))
- uiDamage += uiDamage;
- else
- if (pDoneBy->HasAura(m_uiMyEssenceSpellId))
- uiDamage /= 2;
- }
-
- if (m_pInstance)
- m_pInstance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetHealth() >= uiDamage ? me->GetHealth() - uiDamage : 0);
- }
-
- void SpellHit(Unit* caster, const SpellInfo* spell)
- {
- if (caster->ToCreature() == me)
- if (spell->Effects[0].Effect == 136) //Effect Heal
- if (m_pInstance)
- m_pInstance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetHealth() + me->CountPctFromMaxHealth(spell->Effects[EFFECT_0].CalcValue()));
- }
-
void SummonColorballs(uint8 quantity)
{
float x0 = ToCCommonLoc[1].GetPositionX(), y0 = ToCCommonLoc[1].GetPositionY(), r = 47.0f;
@@ -282,7 +263,6 @@ struct boss_twin_baseAI : public ScriptedAI
DoScriptText(SAY_DEATH, me);
if (m_pInstance)
{
- m_pInstance->SetData(DATA_HEALTH_TWIN_SHARED, 0);
if (Creature* pSister = GetSister())
{
if (!pSister->isAlive())
@@ -307,8 +287,10 @@ struct boss_twin_baseAI : public ScriptedAI
me->SetInCombatWithZone();
if (m_pInstance)
{
+ if (Creature* pSister = GetSister())
+ me->AddAura(m_uiMyEmphatySpellId, pSister);
+
m_pInstance->SetData(TYPE_VALKIRIES, IN_PROGRESS);
- m_pInstance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetMaxHealth());
}
if (me->isAlive())
{
@@ -333,16 +315,18 @@ struct boss_twin_baseAI : public ScriptedAI
}
}
+ void EnableDualWield(bool mode)
+ {
+ SetEquipmentSlots(false, m_uiWeapon, mode ? m_uiWeapon : EQUIP_UNEQUIP, EQUIP_UNEQUIP);
+ me->SetCanDualWield(mode);
+ me->UpdateDamagePhysical(mode ? OFF_ATTACK : BASE_ATTACK);
+ }
+
void UpdateAI(const uint32 uiDiff)
{
if (!m_pInstance || !UpdateVictim())
return;
- if (m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED) != 0)
- me->SetHealth(m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED));
- else
- me->SetHealth(1);
-
switch (m_uiStage)
{
case 0:
@@ -364,10 +348,13 @@ struct boss_twin_baseAI : public ScriptedAI
case 2: // Shield+Pact
if (m_uiSpecialAbilityTimer <= uiDiff)
{
- if (Creature* pSister = GetSister())
- pSister->AI()->DoAction(ACTION_PACT);
DoScriptText(EMOTE_SHIELD, me);
DoScriptText(SAY_SHIELD, me);
+ if (Creature* pSister = GetSister())
+ {
+ pSister->AI()->DoAction(ACTION_PACT);
+ pSister->CastSpell(pSister, SPELL_POWER_TWINS, false);
+ }
DoCast(me, m_uiShieldSpellId);
DoCast(me, m_uiTwinPactSpellId);
m_uiStage = 0;
@@ -447,13 +434,16 @@ public:
void Reset() {
boss_twin_baseAI::Reset();
- SetEquipmentSlots(false, EQUIP_MAIN_1, EQUIP_OFFHAND_1, EQUIP_RANGED_1);
+ SetEquipmentSlots(false, EQUIP_MAIN_1, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
m_uiStage = 0;
+ m_uiWeapon = EQUIP_MAIN_1;
+ m_uiAuraState = AURA_STATE_UNKNOWN22;
m_uiVortexEmote = EMOTE_LIGHT_VORTEX;
m_uiVortexSay = SAY_LIGHT_VORTEX;
m_uiSisterNpcId = NPC_DARKBANE;
m_uiColorballNpcId = NPC_UNLEASHED_LIGHT;
m_uiEssenceNpcId = NPC_LIGHT_ESSENCE;
+ m_uiMyEmphatySpellId = SPELL_TWIN_EMPATHY_1;
m_uiMyEssenceSpellId = SPELL_LIGHT_ESSENCE_HELPER;
m_uiOtherEssenceSpellId = SPELL_DARK_ESSENCE_HELPER;
m_uiEmpoweredWeaknessSpellId = SPELL_EMPOWERED_DARK_HELPER;
@@ -506,13 +496,16 @@ public:
void Reset() {
boss_twin_baseAI::Reset();
- SetEquipmentSlots(false, EQUIP_MAIN_2, EQUIP_OFFHAND_2, EQUIP_RANGED_2);
+ SetEquipmentSlots(false, EQUIP_MAIN_2, EQUIP_UNEQUIP, EQUIP_NO_CHANGE);
m_uiStage = 1;
+ m_uiWeapon = EQUIP_MAIN_2;
+ m_uiAuraState = AURA_STATE_UNKNOWN19;
m_uiVortexEmote = EMOTE_DARK_VORTEX;
m_uiVortexSay = SAY_DARK_VORTEX;
m_uiSisterNpcId = NPC_LIGHTBANE;
m_uiColorballNpcId = NPC_UNLEASHED_DARK;
m_uiEssenceNpcId = NPC_DARK_ESSENCE;
+ m_uiMyEmphatySpellId = SPELL_TWIN_EMPATHY_2;
m_uiMyEssenceSpellId = SPELL_DARK_ESSENCE_HELPER;
m_uiOtherEssenceSpellId = SPELL_LIGHT_ESSENCE_HELPER;
m_uiEmpoweredWeaknessSpellId = SPELL_EMPOWERED_LIGHT_HELPER;
@@ -654,6 +647,12 @@ public:
}
else m_uiRangeCheckTimer -= uiDiff;
}
+
+ void SpellHitTarget(Unit* who, const SpellInfo* spell)
+ {
+ if (who->HasAura(SPELL_DARK_ESSENCE_HELPER))
+ who->CastSpell(who, SPELL_POWERING_UP, true);
+ }
};
};
@@ -687,10 +686,173 @@ public:
}
else m_uiRangeCheckTimer -= uiDiff;
}
+
+ void SpellHitTarget(Unit* who, const SpellInfo* spell)
+ {
+ if (who->HasAura(SPELL_LIGHT_ESSENCE_HELPER))
+ who->CastSpell(who, SPELL_POWERING_UP, true);
+ }
};
};
+class spell_powering_up : public SpellScriptLoader
+{
+ public:
+ spell_powering_up() : SpellScriptLoader("spell_powering_up") { }
+
+ class spell_powering_up_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_powering_up_AuraScript);
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* target = GetTarget())
+ {
+ if (Aura* pAura = target->GetAura(GetId()))
+ {
+ if (pAura->GetStackAmount() == 100)
+ {
+ if(target->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 2206, EFFECT_1))
+ target->CastSpell(target, SPELL_EMPOWERED_DARK, true);
+
+ if(target->GetDummyAuraEffect(SPELLFAMILY_GENERIC, 2845, EFFECT_1))
+ target->CastSpell(target, SPELL_EMPOWERED_LIGHT, true);
+
+ target->RemoveAurasDueToSpell(GetId());
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_powering_up_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_powering_up_AuraScript();
+ }
+
+ class spell_powering_up_SpellScript : public SpellScript
+ {
+ public:
+ PrepareSpellScript(spell_powering_up_SpellScript)
+
+ uint32 spellId;
+
+ bool Validate(SpellEntry const * /*spellEntry*/)
+ {
+ spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_SURGE_OF_SPEED, GetCaster());
+ if (!sSpellMgr->GetSpellInfo(spellId))
+ return false;
+ return true;
+ }
+
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetTargetUnit())
+ if (urand(0, 99) < 15)
+ target->CastSpell(target, spellId, true);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_powering_up_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_powering_up_SpellScript();
+ }
+};
+
+class spell_valkyr_essences : public SpellScriptLoader
+{
+ public:
+ spell_valkyr_essences() : SpellScriptLoader("spell_valkyr_essences") { }
+
+ class spell_valkyr_essences_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_valkyr_essences_AuraScript);
+
+ uint32 spellId;
+
+ bool Load()
+ {
+ spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_SURGE_OF_SPEED, GetCaster());
+ if (!sSpellMgr->GetSpellInfo(spellId))
+ return false;
+ return true;
+ }
+
+ void Absorb(AuraEffect * /*aurEff*/, DamageInfo & /*dmgInfo*/, uint32 & /*absorbAmount*/)
+ {
+ if (urand(0, 99) < 5)
+ GetTarget()->CastSpell(GetTarget(), spellId, true);
+ }
+
+ void Register()
+ {
+ OnEffectAbsorb += AuraEffectAbsorbFn(spell_valkyr_essences_AuraScript::Absorb, EFFECT_0);
+ }
+ };
+
+ AuraScript *GetAuraScript() const
+ {
+ return new spell_valkyr_essences_AuraScript();
+ }
+};
+
+class spell_power_of_the_twins : public SpellScriptLoader
+{
+ public:
+ spell_power_of_the_twins() : SpellScriptLoader("spell_power_of_the_twins") { }
+
+ class spell_power_of_the_twins_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_power_of_the_twins_AuraScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
+ {
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ {
+ if (Creature* Valk = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(GetCaster()->GetEntry())))
+ CAST_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(true);
+ }
+ }
+
+ void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (InstanceScript* instance = GetCaster()->GetInstanceScript())
+ {
+ if (Creature* Valk = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(GetCaster()->GetEntry())))
+ CAST_AI(boss_twin_baseAI, Valk->AI())->EnableDualWield(false);
+ }
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_power_of_the_twins_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_power_of_the_twins_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+
+ }
+ };
+
+ AuraScript *GetAuraScript() const
+ {
+ return new spell_power_of_the_twins_AuraScript();
+ }
+};
+
void AddSC_boss_twin_valkyr()
{
new boss_fjola();
@@ -698,4 +860,7 @@ void AddSC_boss_twin_valkyr()
new mob_unleashed_light();
new mob_unleashed_dark();
new mob_essence_of_twin();
+ new spell_powering_up();
+ new spell_valkyr_essences();
+ new spell_power_of_the_twins();
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
index e4d7d051676..7566d9bc410 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp
@@ -44,10 +44,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript
std::string SaveDataBuffer;
bool NeedSave;
- uint32 DataDamageTwin;
- uint32 FjolaCasting;
- uint32 EydisCasting;
-
uint64 BarrentGUID;
uint64 TirionGUID;
uint64 FizzlebangGUID;
@@ -89,7 +85,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript
EventStage = 0;
TributeChestGUID = 0;
- DataDamageTwin = 0;
MainGateDoorGUID = 0;
EastPortcullisGUID = 0;
@@ -368,11 +363,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript
break;
}
break;
- case DATA_HEALTH_TWIN_SHARED:
- DataDamageTwin = data;
- data = NOT_STARTED;
- break;
-
//Achievements
case DATA_SNOBOLD_COUNT:
if (data == INCREASE)
@@ -584,8 +574,6 @@ class instance_trial_of_the_crusader : public InstanceMapScript
break;
};
return EventNPCId;
- case DATA_HEALTH_TWIN_SHARED:
- return DataDamageTwin;
default:
break;
}
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index bdccc540bb6..34c065f5649 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -745,24 +745,36 @@ class npc_tirion_toc : public CreatureScript
break;
case 4010:
DoScriptText(SAY_STAGE_3_02, me);
- m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR));
+ if(Creature* pTemp = me->SummonCreature(NPC_LIGHTBANE, ToCCommonLoc[3].GetPositionX(), ToCCommonLoc[3].GetPositionY(), ToCCommonLoc[3].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
+ {
+ pTemp->SetVisible(false);
+ pTemp->SetReactState(REACT_PASSIVE);
+ pTemp->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[0].GetPositionX(), TwinValkyrsLoc[0].GetPositionY(), TwinValkyrsLoc[0].GetPositionZ());
+ pTemp->SummonCreature(NPC_LIGHT_ESSENCE, TwinValkyrsLoc[1].GetPositionX(), TwinValkyrsLoc[1].GetPositionY(), TwinValkyrsLoc[1].GetPositionZ());
+ }
+ if(Creature* pTemp = me->SummonCreature(NPC_DARKBANE, ToCCommonLoc[4].GetPositionX(), ToCCommonLoc[4].GetPositionY(), ToCCommonLoc[4].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME))
+ {
+ pTemp->SetVisible(false);
+ pTemp->SetReactState(REACT_PASSIVE);
+ pTemp->SummonCreature(NPC_DARK_ESSENCE, TwinValkyrsLoc[2].GetPositionX(), TwinValkyrsLoc[2].GetPositionY(), TwinValkyrsLoc[2].GetPositionZ());
+ pTemp->SummonCreature(NPC_DARK_ESSENCE, TwinValkyrsLoc[3].GetPositionX(), TwinValkyrsLoc[3].GetPositionY(), TwinValkyrsLoc[3].GetPositionZ());
+ }
m_uiUpdateTimer = 3000;
m_pInstance->SetData(TYPE_EVENT, 4015);
break;
case 4015:
- me->SummonCreature(NPC_LIGHTBANE, ToCCommonLoc[3].GetPositionX(), ToCCommonLoc[3].GetPositionY(), ToCCommonLoc[3].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
+ m_pInstance->DoUseDoorOrButton(m_pInstance->GetData64(GO_MAIN_GATE_DOOR));
if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_LIGHTBANE)))
{
pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[6].GetPositionX(), ToCCommonLoc[6].GetPositionY(), ToCCommonLoc[6].GetPositionZ());
pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
- me->SetReactState(REACT_PASSIVE);
+ pTemp->SetVisible(true);
}
- me->SummonCreature(NPC_DARKBANE, ToCCommonLoc[4].GetPositionX(), ToCCommonLoc[4].GetPositionY(), ToCCommonLoc[4].GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME);
if (Creature* pTemp = Unit::GetCreature((*me), m_pInstance->GetData64(NPC_DARKBANE)))
{
pTemp->GetMotionMaster()->MovePoint(0, ToCCommonLoc[7].GetPositionX(), ToCCommonLoc[7].GetPositionY(), ToCCommonLoc[7].GetPositionZ());
pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
- me->SetReactState(REACT_PASSIVE);
+ pTemp->SetVisible(true);
}
m_uiUpdateTimer = 5000;
m_pInstance->SetData(TYPE_EVENT, 4016);
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
index ab9087c0ca8..a0ee721a26a 100644
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h
@@ -22,8 +22,6 @@ enum
TYPE_EVENT_NPC = 102,
TYPE_NORTHREND_BEASTS = 103,
- DATA_HEALTH_TWIN_SHARED = 201,
-
DATA_SNOBOLD_COUNT = 301,
DATA_MISTRESS_OF_PAIN_COUNT = 302,
DATA_TRIBUTE_TO_IMMORTALITY_ELEGIBLE = 303,
@@ -210,6 +208,9 @@ enum eCreature
NPC_LIGHTBANE = 34497,
NPC_DARKBANE = 34496,
+ NPC_DARK_ESSENCE = 34567,
+ NPC_LIGHT_ESSENCE = 34568,
+
NPC_ANUBARAK = 34564,
};
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index f8aaf0ee363..c34528530bd 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -204,12 +204,11 @@ class mob_corrupted_soul_fragment : public CreatureScript
if (type != TARGETED_MOTION_TYPE)
return;
- uint64 BronjahmGUID = 0;
if (instance)
{
if (TempSummon* summ = me->ToTempSummon())
{
- BronjahmGUID = instance->GetData64(DATA_BRONJAHM);
+ uint64 BronjahmGUID = instance->GetData64(DATA_BRONJAHM);
if (GUID_LOPART(BronjahmGUID) != id)
return;
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 fcee11c8774..7a6aefe90fb 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp
@@ -318,7 +318,7 @@ class boss_rimefang : public CreatureScript
_EnterEvadeMode();
}
- void SetGUID(const uint64 guid, int32 type)
+ void SetGUID(uint64 guid, int32 type)
{
if (type == GUID_HOARFROST)
{
@@ -384,7 +384,7 @@ class player_overlord_brandAI : public PlayerAI
tyrannus = NULL;
}
- void SetGUID(const uint64 guid, int32 /*type*/)
+ void SetGUID(uint64 guid, int32 /*type*/)
{
tyrannus = ObjectAccessor::GetCreature(*me, guid);
if (!tyrannus)
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
index 411f9cc7d04..35c2d40494a 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -425,6 +425,9 @@ class boss_prince_keleseth_icc : public CreatureScript
void JustDied(Unit* /*killer*/)
{
+ events.Reset();
+ summons.DespawnAll();
+
Talk(SAY_KELESETH_DEATH);
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
}
@@ -646,6 +649,9 @@ class boss_prince_taldaram_icc : public CreatureScript
void JustDied(Unit* /*killer*/)
{
+ events.Reset();
+ summons.DespawnAll();
+
Talk(EMOTE_TALDARAM_DEATH);
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
}
@@ -866,6 +872,9 @@ class boss_prince_valanar_icc : public CreatureScript
void JustDied(Unit* /*killer*/)
{
+ events.Reset();
+ summons.DespawnAll();
+
Talk(SAY_VALANAR_DEATH);
instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
}
@@ -1176,7 +1185,7 @@ class npc_ball_of_flame : public CreatureScript
}
}
- void SetGUID(uint64 const guid, int32 /*type*/)
+ void SetGUID(uint64 guid, int32 /*type*/)
{
_chaseGUID = guid;
}
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 1954e18bafd..25c804f2eed 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
@@ -81,6 +81,7 @@ uint32 const vampireAuras[3][MAX_DIFFICULTY] =
#define ESSENCE_OF_BLOOD_QUEEN RAID_MODE<uint32>(70867, 71473, 71532, 71533)
#define ESSENCE_OF_BLOOD_QUEEN_PLR RAID_MODE<uint32>(70879, 71525, 71530, 71531)
#define FRENZIED_BLOODTHIRST RAID_MODE<uint32>(70877, 71474, 70877, 71474)
+#define DELIRIOUS_SLASH RAID_MODE<uint32>(71623, 71624, 71625, 71626)
enum Events
{
@@ -185,7 +186,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DAMAGE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_VISUAL);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_BLOOD_MIRROR_DUMMY);
- instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_DELIRIOUS_SLASH);
+ instance->DoRemoveAurasDueToSpellOnPlayers(DELIRIOUS_SLASH);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_PACT_OF_THE_DARKFALLEN);
// Blah, credit the quest
if (_creditBloodQuickening)
@@ -257,7 +258,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
Talk(SAY_KILL);
}
- void SetGUID(uint64 const guid, int32 type = 0)
+ void SetGUID(uint64 guid, int32 type = 0)
{
switch (type)
{
@@ -355,6 +356,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
_offtank = newOfftank;
if (_offtank)
{
+ // both spells have SPELL_ATTR5_SINGLE_TARGET_SPELL, no manual removal needed
_offtank->CastSpell(me->getVictim(), SPELL_BLOOD_MIRROR_DAMAGE, true);
me->getVictim()->CastSpell(_offtank, SPELL_BLOOD_MIRROR_DUMMY, true);
DoCastVictim(SPELL_BLOOD_MIRROR_VISUAL);
@@ -416,7 +418,7 @@ class boss_blood_queen_lana_thel : public CreatureScript
case EVENT_AIR_PHASE:
DoStopAttack();
me->SetReactState(REACT_PASSIVE);
- events.DelayEvents(7000, EVENT_GROUP_NORMAL);
+ events.DelayEvents(10000, EVENT_GROUP_NORMAL);
events.CancelEventGroup(EVENT_GROUP_CANCELLABLE);
me->GetMotionMaster()->MovePoint(POINT_CENTER, centerPos);
break;
@@ -655,21 +657,24 @@ class spell_blood_queen_bloodbolt : public SpellScriptLoader
void FilterTargets(std::list<Unit*>& targets)
{
- uint32 targetCount = targets.size() / 3 + 1;
+ uint32 targetCount = (targets.size() + 2) / 3;
targets.remove_if(BloodboltHitCheck(static_cast<LanaThelAI*>(GetCaster()->GetAI())));
Trinity::RandomResizeList(targets, targetCount);
+ // mark targets now, effect hook has missile travel time delay (might cast next in that time)
+ for (std::list<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr)
+ GetCaster()->GetAI()->SetGUID((*itr)->GetGUID(), GUID_BLOODBOLT);
}
- void HandleDummy()
+ void HandleScript(SpellEffIndex effIndex)
{
+ PreventHitDefaultEffect(effIndex);
GetCaster()->CastSpell(GetHitUnit(), SPELL_TWILIGHT_BLOODBOLT, true);
- GetCaster()->GetAI()->SetGUID(GetHitUnit()->GetGUID(), GUID_BLOODBOLT);
}
void Register()
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_bloodbolt_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- AfterHit += SpellHitFn(spell_blood_queen_bloodbolt_SpellScript::HandleDummy);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_blood_queen_bloodbolt_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnEffect += SpellEffectFn(spell_blood_queen_bloodbolt_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
@@ -679,20 +684,6 @@ class spell_blood_queen_bloodbolt : public SpellScriptLoader
}
};
-class PactOfTheDarkfallenCheck
-{
- public:
- PactOfTheDarkfallenCheck(bool hasPact) : _hasPact(hasPact) { }
-
- bool operator() (Unit* unit)
- {
- return unit->HasAura(SPELL_PACT_OF_THE_DARKFALLEN) == _hasPact;
- }
-
- private:
- bool _hasPact;
-};
-
class spell_blood_queen_pact_of_the_darkfallen : public SpellScriptLoader
{
public:
@@ -704,7 +695,7 @@ class spell_blood_queen_pact_of_the_darkfallen : public SpellScriptLoader
void FilterTargets(std::list<Unit*>& unitList)
{
- unitList.remove_if(PactOfTheDarkfallenCheck(false));
+ unitList.remove_if(Trinity::UnitAuraCheck(false, SPELL_PACT_OF_THE_DARKFALLEN));
bool remove = true;
std::list<Unit*>::const_iterator itrEnd = unitList.end(), itr, itr2;
@@ -790,7 +781,7 @@ class spell_blood_queen_pact_of_the_darkfallen_dmg_target : public SpellScriptLo
void FilterTargets(std::list<Unit*>& unitList)
{
- unitList.remove_if(PactOfTheDarkfallenCheck(true));
+ unitList.remove_if(Trinity::UnitAuraCheck(true, SPELL_PACT_OF_THE_DARKFALLEN));
unitList.push_back(GetCaster());
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
index 89869040e6d..56613d59e99 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp
@@ -549,7 +549,7 @@ class boss_lady_deathwhisper : public CreatureScript
summon->AI()->DoCast(summon, SPELL_TELEPORT_VISUAL);
}
- void SetGUID(uint64 const guid, int32 id/* = 0*/)
+ void SetGUID(uint64 guid, int32 id/* = 0*/)
{
if (id != GUID_CULTIST)
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
index 1898fa253f6..f418726aedf 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp
@@ -77,6 +77,8 @@ enum MovementPoints
POINT_TARGET_COLDFLAME = 36672631,
};
+#define DATA_COLDFLAME_GUID 0
+
class boss_lord_marrowgar : public CreatureScript
{
public:
@@ -165,8 +167,9 @@ class boss_lord_marrowgar : public CreatureScript
break;
case EVENT_COLDFLAME:
_coldflameLastPos.Relocate(me);
+ _coldflameTarget = 0LL;
if (!me->HasAura(SPELL_BONE_STORM))
- me->CastCustomSpell(SPELL_COLDFLAME_NORMAL, SPELLVALUE_MAX_TARGETS, 1, me);
+ DoCastAOE(SPELL_COLDFLAME_NORMAL);
else
DoCast(me, SPELL_COLDFLAME_BONE_STORM);
events.ScheduleEvent(EVENT_COLDFLAME, 5000, EVENT_GROUP_SPECIAL);
@@ -242,8 +245,24 @@ class boss_lord_marrowgar : public CreatureScript
return &_coldflameLastPos;
}
+ uint64 GetGUID(int32 type/* = 0 */)
+ {
+ if (type == DATA_COLDFLAME_GUID)
+ return _coldflameTarget;
+ return 0LL;
+ }
+
+ void SetGUID(uint64 guid, int32 type/* = 0 */)
+ {
+ if (type != DATA_COLDFLAME_GUID)
+ return;
+
+ _coldflameTarget = guid;
+ }
+
private:
Position _coldflameLastPos;
+ uint64 _coldflameTarget;
uint32 _boneStormDuration;
float _baseSpeed;
bool _introDone;
@@ -277,22 +296,7 @@ class npc_coldflame : public CreatureScript
Creature* creOwner = owner->ToCreature();
Position pos;
// random target case
- if (!owner->HasAura(SPELL_BONE_STORM))
- {
- // select any unit but not the tank (by owners threatlist)
- Unit* target = creOwner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 1, -owner->GetObjectSize(), true, -SPELL_IMPALED);
- if (!target)
- target = creOwner->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); // or the tank if its solo
- if (!target)
- {
- me->DespawnOrUnsummon();
- return;
- }
-
- me->SetOrientation(me->GetAngle(target));
- owner->GetNearPosition(pos, owner->GetObjectSize() / 2.0f, 0.0f);
- }
- else
+ if (owner->HasAura(SPELL_BONE_STORM))
{
if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, creOwner->AI()))
{
@@ -303,6 +307,18 @@ class npc_coldflame : public CreatureScript
owner->GetNearPosition(pos, 2.5f, 0.0f);
}
}
+ else
+ {
+ Player* target = ObjectAccessor::GetPlayer(*owner, owner->GetAI()->GetGUID(DATA_COLDFLAME_GUID));
+ if (!target)
+ {
+ me->DespawnOrUnsummon();
+ return;
+ }
+
+ me->SetOrientation(owner->GetAngle(target));
+ owner->GetNearPosition(pos, owner->GetObjectSize() / 2.0f, 0.0f);
+ }
me->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), me->GetPositionZ(), me->GetOrientation());
_events.ScheduleEvent(EVENT_COLDFLAME_TRIGGER, 450);
@@ -399,16 +415,53 @@ class spell_marrowgar_coldflame : public SpellScriptLoader
{
PrepareSpellScript(spell_marrowgar_coldflame_SpellScript);
+ void SelectTarget(std::list<Unit*>& targets)
+ {
+ targets.clear();
+ // select any unit but not the tank (by owners threatlist)
+ Unit* target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 1, -GetCaster()->GetObjectSize(), true, -SPELL_IMPALED);
+ if (!target)
+ target = GetCaster()->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); // or the tank if its solo
+ if (!target)
+ return;
+
+ GetCaster()->GetAI()->SetGUID(target->GetGUID(), DATA_COLDFLAME_GUID);
+ targets.push_back(target);
+ }
+
void HandleScriptEffect(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(effIndex);
- Unit* caster = GetCaster();
- uint8 count = 1;
- if (GetSpellInfo()->Id == 72705)
- count = 4;
+ GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
+ }
- for (uint8 i = 0; i < count; ++i)
- caster->CastSpell(caster, uint32(GetEffectValue() + i), true);
+ void Register()
+ {
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_marrowgar_coldflame_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY);
+ OnEffect += SpellEffectFn(spell_marrowgar_coldflame_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_marrowgar_coldflame_SpellScript();
+ }
+};
+
+class spell_marrowgar_coldflame_bonestorm : public SpellScriptLoader
+{
+ public:
+ spell_marrowgar_coldflame_bonestorm() : SpellScriptLoader("spell_marrowgar_coldflame_bonestorm") { }
+
+ class spell_marrowgar_coldflame_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_marrowgar_coldflame_SpellScript);
+
+ void HandleScriptEffect(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ for (uint8 i = 0; i < 4; ++i)
+ GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue() + i), true);
}
void Register()
@@ -534,6 +587,7 @@ void AddSC_boss_lord_marrowgar()
new npc_coldflame();
new npc_bone_spike();
new spell_marrowgar_coldflame();
+ new spell_marrowgar_coldflame_bonestorm();
new spell_marrowgar_coldflame_damage();
new spell_marrowgar_bone_spike_graveyard();
new spell_marrowgar_bone_storm();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
index 92431629872..b5bcd93d257 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp
@@ -68,8 +68,8 @@ enum Spells
SPELL_GUZZLE_POTIONS = 71893,
SPELL_OOZE_TANK_PROTECTION = 71770, // protects the tank
SPELL_CHOKING_GAS_BOMB = 71255,
- SPELL_OOZE_VARIABLE = 70352,
- SPELL_GAS_VARIABLE = 70353,
+ SPELL_OOZE_VARIABLE = 74118,
+ SPELL_GAS_VARIABLE = 74119,
SPELL_UNBOUND_PLAGUE = 70911,
SPELL_UNBOUND_PLAGUE_SEARCHER = 70917,
SPELL_PLAGUE_SICKNESS = 70953,
@@ -256,14 +256,14 @@ class boss_professor_putricide : public CreatureScript
break;
case NPC_GAS_CLOUD:
// no possible aura seen in sniff adding the aurastate
- summon->SetFlag(UNIT_FIELD_AURASTATE, 1 << (AURA_STATE_UNKNOWN22 - 1));
+ summon->ModifyAuraState(AURA_STATE_UNKNOWN22, true);
summon->CastSpell(summon, SPELL_GASEOUS_BLOAT_PROC, true);
summon->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, summon, false);
summon->SetReactState(REACT_PASSIVE);
return;
case NPC_VOLATILE_OOZE:
// no possible aura seen in sniff adding the aurastate
- summon->SetFlag(UNIT_FIELD_AURASTATE, 1 << (AURA_STATE_UNKNOWN19 - 1));
+ summon->ModifyAuraState(AURA_STATE_UNKNOWN19, true);
summon->CastSpell(summon, SPELL_OOZE_ERUPTION_SEARCH_PERIODIC, true);
summon->CastSpell(summon, SPELL_VOLATILE_OOZE_ADHESIVE, false);
summon->SetReactState(REACT_PASSIVE);
@@ -450,13 +450,13 @@ class boss_professor_putricide : public CreatureScript
while (half < targetList.size())
{
std::list<Unit*>::iterator itr = targetList.begin();
- advance(itr, urand(0, targetList.size()-1));
- DoCast(*itr, SPELL_OOZE_VARIABLE);
+ advance(itr, urand(0, targetList.size() - 1));
+ (*itr)->CastSpell(*itr, SPELL_OOZE_VARIABLE, true);
targetList.erase(itr);
}
// and half gets gas
for (std::list<Unit*>::iterator itr = targetList.begin(); itr != targetList.end(); ++itr)
- DoCast(*itr, SPELL_GAS_VARIABLE);
+ (*itr)->CastSpell(*itr, SPELL_GAS_VARIABLE, true);
}
me->GetMotionMaster()->MovePoint(POINT_TABLE, tablePos);
}
@@ -570,6 +570,8 @@ class boss_professor_putricide : public CreatureScript
// remove Tear Gas
instance->DoRemoveAurasDueToSpellOnPlayers(71615);
instance->DoRemoveAurasDueToSpellOnPlayers(71618);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GAS_VARIABLE);
+ instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_OOZE_VARIABLE);
break;
case EVENT_MALLEABLE_GOO:
if (Is25ManRaid())
@@ -738,20 +740,6 @@ class spell_putricide_gaseous_bloat : public SpellScriptLoader
}
};
-class BeamProtectionCheck
-{
- public:
- explicit BeamProtectionCheck(uint32 excludeAura) : _excludeAura(excludeAura) { }
-
- bool operator()(Unit* unit)
- {
- return unit->HasAura(_excludeAura);
- }
-
- private:
- uint32 _excludeAura;
-};
-
class spell_putricide_ooze_channel : public SpellScriptLoader
{
public:
@@ -780,7 +768,6 @@ class spell_putricide_ooze_channel : public SpellScriptLoader
void SelectTarget(std::list<Unit*>& targetList)
{
- targetList.remove_if(BeamProtectionCheck(GetSpellInfo()->ExcludeTargetAuraSpell));
if (targetList.empty())
{
FinishCast(SPELL_FAILED_NO_VALID_TARGETS);
@@ -826,59 +813,6 @@ class spell_putricide_ooze_channel : public SpellScriptLoader
}
};
-class spell_putricide_expunged_gas : public SpellScriptLoader
-{
- public:
- spell_putricide_expunged_gas() : SpellScriptLoader("spell_putricide_expunged_gas") { }
-
- class spell_putricide_expunged_gas_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_putricide_expunged_gas_SpellScript);
-
- bool Load()
- {
- return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->GetInstanceScript();
- }
-
- void CalcDamage(SpellEffIndex /*effIndex*/)
- {
- // checked in script loading, cant be NULL here
- InstanceScript* instance = GetCaster()->GetInstanceScript();
- Creature* professor = Unit::GetCreature(*GetCaster(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE));
- if (!professor)
- return;
-
- int32 dmg = 0;
- uint32 bloatId = sSpellMgr->GetSpellIdForDifficulty(SPELL_GASEOUS_BLOAT, GetCaster());
- if (Aura* gasBloat = GetTargetUnit()->GetAura(bloatId))
- {
- uint32 stack = gasBloat->GetStackAmount();
- int32 const mod = (GetCaster()->GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
- for (uint8 i = 1; i < stack; ++i)
- dmg += mod * stack;
- }
-
- SetHitDamage(dmg);
- }
-
- void DespawnAfterCast()
- {
- GetCaster()->ToCreature()->DespawnOrUnsummon(100);
- }
-
- void Register()
- {
- OnEffect += SpellEffectFn(spell_putricide_expunged_gas_SpellScript::CalcDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- AfterHit += SpellHitFn(spell_putricide_expunged_gas_SpellScript::DespawnAfterCast);
- }
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_putricide_expunged_gas_SpellScript();
- }
-};
-
class spell_putricide_slime_puddle : public SpellScriptLoader
{
public:
@@ -1384,11 +1318,11 @@ class spell_putricide_mutated_transformation : public SpellScriptLoader
if (!caster)
return;
- InstanceScript* instance = GetTargetUnit()->GetInstanceScript();
+ InstanceScript* instance = caster->GetInstanceScript();
if (!instance)
return;
- Creature* putricide = ObjectAccessor::GetCreature(*GetTargetUnit(), instance->GetData64(DATA_PROFESSOR_PUTRICIDE));
+ Creature* putricide = ObjectAccessor::GetCreature(*caster, instance->GetData64(DATA_PROFESSOR_PUTRICIDE));
if (!putricide)
return;
@@ -1432,29 +1366,29 @@ class spell_putricide_mutated_transformation : public SpellScriptLoader
class spell_putricide_mutated_transformation_dmg : public SpellScriptLoader
{
-public:
- spell_putricide_mutated_transformation_dmg() : SpellScriptLoader("spell_putricide_mutated_transformation_dmg") { }
-
- class spell_putricide_mutated_transformation_dmg_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_putricide_mutated_transformation_dmg_SpellScript);
+ public:
+ spell_putricide_mutated_transformation_dmg() : SpellScriptLoader("spell_putricide_mutated_transformation_dmg") { }
- void FilterTargetsInitial(std::list<Unit*>& unitList)
+ class spell_putricide_mutated_transformation_dmg_SpellScript : public SpellScript
{
- if (Unit* owner = ObjectAccessor::GetUnit(*GetCaster(), GetCaster()->GetCreatorGUID()))
- unitList.remove(owner);
- }
+ PrepareSpellScript(spell_putricide_mutated_transformation_dmg_SpellScript);
- void Register()
+ void FilterTargetsInitial(std::list<Unit*>& unitList)
+ {
+ if (Unit* owner = ObjectAccessor::GetUnit(*GetCaster(), GetCaster()->GetCreatorGUID()))
+ unitList.remove(owner);
+ }
+
+ void Register()
+ {
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_mutated_transformation_dmg_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- OnUnitTargetSelect += SpellUnitTargetFn(spell_putricide_mutated_transformation_dmg_SpellScript::FilterTargetsInitial, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ return new spell_putricide_mutated_transformation_dmg_SpellScript();
}
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_putricide_mutated_transformation_dmg_SpellScript();
- }
};
class spell_putricide_regurgitated_ooze : public SpellScriptLoader
@@ -1522,7 +1456,6 @@ void AddSC_boss_professor_putricide()
new npc_volatile_ooze();
new spell_putricide_gaseous_bloat();
new spell_putricide_ooze_channel();
- new spell_putricide_expunged_gas();
new spell_putricide_slime_puddle();
new spell_putricide_slime_puddle_aura();
new spell_putricide_unstable_experiment();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
index b341a87c176..dd645562501 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp
@@ -125,6 +125,7 @@ class boss_rotface : public CreatureScript
{
_JustDied();
Talk(SAY_DEATH);
+ instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION);
if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
professor->AI()->DoAction(ACTION_ROTFACE_DEATH);
}
@@ -191,18 +192,9 @@ class boss_rotface : public CreatureScript
}
break;
case EVENT_MUTATED_INFECTION:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true, -MUTATED_INFECTION);
- if (!target)
- target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -MUTATED_INFECTION);
- if (target)
- {
- me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, target, false);
- Talk(EMOTE_MUTATED_INFECTION, target->GetGUID());
- }
+ me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, NULL, false);
events.ScheduleEvent(EVENT_MUTATED_INFECTION, infectionCooldown);
break;
- }
default:
break;
}
@@ -478,6 +470,68 @@ class spell_rotface_ooze_flood : public SpellScriptLoader
}
};
+class spell_rotface_mutated_infection : public SpellScriptLoader
+{
+ public:
+ spell_rotface_mutated_infection() : SpellScriptLoader("spell_rotface_mutated_infection") { }
+
+ class spell_rotface_mutated_infection_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_rotface_mutated_infection_SpellScript);
+
+ bool Load()
+ {
+ _target = NULL;
+ return true;
+ }
+
+ void FilterTargets(std::list<Unit*>& targets)
+ {
+ // remove targets with this aura already
+ // tank is not on this list
+ targets.remove_if(Trinity::UnitAuraCheck(true, GetSpellInfo()->Id));
+ if (targets.empty())
+ return;
+
+ std::list<Unit*>::iterator itr = targets.begin();
+ std::advance(itr, urand(0, targets.size() - 1));
+ Unit* target = *itr;
+ targets.clear();
+ targets.push_back(target);
+ _target = target;
+ }
+
+ void ReplaceTargets(std::list<Unit*>& targets)
+ {
+ targets.clear();
+ if (_target)
+ targets.push_back(_target);
+ }
+
+ void NotifyTargets()
+ {
+ if (Creature* caster = GetCaster()->ToCreature())
+ if (Unit* target = GetHitUnit())
+ caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target->GetGUID());
+ }
+
+ void Register()
+ {
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_rotface_mutated_infection_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_rotface_mutated_infection_SpellScript::ReplaceTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY);
+ AfterHit += SpellHitFn(spell_rotface_mutated_infection_SpellScript::NotifyTargets);
+ }
+
+ Unit* _target;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_rotface_mutated_infection_SpellScript();
+ }
+};
+
class spell_rotface_little_ooze_combine : public SpellScriptLoader
{
public:
@@ -659,15 +713,17 @@ class spell_rotface_unstable_ooze_explosion : public SpellScriptLoader
void CheckTarget(SpellEffIndex effIndex)
{
PreventHitDefaultEffect(EFFECT_0);
- if (!GetTargetUnit())
+ if (!GetTargetDest())
return;
uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell;
+ float x, y, z;
+ GetTargetDest()->GetPosition(x, y, z);
// let Rotface handle the cast - caster dies before this executes
- if (InstanceScript* script = GetTargetUnit()->GetInstanceScript())
+ if (InstanceScript* script = GetCaster()->GetInstanceScript())
if (Creature* rotface = script->instance->GetCreature(script->GetData64(DATA_ROTFACE)))
- rotface->CastSpell(GetTargetUnit(), triggered_spell_id, true, NULL, NULL, GetCaster()->GetGUID());
+ rotface->CastSpell(x, y, z, triggered_spell_id, true, NULL, NULL, GetCaster()->GetGUID());
}
void Register()
@@ -722,6 +778,7 @@ void AddSC_boss_rotface()
new npc_big_ooze();
new npc_precious_icc();
new spell_rotface_ooze_flood();
+ new spell_rotface_mutated_infection();
new spell_rotface_little_ooze_combine();
new spell_rotface_large_ooze_combine();
new spell_rotface_large_ooze_buff_combine();
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index 0c2d1e8fe00..e0b8afdbfd5 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -523,7 +523,7 @@ class npc_ice_tomb : public CreatureScript
me->SetReactState(REACT_PASSIVE);
}
- void SetGUID(uint64 const guid, int32 type/* = 0 */)
+ void SetGUID(uint64 guid, int32 type/* = 0 */)
{
if (type == DATA_TRAPPED_PLAYER)
{
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
index a237f239386..c167dfc8e95 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp
@@ -212,15 +212,6 @@ class AuraRemoveEvent : public BasicEvent
uint32 _spellId;
};
-class SummonTargetSelector
-{
- public:
- bool operator()(Unit* unit) const
- {
- return unit->HasAura(SPELL_RECENTLY_SPAWNED);
- }
-};
-
class ValithriaDespawner : public BasicEvent
{
public:
@@ -249,6 +240,7 @@ class ValithriaDespawner : public BasicEvent
case NPC_GLUTTONOUS_ABOMINATION:
case NPC_MANA_VOID:
case NPC_COLUMN_OF_FROST:
+ case NPC_ROT_WORM:
creature->DespawnOrUnsummon();
return;
case NPC_RISEN_ARCHMAGE:
@@ -310,6 +302,8 @@ class boss_valithria_dreamwalker : public CreatureScript
// immune to percent heals
me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_OBS_MOD_HEALTH, true);
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_HEAL_PCT, true);
+ // Glyph of Dispel Magic - not a percent heal by effect, its cast with custom basepoints
+ me->ApplySpellImmune(0, IMMUNITY_ID, 56131, true);
_instance->SendEncounterUnit(ENCOUNTER_FRAME_REMOVE, me);
_missedPortals = 0;
_under25PercentTalkDone = false;
@@ -506,8 +500,15 @@ class npc_green_dragon_combat_trigger : public CreatureScript
me->SetReactState(REACT_PASSIVE);
}
- void EnterCombat(Unit* /*target*/)
+ void EnterCombat(Unit* target)
{
+ if (!instance->CheckRequiredBosses(DATA_VALITHRIA_DREAMWALKER, target->ToPlayer()))
+ {
+ EnterEvadeMode();
+ instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
+ return;
+ }
+
me->setActive(true);
DoZoneInCombat();
instance->SetBossState(DATA_VALITHRIA_DREAMWALKER, IN_PROGRESS);
@@ -1177,7 +1178,7 @@ class spell_dreamwalker_summoner : public SpellScriptLoader
void FilterTargets(std::list<Unit*>& targets)
{
- targets.remove_if(SummonTargetSelector());
+ targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED));
if (targets.empty())
return;
@@ -1218,7 +1219,7 @@ class spell_dreamwalker_summon_suppresser : public SpellScriptLoader
std::list<Creature*> summoners;
GetCreatureListWithEntryInGrid(summoners, caster, 22515, 100.0f);
- summoners.remove_if(SummonTargetSelector());
+ summoners.remove_if(Trinity::UnitAuraCheck(true, SPELL_RECENTLY_SPAWNED));
Trinity::RandomResizeList(summoners, 2);
if (summoners.empty())
return;
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
index 56c42f4f285..1e061c38c08 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp
@@ -971,7 +971,7 @@ class npc_crok_scourgebane : public CreatureScript
}
}
- void SetGUID(uint64 const guid, int32 type/* = 0*/)
+ void SetGUID(uint64 guid, int32 type/* = 0*/)
{
if (type == ACTION_VRYKUL_DEATH)
{
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
index 7a1ab3e4f19..f5973fc0c8c 100755
--- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
+++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.h
@@ -228,6 +228,7 @@ enum CreaturesIds
NPC_GLUTTONOUS_ABOMINATION = 37886,
NPC_MANA_VOID = 38068,
NPC_COLUMN_OF_FROST = 37918,
+ NPC_ROT_WORM = 37907,
NPC_THE_LICH_KING_VALITHRIA = 16980,
NPC_DREAM_PORTAL_PRE_EFFECT = 38186,
NPC_NIGHTMARE_PORTAL_PRE_EFFECT = 38429,
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
index 2122e4d9179..9384eb04bc8 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_maexxna.cpp
@@ -163,7 +163,7 @@ public:
uint64 victimGUID;
- void SetGUID(const uint64 guid, int32 /*param*/)
+ void SetGUID(uint64 guid, int32 /*param*/)
{
victimGUID = guid;
if (me->m_spells[0] && victimGUID)
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
index cd742b11d58..cf653284e6a 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp
@@ -157,7 +157,7 @@ public:
}
}
- void SetGUID(uint64 const guid, int32 id/* = 0 */)
+ void SetGUID(uint64 guid, int32 id/* = 0 */)
{
if (id == DATA_INTENSE_COLD)
intenseColdList.push_back(guid);
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
index e7dffae5c9d..748de08f5e0 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/instance_ulduar.cpp
@@ -78,6 +78,7 @@ class instance_ulduar : public InstanceMapScript
// Miscellaneous
uint32 TeamInInstance;
uint32 HodirRareCacheData;
+ uint32 ColossusData;
uint8 elderCount;
bool conSpeedAtory;
@@ -117,6 +118,7 @@ class instance_ulduar : public InstanceMapScript
ArchivumDoorGUID = 0;
TeamInInstance = 0;
HodirRareCacheData = 0;
+ ColossusData = 0;
elderCount = 0;
conSpeedAtory = false;
@@ -473,7 +475,7 @@ class instance_ulduar : public InstanceMapScript
switch (type)
{
case DATA_COLOSSUS:
- Encounter[DATA_COLOSSUS] = data;
+ ColossusData = data;
if (data == 2)
{
if (Creature* Leviathan = instance->GetCreature(LeviathanGUID))
@@ -589,7 +591,7 @@ class instance_ulduar : public InstanceMapScript
switch (type)
{
case DATA_COLOSSUS:
- return Encounter[type];
+ return ColossusData;
case DATA_HODIR_RARE_CACHE:
return HodirRareCacheData;
default:
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
index 8d668011f9a..904566e13a4 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
+++ b/src/server/scripts/Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp
@@ -41,9 +41,6 @@ class instance_archavon : public InstanceMapScript
{
EmalonGUID = 0;
ToravonGUID = 0;
- ArchavonDeath = 0;
- EmalonDeath = 0;
- KoralonDeath = 0;
}
void OnCreatureCreate(Creature* creature)
@@ -76,63 +73,9 @@ class instance_archavon : public InstanceMapScript
return 0;
}
- bool SetBossState(uint32 type, EncounterState state)
- {
- if (!InstanceScript::SetBossState(type, state))
- return false;
-
- if (state != DONE)
- return true;
-
- switch (type)
- {
- case DATA_ARCHAVON:
- ArchavonDeath = time(NULL);
- break;
- case DATA_EMALON:
- EmalonDeath = time(NULL);
- break;
- case DATA_KORALON:
- KoralonDeath = time(NULL);
- break;
- default:
- return true;
- }
-
- // on every death of Archavon, Emalon and Koralon check our achievement
- DoCastSpellOnPlayers(SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK);
-
- return true;
- }
-
- bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/, uint32 /*miscvalue1*/)
- {
- switch (criteria_id)
- {
- case CRITERIA_EARTH_WIND_FIRE_10:
- case CRITERIA_EARTH_WIND_FIRE_25:
- if (ArchavonDeath && EmalonDeath && KoralonDeath)
- {
- // instance difficulty check is already done in db (achievement_criteria_data)
- // int() for Visual Studio, compile errors with abs(time_t)
- return (abs(int(ArchavonDeath-EmalonDeath)) < MINUTE && \
- abs(int(EmalonDeath-KoralonDeath)) < MINUTE && \
- abs(int(KoralonDeath-ArchavonDeath)) < MINUTE);
- }
- break;
- default:
- break;
- }
-
- return false;
- }
-
private:
uint64 EmalonGUID;
uint64 ToravonGUID;
- time_t ArchavonDeath;
- time_t EmalonDeath;
- time_t KoralonDeath;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
diff --git a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
index 04f50d3adeb..4aa01e58f5f 100644
--- a/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
+++ b/src/server/scripts/Northrend/VaultOfArchavon/vault_of_archavon.h
@@ -36,15 +36,4 @@ enum Data
#define MAX_ENCOUNTER 4
-enum AchievementCriteriaIds
-{
- CRITERIA_EARTH_WIND_FIRE_10 = 12018,
- CRITERIA_EARTH_WIND_FIRE_25 = 12019,
-};
-
-enum AchievementSpells
-{
- SPELL_EARTH_WIND_FIRE_ACHIEVEMENT_CHECK = 68308,
-};
-
#endif
diff --git a/src/server/scripts/Northrend/borean_tundra.cpp b/src/server/scripts/Northrend/borean_tundra.cpp
index aa08e4230ab..205dcdb5347 100644
--- a/src/server/scripts/Northrend/borean_tundra.cpp
+++ b/src/server/scripts/Northrend/borean_tundra.cpp
@@ -2431,7 +2431,7 @@ public:
uiEventPhase = 1;
}
- void SetGUID(const uint64 uiGuid, int32 /*iId*/)
+ void SetGUID(uint64 uiGuid, int32 /*iId*/)
{
uiPlayerGUID = uiGuid;
}
diff --git a/src/server/scripts/Northrend/icecrown.cpp b/src/server/scripts/Northrend/icecrown.cpp
index 86b375fc274..dc55c2f6ad3 100644
--- a/src/server/scripts/Northrend/icecrown.cpp
+++ b/src/server/scripts/Northrend/icecrown.cpp
@@ -381,6 +381,51 @@ public:
}
};
+/*######
+## npc_vereth_the_cunning
+######*/
+
+enum eVerethTheCunning
+{
+ NPC_GEIST_RETURN_BUNNY_KC = 31049,
+ NPC_LITHE_STALKER = 30894,
+ SPELL_SUBDUED_LITHE_STALKER = 58151,
+};
+
+class npc_vereth_the_cunning : public CreatureScript
+{
+public:
+ npc_vereth_the_cunning() : CreatureScript("npc_vereth_the_cunning") { }
+
+ struct npc_vereth_the_cunningAI : public ScriptedAI
+ {
+ npc_vereth_the_cunningAI(Creature* pCreature) : ScriptedAI(pCreature) {}
+
+ void MoveInLineOfSight(Unit* who)
+ {
+ ScriptedAI::MoveInLineOfSight(who);
+
+ if (who->GetEntry() == NPC_LITHE_STALKER && me->IsWithinDistInMap(who, 10.0f))
+ {
+ if (Unit* owner = who->GetCharmer())
+ {
+ if (who->HasAura(SPELL_SUBDUED_LITHE_STALKER))
+ {
+ owner->ToPlayer()->KilledMonsterCredit(NPC_GEIST_RETURN_BUNNY_KC, 0);
+ who->ToCreature()->DisappearAndDie();
+
+ }
+ }
+ }
+ }
+ };
+
+ CreatureAI *GetAI(Creature *creature) const
+ {
+ return new npc_vereth_the_cunningAI(creature);
+ }
+};
+
void AddSC_icecrown()
{
new npc_arete;
@@ -389,4 +434,5 @@ void AddSC_icecrown()
new npc_argent_valiant;
new npc_alorah_and_grimmin;
new npc_guardian_pavilion;
+ new npc_vereth_the_cunning;
}
diff --git a/src/server/scripts/Northrend/zuldrak.cpp b/src/server/scripts/Northrend/zuldrak.cpp
index b8e0d31d49b..16567be9636 100644
--- a/src/server/scripts/Northrend/zuldrak.cpp
+++ b/src/server/scripts/Northrend/zuldrak.cpp
@@ -361,7 +361,7 @@ public:
bRemoveFlag = false;
}
- void SetGUID(const uint64 guid, int32 /*id*/)
+ void SetGUID(uint64 guid, int32 /*id*/)
{
uiPlayerGUID = guid;
}
diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
index d827533610d..d4f9803b800 100644
--- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp
@@ -132,7 +132,7 @@ class boss_void_reaver : public CreatureScript
target = NULL;
}
- if (target_list.size())
+ if (!target_list.empty())
target = *(target_list.begin()+rand()%target_list.size());
else
target = me->getVictim();
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 0a81b13ed64..16d147a4000 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -39,6 +39,58 @@ enum HunterSpells
HUNTER_SPELL_CHIMERA_SHOT_SERPENT = 53353,
HUNTER_SPELL_CHIMERA_SHOT_VIPER = 53358,
HUNTER_SPELL_CHIMERA_SHOT_SCORPID = 53359,
+ HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET = 61669,
+};
+
+// 13161 Aspect of the Beast
+class spell_hun_aspect_of_the_beast : public SpellScriptLoader
+{
+public:
+ spell_hun_aspect_of_the_beast() : SpellScriptLoader("spell_hun_aspect_of_the_beast") { }
+
+ class spell_hun_aspect_of_the_beast_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_aspect_of_the_beast_AuraScript)
+ bool Validate(SpellInfo const* /*entry*/)
+ {
+ if (!sSpellMgr->GetSpellInfo(HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET))
+ return false;
+ return true;
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (!GetCaster())
+ return;
+
+ Unit* caster = GetCaster();
+ if (caster->ToPlayer())
+ if (Pet* pet = caster->ToPlayer()->GetPet())
+ pet->RemoveAurasDueToSpell(HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET);
+ }
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (!GetCaster())
+ return;
+
+ Unit* caster = GetCaster();
+ if (caster->ToPlayer())
+ if (Pet* pet = caster->ToPlayer()->GetPet())
+ caster->CastSpell(caster, HUNTER_SPELL_ASPECT_OF_THE_BEAST_PET, true);
+ }
+
+ void Register()
+ {
+ AfterEffectApply += AuraEffectApplyFn(spell_hun_aspect_of_the_beast_AuraScript::OnApply, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL);
+ AfterEffectRemove += AuraEffectRemoveFn(spell_hun_aspect_of_the_beast_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_UNTRACKABLE, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript *GetAuraScript() const
+ {
+ return new spell_hun_aspect_of_the_beast_AuraScript();
+ }
};
// 53209 Chimera Shot
@@ -376,7 +428,7 @@ public:
if (!target->HasAura(spellId))
{
SpellInfo const* triggeredSpellInfo = sSpellMgr->GetSpellInfo(spellId);
- Unit* triggerCaster = triggeredSpellInfo->IsRequiringSelectedTarget() ? caster : target;
+ Unit* triggerCaster = triggeredSpellInfo->NeedsToBeTriggeredByCaster() ? caster : target;
triggerCaster->CastSpell(target, triggeredSpellInfo, true, 0, aurEff);
}
}
@@ -512,6 +564,7 @@ public:
void AddSC_hunter_spell_scripts()
{
+ new spell_hun_aspect_of_the_beast();
new spell_hun_chimera_shot();
new spell_hun_invigoration();
new spell_hun_last_stand_pet();
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index e2f37912931..5300849d0ec 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -1088,7 +1088,7 @@ class spell_magic_eater_food : public SpellScriptLoader
{
PrepareAuraScript(spell_magic_eater_food_AuraScript);
- void HandleTriggerSpell(AuraEffect const* aurEff)
+ void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
{
PreventDefaultAction();
Unit* target = GetTarget();
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index 623bfe0a5da..77048d6ea29 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -23,6 +23,7 @@
#include "ScriptPCH.h"
#include "SpellAuraEffects.h"
+#include "GridNotifiers.h"
enum PriestSpells
{
@@ -130,7 +131,7 @@ class spell_pri_mind_sear : public SpellScriptLoader
void FilterTargets(std::list<Unit*>& unitList)
{
- unitList.remove(GetTargetUnit());
+ unitList.remove_if(Trinity::ObjectGUIDCheck(GetCaster()->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT)));
}
void Register()
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index ae8069747e3..a9ffe2e0f47 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -22,6 +22,7 @@
*/
#include "ScriptPCH.h"
+#include "Vehicle.h"
class spell_generic_quest_update_entry_SpellScript : public SpellScript
{
@@ -939,6 +940,44 @@ class spell_q12805_lifeblood_dummy : public SpellScriptLoader
};
};
+/*
+ http://www.wowhead.com/quest=13283 King of the Mountain
+ http://www.wowhead.com/quest=13280 King of the Mountain
+ 59643 Plant Horde Battle Standard
+ 4338 Plant Alliance Battle Standard
+ */
+enum eBattleStandard
+{
+ NPC_KING_OF_THE_MOUNTAINT_KC = 31766,
+};
+class spell_q13280_13283_plant_battle_standard: public SpellScriptLoader
+{
+public:
+ spell_q13280_13283_plant_battle_standard() : SpellScriptLoader("spell_q13280_13283_plant_battle_standard") { }
+
+ class spell_q13280_13283_plant_battle_standard_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q13280_13283_plant_battle_standard_SpellScript)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ if (caster->IsVehicle())
+ if (Unit* player = caster->GetVehicleKit()->GetPassenger(0))
+ player->ToPlayer()->KilledMonsterCredit(NPC_KING_OF_THE_MOUNTAINT_KC,0);
+ }
+
+ void Register()
+ {
+ OnEffect += SpellEffectFn(spell_q13280_13283_plant_battle_standard_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q13280_13283_plant_battle_standard_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -961,4 +1000,5 @@ void AddSC_quest_spell_scripts()
new spell_q12659_ahunaes_knife();
new spell_q9874_liquid_fire();
new spell_q12805_lifeblood_dummy();
+ new spell_q13280_13283_plant_battle_standard();
}
diff --git a/src/server/scripts/World/achievement_scripts.cpp b/src/server/scripts/World/achievement_scripts.cpp
index db09c12da0b..af966e3e22e 100755
--- a/src/server/scripts/World/achievement_scripts.cpp
+++ b/src/server/scripts/World/achievement_scripts.cpp
@@ -21,6 +21,7 @@
#include "BattlegroundWS.h"
#include "BattlegroundIC.h"
#include "BattlegroundSA.h"
+#include "BattlegroundAV.h"
#include "Vehicle.h"
class achievement_storm_glory : public AchievementCriteriaScript
@@ -207,6 +208,48 @@ public:
}
};
+class achievement_everything_counts : public AchievementCriteriaScript
+{
+ public:
+ achievement_everything_counts() : AchievementCriteriaScript("achievement_everything_counts") { }
+
+ bool OnCheck(Player* source, Unit* /*target*/)
+ {
+ Battleground* bg = source->GetBattleground();
+ if (!bg)
+ return false;
+
+ if (source->GetBattlegroundTypeId() != BATTLEGROUND_AV)
+ return false;
+
+ if (static_cast<BattlegroundAV*>(bg)->IsBothMinesControlledByTeam(source->GetTeam()))
+ return true;
+
+ return false;
+ }
+};
+
+class achievement_bg_av_perfection : public AchievementCriteriaScript
+{
+ public:
+ achievement_bg_av_perfection() : AchievementCriteriaScript("achievement_bg_av_perfection") { }
+
+ bool OnCheck(Player* source, Unit* /*target*/)
+ {
+ Battleground* bg = source->GetBattleground();
+ if (!bg)
+ return false;
+
+ if (source->GetBattlegroundTypeId() != BATTLEGROUND_AV)
+ return false;
+
+ if (static_cast<BattlegroundAV*>(bg)->IsAllTowersControlledAndCaptainAlive(source->GetTeam()))
+ return true;
+
+ return false;
+ }
+};
+
class achievement_wg_didnt_stand_a_chance : public AchievementCriteriaScript
{
public:
@@ -269,6 +312,8 @@ void AddSC_achievement_scripts()
new achievement_bg_sa_artillery();
new achievement_sickly_gazelle();
new achievement_wg_didnt_stand_a_chance();
+ new achievement_everything_counts();
+ new achievement_bg_av_perfection();
new achievement_arena_kills("achievement_arena_2v2_kills", ARENA_TYPE_2v2);
new achievement_arena_kills("achievement_arena_3v3_kills", ARENA_TYPE_3v3);
new achievement_arena_kills("achievement_arena_5v5_kills", ARENA_TYPE_5v5);
diff --git a/src/server/scripts/World/go_scripts.cpp b/src/server/scripts/World/go_scripts.cpp
index fba7b44d789..d99501f6aaa 100644
--- a/src/server/scripts/World/go_scripts.cpp
+++ b/src/server/scripts/World/go_scripts.cpp
@@ -313,10 +313,10 @@ public:
{
if (!creature->IsHostileTo(player))
{
- uint32 Spell = 0;
-
if (FactionTemplateEntry const* pFaction = creature->getFactionTemplateEntry())
{
+ uint32 Spell = 0;
+
switch(pFaction->faction)
{
case 1011: Spell = SPELL_REP_LC; break;