aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorForesterDev <11771800+ForesterDev@users.noreply.github.com>2019-08-23 21:24:56 +0400
committerGiacomo Pozzoni <giacomopoz@gmail.com>2019-08-23 19:24:56 +0200
commit448facc5e794bde5068533825ebfd55435effb57 (patch)
tree9df1c5ea6f2cb7f9b2e49d00fbaf0d66fc48cfc2
parent10f6e3818578410246750c6fce53d189ad05bee4 (diff)
Core/Spells: Fixed warlock's Banish cancel if target was already banished (#23697)
* Core/Spells: Add SpellMissInfo argument to BeforeHit hooks and call them also when the spell doesn't hit. (#17613) (cherry picked from commit 8ff5b35be1256d03b85438b130dcec7cd4cae6e1) # Conflicts: # src/server/game/Spells/Spell.cpp # src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp # src/server/scripts/Spells/spell_warlock.cpp * Core/Spells: Fixed warlock's Banish cancel if target was already banished (#17614) (cherry picked from commit 4587b5d88082d2c6416fafaa2f5b9f5f15038520) # Conflicts: # src/server/scripts/Spells/spell_warlock.cpp
-rw-r--r--src/server/game/Spells/Spell.cpp12
-rw-r--r--src/server/game/Spells/Spell.h2
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
-rw-r--r--src/server/game/Spells/SpellScript.cpp10
-rw-r--r--src/server/game/Spells/SpellScript.h18
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp7
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp7
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp6
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp7
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp14
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp7
-rw-r--r--src/server/scripts/Spells/spell_rogue.cpp7
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp32
13 files changed, 81 insertions, 50 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 5e05fd2f911..740f7afdfab 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -2284,6 +2284,8 @@ void Spell::TargetInfo::PreprocessTarget(Spell* spell)
if ((MissCondition == SPELL_MISS_IMMUNE || MissCondition == SPELL_MISS_IMMUNE2) && spell->m_caster->GetTypeId() == TYPEID_PLAYER && unit->GetTypeId() == TYPEID_PLAYER && spell->m_caster->IsValidAttackTarget(unit, spell->GetSpellInfo()))
unit->SetInCombatWith(spell->m_caster->ToPlayer());
+ spell->CallScriptBeforeHitHandlers(MissCondition);
+
_enablePVP = false; // need to check PvP state before spell effects, but act on it afterwards
if (_spellHitTarget)
{
@@ -2592,7 +2594,7 @@ void Spell::GOTargetInfo::DoTargetSpellHit(Spell* spell, uint8 effIndex)
if (!go)
return;
- spell->CallScriptBeforeHitHandlers();
+ spell->CallScriptBeforeHitHandlers(SPELL_MISS_NONE);
spell->HandleEffects(nullptr, nullptr, go, effIndex, SPELL_EFFECT_HANDLE_HIT_TARGET);
@@ -2616,7 +2618,7 @@ void Spell::GOTargetInfo::DoTargetSpellHit(Spell* spell, uint8 effIndex)
void Spell::ItemTargetInfo::DoTargetSpellHit(Spell* spell, uint8 effIndex)
{
- spell->CallScriptBeforeHitHandlers();
+ spell->CallScriptBeforeHitHandlers(SPELL_MISS_NONE);
spell->HandleEffects(nullptr, TargetItem, nullptr, effIndex, SPELL_EFFECT_HANDLE_HIT_TARGET);
@@ -2638,8 +2640,6 @@ SpellMissInfo Spell::PreprocessSpellHit(Unit* unit, bool scaleAura, TargetInfo&
if (m_spellInfo->Speed && unit->IsImmunedToSpell(m_spellInfo, m_caster))
return SPELL_MISS_IMMUNE;
- CallScriptBeforeHitHandlers();
-
if (Player* player = unit->ToPlayer())
{
player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, m_spellInfo->Id);
@@ -7826,7 +7826,7 @@ void Spell::CallScriptSuccessfulDispel(SpellEffIndex effIndex)
}
}
-void Spell::CallScriptBeforeHitHandlers()
+void Spell::CallScriptBeforeHitHandlers(SpellMissInfo missInfo)
{
for (auto scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr)
{
@@ -7834,7 +7834,7 @@ void Spell::CallScriptBeforeHitHandlers()
(*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_BEFORE_HIT);
auto hookItrEnd = (*scritr)->BeforeHit.end(), hookItr = (*scritr)->BeforeHit.begin();
for (; hookItr != hookItrEnd; ++hookItr)
- (*hookItr).Call(*scritr);
+ (*hookItr).Call(*scritr, missInfo);
(*scritr)->_FinishScriptCall();
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 13d15773e3d..b8ddb3895b1 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -740,7 +740,7 @@ class TC_GAME_API Spell
SpellCastResult CallScriptCheckCastHandlers();
bool CallScriptEffectHandlers(SpellEffIndex effIndex, SpellEffectHandleMode mode);
void CallScriptSuccessfulDispel(SpellEffIndex effIndex);
- void CallScriptBeforeHitHandlers();
+ void CallScriptBeforeHitHandlers(SpellMissInfo missInfo);
void CallScriptOnHitHandlers();
void CallScriptAfterHitHandlers();
void CallScriptObjectAreaTargetSelectHandlers(std::list<WorldObject*>& targets, SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType);
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index f5c6f1d9f25..fcff4b49a36 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1346,7 +1346,7 @@ bool SpellInfo::CanPierceImmuneAura(SpellInfo const* auraSpellInfo) const
// ...but not these (Divine shield, Ice block, Cyclone and Banish for example)
if (auraSpellInfo->Mechanic != MECHANIC_IMMUNE_SHIELD &&
auraSpellInfo->Mechanic != MECHANIC_INVULNERABILITY &&
- (auraSpellInfo->Mechanic != MECHANIC_BANISH || (IsRankOf(auraSpellInfo) && auraSpellInfo->Dispel != DISPEL_NONE))) // Banish shouldn't be immune to itself, but Cyclone should
+ auraSpellInfo->Mechanic != MECHANIC_BANISH)
return true;
}
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index 3a777643933..784b009b3c2 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -220,6 +220,16 @@ void SpellScript::EffectHandler::Call(SpellScript* spellScript, SpellEffIndex ef
(spellScript->*pEffectHandlerScript)(effIndexToHandle);
}
+SpellScript::BeforeHitHandler::BeforeHitHandler(SpellBeforeHitFnType pBeforeHitHandlerScript)
+{
+ _pBeforeHitHandlerScript = pBeforeHitHandlerScript;
+}
+
+void SpellScript::BeforeHitHandler::Call(SpellScript* spellScript, SpellMissInfo missInfo)
+{
+ (spellScript->*_pBeforeHitHandlerScript)(missInfo);
+}
+
SpellScript::HitHandler::HitHandler(SpellHitFnType _pHitHandlerScript)
{
pHitHandlerScript = _pHitHandlerScript;
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index d2cf973c9a0..e455398c2db 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -189,6 +189,7 @@ class TC_GAME_API SpellScript : public _SpellScript
#define SPELLSCRIPT_FUNCTION_TYPE_DEFINES(CLASSNAME) \
typedef SpellCastResult(CLASSNAME::*SpellCheckCastFnType)(); \
typedef void(CLASSNAME::*SpellEffectFnType)(SpellEffIndex); \
+ typedef void(CLASSNAME::*SpellBeforeHitFnType)(SpellMissInfo missInfo); \
typedef void(CLASSNAME::*SpellHitFnType)(); \
typedef void(CLASSNAME::*SpellCastFnType)(); \
typedef void(CLASSNAME::*SpellObjectAreaTargetSelectFnType)(std::list<WorldObject*>&); \
@@ -235,6 +236,15 @@ class TC_GAME_API SpellScript : public _SpellScript
SpellHitFnType pHitHandlerScript;
};
+ class TC_GAME_API BeforeHitHandler
+ {
+ public:
+ BeforeHitHandler(SpellBeforeHitFnType pBeforeHitHandlerScript);
+ void Call(SpellScript* spellScript, SpellMissInfo missInfo);
+ private:
+ SpellBeforeHitFnType _pBeforeHitHandlerScript;
+ };
+
class TC_GAME_API TargetHook : public _SpellScript::EffectHook
{
public:
@@ -280,6 +290,7 @@ class TC_GAME_API SpellScript : public _SpellScript
class CheckCastHandlerFunction : public SpellScript::CheckCastHandler { public: CheckCastHandlerFunction(SpellCheckCastFnType _checkCastHandlerScript) : SpellScript::CheckCastHandler((SpellScript::SpellCheckCastFnType)_checkCastHandlerScript) { } }; \
class EffectHandlerFunction : public SpellScript::EffectHandler { public: EffectHandlerFunction(SpellEffectFnType _pEffectHandlerScript, uint8 _effIndex, uint16 _effName) : SpellScript::EffectHandler((SpellScript::SpellEffectFnType)_pEffectHandlerScript, _effIndex, _effName) { } }; \
class HitHandlerFunction : public SpellScript::HitHandler { public: HitHandlerFunction(SpellHitFnType _pHitHandlerScript) : SpellScript::HitHandler((SpellScript::SpellHitFnType)_pHitHandlerScript) { } }; \
+ class BeforeHitHandlerFunction : public SpellScript::BeforeHitHandler { public: BeforeHitHandlerFunction(SpellBeforeHitFnType pBeforeHitHandlerScript) : SpellScript::BeforeHitHandler((SpellScript::SpellBeforeHitFnType)pBeforeHitHandlerScript) { } }; \
class ObjectAreaTargetSelectHandlerFunction : public SpellScript::ObjectAreaTargetSelectHandler { public: ObjectAreaTargetSelectHandlerFunction(SpellObjectAreaTargetSelectFnType _pObjectAreaTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectAreaTargetSelectHandler((SpellScript::SpellObjectAreaTargetSelectFnType)_pObjectAreaTargetSelectHandlerScript, _effIndex, _targetType) { } }; \
class ObjectTargetSelectHandlerFunction : public SpellScript::ObjectTargetSelectHandler { public: ObjectTargetSelectHandlerFunction(SpellObjectTargetSelectFnType _pObjectTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::ObjectTargetSelectHandler((SpellScript::SpellObjectTargetSelectFnType)_pObjectTargetSelectHandlerScript, _effIndex, _targetType) { } }; \
class DestinationTargetSelectHandlerFunction : public SpellScript::DestinationTargetSelectHandler { public: DestinationTargetSelectHandlerFunction(SpellDestinationTargetSelectFnType _DestinationTargetSelectHandlerScript, uint8 _effIndex, uint16 _targetType) : SpellScript::DestinationTargetSelectHandler((SpellScript::SpellDestinationTargetSelectFnType)_DestinationTargetSelectHandlerScript, _effIndex, _targetType) { } }
@@ -329,8 +340,11 @@ class TC_GAME_API SpellScript : public _SpellScript
HookList<EffectHandler> OnEffectSuccessfulDispel;
#define SpellEffectFn(F, I, N) EffectHandlerFunction(&F, I, N)
- // example: BeforeHit += SpellHitFn(class::function);
- HookList<HitHandler> BeforeHit;
+ // example: BeforeHit += BeforeSpellHitFn(class::function);
+ // where function is void function(SpellMissInfo missInfo)
+ HookList<BeforeHitHandler> BeforeHit;
+ #define BeforeSpellHitFn(F) BeforeHitHandlerFunction(&F)
+
// example: OnHit += SpellHitFn(class::function);
HookList<HitHandler> OnHit;
// example: AfterHit += SpellHitFn(class::function);
diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
index 3f3de2a9877..31be57e7860 100644
--- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp
@@ -270,8 +270,11 @@ class spell_garfrost_permafrost : public SpellScriptLoader
}
private:
- void PreventHitByLoS()
+ void PreventHitByLoS(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_NONE)
+ return;
+
if (Unit* target = GetHitUnit())
{
Unit* caster = GetCaster();
@@ -312,7 +315,7 @@ class spell_garfrost_permafrost : public SpellScriptLoader
void Register() override
{
- BeforeHit += SpellHitFn(spell_garfrost_permafrost_SpellScript::PreventHitByLoS);
+ BeforeHit += BeforeSpellHitFn(spell_garfrost_permafrost_SpellScript::PreventHitByLoS);
AfterHit += SpellHitFn(spell_garfrost_permafrost_SpellScript::RestoreImmunity);
}
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 9baa007d72c..2c7bc37a51e 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp
@@ -1410,15 +1410,18 @@ class spell_valanar_kinetic_bomb_knockback : public SpellScriptLoader
{
PrepareSpellScript(spell_valanar_kinetic_bomb_knockback_SpellScript);
- void KnockIntoAir()
+ void KnockIntoAir(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_NONE)
+ return;
+
if (Creature* target = GetHitCreature())
target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP);
}
void Register() override
{
- BeforeHit += SpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir);
+ BeforeHit += BeforeSpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir);
}
};
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 48d5ea917ee..2dc9d42a1f2 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
@@ -556,9 +556,9 @@ class spell_blood_queen_vampiric_bite : public SpellScriptLoader
return SPELL_CAST_OK;
}
- void OnCast()
+ void OnCast(SpellMissInfo missInfo)
{
- if (GetCaster()->GetTypeId() != TYPEID_PLAYER)
+ if (GetCaster()->GetTypeId() != TYPEID_PLAYER || missInfo != SPELL_MISS_NONE)
return;
uint32 spellId = sSpellMgr->GetSpellIdForDifficulty(SPELL_FRENZIED_BLOODTHIRST, GetCaster());
@@ -591,7 +591,7 @@ class spell_blood_queen_vampiric_bite : public SpellScriptLoader
void Register() override
{
OnCheckCast += SpellCheckCastFn(spell_blood_queen_vampiric_bite_SpellScript::CheckTarget);
- BeforeHit += SpellHitFn(spell_blood_queen_vampiric_bite_SpellScript::OnCast);
+ BeforeHit += BeforeSpellHitFn(spell_blood_queen_vampiric_bite_SpellScript::OnCast);
OnEffectHitTarget += SpellEffectFn(spell_blood_queen_vampiric_bite_SpellScript::HandlePresence, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
index c663f696f46..e59c6b15ba8 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
@@ -2128,14 +2128,17 @@ class spell_igb_below_zero : public SpellScriptLoader
{
PrepareSpellScript(spell_igb_below_zero_SpellScript);
- void RemovePassengers()
+ void RemovePassengers(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_NONE)
+ return;
+
GetHitUnit()->CastSpell(GetHitUnit(), SPELL_EJECT_ALL_PASSENGERS_BELOW_ZERO, TRIGGERED_FULL_MASK);
}
void Register() override
{
- BeforeHit += SpellHitFn(spell_igb_below_zero_SpellScript::RemovePassengers);
+ BeforeHit += BeforeSpellHitFn(spell_igb_below_zero_SpellScript::RemovePassengers);
}
};
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
index e0cfd7c7f67..0a506d622ae 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp
@@ -2194,8 +2194,11 @@ class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader
targets.resize(1);
}
- void CheckAura()
+ void CheckAura(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_NONE)
+ return;
+
if (GetHitUnit()->HasAura(GetSpellInfo()->Id))
_hadAura = true;
}
@@ -2209,7 +2212,7 @@ class spell_the_lich_king_necrotic_plague_jump : public SpellScriptLoader
void Register() override
{
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_the_lich_king_necrotic_plague_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
- BeforeHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::CheckAura);
+ BeforeHit += BeforeSpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::CheckAura);
OnHit += SpellHitFn(spell_the_lich_king_necrotic_plague_SpellScript::AddMissingStack);
}
@@ -3005,8 +3008,11 @@ class spell_the_lich_king_restore_soul : public SpellScriptLoader
}
}
- void RemoveAura()
+ void RemoveAura(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_NONE)
+ return;
+
if (Unit* target = GetHitUnit())
target->RemoveAurasDueToSpell(target->GetMap()->IsHeroic() ? SPELL_HARVEST_SOULS_TELEPORT : SPELL_HARVEST_SOUL_TELEPORT);
}
@@ -3014,7 +3020,7 @@ class spell_the_lich_king_restore_soul : public SpellScriptLoader
void Register() override
{
OnEffectHit += SpellEffectFn(spell_the_lich_king_restore_soul_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
- BeforeHit += SpellHitFn(spell_the_lich_king_restore_soul_SpellScript::RemoveAura);
+ BeforeHit += BeforeSpellHitFn(spell_the_lich_king_restore_soul_SpellScript::RemoveAura);
}
InstanceScript* _instance;
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
index 579508813fe..cedc68f63db 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp
@@ -1598,8 +1598,11 @@ class spell_auto_repair : public SpellScriptLoader
{
PrepareSpellScript(spell_auto_repair_SpellScript);
- void CheckCooldownForTarget()
+ void CheckCooldownForTarget(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_NONE)
+ return;
+
if (GetHitUnit()->HasAuraEffect(SPELL_AUTO_REPAIR, EFFECT_2)) // Check presence of dummy aura indicating cooldown
{
PreventHitEffect(EFFECT_0);
@@ -1640,7 +1643,7 @@ class spell_auto_repair : public SpellScriptLoader
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_auto_repair_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- BeforeHit += SpellHitFn(spell_auto_repair_SpellScript::CheckCooldownForTarget);
+ BeforeHit += BeforeSpellHitFn(spell_auto_repair_SpellScript::CheckCooldownForTarget);
}
};
diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp
index 597a746b816..4a13ceac980 100644
--- a/src/server/scripts/Spells/spell_rogue.cpp
+++ b/src/server/scripts/Spells/spell_rogue.cpp
@@ -255,8 +255,11 @@ class spell_rog_deadly_poison : public SpellScriptLoader
return GetCaster()->GetTypeId() == TYPEID_PLAYER && GetCastItem();
}
- void HandleBeforeHit()
+ void HandleBeforeHit(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_NONE)
+ return;
+
if (Unit* target = GetHitUnit())
// Deadly Poison
if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x10000, 0x80000, 0, GetCaster()->GetGUID()))
@@ -319,7 +322,7 @@ class spell_rog_deadly_poison : public SpellScriptLoader
void Register() override
{
- BeforeHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleBeforeHit);
+ BeforeHit += BeforeSpellHitFn(spell_rog_deadly_poison_SpellScript::HandleBeforeHit);
AfterHit += SpellHitFn(spell_rog_deadly_poison_SpellScript::HandleAfterHit);
}
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp
index 4195b828046..e14386ffa42 100644
--- a/src/server/scripts/Spells/spell_warlock.cpp
+++ b/src/server/scripts/Spells/spell_warlock.cpp
@@ -148,40 +148,26 @@ class spell_warl_banish : public SpellScriptLoader
PrepareSpellScript(spell_warl_banish_SpellScript);
public:
- spell_warl_banish_SpellScript()
- {
- _removed = false;
- }
+ spell_warl_banish_SpellScript() {}
private:
- void HandleBanish()
+ void HandleBanish(SpellMissInfo missInfo)
{
+ if (missInfo != SPELL_MISS_IMMUNE)
+ return;
+
if (Unit* target = GetHitUnit())
{
- if (target->GetAuraEffect(SPELL_AURA_SCHOOL_IMMUNITY, SPELLFAMILY_WARLOCK, 0, 0x08000000, 0))
- {
- // No need to remove old aura since its removed due to not stack by current Banish aura
- PreventHitDefaultEffect(EFFECT_0);
- PreventHitDefaultEffect(EFFECT_1);
- PreventHitDefaultEffect(EFFECT_2);
- _removed = true;
- }
+ // Casting Banish on a banished target will remove applied aura
+ if (Aura * banishAura = target->GetAura(GetSpellInfo()->Id, GetCaster()->GetGUID()))
+ banishAura->Remove();
}
}
- void RemoveAura()
- {
- if (_removed)
- PreventHitAura();
- }
-
void Register() override
{
- BeforeHit += SpellHitFn(spell_warl_banish_SpellScript::HandleBanish);
- AfterHit += SpellHitFn(spell_warl_banish_SpellScript::RemoveAura);
+ BeforeHit += BeforeSpellHitFn(spell_warl_banish_SpellScript::HandleBanish);
}
-
- bool _removed;
};
SpellScript* GetSpellScript() const override