/src/server/scripts/Spells/spell_generic.cpp
https://gitlab.com/tkrokli/TrinityCore_434 · C++ · 4156 lines · 3424 code · 585 blank · 147 comment · 325 complexity · 85ae9a833aac52d19732228c4733c1ef MD5 · raw file
Large files are truncated click here to view the full file
- /*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /*
- * Scripts for spells with SPELLFAMILY_GENERIC which cannot be included in AI script file
- * of creature using it or can't be bound to any player class.
- * Ordered alphabetically using scriptname.
- * Scriptnames of files in this file should be prefixed with "spell_gen_"
- */
- #include "ScriptMgr.h"
- #include "Battleground.h"
- #include "Cell.h"
- #include "CellImpl.h"
- #include "GridNotifiers.h"
- #include "GridNotifiersImpl.h"
- #include "Group.h"
- #include "InstanceScript.h"
- #include "LFGMgr.h"
- #include "Pet.h"
- #include "ReputationMgr.h"
- #include "SkillDiscovery.h"
- #include "SpellHistory.h"
- #include "SpellScript.h"
- #include "SpellAuraEffects.h"
- #include "Vehicle.h"
- class spell_gen_absorb0_hitlimit1 : public SpellScriptLoader
- {
- public:
- spell_gen_absorb0_hitlimit1() : SpellScriptLoader("spell_gen_absorb0_hitlimit1") { }
- class spell_gen_absorb0_hitlimit1_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_absorb0_hitlimit1_AuraScript);
- public:
- spell_gen_absorb0_hitlimit1_AuraScript()
- {
- limit = 0;
- }
- private:
- uint32 limit;
- bool Load() override
- {
- // Max absorb stored in 1 dummy effect
- limit = GetSpellInfo()->Effects[EFFECT_1].CalcValue();
- return true;
- }
- void Absorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount)
- {
- absorbAmount = std::min(limit, absorbAmount);
- }
- void Register() override
- {
- OnEffectAbsorb += AuraEffectAbsorbFn(spell_gen_absorb0_hitlimit1_AuraScript::Absorb, EFFECT_0);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_absorb0_hitlimit1_AuraScript();
- }
- };
- // 28764 - Adaptive Warding (Frostfire Regalia Set)
- enum AdaptiveWarding
- {
- SPELL_GEN_ADAPTIVE_WARDING_FIRE = 28765,
- SPELL_GEN_ADAPTIVE_WARDING_NATURE = 28768,
- SPELL_GEN_ADAPTIVE_WARDING_FROST = 28766,
- SPELL_GEN_ADAPTIVE_WARDING_SHADOW = 28769,
- SPELL_GEN_ADAPTIVE_WARDING_ARCANE = 28770
- };
- class spell_gen_adaptive_warding : public SpellScriptLoader
- {
- public:
- spell_gen_adaptive_warding() : SpellScriptLoader("spell_gen_adaptive_warding") { }
- class spell_gen_adaptive_warding_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_adaptive_warding_AuraScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FIRE) ||
- !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_NATURE) ||
- !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_FROST) ||
- !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_SHADOW) ||
- !sSpellMgr->GetSpellInfo(SPELL_GEN_ADAPTIVE_WARDING_ARCANE))
- return false;
- return true;
- }
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- if (eventInfo.GetDamageInfo()->GetSpellInfo()) // eventInfo.GetSpellInfo()
- return false;
- // find Mage Armor
- if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, 0x10000000, 0x0, 0x0))
- return false;
- switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
- {
- case SPELL_SCHOOL_NORMAL:
- case SPELL_SCHOOL_HOLY:
- return false;
- default:
- break;
- }
- return true;
- }
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- uint32 spellId = 0;
- switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
- {
- case SPELL_SCHOOL_FIRE:
- spellId = SPELL_GEN_ADAPTIVE_WARDING_FIRE;
- break;
- case SPELL_SCHOOL_NATURE:
- spellId = SPELL_GEN_ADAPTIVE_WARDING_NATURE;
- break;
- case SPELL_SCHOOL_FROST:
- spellId = SPELL_GEN_ADAPTIVE_WARDING_FROST;
- break;
- case SPELL_SCHOOL_SHADOW:
- spellId = SPELL_GEN_ADAPTIVE_WARDING_SHADOW;
- break;
- case SPELL_SCHOOL_ARCANE:
- spellId = SPELL_GEN_ADAPTIVE_WARDING_ARCANE;
- break;
- default:
- return;
- }
- GetTarget()->CastSpell(GetTarget(), spellId, true, NULL, aurEff);
- }
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_adaptive_warding_AuraScript();
- }
- };
- enum AlchemistStone
- {
- ALECHEMIST_STONE_HEAL = 21399,
- ALECHEMIST_STONE_MANA = 21400,
- };
- // 17619 - Alchemist Stone
- class spell_gen_alchemist_stone : public SpellScriptLoader
- {
- public:
- spell_gen_alchemist_stone() : SpellScriptLoader("spell_gen_alchemist_stone") { }
- class spell_gen_alchemist_stone_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_alchemist_stone_AuraScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(ALECHEMIST_STONE_HEAL) ||
- !sSpellMgr->GetSpellInfo(ALECHEMIST_STONE_MANA))
- return false;
- return true;
- }
- bool CheckProc(ProcEventInfo& eventInfo)
- {
- return eventInfo.GetDamageInfo()->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_POTION;
- }
- void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- uint32 spellId = 0;
- int32 bp = int32(eventInfo.GetDamageInfo()->GetDamage() * 0.4f);
- if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_HEAL))
- spellId = ALECHEMIST_STONE_HEAL;
- else if (eventInfo.GetDamageInfo()->GetSpellInfo()->HasEffect(SPELL_EFFECT_ENERGIZE))
- spellId = ALECHEMIST_STONE_MANA;
- if (!spellId)
- return;
- GetTarget()->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, bp, GetTarget(), true, NULL, aurEff);
- }
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_gen_alchemist_stone_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_gen_alchemist_stone_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_alchemist_stone_AuraScript();
- }
- };
- 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);
- SpellCastResult CheckRequirement()
- {
- if (!GetCastItem())
- return SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW;
- return SPELL_CAST_OK;
- }
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_gen_allow_cast_from_item_only_SpellScript::CheckRequirement);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_allow_cast_from_item_only_SpellScript();
- }
- };
- enum AnimalBloodPoolSpell
- {
- SPELL_ANIMAL_BLOOD = 46221,
- SPELL_SPAWN_BLOOD_POOL = 63471
- };
- class spell_gen_animal_blood : public SpellScriptLoader
- {
- public:
- spell_gen_animal_blood() : SpellScriptLoader("spell_gen_animal_blood") { }
- class spell_gen_animal_blood_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_animal_blood_AuraScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_SPAWN_BLOOD_POOL))
- return false;
- return true;
- }
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- // Remove all auras with spell id 46221, except the one currently being applied
- while (Aura* aur = GetUnitOwner()->GetOwnedAura(SPELL_ANIMAL_BLOOD, ObjectGuid::Empty, ObjectGuid::Empty, 0, GetAura()))
- GetUnitOwner()->RemoveOwnedAura(aur);
- }
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* owner = GetUnitOwner())
- if (owner->IsInWater())
- owner->CastSpell(owner, SPELL_SPAWN_BLOOD_POOL, true);
- }
- void Register() override
- {
- AfterEffectApply += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_gen_animal_blood_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_animal_blood_AuraScript();
- }
- };
- // 41337 Aura of Anger
- class spell_gen_aura_of_anger : public SpellScriptLoader
- {
- public:
- spell_gen_aura_of_anger() : SpellScriptLoader("spell_gen_aura_of_anger") { }
- class spell_gen_aura_of_anger_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_aura_of_anger_AuraScript);
- void HandleEffectPeriodicUpdate(AuraEffect* aurEff)
- {
- if (AuraEffect* aurEff1 = aurEff->GetBase()->GetEffect(EFFECT_1))
- aurEff1->ChangeAmount(aurEff1->GetAmount() + 5);
- aurEff->SetAmount(100 * aurEff->GetTickNumber());
- }
- void Register() override
- {
- OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_aura_of_anger_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_aura_of_anger_AuraScript();
- }
- };
- enum ServiceUniform
- {
- // Spells
- SPELL_SERVICE_UNIFORM = 71450,
- // Models
- MODEL_GOBLIN_MALE = 31002,
- MODEL_GOBLIN_FEMALE = 31003
- };
- class spell_gen_aura_service_uniform : public SpellScriptLoader
- {
- public:
- spell_gen_aura_service_uniform() : SpellScriptLoader("spell_gen_aura_service_uniform") { }
- class spell_gen_aura_service_uniform_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_aura_service_uniform_AuraScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_SERVICE_UNIFORM))
- return false;
- return true;
- }
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- // Apply model goblin
- Unit* target = GetTarget();
- if (target->GetTypeId() == TYPEID_PLAYER)
- {
- if (target->getGender() == GENDER_MALE)
- target->SetDisplayId(MODEL_GOBLIN_MALE);
- else
- target->SetDisplayId(MODEL_GOBLIN_FEMALE);
- }
- }
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- if (target->GetTypeId() == TYPEID_PLAYER)
- target->RestoreDisplayId();
- }
- void Register() override
- {
- AfterEffectApply += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
- AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_aura_service_uniform_AuraScript();
- }
- };
- class spell_gen_av_drekthar_presence : public SpellScriptLoader
- {
- public:
- spell_gen_av_drekthar_presence() : SpellScriptLoader("spell_gen_av_drekthar_presence") { }
- class spell_gen_av_drekthar_presence_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_av_drekthar_presence_AuraScript);
- bool CheckAreaTarget(Unit* target)
- {
- switch (target->GetEntry())
- {
- // alliance
- case 14762: // Dun Baldar North Marshal
- case 14763: // Dun Baldar South Marshal
- case 14764: // Icewing Marshal
- case 14765: // Stonehearth Marshal
- case 11948: // Vandar Stormspike
- // horde
- case 14772: // East Frostwolf Warmaster
- case 14776: // Tower Point Warmaster
- case 14773: // Iceblood Warmaster
- case 14777: // West Frostwolf Warmaster
- case 11946: // Drek'thar
- return true;
- default:
- return false;
- }
- }
- void Register() override
- {
- DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_gen_av_drekthar_presence_AuraScript::CheckAreaTarget);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_av_drekthar_presence_AuraScript();
- }
- };
- enum GenericBandage
- {
- SPELL_RECENTLY_BANDAGED = 11196
- };
- class spell_gen_bandage : public SpellScriptLoader
- {
- public:
- spell_gen_bandage() : SpellScriptLoader("spell_gen_bandage") { }
- class spell_gen_bandage_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_bandage_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_RECENTLY_BANDAGED))
- return false;
- return true;
- }
- SpellCastResult CheckCast()
- {
- if (Unit* target = GetExplTargetUnit())
- {
- if (target->HasAura(SPELL_RECENTLY_BANDAGED))
- return SPELL_FAILED_TARGET_AURASTATE;
- }
- return SPELL_CAST_OK;
- }
- void HandleScript()
- {
- if (Unit* target = GetHitUnit())
- GetCaster()->CastSpell(target, SPELL_RECENTLY_BANDAGED, true);
- }
- void Register() override
- {
- OnCheckCast += SpellCheckCastFn(spell_gen_bandage_SpellScript::CheckCast);
- AfterHit += SpellHitFn(spell_gen_bandage_SpellScript::HandleScript);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_bandage_SpellScript();
- }
- };
- enum Bonked
- {
- SPELL_BONKED = 62991,
- SPELL_FOAM_SWORD_DEFEAT = 62994,
- SPELL_ON_GUARD = 62972
- };
- class spell_gen_bonked : public SpellScriptLoader
- {
- public:
- spell_gen_bonked() : SpellScriptLoader("spell_gen_bonked") { }
- class spell_gen_bonked_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_bonked_SpellScript);
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Player* target = GetHitPlayer())
- {
- Aura const* aura = GetHitAura();
- if (!(aura && aura->GetStackAmount() == 3))
- return;
- target->CastSpell(target, SPELL_FOAM_SWORD_DEFEAT, true);
- target->RemoveAurasDueToSpell(SPELL_BONKED);
- if (Aura const* auraOnGuard = target->GetAura(SPELL_ON_GUARD))
- {
- if (Item* item = target->GetItemByGuid(auraOnGuard->GetCastItemGUID()))
- target->DestroyItemCount(item->GetEntry(), 1, true);
- }
- }
- }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_bonked_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_bonked_SpellScript();
- }
- };
- /* DOCUMENTATION: Break-Shield spells
- Break-Shield spells can be classified in three groups:
- - Spells on vehicle bar used by players:
- + EFFECT_0: SCRIPT_EFFECT
- + EFFECT_1: NONE
- + EFFECT_2: NONE
- - Spells cast by players triggered by script:
- + EFFECT_0: SCHOOL_DAMAGE
- + EFFECT_1: SCRIPT_EFFECT
- + EFFECT_2: FORCE_CAST
- - Spells cast by NPCs on players:
- + EFFECT_0: SCHOOL_DAMAGE
- + EFFECT_1: SCRIPT_EFFECT
- + EFFECT_2: NONE
- In the following script we handle the SCRIPT_EFFECT for effIndex EFFECT_0 and EFFECT_1.
- - When handling EFFECT_0 we're in the "Spells on vehicle bar used by players" case
- and we'll trigger "Spells cast by players triggered by script"
- - When handling EFFECT_1 we're in the "Spells cast by players triggered by script"
- or "Spells cast by NPCs on players" so we'll search for the first defend layer and drop it.
- */
- enum BreakShieldSpells
- {
- SPELL_BREAK_SHIELD_DAMAGE_2K = 62626,
- SPELL_BREAK_SHIELD_DAMAGE_10K = 64590,
- SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS = 62575, // Also on ToC5 mounts
- SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE = 64595,
- SPELL_BREAK_SHIELD_TRIGGER_UNK = 66480
- };
- class spell_gen_break_shield: public SpellScriptLoader
- {
- public:
- spell_gen_break_shield(const char* name) : SpellScriptLoader(name) { }
- class spell_gen_break_shield_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_break_shield_SpellScript);
- void HandleScriptEffect(SpellEffIndex effIndex)
- {
- Unit* target = GetHitUnit();
- switch (effIndex)
- {
- case EFFECT_0: // On spells wich trigger the damaging spell (and also the visual)
- {
- uint32 spellId;
- switch (GetSpellInfo()->Id)
- {
- case SPELL_BREAK_SHIELD_TRIGGER_UNK:
- case SPELL_BREAK_SHIELD_TRIGGER_CAMPAING_WARHORSE:
- spellId = SPELL_BREAK_SHIELD_DAMAGE_10K;
- break;
- case SPELL_BREAK_SHIELD_TRIGGER_FACTION_MOUNTS:
- spellId = SPELL_BREAK_SHIELD_DAMAGE_2K;
- break;
- default:
- return;
- }
- if (Unit* rider = GetCaster()->GetCharmer())
- rider->CastSpell(target, spellId, false);
- else
- GetCaster()->CastSpell(target, spellId, false);
- break;
- }
- case EFFECT_1: // On damaging spells, for removing a defend layer
- {
- Unit::AuraApplicationMap const& auras = target->GetAppliedAuras();
- for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
- {
- if (Aura* aura = itr->second->GetBase())
- {
- SpellInfo const* auraInfo = aura->GetSpellInfo();
- if (auraInfo && auraInfo->SpellIconID == 2007 && aura->HasEffectType(SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN))
- {
- aura->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL);
- // Remove dummys from rider (Necessary for updating visual shields)
- if (Unit* rider = target->GetCharmer())
- if (Aura* defend = rider->GetAura(aura->GetId()))
- defend->ModStackAmount(-1, AURA_REMOVE_BY_ENEMY_SPELL);
- break;
- }
- }
- }
- break;
- }
- default:
- break;
- }
- }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_break_shield_SpellScript::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_break_shield_SpellScript();
- }
- };
- // 46394 Brutallus Burn
- class spell_gen_burn_brutallus : public SpellScriptLoader
- {
- public:
- spell_gen_burn_brutallus() : SpellScriptLoader("spell_gen_burn_brutallus") { }
- class spell_gen_burn_brutallus_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_burn_brutallus_AuraScript);
- void HandleEffectPeriodicUpdate(AuraEffect* aurEff)
- {
- if (aurEff->GetTickNumber() % 11 == 0)
- aurEff->SetAmount(aurEff->GetAmount() * 2);
- }
- void Register() override
- {
- OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_burn_brutallus_AuraScript::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_burn_brutallus_AuraScript();
- }
- };
- enum CannibalizeSpells
- {
- SPELL_CANNIBALIZE_TRIGGERED = 20578
- };
- class spell_gen_cannibalize : public SpellScriptLoader
- {
- public:
- spell_gen_cannibalize() : SpellScriptLoader("spell_gen_cannibalize") { }
- class spell_gen_cannibalize_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_cannibalize_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_CANNIBALIZE_TRIGGERED))
- return false;
- return true;
- }
- SpellCastResult CheckIfCorpseNear()
- {
- Unit* caster = GetCaster();
- float max_range = GetSpellInfo()->GetMaxRange(false);
- WorldObject* result = NULL;
- // search for nearby enemy corpse in range
- Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY);
- Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
- caster->GetMap()->VisitFirstFound(caster->m_positionX, caster->m_positionY, max_range, searcher);
- if (!result)
- return SPELL_FAILED_NO_EDIBLE_CORPSES;
- return SPELL_CAST_OK;
- }
- void HandleDummy(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(GetCaster(), SPELL_CANNIBALIZE_TRIGGERED, false);
- }
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_gen_cannibalize_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize_SpellScript::CheckIfCorpseNear);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_cannibalize_SpellScript();
- }
- };
- enum ChaosBlast
- {
- SPELL_CHAOS_BLAST = 37675
- };
- class spell_gen_chaos_blast : public SpellScriptLoader
- {
- public:
- spell_gen_chaos_blast() : SpellScriptLoader("spell_gen_chaos_blast") { }
- class spell_gen_chaos_blast_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_chaos_blast_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_CHAOS_BLAST))
- return false;
- return true;
- }
- void HandleDummy(SpellEffIndex /* effIndex */)
- {
- int32 basepoints0 = 100;
- Unit* caster = GetCaster();
- if (Unit* target = GetHitUnit())
- caster->CastCustomSpell(target, SPELL_CHAOS_BLAST, &basepoints0, NULL, NULL, true);
- }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_chaos_blast_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_chaos_blast_SpellScript();
- }
- };
- enum Clone
- {
- SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE = 57528
- };
- class spell_gen_clone : public SpellScriptLoader
- {
- public:
- spell_gen_clone() : SpellScriptLoader("spell_gen_clone") { }
- class spell_gen_clone_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_clone_SpellScript);
- void HandleScriptEffect(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
- }
- void Register() override
- {
- if (m_scriptSpellId == SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE)
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_DUMMY);
- OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_DUMMY);
- }
- else
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
- OnEffectHitTarget += SpellEffectFn(spell_gen_clone_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_clone_SpellScript();
- }
- };
- enum CloneWeaponSpells
- {
- SPELL_COPY_WEAPON_AURA = 41054,
- SPELL_COPY_WEAPON_2_AURA = 63418,
- SPELL_COPY_WEAPON_3_AURA = 69893,
- SPELL_COPY_OFFHAND_AURA = 45205,
- SPELL_COPY_OFFHAND_2_AURA = 69896,
- SPELL_COPY_RANGED_AURA = 57594
- };
- class spell_gen_clone_weapon : public SpellScriptLoader
- {
- public:
- spell_gen_clone_weapon() : SpellScriptLoader("spell_gen_clone_weapon") { }
- class spell_gen_clone_weapon_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_clone_weapon_SpellScript);
- void HandleScriptEffect(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
- }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_clone_weapon_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_clone_weapon_SpellScript();
- }
- };
- class spell_gen_clone_weapon_aura : public SpellScriptLoader
- {
- public:
- spell_gen_clone_weapon_aura() : SpellScriptLoader("spell_gen_clone_weapon_aura") { }
- class spell_gen_clone_weapon_auraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_clone_weapon_auraScript);
- public:
- spell_gen_clone_weapon_auraScript()
- {
- prevItem = 0;
- }
- private:
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_AURA) ||
- !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_2_AURA) ||
- !sSpellMgr->GetSpellInfo(SPELL_COPY_WEAPON_3_AURA) ||
- !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_AURA) ||
- !sSpellMgr->GetSpellInfo(SPELL_COPY_OFFHAND_2_AURA) ||
- !sSpellMgr->GetSpellInfo(SPELL_COPY_RANGED_AURA))
- return false;
- return true;
- }
- void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* caster = GetCaster();
- Unit* target = GetTarget();
- if (!caster)
- return;
- switch (GetSpellInfo()->Id)
- {
- case SPELL_COPY_WEAPON_AURA:
- case SPELL_COPY_WEAPON_2_AURA:
- case SPELL_COPY_WEAPON_3_AURA:
- {
- prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID);
- if (Player* player = caster->ToPlayer())
- {
- if (Item* mainItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, mainItem->GetEntry());
- }
- else
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID));
- break;
- }
- case SPELL_COPY_OFFHAND_AURA:
- case SPELL_COPY_OFFHAND_2_AURA:
- {
- prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 1;
- if (Player* player = caster->ToPlayer())
- {
- if (Item* offItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, offItem->GetEntry());
- }
- else
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1));
- break;
- }
- case SPELL_COPY_RANGED_AURA:
- {
- prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 2;
- if (Player* player = caster->ToPlayer())
- {
- if (Item* rangedItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED))
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, rangedItem->GetEntry());
- }
- else
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2));
- break;
- }
- default:
- break;
- }
- }
- void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- switch (GetSpellInfo()->Id)
- {
- case SPELL_COPY_WEAPON_AURA:
- case SPELL_COPY_WEAPON_2_AURA:
- case SPELL_COPY_WEAPON_3_AURA:
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, prevItem);
- break;
- case SPELL_COPY_OFFHAND_AURA:
- case SPELL_COPY_OFFHAND_2_AURA:
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, prevItem);
- break;
- case SPELL_COPY_RANGED_AURA:
- target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, prevItem);
- break;
- default:
- break;
- }
- }
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_gen_clone_weapon_auraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- OnEffectRemove += AuraEffectRemoveFn(spell_gen_clone_weapon_auraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- }
- private:
- uint32 prevItem;
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_clone_weapon_auraScript();
- }
- };
- 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() override
- {
- OnHit += SpellHitFn(spell_gen_count_pct_from_max_hp_SpellScript::RecalculateDamage);
- }
- private:
- int32 _damagePct;
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_count_pct_from_max_hp_SpellScript(_damagePct);
- }
- private:
- int32 _damagePct;
- };
- // 63845 - Create Lance
- enum CreateLanceSpells
- {
- SPELL_CREATE_LANCE_ALLIANCE = 63914,
- SPELL_CREATE_LANCE_HORDE = 63919
- };
- class spell_gen_create_lance : public SpellScriptLoader
- {
- public:
- spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { }
- class spell_gen_create_lance_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_create_lance_SpellScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) ||
- !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE))
- return false;
- return true;
- }
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- if (Player* target = GetHitPlayer())
- {
- if (target->GetTeam() == ALLIANCE)
- GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true);
- else
- GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true);
- }
- }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_create_lance_SpellScript();
- }
- };
- class spell_gen_creature_permanent_feign_death : public SpellScriptLoader
- {
- public:
- spell_gen_creature_permanent_feign_death() : SpellScriptLoader("spell_gen_creature_permanent_feign_death") { }
- class spell_gen_creature_permanent_feign_death_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_creature_permanent_feign_death_AuraScript);
- void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- Unit* target = GetTarget();
- target->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
- target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
- if (target->GetTypeId() == TYPEID_UNIT)
- target->ToCreature()->SetReactState(REACT_PASSIVE);
- }
- void Register() override
- {
- OnEffectApply += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_creature_permanent_feign_death_AuraScript();
- }
- };
- enum DalaranDisguiseSpells
- {
- SPELL_SUNREAVER_DISGUISE_TRIGGER = 69672,
- SPELL_SUNREAVER_DISGUISE_FEMALE = 70973,
- SPELL_SUNREAVER_DISGUISE_MALE = 70974,
- SPELL_SILVER_COVENANT_DISGUISE_TRIGGER = 69673,
- SPELL_SILVER_COVENANT_DISGUISE_FEMALE = 70971,
- SPELL_SILVER_COVENANT_DISGUISE_MALE = 70972
- };
- class spell_gen_dalaran_disguise : public SpellScriptLoader
- {
- public:
- spell_gen_dalaran_disguise(const char* name) : SpellScriptLoader(name) { }
- class spell_gen_dalaran_disguise_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_dalaran_disguise_SpellScript);
- bool Validate(SpellInfo const* spellInfo) override
- {
- switch (spellInfo->Id)
- {
- case SPELL_SUNREAVER_DISGUISE_TRIGGER:
- if (!sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_FEMALE) ||
- !sSpellMgr->GetSpellInfo(SPELL_SUNREAVER_DISGUISE_MALE))
- return false;
- break;
- case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER:
- if (!sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_FEMALE) ||
- !sSpellMgr->GetSpellInfo(SPELL_SILVER_COVENANT_DISGUISE_MALE))
- return false;
- break;
- }
- return true;
- }
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Player* player = GetHitPlayer())
- {
- uint8 gender = player->getGender();
- uint32 spellId = GetSpellInfo()->Id;
- switch (spellId)
- {
- case SPELL_SUNREAVER_DISGUISE_TRIGGER:
- spellId = gender ? SPELL_SUNREAVER_DISGUISE_FEMALE : SPELL_SUNREAVER_DISGUISE_MALE;
- break;
- case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER:
- spellId = gender ? SPELL_SILVER_COVENANT_DISGUISE_FEMALE : SPELL_SILVER_COVENANT_DISGUISE_MALE;
- break;
- default:
- break;
- }
- GetCaster()->CastSpell(player, spellId, true);
- }
- }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_dalaran_disguise_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_dalaran_disguise_SpellScript();
- }
- };
- enum DefendVisuals
- {
- SPELL_VISUAL_SHIELD_1 = 63130,
- SPELL_VISUAL_SHIELD_2 = 63131,
- SPELL_VISUAL_SHIELD_3 = 63132
- };
- class spell_gen_defend : public SpellScriptLoader
- {
- public:
- spell_gen_defend() : SpellScriptLoader("spell_gen_defend") { }
- class spell_gen_defend_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_gen_defend_AuraScript);
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_1))
- return false;
- if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_2))
- return false;
- if (!sSpellMgr->GetSpellInfo(SPELL_VISUAL_SHIELD_3))
- return false;
- return true;
- }
- void RefreshVisualShields(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
- {
- if (GetCaster())
- {
- Unit* target = GetTarget();
- for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i)
- target->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i);
- target->CastSpell(target, SPELL_VISUAL_SHIELD_1 + GetAura()->GetStackAmount() - 1, true, NULL, aurEff);
- }
- else
- GetTarget()->RemoveAurasDueToSpell(GetId());
- }
- void RemoveVisualShields(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- for (uint8 i = 0; i < GetSpellInfo()->StackAmount; ++i)
- GetTarget()->RemoveAurasDueToSpell(SPELL_VISUAL_SHIELD_1 + i);
- }
- void RemoveDummyFromDriver(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
- {
- if (Unit* caster = GetCaster())
- if (TempSummon* vehicle = caster->ToTempSummon())
- if (Unit* rider = vehicle->GetSummoner())
- rider->RemoveAurasDueToSpell(GetId());
- }
- void Register() override
- {
- SpellInfo const* spell = sSpellMgr->EnsureSpellInfo(m_scriptSpellId);
- // Defend spells cast by NPCs (add visuals)
- if (spell->Effects[EFFECT_0].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)
- {
- AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK);
- }
- // Remove Defend spell from player when he dismounts
- if (spell->Effects[EFFECT_2].ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)
- OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL);
- // Defend spells cast by players (add/remove visuals)
- if (spell->Effects[EFFECT_1].ApplyAuraName == SPELL_AURA_DUMMY)
- {
- AfterEffectApply += AuraEffectApplyFn(spell_gen_defend_AuraScript::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
- OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend_AuraScript::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK);
- }
- }
- };
- AuraScript* GetAuraScript() const override
- {
- return new spell_gen_defend_AuraScript();
- }
- };
- 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() override
- {
- 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() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self_SpellScript::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_despawn_self_SpellScript();
- }
- };
- enum DivineStormSpell
- {
- SPELL_DIVINE_STORM = 53385,
- };
- // 70769 Divine Storm!
- class spell_gen_divine_storm_cd_reset : public SpellScriptLoader
- {
- public:
- spell_gen_divine_storm_cd_reset() : SpellScriptLoader("spell_gen_divine_storm_cd_reset") { }
- class spell_gen_divine_storm_cd_reset_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_gen_divine_storm_cd_reset_SpellScript);
- bool Load() override
- {
- return GetCaster()->GetTypeId() == TYPEID_PLAYER;
- }
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- if (!sSpellMgr->GetSpellInfo(SPELL_DIVINE_STORM))
- return false;
- return true;
- }
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- Player* caster = GetCaster()->ToPlayer();
- if (caster->GetSpellHistory()->HasCooldown(SPELL_DIVINE_STORM))
- caster->GetSpellHistory()->ResetCooldown(SPELL_DIVINE_STORM, true);
- }
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_gen_divine_storm_cd_reset_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
- SpellScript* GetSpellScript() const override
- {
- return new spell_gen_divine_storm_cd_reset_SpellScript();
- }
- };
- 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(…