aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Spells
diff options
context:
space:
mode:
authorkaelima <kaelima@live.se>2012-05-30 08:01:02 +0200
committerkaelima <kaelima@live.se>2012-05-30 08:01:02 +0200
commit3d14384c32971096b49f88ff785d92879480af76 (patch)
treec1ade41c9d04583a717a705132ca09dde7a8ad56 /src/server/scripts/Spells
parentbdf6cf5146b884591e3a033a31ca5b729fdff0ff (diff)
Merge git://github.com/TrinityCore/TrinityCore into 4.x
Conflicts: dep/PackageList.txt sql/base/auth_database.sql src/server/authserver/Server/AuthSocket.cpp src/server/game/Battlegrounds/BattlegroundMgr.cpp src/server/game/Chat/Commands/Level1.cpp src/server/game/Chat/Commands/Level3.cpp src/server/game/DataStores/DBCEnums.h src/server/game/DataStores/DBCStores.cpp src/server/game/DataStores/DBCStores.h src/server/game/DataStores/DBCStructure.h src/server/game/DataStores/DBCfmt.h src/server/game/Entities/Corpse/Corpse.cpp src/server/game/Entities/Creature/Creature.cpp src/server/game/Entities/DynamicObject/DynamicObject.cpp src/server/game/Entities/GameObject/GameObject.cpp src/server/game/Entities/Item/Item.cpp src/server/game/Entities/Object/Object.cpp src/server/game/Entities/Object/Updates/UpdateData.h src/server/game/Entities/Pet/Pet.cpp src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Player/Player.h src/server/game/Entities/Transport/Transport.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Globals/ObjectMgr.h src/server/game/Guilds/Guild.cpp src/server/game/Handlers/CharacterHandler.cpp src/server/game/Handlers/MiscHandler.cpp src/server/game/Handlers/MovementHandler.cpp src/server/game/Handlers/QuestHandler.cpp src/server/game/Loot/LootMgr.cpp src/server/game/Miscellaneous/SharedDefines.h src/server/game/Quests/QuestDef.cpp src/server/game/Server/Protocol/Opcodes.cpp src/server/game/Server/Protocol/Opcodes.h src/server/game/Server/WorldSession.cpp src/server/game/Server/WorldSocket.cpp src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/game/Spells/Spell.cpp src/server/game/Spells/Spell.h src/server/game/Spells/SpellEffects.cpp src/server/game/Tickets/TicketMgr.cpp src/server/scripts/Commands/cs_gps.cpp src/server/scripts/Commands/cs_modify.cpp src/server/shared/Database/Implementation/CharacterDatabase.cpp src/server/shared/Logging/Log.h src/tools/map_extractor/CMakeLists.txt src/tools/map_extractor/System.cpp src/tools/map_extractor/mpq_libmpq04.h src/tools/vmap4_extractor/CMakeLists.txt
Diffstat (limited to 'src/server/scripts/Spells')
-rw-r--r--src/server/scripts/Spells/CMakeLists.txt2
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp39
-rw-r--r--src/server/scripts/Spells/spell_druid.cpp6
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp215
-rw-r--r--src/server/scripts/Spells/spell_hunter.cpp67
-rw-r--r--src/server/scripts/Spells/spell_item.cpp94
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp26
-rw-r--r--src/server/scripts/Spells/spell_paladin.cpp20
-rw-r--r--src/server/scripts/Spells/spell_priest.cpp64
-rw-r--r--src/server/scripts/Spells/spell_quest.cpp86
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp131
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp134
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp80
13 files changed, 818 insertions, 146 deletions
diff --git a/src/server/scripts/Spells/CMakeLists.txt b/src/server/scripts/Spells/CMakeLists.txt
index 496324e4de9..04dcee9287c 100644
--- a/src/server/scripts/Spells/CMakeLists.txt
+++ b/src/server/scripts/Spells/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (C) 2008-2011 TrinityCore <http://www.trinitycore.org/>
+# Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index eb42b377128..36dcb53ad00 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -337,11 +337,11 @@ class spell_dk_death_pact : public SpellScriptLoader
void FilterTargets(std::list<Unit*>& unitList)
{
Unit* unit_to_add = NULL;
- for (std::list<Unit*>::iterator itr = unitList.begin() ; itr != unitList.end(); ++itr)
+ for (std::list<Unit*>::iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
{
if ((*itr)->GetTypeId() == TYPEID_UNIT
&& (*itr)->GetOwnerGUID() == GetCaster()->GetGUID()
- && (*itr)->ToCreature()->GetCreatureInfo()->type == CREATURE_TYPE_UNDEAD)
+ && (*itr)->ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_UNDEAD)
{
unit_to_add = (*itr);
break;
@@ -642,9 +642,7 @@ public:
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
- Unit* target = GetTarget();
- if (target->HasAura(DK_SPELL_UNHOLY_PRESENCE))
- target->RemoveAura(DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED);
+ GetTarget()->RemoveAura(DK_SPELL_IMPROVED_UNHOLY_PRESENCE_TRIGGERED);
}
void Register()
@@ -713,6 +711,7 @@ enum DeathCoil
{
SPELL_DEATH_COIL_DAMAGE = 47632,
SPELL_DEATH_COIL_HEAL = 47633,
+ SPELL_SIGIL_VENGEFUL_HEART = 64962,
};
class spell_dk_death_coil : public SpellScriptLoader
@@ -743,12 +742,34 @@ class spell_dk_death_coil : public SpellScriptLoader
caster->CastCustomSpell(target, SPELL_DEATH_COIL_HEAL, &bp, NULL, NULL, true);
}
else
+ {
+ if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_SIGIL_VENGEFUL_HEART, EFFECT_1))
+ damage += auraEffect->GetBaseAmount();
caster->CastCustomSpell(target, SPELL_DEATH_COIL_DAMAGE, &damage, NULL, NULL, true);
+ }
}
}
+ SpellCastResult CheckCast()
+ {
+ Unit* caster = GetCaster();
+ if (Unit* target = GetExplTargetUnit())
+ {
+ if (!caster->IsFriendlyTo(target) && !caster->isInFront(target))
+ return SPELL_FAILED_UNIT_NOT_INFRONT;
+
+ if (target->IsFriendlyTo(caster) && target->GetCreatureType() != CREATURE_TYPE_UNDEAD)
+ return SPELL_FAILED_BAD_TARGETS;
+ }
+ else
+ return SPELL_FAILED_BAD_TARGETS;
+
+ return SPELL_CAST_OK;
+ }
+
void Register()
{
+ OnCheckCast += SpellCheckCastFn(spell_dk_death_coil_SpellScript::CheckCast);
OnEffectHitTarget += SpellEffectFn(spell_dk_death_coil_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
@@ -769,16 +790,14 @@ class spell_dk_death_grip : public SpellScriptLoader
{
PrepareSpellScript(spell_dk_death_grip_SpellScript);
- void HandleDummy(SpellEffIndex effIndex)
+ void HandleDummy(SpellEffIndex /*effIndex*/)
{
int32 damage = GetEffectValue();
- Position pos;
+ Position const* pos = GetExplTargetDest();
if (Unit* target = GetHitUnit())
{
- GetSummonPosition(effIndex, pos, 0.0f, 0);
-
if (!target->HasAuraType(SPELL_AURA_DEFLECT_SPELLS)) // Deterrence
- target->CastSpell(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), damage, true);
+ target->CastSpell(pos->GetPositionX(), pos->GetPositionY(), pos->GetPositionZ(), damage, true);
}
}
diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp
index 4c440f18bd9..898350dbd71 100644
--- a/src/server/scripts/Spells/spell_druid.cpp
+++ b/src/server/scripts/Spells/spell_druid.cpp
@@ -237,7 +237,7 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
}
else
{
- unitList.remove(GetTargetUnit());
+ unitList.remove(GetExplTargetUnit());
std::list<Unit*> tempTargets;
for (std::list<Unit*>::const_iterator itr = unitList.begin(); itr != unitList.end(); ++itr)
if ((*itr)->GetTypeId() == TYPEID_PLAYER && GetCaster()->IsInRaidWith(*itr))
@@ -250,7 +250,7 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader
return;
}
- Unit* target = SelectRandomContainerElement(tempTargets);
+ Unit* target = Trinity::Containers::SelectRandomContainerElement(tempTargets);
unitList.clear();
unitList.push_back(target);
}
@@ -279,7 +279,7 @@ class spell_dru_starfall_aoe : public SpellScriptLoader
void FilterTargets(std::list<Unit*>& unitList)
{
- unitList.remove(GetTargetUnit());
+ unitList.remove(GetExplTargetUnit());
}
void Register()
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 886384a1c68..0c879cfb029 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -169,7 +169,7 @@ class spell_gen_burn_brutallus : public SpellScriptLoader
}
};
-enum eCannibalizeSpells
+enum CannibalizeSpells
{
SPELL_CANNIBALIZE_TRIGGERED = 20578,
};
@@ -224,7 +224,7 @@ class spell_gen_cannibalize : public SpellScriptLoader
};
// 45472 Parachute
-enum eParachuteSpells
+enum ParachuteSpells
{
SPELL_PARACHUTE = 45472,
SPELL_PARACHUTE_BUFF = 44795,
@@ -365,7 +365,7 @@ class spell_gen_remove_flight_auras : public SpellScriptLoader
};
// 66118 Leeching Swarm
-enum eLeechingSwarmSpells
+enum LeechingSwarmSpells
{
SPELL_LEECHING_SWARM_DMG = 66240,
SPELL_LEECHING_SWARM_HEAL = 66125,
@@ -481,7 +481,7 @@ class spell_gen_elune_candle : public SpellScriptLoader
};
// 24750 Trick
-enum eTrickSpells
+enum TrickSpells
{
SPELL_PIRATE_COSTUME_MALE = 24708,
SPELL_PIRATE_COSTUME_FEMALE = 24709,
@@ -557,7 +557,7 @@ class spell_gen_trick : public SpellScriptLoader
};
// 24751 Trick or Treat
-enum eTrickOrTreatSpells
+enum TrickOrTreatSpells
{
SPELL_TRICK = 24714,
SPELL_TREAT = 24715,
@@ -1234,30 +1234,30 @@ class spell_gen_magic_rooster : public SpellScriptLoader
class spell_gen_allow_cast_from_item_only : public SpellScriptLoader
{
-public:
- spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { }
-
- class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript);
+ public:
+ spell_gen_allow_cast_from_item_only() : SpellScriptLoader("spell_gen_allow_cast_from_item_only") { }
- SpellCastResult CheckRequirement()
+ class spell_gen_allow_cast_from_item_only_SpellScript : public SpellScript
{
- if (!GetCastItem())
- return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
- return SPELL_CAST_OK;
- }
+ PrepareSpellScript(spell_gen_allow_cast_from_item_only_SpellScript);
- void Register()
+ SpellCastResult CheckRequirement()
+ {
+ if (!GetCastItem())
+ return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
+ return SPELL_CAST_OK;
+ }
+
+ void Register()
+ {
+ OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
{
- OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement);
+ return new spell_gen_allow_cast_from_item_only_SpellScript();
}
- };
-
- SpellScript* GetSpellScript() const
- {
- return new spell_gen_allow_cast_from_item_only_SpellScript();
- }
};
enum Launch
@@ -1282,7 +1282,7 @@ class spell_gen_launch : public SpellScriptLoader
void Launch()
{
- WorldLocation const* const position = GetTargetDest();
+ WorldLocation const* const position = GetExplTargetDest();
if (Player* player = GetHitPlayer())
{
@@ -1312,6 +1312,11 @@ class spell_gen_launch : public SpellScriptLoader
}
};
+enum VehicleScaling
+{
+ SPELL_GEAR_SCALING = 66668,
+};
+
class spell_gen_vehicle_scaling : public SpellScriptLoader
{
public:
@@ -1323,7 +1328,7 @@ class spell_gen_vehicle_scaling : public SpellScriptLoader
bool Load()
{
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
}
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
@@ -1335,7 +1340,7 @@ class spell_gen_vehicle_scaling : public SpellScriptLoader
// TODO: Reserach coeffs for different vehicles
switch (GetId())
{
- case 66668:
+ case SPELL_GEAR_SCALING:
factor = 1.0f;
baseItemLevel = 205;
break;
@@ -1508,7 +1513,7 @@ class spell_gen_luck_of_the_draw : public SpellScriptLoader
if (group->isLFGGroup())
if (uint32 dungeonId = sLFGMgr->GetDungeon(group->GetGUID(), true))
if (LFGDungeonEntry const* dungeon = sLFGDungeonStore.LookupEntry(dungeonId))
- if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == map->GetDifficulty())
+ if (uint32(dungeon->map) == map->GetId() && dungeon->difficulty == uint32(map->GetDifficulty()))
if (randomDungeon && randomDungeon->type == LFG_TYPE_RANDOM)
return; // in correct dungeon
@@ -1585,19 +1590,17 @@ class spell_gen_spirit_healer_res : public SpellScriptLoader
bool Load()
{
- return GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER;
+ return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER;
}
void HandleDummy(SpellEffIndex /* effIndex */)
{
- if (Player* originalCaster = GetOriginalCaster()->ToPlayer())
+ Player* originalCaster = GetOriginalCaster()->ToPlayer();
+ if (Unit* target = GetHitUnit())
{
- if (Unit* target = GetHitUnit())
- {
- WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8);
- data << uint64(target->GetGUID());
- originalCaster->GetSession()->SendPacket(&data);
- }
+ WorldPacket data(SMSG_SPIRIT_HEALER_CONFIRM, 8);
+ data << uint64(target->GetGUID());
+ originalCaster->GetSession()->SendPacket(&data);
}
}
@@ -2550,6 +2553,141 @@ class spell_gen_chaos_blast : public SpellScriptLoader
};
+class spell_gen_ds_flush_knockback : public SpellScriptLoader
+{
+ public:
+ spell_gen_ds_flush_knockback() : SpellScriptLoader("spell_gen_ds_flush_knockback") {}
+
+ class spell_gen_ds_flush_knockback_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_ds_flush_knockback_SpellScript);
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ // Here the target is the water spout and determines the position where the player is knocked from
+ if (Unit* target = GetHitUnit())
+ {
+ if (Player* player = GetCaster()->ToPlayer())
+ {
+ float horizontalSpeed = 20.0f + (40.0f - GetCaster()->GetDistance(target));
+ float verticalSpeed = 8.0f;
+ // This method relies on the Dalaran Sewer map disposition and Water Spout position
+ // What we do is knock the player from a position exactly behind him and at the end of the pipe
+ player->KnockbackFrom(target->GetPositionX(), player->GetPositionY(), horizontalSpeed, verticalSpeed);
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_ds_flush_knockback_SpellScript();
+ }
+};
+
+class spell_gen_wg_water : public SpellScriptLoader
+{
+ public:
+ spell_gen_wg_water() : SpellScriptLoader("spell_gen_wg_water") {}
+
+ class spell_gen_wg_water_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_wg_water_SpellScript);
+
+ SpellCastResult CheckCast()
+ {
+ if (!GetSpellInfo()->CheckTargetCreatureType(GetCaster()))
+ return SPELL_FAILED_DONT_REPORT;
+ return SPELL_CAST_OK;
+ }
+
+ void Register()
+ {
+ OnCheckCast += SpellCheckCastFn(spell_gen_wg_water_SpellScript::CheckCast);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_wg_water_SpellScript();
+ }
+};
+
+class spell_gen_count_pct_from_max_hp : public SpellScriptLoader
+{
+ public:
+ spell_gen_count_pct_from_max_hp(char const* name, int32 damagePct = 0) : SpellScriptLoader(name), _damagePct(damagePct) { }
+
+ class spell_gen_count_pct_from_max_hp_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_count_pct_from_max_hp_SpellScript)
+
+ public:
+ spell_gen_count_pct_from_max_hp_SpellScript(int32 damagePct) : SpellScript(), _damagePct(damagePct) { }
+
+ void RecalculateDamage()
+ {
+ if (!_damagePct)
+ _damagePct = GetHitDamage();
+
+ SetHitDamage(GetHitUnit()->CountPctFromMaxHealth(_damagePct));
+ }
+
+ void Register()
+ {
+ OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage);
+ }
+
+ private:
+ int32 _damagePct;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct);
+ }
+
+ private:
+ int32 _damagePct;
+};
+
+class spell_gen_despawn_self : public SpellScriptLoader
+{
+public:
+ spell_gen_despawn_self() : SpellScriptLoader("spell_gen_despawn_self") { }
+
+ class spell_gen_despawn_self_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_gen_despawn_self_SpellScript);
+
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_UNIT;
+ }
+
+ void HandleDummy(SpellEffIndex effIndex)
+ {
+ if (GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_DUMMY || GetSpellInfo()->Effects[effIndex].Effect == SPELL_EFFECT_SCRIPT_EFFECT)
+ GetCaster()->ToCreature()->DespawnOrUnsummon();
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_gen_despawn_self_SpellScript();
+ }
+};
+
void AddSC_generic_spell_scripts()
{
new spell_gen_absorb0_hitlimit1();
@@ -2599,4 +2737,9 @@ void AddSC_generic_spell_scripts()
new spell_gen_on_tournament_mount();
new spell_gen_tournament_pennant();
new spell_gen_chaos_blast();
+ new spell_gen_ds_flush_knockback();
+ new spell_gen_wg_water();
+ new spell_gen_count_pct_from_max_hp("spell_gen_default_count_pct_from_max_hp");
+ new spell_gen_count_pct_from_max_hp("spell_gen_50pct_count_pct_from_max_hp", 50);
+ new spell_gen_despawn_self();
}
diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp
index 855af75cd83..896ed331bde 100644
--- a/src/server/scripts/Spells/spell_hunter.cpp
+++ b/src/server/scripts/Spells/spell_hunter.cpp
@@ -137,8 +137,9 @@ class spell_hun_chimera_shot : public SpellScriptLoader
{
int32 TickCount = aurEff->GetTotalTicks();
spellId = HUNTER_SPELL_CHIMERA_SHOT_SERPENT;
- basePoint = caster->SpellDamageBonus(unitTarget, aura->GetSpellInfo(), aurEff->GetAmount(), DOT, aura->GetStackAmount());
+ basePoint = caster->SpellDamageBonusDone(unitTarget, aura->GetSpellInfo(), aurEff->GetAmount(), DOT, aura->GetStackAmount());
ApplyPctN(basePoint, TickCount * 40);
+ basePoint = unitTarget->SpellDamageBonusTaken(caster, aura->GetSpellInfo(), basePoint, DOT, aura->GetStackAmount());
}
// Viper Sting - Instantly restores mana to you equal to 60% of the total amount drained by your Viper Sting.
else if (familyFlag[1] & 0x00000080)
@@ -286,8 +287,8 @@ class spell_hun_masters_call : public SpellScriptLoader
target->CastSpell(target, HUNTER_SPELL_MASTERS_CALL_TRIGGERED, castMask);
// there is a possibility that this effect should access effect 0 (dummy) target, but i dubt that
// it's more likely that on on retail it's possible to call target selector based on dbc values
- // anyways, we're using GetTargetUnit() here and it's ok
- if (Unit* ally = GetTargetUnit())
+ // anyways, we're using GetExplTargetUnit() here and it's ok
+ if (Unit* ally = GetExplTargetUnit())
{
target->CastSpell(ally, GetEffectValue(), castMask);
target->CastSpell(ally, GetSpellInfo()->Effects[EFFECT_0].CalcValue(), castMask);
@@ -560,6 +561,64 @@ class spell_hun_pet_carrion_feeder : public SpellScriptLoader
}
};
+// 34477 Misdirection
+class spell_hun_misdirection : public SpellScriptLoader
+{
+ public:
+ spell_hun_misdirection() : SpellScriptLoader("spell_hun_misdirection") { }
+
+ class spell_hun_misdirection_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_misdirection_AuraScript);
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Unit* caster = GetCaster())
+ if (!GetDuration())
+ caster->SetReducedThreatPercent(0, 0);
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_hun_misdirection_AuraScript();
+ }
+};
+
+// 35079 Misdirection proc
+class spell_hun_misdirection_proc : public SpellScriptLoader
+{
+ public:
+ spell_hun_misdirection_proc() : SpellScriptLoader("spell_hun_misdirection_proc") { }
+
+ class spell_hun_misdirection_proc_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_hun_misdirection_proc_AuraScript);
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (GetCaster())
+ GetCaster()->SetReducedThreatPercent(0, 0);
+ }
+
+ void Register()
+ {
+ AfterEffectRemove += AuraEffectRemoveFn(spell_hun_misdirection_proc_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_hun_misdirection_proc_AuraScript();
+ }
+};
+
+
void AddSC_hunter_spell_scripts()
{
new spell_hun_aspect_of_the_beast();
@@ -572,4 +631,6 @@ void AddSC_hunter_spell_scripts()
new spell_hun_sniper_training();
new spell_hun_pet_heart_of_the_phoenix();
new spell_hun_pet_carrion_feeder();
+ new spell_hun_misdirection();
+ new spell_hun_misdirection_proc();
}
diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp
index 416869d98ce..4e2eb633662 100644
--- a/src/server/scripts/Spells/spell_item.cpp
+++ b/src/server/scripts/Spells/spell_item.cpp
@@ -55,8 +55,8 @@ class spell_item_trigger_spell : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Unit* caster = GetCaster();
- if (Item* pItem = GetCastItem())
- caster->CastSpell(caster, _triggeredSpellId, true, pItem);
+ if (Item* item = GetCastItem())
+ caster->CastSpell(caster, _triggeredSpellId, true, item);
}
void Register()
@@ -1095,7 +1095,7 @@ class spell_item_shimmering_vessel : public SpellScriptLoader
void HandleDummy(SpellEffIndex /* effIndex */)
{
if (Creature* target = GetHitCreature())
- target->setDeathState(JUST_ALIVED);
+ target->setDeathState(JUST_RESPAWNED);
}
void Register()
@@ -1513,7 +1513,7 @@ class spell_item_complete_raptor_capture : public SpellScriptLoader
enum ImpaleLeviroth
{
NPC_LEVIROTH = 26452,
- SPELL_LEVIROTH_SELF_IMPALE = 49882
+ SPELL_LEVIROTH_SELF_IMPALE = 49882,
};
class spell_item_impale_leviroth : public SpellScriptLoader
@@ -1534,11 +1534,9 @@ class spell_item_impale_leviroth : public SpellScriptLoader
void HandleDummy(SpellEffIndex /* effIndex */)
{
- Unit* target = GetHitCreature();
- if (!target || target->GetEntry() != NPC_LEVIROTH || !target->HealthBelowPct(95))
- return;
-
- target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true);
+ if (Unit* target = GetHitCreature())
+ if (target->GetEntry() == NPC_LEVIROTH && !target->HealthBelowPct(95))
+ target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true);
}
void Register()
@@ -1591,15 +1589,15 @@ class spell_item_brewfest_mount_transformation : public SpellScriptLoader
{
case SPELL_BREWFEST_MOUNT_TRANSFORM:
if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f)
- spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100 ;
+ spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100;
else
- spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60 ;
+ spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60;
break;
case SPELL_BREWFEST_MOUNT_TRANSFORM_REVERSE:
if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f)
- spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100 ;
+ spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100;
else
- spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60 ;
+ spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60;
break;
default:
return;
@@ -1746,11 +1744,20 @@ class spell_item_rocket_boots : public SpellScriptLoader
if (Battleground* bg = caster->GetBattleground())
bg->EventPlayerDroppedFlag(caster);
+ caster->RemoveSpellCooldown(SPELL_ROCKET_BOOTS_PROC);
caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, NULL);
}
+ SpellCastResult CheckCast()
+ {
+ if (GetCaster()->IsInWater())
+ return SPELL_FAILED_ONLY_ABOVEWATER;
+ return SPELL_CAST_OK;
+ }
+
void Register()
{
+ OnCheckCast += SpellCheckCastFn(spell_item_rocket_boots_SpellScript::CheckCast);
OnEffectHitTarget += SpellEffectFn(spell_item_rocket_boots_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
@@ -1994,6 +2001,65 @@ class spell_item_refocus : public SpellScriptLoader
}
};
+class spell_item_muisek_vessel : public SpellScriptLoader
+{
+ public:
+ spell_item_muisek_vessel() : SpellScriptLoader("spell_item_muisek_vessel") { }
+
+ class spell_item_muisek_vessel_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_muisek_vessel_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (Creature* target = GetHitCreature())
+ if (target->isDead())
+ target->DespawnOrUnsummon();
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_muisek_vessel_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_muisek_vessel_SpellScript();
+ }
+};
+
+enum GreatmothersSoulcather
+{
+ SPELL_FORCE_CAST_SUMMON_GNOME_SOUL = 46486,
+};
+class spell_item_greatmothers_soulcatcher : public SpellScriptLoader
+{
+public:
+ spell_item_greatmothers_soulcatcher() : SpellScriptLoader("spell_item_greatmothers_soulcatcher") { }
+
+ class spell_item_greatmothers_soulcatcher_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_item_greatmothers_soulcatcher_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (GetHitUnit())
+ GetCaster()->CastSpell(GetCaster(),SPELL_FORCE_CAST_SUMMON_GNOME_SOUL);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_item_greatmothers_soulcatcher_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_item_greatmothers_soulcatcher_SpellScript();
+ }
+};
+
void AddSC_item_spell_scripts()
{
// 23074 Arcanite Dragonling
@@ -2045,4 +2111,6 @@ void AddSC_item_spell_scripts()
new spell_item_unusual_compass();
new spell_item_uded();
new spell_item_chicken_cover();
+ new spell_item_muisek_vessel();
+ new spell_item_greatmothers_soulcatcher();
}
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp
index ea1af10816b..050741ffaba 100644
--- a/src/server/scripts/Spells/spell_mage.cpp
+++ b/src/server/scripts/Spells/spell_mage.cpp
@@ -123,6 +123,12 @@ class spell_mage_cold_snap : public SpellScriptLoader
}
};
+enum SilvermoonPolymorph
+{
+ NPC_AUROSALIA = 18744,
+};
+
+// TODO: move out of here and rename - not a mage spell
class spell_mage_polymorph_cast_visual : public SpellScriptLoader
{
public:
@@ -132,22 +138,22 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader
{
PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript);
- static const uint32 spell_list[6];
+ static const uint32 PolymorhForms[6];
bool Validate(SpellInfo const* /*spellEntry*/)
{
// check if spell ids exist in dbc
- for (int i = 0; i < 6; i++)
- if (!sSpellMgr->GetSpellInfo(spell_list[i]))
+ for (uint32 i = 0; i < 6; i++)
+ if (!sSpellMgr->GetSpellInfo(PolymorhForms[i]))
return false;
return true;
}
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* unitTarget = GetHitUnit())
- if (unitTarget->GetTypeId() == TYPEID_UNIT)
- unitTarget->CastSpell(unitTarget, spell_list[urand(0, 5)], true);
+ if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f))
+ if (target->GetTypeId() == TYPEID_UNIT)
+ target->CastSpell(target, PolymorhForms[urand(0, 5)], true);
}
void Register()
@@ -163,7 +169,7 @@ class spell_mage_polymorph_cast_visual : public SpellScriptLoader
}
};
-const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::spell_list[6] =
+const uint32 spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] =
{
SPELL_MAGE_SQUIRREL_FORM,
SPELL_MAGE_GIRAFFE_FORM,
@@ -244,9 +250,11 @@ class spell_mage_frost_warding_trigger : public SpellScriptLoader
if (roll_chance_i(chance))
{
- absorbAmount = dmgInfo.GetDamage();
- int32 bp = absorbAmount;
+ int32 bp = dmgInfo.GetDamage();
+ dmgInfo.AbsorbDamage(bp);
target->CastCustomSpell(target, SPELL_MAGE_FROST_WARDING_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
+ absorbAmount = 0;
+ PreventDefaultAction();
}
}
}
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp
index d823c629d4b..4baa1eb3735 100644
--- a/src/server/scripts/Spells/spell_paladin.cpp
+++ b/src/server/scripts/Spells/spell_paladin.cpp
@@ -285,9 +285,29 @@ class spell_pal_holy_shock : public SpellScriptLoader
}
}
+ SpellCastResult CheckCast()
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ if (Unit* target = GetExplTargetUnit())
+ {
+ if (!caster->IsFriendlyTo(target))
+ {
+ if (!caster->IsValidAttackTarget(target))
+ return SPELL_FAILED_BAD_TARGETS;
+
+ if (!caster->isInFront(target))
+ return SPELL_FAILED_UNIT_NOT_INFRONT;
+ }
+ }
+ else
+ return SPELL_FAILED_BAD_TARGETS;
+ return SPELL_CAST_OK;
+ }
+
void Register()
{
// add dummy effect spell handler to Holy Shock
+ OnCheckCast += SpellCheckCastFn(spell_pal_holy_shock_SpellScript::CheckCast);
OnEffectHitTarget += SpellEffectFn(spell_pal_holy_shock_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp
index b012fe5f183..8088004c9d1 100644
--- a/src/server/scripts/Spells/spell_priest.cpp
+++ b/src/server/scripts/Spells/spell_priest.cpp
@@ -185,6 +185,11 @@ class spell_pri_penance : public SpellScriptLoader
{
PrepareSpellScript(spell_pri_penance_SpellScript);
+ bool Load()
+ {
+ return GetCaster()->GetTypeId() == TYPEID_PLAYER;
+ }
+
bool Validate(SpellInfo const* spellEntry)
{
if (!sSpellMgr->GetSpellInfo(PRIEST_SPELL_PENANCE_R1))
@@ -207,7 +212,7 @@ class spell_pri_penance : public SpellScriptLoader
Unit* caster = GetCaster();
if (Unit* unitTarget = GetHitUnit())
{
- if(!unitTarget->isAlive())
+ if (!unitTarget->isAlive())
return;
uint8 rank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
@@ -219,10 +224,20 @@ class spell_pri_penance : public SpellScriptLoader
}
}
+ SpellCastResult CheckCast()
+ {
+ Player* caster = GetCaster()->ToPlayer();
+ if (Unit* target = GetExplTargetUnit())
+ if (!caster->IsFriendlyTo(target) && !caster->IsValidAttackTarget(target))
+ return SPELL_FAILED_BAD_TARGETS;
+ return SPELL_CAST_OK;
+ }
+
void Register()
{
// add dummy effect spell handler to Penance
OnEffectHitTarget += SpellEffectFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ OnCheckCast += SpellCheckCastFn(spell_pri_penance_SpellScript::CheckCast);
}
};
@@ -275,12 +290,53 @@ class spell_pri_reflective_shield_trigger : public SpellScriptLoader
}
};
+enum PrayerOfMending
+{
+ SPELL_T9_HEALING_2_PIECE = 67201,
+};
+// Prayer of Mending Heal
+class spell_pri_prayer_of_mending_heal : public SpellScriptLoader
+{
+public:
+ spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { }
+
+ class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript);
+
+ void HandleHeal(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* caster = GetOriginalCaster())
+ {
+ if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_T9_HEALING_2_PIECE,EFFECT_0))
+ {
+ int32 heal = GetHitHeal();
+ AddPctN(heal, aurEff->GetAmount());
+ SetHitHeal(heal);
+ }
+ }
+
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_pri_prayer_of_mending_heal_SpellScript();
+ }
+};
+
void AddSC_priest_spell_scripts()
{
new spell_pri_guardian_spirit();
- new spell_pri_mana_burn;
- new spell_pri_pain_and_suffering_proc;
- new spell_pri_penance;
+ new spell_pri_mana_burn();
+ new spell_pri_pain_and_suffering_proc();
+ new spell_pri_penance();
new spell_pri_reflective_shield_trigger();
new spell_pri_mind_sear();
+ new spell_pri_prayer_of_mending_heal();
}
diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp
index 09c34e3499d..810cc20e04b 100644
--- a/src/server/scripts/Spells/spell_quest.cpp
+++ b/src/server/scripts/Spells/spell_quest.cpp
@@ -275,7 +275,7 @@ class spell_q11396_11399_scourging_crystal_controller : public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
- if (Unit* target = GetTargetUnit())
+ if (Unit* target = GetExplTargetUnit())
if (target->GetTypeId() == TYPEID_UNIT && target->HasAura(SPELL_FORCE_SHIELD_ARCANE_PURPLE_X3))
// Make sure nobody else is channeling the same target
if (!target->HasAura(SPELL_SCOURGING_CRYSTAL_CONTROLLER))
@@ -636,6 +636,10 @@ class spell_q12851_going_bearback : public SpellScriptLoader
if (Unit* caster = GetCaster())
{
Unit* target = GetTarget();
+ // Already in fire
+ if (target->HasAura(SPELL_ABLAZE))
+ return;
+
if (Player* player = caster->GetCharmerOrOwnerPlayerOrPlayerItself())
{
switch (target->GetEntry())
@@ -833,7 +837,7 @@ class spell_q12659_ahunaes_knife : public SpellScriptLoader
Player* caster = GetCaster()->ToPlayer();
if (Creature* target = GetHitCreature())
{
- target->ForcedDespawn();
+ target->DespawnOrUnsummon();
caster->KilledMonsterCredit(NPC_SCALPS_KC_BUNNY, 0);
}
}
@@ -1025,9 +1029,9 @@ class spell_q14112_14145_chum_the_water: public SpellScriptLoader
// http://old01.wowhead.com/quest=9452 - Red Snapper - Very Tasty!
enum RedSnapperVeryTasty
{
- SPELL_CAST_NET = 29866,
- ITEM_RED_SNAPPER = 23614,
- NPC_ANGRY_MURLOC = 17102,
+ SPELL_CAST_NET = 29866,
+ ITEM_RED_SNAPPER = 23614,
+ SPELL_NEW_SUMMON_TEST = 49214,
};
class spell_q9452_cast_net: public SpellScriptLoader
@@ -1047,16 +1051,10 @@ class spell_q9452_cast_net: public SpellScriptLoader
void HandleDummy(SpellEffIndex /*effIndex*/)
{
Player* caster = GetCaster()->ToPlayer();
- switch (urand(0, 2))
- {
- case 0: case 1:
- caster->AddItem(ITEM_RED_SNAPPER, 1);
- break;
- case 2:
- if (Creature* murloc = caster->SummonCreature(NPC_ANGRY_MURLOC, caster->GetPositionX()+5, caster->GetPositionY(), caster->GetPositionZ(), 0.0f, TEMPSUMMON_MANUAL_DESPAWN, 120000))
- murloc->AI()->AttackStart(caster);
- break;
- }
+ if (roll_chance_i(66))
+ caster->AddItem(ITEM_RED_SNAPPER, 1);
+ else
+ caster->CastSpell(caster, SPELL_NEW_SUMMON_TEST, true);
}
void Register()
@@ -1107,6 +1105,63 @@ public:
}
};
+enum LeaveNothingToChance
+{
+ NPC_UPPER_MINE_SHAFT = 27436,
+ NPC_LOWER_MINE_SHAFT = 27437,
+
+ SPELL_UPPER_MINE_SHAFT_CREDIT = 48744,
+ SPELL_LOWER_MINE_SHAFT_CREDIT = 48745,
+};
+
+class spell_q12277_wintergarde_mine_explosion : public SpellScriptLoader
+{
+ public:
+ spell_q12277_wintergarde_mine_explosion() : SpellScriptLoader("spell_q12277_wintergarde_mine_explosion") { }
+
+ class spell_q12277_wintergarde_mine_explosion_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_q12277_wintergarde_mine_explosion_SpellScript);
+
+ void HandleDummy(SpellEffIndex /*effIndex*/)
+ {
+ if (Creature* unitTarget = GetHitCreature())
+ {
+ if (Unit* caster = GetCaster())
+ {
+ if (caster->GetTypeId() == TYPEID_UNIT)
+ {
+ if (Unit* owner = caster->GetOwner())
+ {
+ switch (unitTarget->GetEntry())
+ {
+ case NPC_UPPER_MINE_SHAFT:
+ caster->CastSpell(owner, SPELL_UPPER_MINE_SHAFT_CREDIT, true);
+ break;
+ case NPC_LOWER_MINE_SHAFT:
+ caster->CastSpell(owner, SPELL_LOWER_MINE_SHAFT_CREDIT, true);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_q12277_wintergarde_mine_explosion_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_q12277_wintergarde_mine_explosion_SpellScript();
+ }
+};
+
void AddSC_quest_spell_scripts()
{
new spell_q55_sacred_cleansing();
@@ -1133,4 +1188,5 @@ void AddSC_quest_spell_scripts()
new spell_q14112_14145_chum_the_water();
new spell_q9452_cast_net();
new spell_q12987_read_pronouncement();
+ new spell_q12277_wintergarde_mine_explosion();
}
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 96ee7a18429..c9c036d5329 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -35,6 +35,9 @@ enum ShamanSpells
SHAMAN_SPELL_FIRE_NOVA_TRIGGERED_R1 = 8349,
SHAMAN_SPELL_SATED = 57724,
SHAMAN_SPELL_EXHAUSTION = 57723,
+
+ SHAMAN_SPELL_STORM_EARTH_AND_FIRE = 51483,
+ EARTHBIND_TOTEM_SPELL_EARTHGRAB = 64695,
// For Earthen Power
SHAMAN_TOTEM_SPELL_EARTHBIND_TOTEM = 6474,
@@ -210,20 +213,35 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
return true;
}
- void HandleEffectPeriodic(AuraEffect const* aurEff)
+ void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
{
- if (Unit* target = GetTarget())
- if (Unit* caster = aurEff->GetBase()->GetCaster())
- if (TempSummon* summon = caster->ToTempSummon())
- if (Unit* owner = summon->GetOwner())
- if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))
- if (roll_chance_i(aur->GetBaseAmount()) && target->HasAuraWithMechanic(1 << MECHANIC_SNARE))
- caster->CastSpell(caster, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true, NULL, aurEff);
+ if (!GetCaster())
+ return;
+ if (Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself())
+ if (AuraEffect* aur = owner->GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 2289, 0))
+ if (roll_chance_i(aur->GetBaseAmount()))
+ GetTarget()->CastSpell((Unit*)NULL, SHAMAN_TOTEM_SPELL_EARTHEN_POWER, true);
+ }
+
+ void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (!GetCaster())
+ return;
+ Player* owner = GetCaster()->GetCharmerOrOwnerPlayerOrPlayerItself();
+ if (!owner)
+ return;
+ // Storm, Earth and Fire
+ if (AuraEffect* aurEff = owner->GetAuraEffectOfRankedSpell(SHAMAN_SPELL_STORM_EARTH_AND_FIRE, EFFECT_1))
+ {
+ if (roll_chance_i(aurEff->GetAmount()))
+ GetCaster()->CastSpell(GetCaster(), EARTHBIND_TOTEM_SPELL_EARTHGRAB, false);
+ }
}
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_sha_earthbind_totem_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ OnEffectApply += AuraEffectApplyFn(spell_sha_earthbind_totem_AuraScript::Apply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
}
};
@@ -233,6 +251,46 @@ class spell_sha_earthbind_totem : public SpellScriptLoader
}
};
+class EarthenPowerTargetSelector
+{
+ public:
+ EarthenPowerTargetSelector() { }
+
+ bool operator() (Unit* target)
+ {
+ if (!target->HasAuraWithMechanic(1 << MECHANIC_SNARE))
+ return true;
+
+ return false;
+ }
+};
+
+class spell_sha_earthen_power : public SpellScriptLoader
+{
+ public:
+ spell_sha_earthen_power() : SpellScriptLoader("spell_sha_earthen_power") { }
+
+ class spell_sha_earthen_power_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_earthen_power_SpellScript);
+
+ void FilterTargets(std::list<Unit*>& unitList)
+ {
+ unitList.remove_if(EarthenPowerTargetSelector());
+ }
+
+ void Register()
+ {
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_sha_earthen_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_earthen_power_SpellScript();
+ }
+};
+
class spell_sha_bloodlust : public SpellScriptLoader
{
public:
@@ -251,7 +309,7 @@ class spell_sha_bloodlust : public SpellScriptLoader
void RemoveInvalidTargets(std::list<Unit*>& targets)
{
- targets.remove_if (Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED));
+ targets.remove_if(Trinity::UnitAuraCheck(true, SHAMAN_SPELL_SATED));
}
void ApplyDebuff()
@@ -430,7 +488,7 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
if (Unit* owner = caster->GetOwner())
{
if (triggeringSpell)
- damage = int32(owner->SpellHealingBonus(target, triggeringSpell, damage, HEAL));
+ damage = int32(owner->SpellHealingBonusDone(target, triggeringSpell, damage, HEAL));
// Restorative Totems
if (AuraEffect* dummy = owner->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, ICON_ID_RESTORATIVE_TOTEMS, 1))
@@ -439,6 +497,8 @@ class spell_sha_healing_stream_totem : public SpellScriptLoader
// Glyph of Healing Stream Totem
if (AuraEffect const* aurEff = owner->GetAuraEffect(SPELL_GLYPH_OF_HEALING_STREAM_TOTEM, EFFECT_0))
AddPctN(damage, aurEff->GetAmount());
+
+ damage = int32(target->SpellHealingBonusTaken(owner, triggeringSpell, damage, HEAL));
}
caster->CastCustomSpell(target, SPELL_HEALING_STREAM_TOTEM_HEAL, &damage, 0, 0, true, 0, 0, GetOriginalCaster()->GetGUID());
}
@@ -542,6 +602,55 @@ class spell_sha_lava_lash : public SpellScriptLoader
}
};
+// 1064 Chain Heal
+class spell_sha_chain_heal : public SpellScriptLoader
+{
+ public:
+ spell_sha_chain_heal() : SpellScriptLoader("spell_sha_chain_heal") { }
+
+ class spell_sha_chain_heal_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_sha_chain_heal_SpellScript);
+
+ bool Load()
+ {
+ firstHeal = true;
+ riptide = false;
+ return true;
+ }
+
+ void HandleHeal(SpellEffIndex /*effIndex*/)
+ {
+ if (firstHeal)
+ {
+ // Check if the target has Riptide
+ if (AuraEffect* aurEff = GetHitUnit()->GetAuraEffect(SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_SHAMAN, 0, 0, 0x10, GetCaster()->GetGUID()))
+ {
+ riptide = true;
+ // Consume it
+ GetHitUnit()->RemoveAura(aurEff->GetBase());
+ }
+ firstHeal = false;
+ }
+ // Riptide increases the Chain Heal effect by 25%
+ if (riptide)
+ SetHitHeal(GetHitHeal() * 1.25f);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_sha_chain_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);
+ }
+
+ bool firstHeal;
+ bool riptide;
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_sha_chain_heal_SpellScript();
+ }
+};
void AddSC_shaman_spell_scripts()
{
@@ -549,6 +658,7 @@ void AddSC_shaman_spell_scripts()
new spell_sha_fire_nova();
new spell_sha_mana_tide_totem();
new spell_sha_earthbind_totem();
+ new spell_sha_earthen_power();
new spell_sha_bloodlust();
new spell_sha_heroism();
new spell_sha_ancestral_awakening_proc();
@@ -556,4 +666,5 @@ void AddSC_shaman_spell_scripts()
new spell_sha_healing_stream_totem();
new spell_sha_mana_spring_totem();
new spell_sha_lava_lash();
+ new spell_sha_chain_heal();
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index b1aff706db0..838b9e4f932 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -34,6 +34,9 @@ enum WarlockSpells
WARLOCK_DEMONIC_EMPOWERMENT_IMP = 54444,
WARLOCK_IMPROVED_HEALTHSTONE_R1 = 18692,
WARLOCK_IMPROVED_HEALTHSTONE_R2 = 18693,
+ WARLOCK_DEMONIC_CIRCLE_SUMMON = 48018,
+ WARLOCK_DEMONIC_CIRCLE_TELEPORT = 48020,
+ WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST = 62388,
};
class spell_warl_banish : public SpellScriptLoader
@@ -169,6 +172,19 @@ class spell_warl_create_healthstone : public SpellScriptLoader
return true;
}
+ SpellCastResult CheckCast()
+ {
+ if (Player* caster = GetCaster()->ToPlayer())
+ {
+ uint8 spellRank = sSpellMgr->GetSpellRank(GetSpellInfo()->Id);
+ ItemPosCountVec dest;
+ InventoryResult msg = caster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, iTypes[spellRank - 1][0], 1, NULL);
+ if (msg != EQUIP_ERR_OK)
+ return SPELL_FAILED_TOO_MANY_OF_ITEM;
+ }
+ return SPELL_CAST_OK;
+ }
+
void HandleScriptEffect(SpellEffIndex effIndex)
{
if (Unit* unitTarget = GetHitUnit())
@@ -195,6 +211,7 @@ class spell_warl_create_healthstone : public SpellScriptLoader
void Register()
{
OnEffectHitTarget += SpellEffectFn(spell_warl_create_healthstone_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ OnCheckCast += SpellCheckCastFn(spell_warl_create_healthstone_SpellScript::CheckCast);
}
};
@@ -284,8 +301,8 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader
void FilterTargets(std::list<Unit*>& unitList)
{
- if (GetTargetUnit())
- unitList.remove(GetTargetUnit());
+ if (GetExplTargetUnit())
+ unitList.remove(GetExplTargetUnit());
}
void Register()
@@ -327,11 +344,7 @@ class spell_warl_soulshatter : public SpellScriptLoader
if (Unit* target = GetHitUnit())
{
if (target->CanHaveThreatList() && target->getThreatManager().getThreat(caster) > 0.0f)
- {
- sLog->outString("THREATREDUCTION");
caster->CastSpell(target, SPELL_SOULSHATTER, true);
- } else
- sLog->outString("can have threat? %u . threat number? %f ",target->CanHaveThreatList(),target->getThreatManager().getThreat(caster));
}
}
@@ -349,9 +362,6 @@ class spell_warl_soulshatter : public SpellScriptLoader
enum LifeTap
{
- SPELL_LIFE_TAP_RANK_6 = 11689,
- SPELL_LIFE_TAP_RANK_7 = 27222,
- SPELL_LIFE_TAP_RANK_8 = 57946,
SPELL_LIFE_TAP_ENERGIZE = 31818,
SPELL_LIFE_TAP_ENERGIZE_2 = 32553,
ICON_ID_IMPROVED_LIFE_TAP = 208,
@@ -374,9 +384,7 @@ class spell_warl_life_tap : public SpellScriptLoader
bool Validate(SpellInfo const* /*spell*/)
{
- if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_RANK_6) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_RANK_7)
- || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_RANK_8) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE)
- || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE_2))
+ if (!sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE) || !sSpellMgr->GetSpellInfo(SPELL_LIFE_TAP_ENERGIZE_2))
return false;
return true;
}
@@ -386,18 +394,8 @@ class spell_warl_life_tap : public SpellScriptLoader
Player* caster = GetCaster()->ToPlayer();
if (Unit* target = GetHitUnit())
{
- SpellInfo const* spellInfo = GetSpellInfo();
- float spFactor = 0.0f;
- int32 damage = int32(GetEffectValue() + (6.3875 * spellInfo->BaseLevel));
- switch (spellInfo->Id)
- {
- case SPELL_LIFE_TAP_RANK_6: spFactor = 0.2f; break;
- case SPELL_LIFE_TAP_RANK_7:
- case SPELL_LIFE_TAP_RANK_8: spFactor = 0.5f; break;
- default: break;
- }
-
- int32 mana = int32(damage + (caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * spFactor));
+ int32 damage = GetEffectValue();
+ int32 mana = int32(damage + (caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+SPELL_SCHOOL_SHADOW) * 0.5f));
// Shouldn't Appear in Combat Log
target->ModifyHealth(-damage);
@@ -424,9 +422,7 @@ class spell_warl_life_tap : public SpellScriptLoader
SpellCastResult CheckCast()
{
if ((int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue() + (6.3875 * GetSpellInfo()->BaseLevel))))
- {
return SPELL_CAST_OK;
- }
return SPELL_FAILED_FIZZLE;
}
@@ -443,6 +439,90 @@ class spell_warl_life_tap : public SpellScriptLoader
}
};
+class spell_warl_demonic_circle_summon : public SpellScriptLoader
+{
+ public:
+ spell_warl_demonic_circle_summon() : SpellScriptLoader("spell_warl_demonic_circle_summon") { }
+
+ class spell_warl_demonic_circle_summon_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_demonic_circle_summon_AuraScript);
+
+ void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode)
+ {
+ // If effect is removed by expire remove the summoned demonic circle too.
+ if (!(mode & AURA_EFFECT_HANDLE_REAPPLY))
+ GetTarget()->RemoveGameObject(GetId(), true);
+
+ GetTarget()->RemoveAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
+ }
+
+ void HandleDummyTick(AuraEffect const* /*aurEff*/)
+ {
+ if (GameObject* circle = GetTarget()->GetGameObject(GetId()))
+ {
+ // Here we check if player is in demonic circle teleport range, if so add
+ // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT.
+ // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST.
+
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(WARLOCK_DEMONIC_CIRCLE_TELEPORT);
+
+ if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true)))
+ {
+ if (!GetTarget()->HasAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST))
+ GetTarget()->CastSpell(GetTarget(), WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true);
+ }
+ else
+ GetTarget()->RemoveAura(WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST);
+ }
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectApplyFn(spell_warl_demonic_circle_summon_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_demonic_circle_summon_AuraScript();
+ }
+};
+
+class spell_warl_demonic_circle_teleport : public SpellScriptLoader
+{
+ public:
+ spell_warl_demonic_circle_teleport() : SpellScriptLoader("spell_warl_demonic_circle_teleport") { }
+
+ class spell_warl_demonic_circle_teleport_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_warl_demonic_circle_teleport_AuraScript);
+
+ void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (Player* player = GetTarget()->ToPlayer())
+ {
+ if (GameObject* circle = player->GetGameObject(WARLOCK_DEMONIC_CIRCLE_SUMMON))
+ {
+ player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation());
+ player->RemoveMovementImpairingAuras();
+ }
+ }
+ }
+
+ void Register()
+ {
+ OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport_AuraScript::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_warl_demonic_circle_teleport_AuraScript();
+ }
+};
+
void AddSC_warlock_spell_scripts()
{
new spell_warl_banish();
@@ -453,4 +533,6 @@ void AddSC_warlock_spell_scripts()
new spell_warl_seed_of_corruption();
new spell_warl_soulshatter();
new spell_warl_life_tap();
+ new spell_warl_demonic_circle_summon();
+ new spell_warl_demonic_circle_teleport();
}
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 1084398c37d..0ba5c866d63 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -177,24 +177,27 @@ class spell_warr_deep_wounds : public SpellScriptLoader
void HandleDummy(SpellEffIndex /* effIndex */)
{
int32 damage = GetEffectValue();
+ Unit* caster = GetCaster();
if (Unit* target = GetHitUnit())
- if (Unit* caster = GetCaster())
- {
- // apply percent damage mods
- damage = caster->SpellDamageBonus(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
+ {
+ // apply percent damage mods
+ damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
- ApplyPctN(damage, 16 * sSpellMgr->GetSpellRank(GetSpellInfo()->Id));
+ ApplyPctN(damage, 16 * sSpellMgr->GetSpellRank(GetSpellInfo()->Id));
+
+ damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE);
+
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_PERIODIC);
+ uint32 ticks = spellInfo->GetDuration() / spellInfo->Effects[EFFECT_0].Amplitude;
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_DEEP_WOUNDS_RANK_PERIODIC);
- uint32 ticks = spellInfo->GetDuration() / spellInfo->Effects[EFFECT_0].Amplitude;
+ // Add remaining ticks to damage done
+ if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID()))
+ damage += aurEff->GetAmount() * (ticks - aurEff->GetTickNumber());
- // Add remaining ticks to damage done
- if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_DEEP_WOUNDS_RANK_PERIODIC, EFFECT_0, caster->GetGUID()))
- damage += aurEff->GetAmount() * (ticks - aurEff->GetTickNumber());
+ damage = damage / ticks;
- damage = damage / ticks;
- caster->CastCustomSpell(target, SPELL_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true);
- }
+ caster->CastCustomSpell(target, SPELL_DEEP_WOUNDS_RANK_PERIODIC, &damage, NULL, NULL, true);
+ }
}
void Register()
@@ -365,7 +368,7 @@ class spell_warr_concussion_blow : public SpellScriptLoader
void HandleDummy(SpellEffIndex /* effIndex */)
{
- SetHitDamage(GetHitDamage() + CalculatePctF(GetHitDamage(),GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK)));
+ SetHitDamage(CalculatePctN(GetCaster()->GetTotalAttackPowerValue(BASE_ATTACK), GetEffectValue()));
}
void Register()
@@ -397,8 +400,7 @@ class spell_warr_bloodthirst : public SpellScriptLoader
void HandleDummy(SpellEffIndex /* effIndex */)
{
int32 damage = GetEffectValue();
- if (GetHitUnit())
- GetCaster()->CastCustomSpell(GetHitUnit(), SPELL_BLOODTHIRST, &damage, NULL, NULL, true, NULL);
+ GetCaster()->CastCustomSpell(GetCaster(), SPELL_BLOODTHIRST, &damage, NULL, NULL, true, NULL);
}
void Register()
@@ -413,6 +415,51 @@ class spell_warr_bloodthirst : public SpellScriptLoader
}
};
+enum Overpower
+{
+ SPELL_UNRELENTING_ASSAULT_RANK_1 = 46859,
+ SPELL_UNRELENTING_ASSAULT_RANK_2 = 46860,
+ SPELL_UNRELENTING_ASSAULT_TRIGGER_1 = 64849,
+ SPELL_UNRELENTING_ASSAULT_TRIGGER_2 = 64850,
+};
+
+class spell_warr_overpower : public SpellScriptLoader
+{
+public:
+ spell_warr_overpower() : SpellScriptLoader("spell_warr_overpower") { }
+
+ class spell_warr_overpower_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_warr_overpower_SpellScript);
+
+ void HandleEffect(SpellEffIndex /* effIndex */)
+ {
+ uint32 spellId = 0;
+ if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_1))
+ spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_1;
+ else if (GetCaster()->HasAura(SPELL_UNRELENTING_ASSAULT_RANK_2))
+ spellId = SPELL_UNRELENTING_ASSAULT_TRIGGER_2;
+
+ if (!spellId)
+ return;
+
+ if (Player* target = GetHitPlayer())
+ if (target->HasUnitState(UNIT_STATE_CASTING))
+ target->CastSpell(target, spellId, true);
+ }
+
+ void Register()
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_warr_overpower_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_ANY);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_warr_overpower_SpellScript();
+ }
+};
+
void AddSC_warrior_spell_scripts()
{
new spell_warr_last_stand();
@@ -424,4 +471,5 @@ void AddSC_warrior_spell_scripts()
new spell_warr_execute();
new spell_warr_concussion_blow();
new spell_warr_bloodthirst();
+ new spell_warr_overpower();
}