mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-16 13:09:50 -04:00
* typo and correction
* spell aura no longer shared between targets
_spellAura isolated
* SPELL_AURA_CONTROL_VEHICLE is not strictly single target spell
Steam Tank Control and Wyrmrest Commander
units can reseat themselves again
* Rename 9999_99_99_99_world.sql to 2019_03_08_00_world.sql
(cherry picked from commit ec3cb05d7f)
4505 lines
144 KiB
C++
4505 lines
144 KiB
C++
/*
|
|
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
|
*
|
|
* 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 "CellImpl.h"
|
|
#include "DB2Stores.h"
|
|
#include "GameTime.h"
|
|
#include "GridNotifiersImpl.h"
|
|
#include "Group.h"
|
|
#include "InstanceScript.h"
|
|
#include "Item.h"
|
|
#include "LFGMgr.h"
|
|
#include "Log.h"
|
|
#include "NPCPackets.h"
|
|
#include "Pet.h"
|
|
#include "ReputationMgr.h"
|
|
#include "SkillDiscovery.h"
|
|
#include "SpellAuraEffects.h"
|
|
#include "SpellHistory.h"
|
|
#include "SpellMgr.h"
|
|
#include "SpellScript.h"
|
|
#include "Vehicle.h"
|
|
|
|
class spell_gen_absorb0_hitlimit1 : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_absorb0_hitlimit1);
|
|
|
|
uint32 limit = 0;
|
|
|
|
bool Load() override
|
|
{
|
|
// Max absorb stored in 1 dummy effect
|
|
limit = GetSpellInfo()->GetEffect(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::Absorb, EFFECT_0);
|
|
}
|
|
};
|
|
|
|
// 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 AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_adaptive_warding);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_GEN_ADAPTIVE_WARDING_FIRE,
|
|
SPELL_GEN_ADAPTIVE_WARDING_NATURE,
|
|
SPELL_GEN_ADAPTIVE_WARDING_FROST,
|
|
SPELL_GEN_ADAPTIVE_WARDING_SHADOW,
|
|
SPELL_GEN_ADAPTIVE_WARDING_ARCANE
|
|
});
|
|
}
|
|
|
|
bool CheckProc(ProcEventInfo& eventInfo)
|
|
{
|
|
if (!eventInfo.GetSpellInfo())
|
|
return false;
|
|
|
|
// find Mage Armor
|
|
if (!GetTarget()->GetAuraEffect(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELLFAMILY_MAGE, flag128(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* 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, aurEff);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoCheckProc += AuraCheckProcFn(spell_gen_adaptive_warding::CheckProc);
|
|
OnEffectProc += AuraEffectProcFn(spell_gen_adaptive_warding::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_allow_cast_from_item_only : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_allow_cast_from_item_only);
|
|
|
|
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::CheckRequirement);
|
|
}
|
|
};
|
|
|
|
enum AnimalBloodPoolSpell
|
|
{
|
|
SPELL_ANIMAL_BLOOD = 46221,
|
|
SPELL_SPAWN_BLOOD_POOL = 63471
|
|
};
|
|
|
|
class spell_gen_animal_blood : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_animal_blood);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_SPAWN_BLOOD_POOL });
|
|
}
|
|
|
|
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::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_gen_animal_blood::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
class spell_gen_arcane_charge : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_arcane_charge);
|
|
|
|
SpellCastResult CheckRequirement()
|
|
{
|
|
if (Unit* target = GetExplTargetUnit())
|
|
{
|
|
if (!(target->GetCreatureTypeMask() & CREATURE_TYPEMASK_DEMON_OR_UNDEAD))
|
|
return SPELL_FAILED_DONT_REPORT;
|
|
}
|
|
|
|
return SPELL_CAST_OK;
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnCheckCast += SpellCheckCastFn(spell_gen_arcane_charge::CheckRequirement);
|
|
}
|
|
};
|
|
|
|
// 430 Drink
|
|
// 431 Drink
|
|
// 432 Drink
|
|
// 1133 Drink
|
|
// 1135 Drink
|
|
// 1137 Drink
|
|
// 10250 Drink
|
|
// 22734 Drink
|
|
// 27089 Drink
|
|
// 34291 Drink
|
|
// 43182 Drink
|
|
// 43183 Drink
|
|
// 46755 Drink
|
|
// 49472 Drink Coffee
|
|
// 57073 Drink
|
|
// 61830 Drink
|
|
// 72623 Drink
|
|
class spell_gen_arena_drink : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_arena_drink);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
if (spellInfo->GetEffects().empty() || !spellInfo->GetEffect(EFFECT_0).IsAura(SPELL_AURA_MOD_POWER_REGEN))
|
|
{
|
|
TC_LOG_ERROR("spells", "Aura %d structure has been changed - first aura is no longer SPELL_AURA_MOD_POWER_REGEN", GetId());
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& isPeriodic, int32& /*amplitude*/)
|
|
{
|
|
// Get SPELL_AURA_MOD_POWER_REGEN aura from spell
|
|
AuraEffect* regen = GetAura()->GetEffect(EFFECT_0);
|
|
if (!regen)
|
|
return;
|
|
|
|
// default case - not in arena
|
|
if (!GetCaster()->ToPlayer()->InArena())
|
|
isPeriodic = false;
|
|
}
|
|
|
|
void CalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
|
{
|
|
AuraEffect* regen = GetAura()->GetEffect(EFFECT_0);
|
|
if (!regen)
|
|
return;
|
|
|
|
// default case - not in arena
|
|
if (!GetCaster()->ToPlayer()->InArena())
|
|
regen->ChangeAmount(amount);
|
|
}
|
|
|
|
void UpdatePeriodic(AuraEffect* aurEff)
|
|
{
|
|
AuraEffect* regen = GetAura()->GetEffect(EFFECT_0);
|
|
if (!regen)
|
|
return;
|
|
|
|
// **********************************************
|
|
// This feature used only in arenas
|
|
// **********************************************
|
|
// Here need increase mana regen per tick (6 second rule)
|
|
// on 0 tick - 0 (handled in 2 second)
|
|
// on 1 tick - 166% (handled in 4 second)
|
|
// on 2 tick - 133% (handled in 6 second)
|
|
|
|
// Apply bonus for 1 - 4 tick
|
|
switch (aurEff->GetTickNumber())
|
|
{
|
|
case 1: // 0%
|
|
regen->ChangeAmount(0);
|
|
break;
|
|
case 2: // 166%
|
|
regen->ChangeAmount(aurEff->GetAmount() * 5 / 3);
|
|
break;
|
|
case 3: // 133%
|
|
regen->ChangeAmount(aurEff->GetAmount() * 4 / 3);
|
|
break;
|
|
default: // 100% - normal regen
|
|
regen->ChangeAmount(aurEff->GetAmount());
|
|
// No need to update after 4th tick
|
|
aurEff->SetPeriodic(false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_gen_arena_drink::CalcPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
|
|
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_arena_drink::CalcAmount, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
|
|
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_arena_drink::UpdatePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
|
|
}
|
|
};
|
|
|
|
// 41337 Aura of Anger
|
|
class spell_gen_aura_of_anger : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_aura_of_anger);
|
|
|
|
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::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
|
}
|
|
};
|
|
|
|
// 28313 - Aura of Fear
|
|
class spell_gen_aura_of_fear : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_aura_of_fear);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return !spellInfo->GetEffects().empty() && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
|
|
}
|
|
|
|
void PeriodicTick(AuraEffect const* aurEff)
|
|
{
|
|
PreventDefaultAction();
|
|
if (!roll_chance_i(GetSpellInfo()->ProcChance))
|
|
return;
|
|
|
|
GetTarget()->CastSpell(nullptr, aurEff->GetSpellEffectInfo().TriggerSpell, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_aura_of_fear::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
|
}
|
|
};
|
|
|
|
enum ServiceUniform
|
|
{
|
|
// Spells
|
|
SPELL_SERVICE_UNIFORM = 71450,
|
|
|
|
// Models
|
|
MODEL_GOBLIN_MALE = 31002,
|
|
MODEL_GOBLIN_FEMALE = 31003
|
|
};
|
|
|
|
class spell_gen_aura_service_uniform : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_aura_service_uniform);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_SERVICE_UNIFORM });
|
|
}
|
|
|
|
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::OnApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_gen_aura_service_uniform::OnRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
class spell_gen_av_drekthar_presence : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_av_drekthar_presence);
|
|
|
|
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::CheckAreaTarget);
|
|
}
|
|
};
|
|
|
|
enum GenericBandage
|
|
{
|
|
SPELL_RECENTLY_BANDAGED = 11196
|
|
};
|
|
|
|
class spell_gen_bandage : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_bandage);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_RECENTLY_BANDAGED });
|
|
}
|
|
|
|
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::CheckCast);
|
|
AfterHit += SpellHitFn(spell_gen_bandage::HandleScript);
|
|
}
|
|
};
|
|
|
|
// Blood Reserve - 64568
|
|
enum BloodReserve
|
|
{
|
|
SPELL_GEN_BLOOD_RESERVE_AURA = 64568,
|
|
SPELL_GEN_BLOOD_RESERVE_HEAL = 64569
|
|
};
|
|
|
|
class spell_gen_blood_reserve : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_blood_reserve);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_GEN_BLOOD_RESERVE_HEAL });
|
|
}
|
|
|
|
bool CheckProc(ProcEventInfo& eventInfo)
|
|
{
|
|
if (Unit* caster = eventInfo.GetActionTarget())
|
|
if (caster->HealthBelowPct(35))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
|
|
{
|
|
PreventDefaultAction();
|
|
|
|
Unit* caster = eventInfo.GetActionTarget();
|
|
CastSpellExtraArgs args(aurEff);
|
|
args.AddSpellBP0(aurEff->GetAmount());
|
|
caster->CastSpell(caster, SPELL_GEN_BLOOD_RESERVE_HEAL, args);
|
|
caster->RemoveAura(SPELL_GEN_BLOOD_RESERVE_AURA);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoCheckProc += AuraCheckProcFn(spell_gen_blood_reserve::CheckProc);
|
|
OnEffectProc += AuraEffectProcFn(spell_gen_blood_reserve::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
|
|
}
|
|
};
|
|
|
|
enum Bonked
|
|
{
|
|
SPELL_BONKED = 62991,
|
|
SPELL_FOAM_SWORD_DEFEAT = 62994,
|
|
SPELL_ON_GUARD = 62972
|
|
};
|
|
|
|
class spell_gen_bonked : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_bonked);
|
|
|
|
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::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
/* 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(char const* name) : SpellScriptLoader(name) { }
|
|
|
|
class spell_gen_break_shield_SpellScript : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_break_shield_SpellScript);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ 62552, 62719, 64100, 66482 });
|
|
}
|
|
|
|
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())
|
|
{
|
|
if (aura->GetId() == 62552 || aura->GetId() == 62719 || aura->GetId() == 64100 || aura->GetId() == 66482)
|
|
{
|
|
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 AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_burn_brutallus);
|
|
|
|
void HandleEffectPeriodicUpdate(AuraEffect* aurEff)
|
|
{
|
|
if (aurEff->GetTickNumber() % 11 == 0)
|
|
aurEff->SetAmount(aurEff->GetAmount() * 2);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_burn_brutallus::HandleEffectPeriodicUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
|
}
|
|
};
|
|
|
|
// 48750 - Burning Depths Necrolyte Image
|
|
class spell_gen_burning_depths_necrolyte_image : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_burning_depths_necrolyte_image);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return spellInfo->GetEffects().size() > EFFECT_2 && ValidateSpellInfo({ static_cast<uint32>(spellInfo->GetEffect(EFFECT_2).CalcValue()) });
|
|
}
|
|
|
|
void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
if (Unit* caster = GetCaster())
|
|
caster->CastSpell(GetTarget(), uint32(GetEffectInfo(EFFECT_2).CalcValue()));
|
|
}
|
|
|
|
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
GetTarget()->RemoveAurasDueToSpell(uint32(GetEffectInfo(EFFECT_2).CalcValue()), GetCasterGUID());
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterEffectApply += AuraEffectApplyFn(spell_gen_burning_depths_necrolyte_image::HandleApply, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_gen_burning_depths_necrolyte_image::HandleRemove, EFFECT_0, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
enum CannibalizeSpells
|
|
{
|
|
SPELL_CANNIBALIZE_TRIGGERED = 20578
|
|
};
|
|
|
|
class spell_gen_cannibalize : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_cannibalize);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_CANNIBALIZE_TRIGGERED });
|
|
}
|
|
|
|
SpellCastResult CheckIfCorpseNear()
|
|
{
|
|
Unit* caster = GetCaster();
|
|
float max_range = GetSpellInfo()->GetMaxRange(false);
|
|
WorldObject* result = nullptr;
|
|
// search for nearby enemy corpse in range
|
|
Trinity::AnyDeadUnitSpellTargetInRangeCheck check(caster, max_range, GetSpellInfo(), TARGET_CHECK_ENEMY, TARGET_OBJECT_TYPE_CORPSE_ENEMY);
|
|
Trinity::WorldObjectSearcher<Trinity::AnyDeadUnitSpellTargetInRangeCheck> searcher(caster, result, check);
|
|
Cell::VisitWorldObjects(caster, searcher, max_range);
|
|
if (!result)
|
|
Cell::VisitGridObjects(caster, searcher, max_range);
|
|
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::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
OnCheckCast += SpellCheckCastFn(spell_gen_cannibalize::CheckIfCorpseNear);
|
|
}
|
|
};
|
|
|
|
// 66020 Chains of Ice
|
|
class spell_gen_chains_of_ice : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_chains_of_ice);
|
|
|
|
void UpdatePeriodic(AuraEffect* aurEff)
|
|
{
|
|
// Get 0 effect aura
|
|
AuraEffect* slow = GetAura()->GetEffect(EFFECT_0);
|
|
if (!slow)
|
|
return;
|
|
|
|
int32 newAmount = std::min<int32>(slow->GetAmount() + aurEff->GetAmount(), 0);
|
|
slow->ChangeAmount(newAmount);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_gen_chains_of_ice::UpdatePeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum ChaosBlast
|
|
{
|
|
SPELL_CHAOS_BLAST = 37675
|
|
};
|
|
|
|
class spell_gen_chaos_blast : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_chaos_blast);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_CHAOS_BLAST });
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex /* effIndex */)
|
|
{
|
|
int32 basepoints0 = 100;
|
|
Unit* caster = GetCaster();
|
|
if (Unit* target = GetHitUnit())
|
|
{
|
|
CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
|
|
args.AddSpellBP0(basepoints0);
|
|
caster->CastSpell(target, SPELL_CHAOS_BLAST, args);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_chaos_blast::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum Clone
|
|
{
|
|
SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE = 57528
|
|
};
|
|
|
|
class spell_gen_clone : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_clone);
|
|
|
|
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::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_DUMMY);
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_clone::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_DUMMY);
|
|
}
|
|
else
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_clone::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_clone::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
}
|
|
};
|
|
|
|
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 SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_clone_weapon);
|
|
|
|
void HandleScriptEffect(SpellEffIndex effIndex)
|
|
{
|
|
PreventHitDefaultEffect(effIndex);
|
|
GetHitUnit()->CastSpell(GetCaster(), uint32(GetEffectValue()), true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_clone_weapon::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
class spell_gen_clone_weapon_aura : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_clone_weapon_aura);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_COPY_WEAPON_AURA,
|
|
SPELL_COPY_WEAPON_2_AURA,
|
|
SPELL_COPY_WEAPON_3_AURA,
|
|
SPELL_COPY_OFFHAND_AURA,
|
|
SPELL_COPY_OFFHAND_2_AURA,
|
|
SPELL_COPY_RANGED_AURA
|
|
});
|
|
}
|
|
|
|
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->GetVirtualItemId(0);
|
|
|
|
if (Player* player = caster->ToPlayer())
|
|
{
|
|
if (Item* mainItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))
|
|
target->SetVirtualItem(0, mainItem->GetEntry());
|
|
}
|
|
else
|
|
target->SetVirtualItem(0, caster->GetVirtualItemId(0));
|
|
break;
|
|
}
|
|
case SPELL_COPY_OFFHAND_AURA:
|
|
case SPELL_COPY_OFFHAND_2_AURA:
|
|
{
|
|
prevItem = target->GetVirtualItemId(1);
|
|
|
|
if (Player* player = caster->ToPlayer())
|
|
{
|
|
if (Item* offItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
|
|
target->SetVirtualItem(1, offItem->GetEntry());
|
|
}
|
|
else
|
|
target->SetVirtualItem(1, caster->GetVirtualItemId(1));
|
|
break;
|
|
}
|
|
case SPELL_COPY_RANGED_AURA:
|
|
{
|
|
prevItem = target->GetVirtualItemId(2);
|
|
|
|
if (Player* player = caster->ToPlayer())
|
|
{
|
|
if (Item* rangedItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND))
|
|
target->SetVirtualItem(2, rangedItem->GetEntry());
|
|
}
|
|
else
|
|
target->SetVirtualItem(2, caster->GetVirtualItemId(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->SetVirtualItem(0, prevItem);
|
|
break;
|
|
case SPELL_COPY_OFFHAND_AURA:
|
|
case SPELL_COPY_OFFHAND_2_AURA:
|
|
target->SetVirtualItem(1, prevItem);
|
|
break;
|
|
case SPELL_COPY_RANGED_AURA:
|
|
target->SetVirtualItem(2, prevItem);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectApply += AuraEffectApplyFn(spell_gen_clone_weapon_aura::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_clone_weapon_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
|
|
}
|
|
|
|
uint32 prevItem = 0;
|
|
};
|
|
|
|
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 SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_create_lance);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_CREATE_LANCE_ALLIANCE,
|
|
SPELL_CREATE_LANCE_HORDE
|
|
});
|
|
}
|
|
|
|
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::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
class spell_gen_creature_permanent_feign_death : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_creature_permanent_feign_death);
|
|
|
|
void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
Unit* target = GetTarget();
|
|
target->AddDynamicFlag(UNIT_DYNFLAG_DEAD);
|
|
target->AddUnitFlag2(UNIT_FLAG2_FEIGN_DEATH);
|
|
|
|
if (Creature* creature = target->ToCreature())
|
|
creature->SetReactState(REACT_PASSIVE);
|
|
}
|
|
|
|
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
Unit* target = GetTarget();
|
|
target->RemoveDynamicFlag(UNIT_DYNFLAG_DEAD);
|
|
target->RemoveUnitFlag2(UNIT_FLAG2_FEIGN_DEATH);
|
|
|
|
if (Creature* creature = target->ToCreature())
|
|
creature->InitializeReactState();
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectApply += AuraEffectApplyFn(spell_gen_creature_permanent_feign_death::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_creature_permanent_feign_death::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
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(char const* 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:
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_SUNREAVER_DISGUISE_FEMALE,
|
|
SPELL_SUNREAVER_DISGUISE_MALE
|
|
});
|
|
case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER:
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_SILVER_COVENANT_DISGUISE_FEMALE,
|
|
SPELL_SILVER_COVENANT_DISGUISE_MALE
|
|
});
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
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 == GENDER_FEMALE ? SPELL_SUNREAVER_DISGUISE_FEMALE : SPELL_SUNREAVER_DISGUISE_MALE;
|
|
break;
|
|
case SPELL_SILVER_COVENANT_DISGUISE_TRIGGER:
|
|
spellId = gender == GENDER_FEMALE ? 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();
|
|
}
|
|
};
|
|
|
|
class spell_gen_decay_over_time : public SpellScriptLoader
|
|
{
|
|
public:
|
|
spell_gen_decay_over_time(char const* name) : SpellScriptLoader(name) { }
|
|
|
|
SpellScript* GetSpellScript() const override
|
|
{
|
|
return new spell_gen_decay_over_time_SpellScript();
|
|
}
|
|
|
|
private:
|
|
class spell_gen_decay_over_time_SpellScript : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_decay_over_time_SpellScript);
|
|
|
|
void ModAuraStack()
|
|
{
|
|
if (Aura* aur = GetHitAura())
|
|
aur->SetStackAmount(static_cast<uint8>(GetSpellInfo()->StackAmount));
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterHit += SpellHitFn(spell_gen_decay_over_time_SpellScript::ModAuraStack);
|
|
}
|
|
};
|
|
|
|
protected:
|
|
class spell_gen_decay_over_time_AuraScript : public AuraScript
|
|
{
|
|
protected:
|
|
PrepareAuraScript(spell_gen_decay_over_time_AuraScript);
|
|
|
|
bool CheckProc(ProcEventInfo& eventInfo)
|
|
{
|
|
return (eventInfo.GetSpellInfo() == GetSpellInfo());
|
|
}
|
|
|
|
void Decay(ProcEventInfo& /*eventInfo*/)
|
|
{
|
|
PreventDefaultAction();
|
|
ModStackAmount(-1);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoCheckProc += AuraCheckProcFn(spell_gen_decay_over_time_AuraScript::CheckProc);
|
|
OnProc += AuraProcFn(spell_gen_decay_over_time_AuraScript::Decay);
|
|
}
|
|
|
|
~spell_gen_decay_over_time_AuraScript() = default;
|
|
};
|
|
|
|
~spell_gen_decay_over_time() = default;
|
|
};
|
|
|
|
enum FungalDecay
|
|
{
|
|
// found in sniffs, there is no duration entry we can possibly use
|
|
AURA_DURATION = 12600
|
|
};
|
|
|
|
// 32065 - Fungal Decay
|
|
class spell_gen_decay_over_time_fungal_decay : public spell_gen_decay_over_time
|
|
{
|
|
public:
|
|
spell_gen_decay_over_time_fungal_decay() : spell_gen_decay_over_time("spell_gen_decay_over_time_fungal_decay") { }
|
|
|
|
class spell_gen_decay_over_time_fungal_decay_AuraScript : public spell_gen_decay_over_time_AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_decay_over_time_fungal_decay_AuraScript);
|
|
|
|
void ModDuration(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
// only on actual reapply, not on stack decay
|
|
if (GetDuration() == GetMaxDuration())
|
|
{
|
|
SetMaxDuration(AURA_DURATION);
|
|
SetDuration(AURA_DURATION);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
spell_gen_decay_over_time_AuraScript::Register();
|
|
OnEffectApply += AuraEffectApplyFn(spell_gen_decay_over_time_fungal_decay_AuraScript::ModDuration, EFFECT_0, SPELL_AURA_MOD_DECREASE_SPEED, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
|
|
}
|
|
};
|
|
|
|
AuraScript* GetAuraScript() const override
|
|
{
|
|
return new spell_gen_decay_over_time_fungal_decay_AuraScript();
|
|
}
|
|
};
|
|
|
|
// 36659 - Tail Sting
|
|
class spell_gen_decay_over_time_tail_sting : public spell_gen_decay_over_time
|
|
{
|
|
public:
|
|
spell_gen_decay_over_time_tail_sting() : spell_gen_decay_over_time("spell_gen_decay_over_time_tail_sting") { }
|
|
|
|
class spell_gen_decay_over_time_tail_sting_AuraScript : public spell_gen_decay_over_time_AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_decay_over_time_tail_sting_AuraScript);
|
|
};
|
|
|
|
AuraScript* GetAuraScript() const override
|
|
{
|
|
return new spell_gen_decay_over_time_tail_sting_AuraScript();
|
|
}
|
|
};
|
|
|
|
enum DefendVisuals
|
|
{
|
|
SPELL_VISUAL_SHIELD_1 = 63130,
|
|
SPELL_VISUAL_SHIELD_2 = 63131,
|
|
SPELL_VISUAL_SHIELD_3 = 63132
|
|
};
|
|
|
|
class spell_gen_defend : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_defend);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_VISUAL_SHIELD_1,
|
|
SPELL_VISUAL_SHIELD_2,
|
|
SPELL_VISUAL_SHIELD_3
|
|
});
|
|
}
|
|
|
|
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, 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->AssertSpellInfo(m_scriptSpellId, DIFFICULTY_NONE);
|
|
|
|
// 6.x effects removed
|
|
|
|
// Defend spells cast by NPCs (add visuals)
|
|
if (spell->GetEffect(EFFECT_0)->ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)
|
|
{
|
|
AfterEffectApply += AuraEffectApplyFn(spell_gen_defend::RefreshVisualShields, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend::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->GetEffect(EFFECT_2)->ApplyAuraName == SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN)
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend::RemoveDummyFromDriver, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, AURA_EFFECT_HANDLE_REAL);
|
|
|
|
// Defend spells cast by players (add/remove visuals)
|
|
if (spell->GetEffect(EFFECT_1)->ApplyAuraName == SPELL_AURA_DUMMY)
|
|
{
|
|
AfterEffectApply += AuraEffectApplyFn(spell_gen_defend::RefreshVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_defend::RemoveVisualShields, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK);
|
|
}
|
|
*/
|
|
}
|
|
};
|
|
|
|
class spell_gen_despawn_self : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_despawn_self);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster()->GetTypeId() == TYPEID_UNIT;
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (GetEffectInfo().IsEffect(SPELL_EFFECT_DUMMY) || GetEffectInfo().IsEffect(SPELL_EFFECT_SCRIPT_EFFECT))
|
|
GetCaster()->ToCreature()->DespawnOrUnsummon();
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_despawn_self::HandleDummy, EFFECT_ALL, SPELL_EFFECT_ANY);
|
|
}
|
|
};
|
|
|
|
enum DivineStormSpell
|
|
{
|
|
SPELL_DIVINE_STORM = 53385,
|
|
};
|
|
|
|
// 70769 Divine Storm!
|
|
class spell_gen_divine_storm_cd_reset : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_divine_storm_cd_reset);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_DIVINE_STORM });
|
|
}
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
GetCaster()->GetSpellHistory()->ResetCooldown(SPELL_DIVINE_STORM, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_divine_storm_cd_reset::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_ds_flush_knockback : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_ds_flush_knockback);
|
|
|
|
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->GetPosition(), horizontalSpeed, verticalSpeed);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_ds_flush_knockback::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_dungeon_credit : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_dungeon_credit);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster()->GetTypeId() == TYPEID_UNIT;
|
|
}
|
|
|
|
void CreditEncounter()
|
|
{
|
|
// This hook is executed for every target, make sure we only credit instance once
|
|
if (_handled)
|
|
return;
|
|
|
|
_handled = true;
|
|
Unit* caster = GetCaster();
|
|
if (InstanceScript* instance = caster->GetInstanceScript())
|
|
instance->UpdateEncounterStateForSpellCast(GetSpellInfo()->Id, caster);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterHit += SpellHitFn(spell_gen_dungeon_credit::CreditEncounter);
|
|
}
|
|
|
|
bool _handled = false;
|
|
};
|
|
|
|
enum EluneCandle
|
|
{
|
|
// Creatures
|
|
NPC_OMEN = 15467,
|
|
|
|
// Spells
|
|
SPELL_ELUNE_CANDLE_OMEN_HEAD = 26622,
|
|
SPELL_ELUNE_CANDLE_OMEN_CHEST = 26624,
|
|
SPELL_ELUNE_CANDLE_OMEN_HAND_R = 26625,
|
|
SPELL_ELUNE_CANDLE_OMEN_HAND_L = 26649,
|
|
SPELL_ELUNE_CANDLE_NORMAL = 26636
|
|
};
|
|
|
|
class spell_gen_elune_candle : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_elune_candle);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_ELUNE_CANDLE_OMEN_HEAD,
|
|
SPELL_ELUNE_CANDLE_OMEN_CHEST,
|
|
SPELL_ELUNE_CANDLE_OMEN_HAND_R,
|
|
SPELL_ELUNE_CANDLE_OMEN_HAND_L,
|
|
SPELL_ELUNE_CANDLE_NORMAL
|
|
});
|
|
}
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
uint32 spellId = 0;
|
|
|
|
if (GetHitUnit()->GetEntry() == NPC_OMEN)
|
|
{
|
|
switch (urand(0, 3))
|
|
{
|
|
case 0:
|
|
spellId = SPELL_ELUNE_CANDLE_OMEN_HEAD;
|
|
break;
|
|
case 1:
|
|
spellId = SPELL_ELUNE_CANDLE_OMEN_CHEST;
|
|
break;
|
|
case 2:
|
|
spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_R;
|
|
break;
|
|
case 3:
|
|
spellId = SPELL_ELUNE_CANDLE_OMEN_HAND_L;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
spellId = SPELL_ELUNE_CANDLE_NORMAL;
|
|
|
|
GetCaster()->CastSpell(GetHitUnit(), spellId, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_elune_candle::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
// 50051 - Ethereal Pet Aura
|
|
enum EtherealPet
|
|
{
|
|
NPC_ETHEREAL_SOUL_TRADER = 27914,
|
|
|
|
SAY_STEAL_ESSENCE = 1,
|
|
SAY_CREATE_TOKEN = 2,
|
|
|
|
SPELL_PROC_TRIGGER_ON_KILL_AURA = 50051,
|
|
SPELL_ETHEREAL_PET_AURA = 50055,
|
|
SPELL_CREATE_TOKEN = 50063,
|
|
SPELL_STEAL_ESSENCE_VISUAL = 50101
|
|
};
|
|
|
|
// 50051 - Ethereal Pet Aura
|
|
class spell_ethereal_pet_aura : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_ethereal_pet_aura);
|
|
|
|
bool CheckProc(ProcEventInfo& eventInfo)
|
|
{
|
|
uint32 levelDiff = std::abs(GetTarget()->getLevel() - eventInfo.GetProcTarget()->getLevel());
|
|
return levelDiff <= 9;
|
|
}
|
|
|
|
void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
|
|
{
|
|
PreventDefaultAction();
|
|
|
|
std::list<TempSummon*> minionList;
|
|
GetUnitOwner()->GetAllMinionsByEntry(minionList, NPC_ETHEREAL_SOUL_TRADER);
|
|
for (Creature* minion : minionList)
|
|
{
|
|
if (minion->IsAIEnabled())
|
|
{
|
|
minion->AI()->Talk(SAY_STEAL_ESSENCE);
|
|
minion->CastSpell(eventInfo.GetProcTarget(), SPELL_STEAL_ESSENCE_VISUAL);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoCheckProc += AuraCheckProcFn(spell_ethereal_pet_aura::CheckProc);
|
|
OnEffectProc += AuraEffectProcFn(spell_ethereal_pet_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
|
|
}
|
|
};
|
|
|
|
// 50052 - Ethereal Pet onSummon
|
|
class spell_ethereal_pet_onsummon : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_ethereal_pet_onsummon);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_PROC_TRIGGER_ON_KILL_AURA });
|
|
}
|
|
|
|
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
|
{
|
|
Unit* target = GetHitUnit();
|
|
target->CastSpell(target, SPELL_PROC_TRIGGER_ON_KILL_AURA, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_ethereal_pet_onsummon::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
// 50055 - Ethereal Pet Aura Remove
|
|
class spell_ethereal_pet_aura_remove : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_ethereal_pet_aura_remove);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_ETHEREAL_PET_AURA });
|
|
}
|
|
|
|
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
|
{
|
|
GetHitUnit()->RemoveAurasDueToSpell(SPELL_ETHEREAL_PET_AURA);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_ethereal_pet_aura_remove::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
// 50101 - Ethereal Pet OnKill Steal Essence
|
|
class spell_steal_essence_visual : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_steal_essence_visual);
|
|
|
|
void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
if (Unit* caster = GetCaster())
|
|
{
|
|
caster->CastSpell(caster, SPELL_CREATE_TOKEN, true);
|
|
if (Creature* soulTrader = caster->ToCreature())
|
|
soulTrader->AI()->Talk(SAY_CREATE_TOKEN);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_steal_essence_visual::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
enum FishingSpells
|
|
{
|
|
SPELL_FISHING_NO_FISHING_POLE = 131476,
|
|
SPELL_FISHING_WITH_POLE = 131490
|
|
};
|
|
|
|
// 131474 - Fishing
|
|
class spell_gen_fishing : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_fishing);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_FISHING_NO_FISHING_POLE, SPELL_FISHING_WITH_POLE });
|
|
}
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex effIndex)
|
|
{
|
|
PreventHitDefaultEffect(effIndex);
|
|
uint32 spellId;
|
|
Item* mainHand = GetCaster()->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
|
|
if (!mainHand || mainHand->GetTemplate()->GetClass() != ITEM_CLASS_WEAPON || mainHand->GetTemplate()->GetSubClass() != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
|
|
spellId = SPELL_FISHING_NO_FISHING_POLE;
|
|
else
|
|
spellId = SPELL_FISHING_WITH_POLE;
|
|
|
|
GetCaster()->CastSpell(GetCaster(), spellId, false);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_fishing::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum TransporterBackfires
|
|
{
|
|
SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH = 23444,
|
|
SPELL_TRANSPORTER_EVIL_TWIN = 23445,
|
|
SPELL_TRANSPORTER_MALFUNCTION_MISS = 36902
|
|
};
|
|
|
|
class spell_gen_gadgetzan_transporter_backfire : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_gadgetzan_transporter_backfire);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH,
|
|
SPELL_TRANSPORTER_EVIL_TWIN,
|
|
SPELL_TRANSPORTER_MALFUNCTION_MISS
|
|
});
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex /* effIndex */)
|
|
{
|
|
Unit* caster = GetCaster();
|
|
int32 r = irand(0, 119);
|
|
if (r < 20) // Transporter Malfunction - 1/6 polymorph
|
|
caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_POLYMORPH, true);
|
|
else if (r < 100) // Evil Twin - 4/6 evil twin
|
|
caster->CastSpell(caster, SPELL_TRANSPORTER_EVIL_TWIN, true);
|
|
else // Transporter Malfunction - 1/6 miss the target
|
|
caster->CastSpell(caster, SPELL_TRANSPORTER_MALFUNCTION_MISS, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_gadgetzan_transporter_backfire::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
// 28880 - Warrior
|
|
// 59542 - Paladin
|
|
// 59543 - Hunter
|
|
// 59544 - Priest
|
|
// 59545 - Death Knight
|
|
// 59547 - Shaman
|
|
// 59548 - Mage
|
|
// 121093 - Monk
|
|
class spell_gen_gift_of_naaru : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_gift_of_naaru);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return spellInfo->GetEffects().size() > EFFECT_1;
|
|
}
|
|
|
|
void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
|
|
{
|
|
if (!GetCaster() || !aurEff->GetTotalTicks())
|
|
return;
|
|
|
|
float healPct = GetEffectInfo(EFFECT_1).CalcValue() / 100.0f;
|
|
float heal = healPct * GetCaster()->GetMaxHealth();
|
|
int32 healTick = std::floor(heal / aurEff->GetTotalTicks());
|
|
amount += healTick;
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_gift_of_naaru::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL);
|
|
}
|
|
};
|
|
|
|
enum GnomishTransporter
|
|
{
|
|
SPELL_TRANSPORTER_SUCCESS = 23441,
|
|
SPELL_TRANSPORTER_FAILURE = 23446
|
|
};
|
|
|
|
class spell_gen_gnomish_transporter : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_gnomish_transporter);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_TRANSPORTER_SUCCESS,
|
|
SPELL_TRANSPORTER_FAILURE
|
|
});
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex /* effIndex */)
|
|
{
|
|
GetCaster()->CastSpell(GetCaster(), roll_chance_i(50) ? SPELL_TRANSPORTER_SUCCESS : SPELL_TRANSPORTER_FAILURE, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_gnomish_transporter::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum Interrupt
|
|
{
|
|
SPELL_GEN_THROW_INTERRUPT = 32747
|
|
};
|
|
|
|
// 32748 - Deadly Throw Interrupt
|
|
// 44835 - Maim Interrupt
|
|
class spell_gen_interrupt : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_interrupt);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_GEN_THROW_INTERRUPT });
|
|
}
|
|
|
|
void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
|
|
{
|
|
PreventDefaultAction();
|
|
GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_GEN_THROW_INTERRUPT, aurEff);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectProc += AuraEffectProcFn(spell_gen_interrupt::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_increase_stats_buff : public SpellScriptLoader
|
|
{
|
|
public:
|
|
spell_gen_increase_stats_buff(char const* scriptName) : SpellScriptLoader(scriptName) { }
|
|
|
|
class spell_gen_increase_stats_buff_SpellScript : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_increase_stats_buff_SpellScript);
|
|
|
|
void HandleDummy(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (GetHitUnit()->IsInRaidWith(GetCaster()))
|
|
GetCaster()->CastSpell(GetCaster(), GetEffectValue() + 1, true); // raid buff
|
|
else
|
|
GetCaster()->CastSpell(GetHitUnit(), GetEffectValue(), true); // single-target buff
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_increase_stats_buff_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
SpellScript* GetSpellScript() const override
|
|
{
|
|
return new spell_gen_increase_stats_buff_SpellScript();
|
|
}
|
|
};
|
|
|
|
enum GenericLifebloom
|
|
{
|
|
SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL = 43422,
|
|
SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL = 52552,
|
|
SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL = 53692,
|
|
SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL = 57763,
|
|
SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL = 66094
|
|
};
|
|
|
|
class spell_gen_lifebloom : public SpellScriptLoader
|
|
{
|
|
public:
|
|
spell_gen_lifebloom(char const* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { }
|
|
|
|
class spell_gen_lifebloom_AuraScript : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_lifebloom_AuraScript);
|
|
|
|
public:
|
|
spell_gen_lifebloom_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { }
|
|
|
|
private:
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ _spellId });
|
|
}
|
|
|
|
void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
// final heal only on duration end or dispel
|
|
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_ENEMY_SPELL)
|
|
return;
|
|
|
|
// final heal
|
|
GetTarget()->CastSpell(GetTarget(), _spellId, CastSpellExtraArgs(aurEff)
|
|
.SetOriginalCaster(GetCasterGUID()));
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_gen_lifebloom_AuraScript::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
|
|
uint32 _spellId;
|
|
};
|
|
|
|
AuraScript* GetAuraScript() const override
|
|
{
|
|
return new spell_gen_lifebloom_AuraScript(_spellId);
|
|
}
|
|
|
|
private:
|
|
uint32 _spellId;
|
|
};
|
|
|
|
/* DOCUMENTATION: Charge spells
|
|
Charge spells can be classified in four groups:
|
|
|
|
- Spells on vehicle bar used by players:
|
|
+ EFFECT_0: SCRIPT_EFFECT
|
|
+ EFFECT_1: TRIGGER_SPELL
|
|
+ EFFECT_2: NONE
|
|
- Spells cast by player's mounts triggered by script:
|
|
+ EFFECT_0: CHARGE
|
|
+ EFFECT_1: TRIGGER_SPELL
|
|
+ EFFECT_2: APPLY_AURA
|
|
- Spells cast by players on the target triggered by script:
|
|
+ EFFECT_0: SCHOOL_DAMAGE
|
|
+ EFFECT_1: SCRIPT_EFFECT
|
|
+ EFFECT_2: NONE
|
|
- Spells cast by NPCs on players:
|
|
+ EFFECT_0: SCHOOL_DAMAGE
|
|
+ EFFECT_1: CHARGE
|
|
+ EFFECT_2: SCRIPT_EFFECT
|
|
|
|
In the following script we handle the SCRIPT_EFFECT and CHARGE
|
|
- When handling SCRIPT_EFFECT:
|
|
+ EFFECT_0: Corresponds to "Spells on vehicle bar used by players" and we make player's mount cast
|
|
the charge effect on the current target ("Spells cast by player's mounts triggered by script").
|
|
+ EFFECT_1 and EFFECT_2: Triggered when "Spells cast by player's mounts triggered by script" hits target,
|
|
corresponding to "Spells cast by players on the target triggered by script" and "Spells cast by
|
|
NPCs on players" and we check Defend layers and drop a charge of the first found.
|
|
- When handling CHARGE:
|
|
+ Only launched for "Spells cast by player's mounts triggered by script", makes the player cast the
|
|
damaging spell on target with a small chance of failing it.
|
|
*/
|
|
|
|
enum ChargeSpells
|
|
{
|
|
SPELL_CHARGE_DAMAGE_8K5 = 62874,
|
|
SPELL_CHARGE_DAMAGE_20K = 68498,
|
|
SPELL_CHARGE_DAMAGE_45K = 64591,
|
|
|
|
SPELL_CHARGE_CHARGING_EFFECT_8K5 = 63661,
|
|
SPELL_CHARGE_CHARGING_EFFECT_20K_1 = 68284,
|
|
SPELL_CHARGE_CHARGING_EFFECT_20K_2 = 68501,
|
|
SPELL_CHARGE_CHARGING_EFFECT_45K_1 = 62563,
|
|
SPELL_CHARGE_CHARGING_EFFECT_45K_2 = 66481,
|
|
|
|
SPELL_CHARGE_TRIGGER_FACTION_MOUNTS = 62960,
|
|
SPELL_CHARGE_TRIGGER_TRIAL_CHAMPION = 68282,
|
|
|
|
SPELL_CHARGE_MISS_EFFECT = 62977,
|
|
};
|
|
|
|
class spell_gen_mounted_charge : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_mounted_charge);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ 62552, 62719, 64100, 66482 });
|
|
}
|
|
|
|
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_CHARGE_TRIGGER_TRIAL_CHAMPION:
|
|
spellId = SPELL_CHARGE_CHARGING_EFFECT_20K_1;
|
|
break;
|
|
case SPELL_CHARGE_TRIGGER_FACTION_MOUNTS:
|
|
spellId = SPELL_CHARGE_CHARGING_EFFECT_8K5;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
// If target isn't a training dummy there's a chance of failing the charge
|
|
if (!target->IsCharmedOwnedByPlayerOrPlayer() && roll_chance_f(12.5f))
|
|
spellId = SPELL_CHARGE_MISS_EFFECT;
|
|
|
|
if (Unit* vehicle = GetCaster()->GetVehicleBase())
|
|
vehicle->CastSpell(target, spellId, false);
|
|
else
|
|
GetCaster()->CastSpell(target, spellId, false);
|
|
break;
|
|
}
|
|
case EFFECT_1: // On damaging spells, for removing a defend layer
|
|
case EFFECT_2:
|
|
{
|
|
Unit::AuraApplicationMap const& auras = target->GetAppliedAuras();
|
|
for (Unit::AuraApplicationMap::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
|
|
{
|
|
if (Aura* aura = itr->second->GetBase())
|
|
{
|
|
if (aura->GetId() == 62552 || aura->GetId() == 62719 || aura->GetId() == 64100 || aura->GetId() == 66482)
|
|
{
|
|
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 HandleChargeEffect(SpellEffIndex /*effIndex*/)
|
|
{
|
|
uint32 spellId;
|
|
|
|
switch (GetSpellInfo()->Id)
|
|
{
|
|
case SPELL_CHARGE_CHARGING_EFFECT_8K5:
|
|
spellId = SPELL_CHARGE_DAMAGE_8K5;
|
|
break;
|
|
case SPELL_CHARGE_CHARGING_EFFECT_20K_1:
|
|
case SPELL_CHARGE_CHARGING_EFFECT_20K_2:
|
|
spellId = SPELL_CHARGE_DAMAGE_20K;
|
|
break;
|
|
case SPELL_CHARGE_CHARGING_EFFECT_45K_1:
|
|
case SPELL_CHARGE_CHARGING_EFFECT_45K_2:
|
|
spellId = SPELL_CHARGE_DAMAGE_45K;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
|
|
if (Unit* rider = GetCaster()->GetCharmer())
|
|
rider->CastSpell(GetHitUnit(), spellId, false);
|
|
else
|
|
GetCaster()->CastSpell(GetHitUnit(), spellId, false);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
SpellInfo const* spell = sSpellMgr->AssertSpellInfo(m_scriptSpellId, DIFFICULTY_NONE);
|
|
|
|
if (spell->HasEffect(SPELL_EFFECT_SCRIPT_EFFECT))
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge::HandleScriptEffect, EFFECT_FIRST_FOUND, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
|
|
if (spell->GetEffect(EFFECT_0).IsEffect(SPELL_EFFECT_CHARGE))
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_mounted_charge::HandleChargeEffect, EFFECT_0, SPELL_EFFECT_CHARGE);
|
|
}
|
|
};
|
|
|
|
enum MossCoveredFeet
|
|
{
|
|
SPELL_FALL_DOWN = 6869
|
|
};
|
|
|
|
// 6870 Moss Covered Feet
|
|
// 31399 Moss Covered Feet
|
|
class spell_gen_moss_covered_feet : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_moss_covered_feet);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_FALL_DOWN });
|
|
}
|
|
|
|
void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
|
|
{
|
|
PreventDefaultAction();
|
|
eventInfo.GetActionTarget()->CastSpell(nullptr, SPELL_FALL_DOWN, aurEff);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectProc += AuraEffectProcFn(spell_gen_moss_covered_feet::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
|
|
}
|
|
};
|
|
|
|
// 46284 - Negative Energy Periodic
|
|
class spell_gen_negative_energy_periodic : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_negative_energy_periodic);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return !spellInfo->GetEffects().empty() && ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
|
|
}
|
|
|
|
void PeriodicTick(AuraEffect const* aurEff)
|
|
{
|
|
PreventDefaultAction();
|
|
|
|
CastSpellExtraArgs args(aurEff);
|
|
args.AddSpellMod(SPELLVALUE_MAX_TARGETS, aurEff->GetTickNumber() / 10 + 1);
|
|
GetTarget()->CastSpell(nullptr, aurEff->GetSpellEffectInfo().TriggerSpell, args);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_negative_energy_periodic::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
|
}
|
|
};
|
|
|
|
enum Netherbloom : uint32
|
|
{
|
|
SPELL_NETHERBLOOM_POLLEN_1 = 28703
|
|
};
|
|
|
|
// 28702 - Netherbloom
|
|
class spell_gen_netherbloom : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_netherbloom);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
for (uint8 i = 0; i < 5; ++i)
|
|
if (!ValidateSpellInfo({ SPELL_NETHERBLOOM_POLLEN_1 + i }))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
void HandleScript(SpellEffIndex effIndex)
|
|
{
|
|
PreventHitDefaultEffect(effIndex);
|
|
|
|
if (Unit* target = GetHitUnit())
|
|
{
|
|
// 25% chance of casting a random buff
|
|
if (roll_chance_i(75))
|
|
return;
|
|
|
|
// triggered spells are 28703 to 28707
|
|
// Note: some sources say, that there was the possibility of
|
|
// receiving a debuff. However, this seems to be removed by a patch.
|
|
|
|
// don't overwrite an existing aura
|
|
for (uint8 i = 0; i < 5; ++i)
|
|
if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i))
|
|
return;
|
|
|
|
target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum NightmareVine
|
|
{
|
|
SPELL_NIGHTMARE_POLLEN = 28721
|
|
};
|
|
|
|
// 28720 - Nightmare Vine
|
|
class spell_gen_nightmare_vine : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_nightmare_vine);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_NIGHTMARE_POLLEN });
|
|
}
|
|
|
|
void HandleScript(SpellEffIndex effIndex)
|
|
{
|
|
PreventHitDefaultEffect(effIndex);
|
|
|
|
if (Unit* target = GetHitUnit())
|
|
{
|
|
// 25% chance of casting Nightmare Pollen
|
|
if (roll_chance_i(25))
|
|
target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
// 27746 - Nitrous Boost
|
|
class spell_gen_nitrous_boost : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_nitrous_boost);
|
|
|
|
void PeriodicTick(AuraEffect const* /*aurEff*/)
|
|
{
|
|
PreventDefaultAction();
|
|
|
|
if (GetCaster() && GetTarget()->GetPower(POWER_MANA) >= 10)
|
|
GetTarget()->ModifyPower(POWER_MANA, -10);
|
|
else
|
|
Remove();
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_nitrous_boost::PeriodicTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
|
}
|
|
};
|
|
|
|
enum ObsidianArmor
|
|
{
|
|
SPELL_GEN_OBSIDIAN_ARMOR_HOLY = 27536,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_FIRE = 27533,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_NATURE = 27538,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_FROST = 27534,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_SHADOW = 27535,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_ARCANE = 27540
|
|
};
|
|
|
|
// 27539 - Obsidian Armor
|
|
class spell_gen_obsidian_armor : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_obsidian_armor);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_GEN_OBSIDIAN_ARMOR_HOLY,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_FIRE,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_NATURE,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_FROST,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_SHADOW,
|
|
SPELL_GEN_OBSIDIAN_ARMOR_ARCANE
|
|
});
|
|
}
|
|
|
|
bool CheckProc(ProcEventInfo& eventInfo)
|
|
{
|
|
if (!eventInfo.GetSpellInfo())
|
|
return false;
|
|
|
|
if (GetFirstSchoolInMask(eventInfo.GetSchoolMask()) == SPELL_SCHOOL_NORMAL)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
void OnProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
|
|
{
|
|
PreventDefaultAction();
|
|
|
|
uint32 spellId = 0;
|
|
switch (GetFirstSchoolInMask(eventInfo.GetSchoolMask()))
|
|
{
|
|
case SPELL_SCHOOL_HOLY:
|
|
spellId = SPELL_GEN_OBSIDIAN_ARMOR_HOLY;
|
|
break;
|
|
case SPELL_SCHOOL_FIRE:
|
|
spellId = SPELL_GEN_OBSIDIAN_ARMOR_FIRE;
|
|
break;
|
|
case SPELL_SCHOOL_NATURE:
|
|
spellId = SPELL_GEN_OBSIDIAN_ARMOR_NATURE;
|
|
break;
|
|
case SPELL_SCHOOL_FROST:
|
|
spellId = SPELL_GEN_OBSIDIAN_ARMOR_FROST;
|
|
break;
|
|
case SPELL_SCHOOL_SHADOW:
|
|
spellId = SPELL_GEN_OBSIDIAN_ARMOR_SHADOW;
|
|
break;
|
|
case SPELL_SCHOOL_ARCANE:
|
|
spellId = SPELL_GEN_OBSIDIAN_ARMOR_ARCANE;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
GetTarget()->CastSpell(GetTarget(), spellId, aurEff);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoCheckProc += AuraCheckProcFn(spell_gen_obsidian_armor::CheckProc);
|
|
OnEffectProc += AuraEffectProcFn(spell_gen_obsidian_armor::OnProc, EFFECT_0, SPELL_AURA_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_oracle_wolvar_reputation : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_oracle_wolvar_reputation);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return spellInfo->GetEffects().size() > EFFECT_1;
|
|
}
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex /*effIndex*/)
|
|
{
|
|
Player* player = GetCaster()->ToPlayer();
|
|
uint32 factionId = GetEffectInfo().CalcValue();
|
|
int32 repChange = GetEffectInfo(EFFECT_1).CalcValue();
|
|
|
|
FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionId);
|
|
if (!factionEntry)
|
|
return;
|
|
|
|
// Set rep to baserep + basepoints (expecting spillover for oposite faction -> become hated)
|
|
// Not when player already has equal or higher rep with this faction
|
|
if (player->GetReputationMgr().GetReputation(factionEntry) < repChange)
|
|
player->GetReputationMgr().SetReputation(factionEntry, repChange);
|
|
|
|
// EFFECT_INDEX_2 most likely update at war state, we already handle this in SetReputation
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHit += SpellEffectFn(spell_gen_oracle_wolvar_reputation::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum OrcDisguiseSpells
|
|
{
|
|
SPELL_ORC_DISGUISE_TRIGGER = 45759,
|
|
SPELL_ORC_DISGUISE_MALE = 45760,
|
|
SPELL_ORC_DISGUISE_FEMALE = 45762
|
|
};
|
|
|
|
class spell_gen_orc_disguise : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_orc_disguise);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_ORC_DISGUISE_TRIGGER,
|
|
SPELL_ORC_DISGUISE_MALE,
|
|
SPELL_ORC_DISGUISE_FEMALE
|
|
});
|
|
}
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
Unit* caster = GetCaster();
|
|
if (Player* target = GetHitPlayer())
|
|
{
|
|
uint8 gender = target->getGender();
|
|
if (!gender)
|
|
caster->CastSpell(target, SPELL_ORC_DISGUISE_MALE, true);
|
|
else
|
|
caster->CastSpell(target, SPELL_ORC_DISGUISE_FEMALE, true);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_orc_disguise::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum ParalyticPoison
|
|
{
|
|
SPELL_PARALYSIS = 35202
|
|
};
|
|
|
|
// 35201 - Paralytic Poison
|
|
class spell_gen_paralytic_poison : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_paralytic_poison);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_PARALYSIS });
|
|
}
|
|
|
|
void HandleStun(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
|
|
return;
|
|
|
|
GetTarget()->CastSpell(nullptr, SPELL_PARALYSIS, aurEff);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_gen_paralytic_poison::HandleStun, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
class spell_gen_proc_below_pct_damaged : public SpellScriptLoader
|
|
{
|
|
public:
|
|
spell_gen_proc_below_pct_damaged(char const* name) : SpellScriptLoader(name) { }
|
|
|
|
class spell_gen_proc_below_pct_damaged_AuraScript : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_proc_below_pct_damaged_AuraScript);
|
|
|
|
bool CheckProc(ProcEventInfo& eventInfo)
|
|
{
|
|
DamageInfo* damageInfo = eventInfo.GetDamageInfo();
|
|
if (!damageInfo || !damageInfo->GetDamage())
|
|
return false;
|
|
|
|
int32 pct = GetSpellInfo()->GetEffect(EFFECT_0).CalcValue();
|
|
|
|
if (eventInfo.GetActionTarget()->HealthBelowPctDamaged(pct, damageInfo->GetDamage()))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoCheckProc += AuraCheckProcFn(spell_gen_proc_below_pct_damaged_AuraScript::CheckProc);
|
|
}
|
|
};
|
|
|
|
AuraScript* GetAuraScript() const override
|
|
{
|
|
return new spell_gen_proc_below_pct_damaged_AuraScript();
|
|
}
|
|
};
|
|
|
|
class spell_gen_proc_charge_drop_only : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_proc_charge_drop_only);
|
|
|
|
void HandleChargeDrop(ProcEventInfo& /*eventInfo*/)
|
|
{
|
|
PreventDefaultAction();
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnProc += AuraProcFn(spell_gen_proc_charge_drop_only::HandleChargeDrop);
|
|
}
|
|
};
|
|
|
|
enum ParachuteSpells
|
|
{
|
|
SPELL_PARACHUTE = 45472,
|
|
SPELL_PARACHUTE_BUFF = 44795,
|
|
};
|
|
|
|
// 45472 Parachute
|
|
class spell_gen_parachute : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_parachute);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_PARACHUTE,
|
|
SPELL_PARACHUTE_BUFF
|
|
});
|
|
}
|
|
|
|
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
|
|
{
|
|
if (Player* target = GetTarget()->ToPlayer())
|
|
if (target->IsFalling())
|
|
{
|
|
target->RemoveAurasDueToSpell(SPELL_PARACHUTE);
|
|
target->CastSpell(target, SPELL_PARACHUTE_BUFF, true);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_parachute::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum PetSummoned
|
|
{
|
|
NPC_DOOMGUARD = 11859,
|
|
NPC_INFERNAL = 89,
|
|
NPC_IMP = 416
|
|
};
|
|
|
|
class spell_gen_pet_summoned : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_pet_summoned);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
Player* player = GetCaster()->ToPlayer();
|
|
if (player->GetLastPetNumber())
|
|
{
|
|
PetType newPetType = (player->getClass() == CLASS_HUNTER) ? HUNTER_PET : SUMMON_PET;
|
|
Pet* newPet = new Pet(player, newPetType);
|
|
if (newPet->LoadPetFromDB(player, 0, player->GetLastPetNumber(), true))
|
|
{
|
|
// revive the pet if it is dead
|
|
if (newPet->getDeathState() == DEAD)
|
|
newPet->setDeathState(ALIVE);
|
|
|
|
newPet->SetFullHealth();
|
|
newPet->SetFullPower(newPet->GetPowerType());
|
|
|
|
switch (newPet->GetEntry())
|
|
{
|
|
case NPC_DOOMGUARD:
|
|
case NPC_INFERNAL:
|
|
newPet->SetEntry(NPC_IMP);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
delete newPet;
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_pet_summoned::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
class spell_gen_profession_research : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_profession_research);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
SpellCastResult CheckRequirement()
|
|
{
|
|
if (HasDiscoveredAllSpells(GetSpellInfo()->Id, GetCaster()->ToPlayer()))
|
|
{
|
|
SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_NOTHING_TO_DISCOVER);
|
|
return SPELL_FAILED_CUSTOM_ERROR;
|
|
}
|
|
|
|
return SPELL_CAST_OK;
|
|
}
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
Player* caster = GetCaster()->ToPlayer();
|
|
uint32 spellId = GetSpellInfo()->Id;
|
|
|
|
// learn random explicit discovery recipe (if any)
|
|
if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster))
|
|
caster->LearnSpell(discoveredSpellId, false);
|
|
|
|
caster->UpdateCraftSkill(spellId);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnCheckCast += SpellCheckCastFn(spell_gen_profession_research::CheckRequirement);
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_profession_research::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum TrinketSpells
|
|
{
|
|
SPELL_PVP_TRINKET_ALLIANCE = 97403,
|
|
SPELL_PVP_TRINKET_HORDE = 97404
|
|
};
|
|
|
|
class spell_gen_pvp_trinket : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_pvp_trinket);
|
|
|
|
void TriggerAnimation()
|
|
{
|
|
Player* caster = GetCaster()->ToPlayer();
|
|
|
|
switch (caster->GetTeam())
|
|
{
|
|
case ALLIANCE:
|
|
caster->CastSpell(caster, SPELL_PVP_TRINKET_ALLIANCE, TRIGGERED_FULL_MASK);
|
|
break;
|
|
case HORDE:
|
|
caster->CastSpell(caster, SPELL_PVP_TRINKET_HORDE, TRIGGERED_FULL_MASK);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterCast += SpellCastFn(spell_gen_pvp_trinket::TriggerAnimation);
|
|
}
|
|
};
|
|
|
|
class spell_gen_remove_flight_auras : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_remove_flight_auras);
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Unit* target = GetHitUnit())
|
|
{
|
|
target->RemoveAurasByType(SPELL_AURA_FLY);
|
|
target->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_remove_flight_auras::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
// 23493 - Restoration
|
|
// 24379 - Restoration
|
|
class spell_gen_restoration : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_restoration);
|
|
|
|
void PeriodicTick(AuraEffect const* /*aurEff*/)
|
|
{
|
|
PreventDefaultAction();
|
|
|
|
Unit* caster = GetCaster();
|
|
if (!caster)
|
|
return;
|
|
|
|
int32 heal = caster->CountPctFromMaxHealth(10);
|
|
HealInfo healInfo(caster, GetTarget(), heal, GetSpellInfo(), GetSpellInfo()->GetSchoolMask());
|
|
caster->HealBySpell(healInfo);
|
|
|
|
/// @todo: should proc other auras?
|
|
if (int32 mana = caster->GetMaxPower(POWER_MANA))
|
|
{
|
|
mana /= 10;
|
|
caster->EnergizeBySpell(caster, GetSpellInfo(), mana, POWER_MANA);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_restoration::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
|
}
|
|
};
|
|
|
|
// 38772 Grievous Wound
|
|
// 43937 Grievous Wound
|
|
// 62331 Impale
|
|
// 62418 Impale
|
|
class spell_gen_remove_on_health_pct : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_remove_on_health_pct);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return spellInfo->GetEffects().size() > EFFECT_1;
|
|
}
|
|
|
|
void PeriodicTick(AuraEffect const* /*aurEff*/)
|
|
{
|
|
// they apply damage so no need to check for ticks here
|
|
|
|
if (GetTarget()->HealthAbovePct(GetEffectInfo(EFFECT_1).CalcValue()))
|
|
{
|
|
Remove(AURA_REMOVE_BY_ENEMY_SPELL);
|
|
PreventDefaultAction();
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_remove_on_health_pct::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
|
}
|
|
};
|
|
|
|
// 31956 Grievous Wound
|
|
// 38801 Grievous Wound
|
|
// 43093 Grievous Throw
|
|
// 58517 Grievous Wound
|
|
// 59262 Grievous Wound
|
|
class spell_gen_remove_on_full_health : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_remove_on_full_health);
|
|
|
|
void PeriodicTick(AuraEffect const* aurEff)
|
|
{
|
|
// if it has only periodic effect, allow 1 tick
|
|
bool onlyEffect = GetSpellInfo()->GetEffects().size() == 1;
|
|
if (onlyEffect && aurEff->GetTickNumber() <= 1)
|
|
return;
|
|
|
|
if (GetTarget()->IsFullHealth())
|
|
{
|
|
Remove(AURA_REMOVE_BY_ENEMY_SPELL);
|
|
PreventDefaultAction();
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_remove_on_full_health::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE);
|
|
}
|
|
};
|
|
|
|
// 70292 - Glacial Strike
|
|
// 71316 - Glacial Strike
|
|
class spell_gen_remove_on_full_health_pct : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_remove_on_full_health_pct);
|
|
|
|
void PeriodicTick(AuraEffect const* /*aurEff*/)
|
|
{
|
|
// they apply damage so no need to check for ticks here
|
|
|
|
if (GetTarget()->IsFullHealth())
|
|
{
|
|
Remove(AURA_REMOVE_BY_ENEMY_SPELL);
|
|
PreventDefaultAction();
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_remove_on_full_health_pct::PeriodicTick, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
|
|
}
|
|
};
|
|
|
|
enum Replenishment
|
|
{
|
|
SPELL_REPLENISHMENT = 57669,
|
|
SPELL_INFINITE_REPLENISHMENT = 61782
|
|
};
|
|
|
|
class ReplenishmentCheck
|
|
{
|
|
public:
|
|
bool operator()(WorldObject* obj) const
|
|
{
|
|
if (Unit* target = obj->ToUnit())
|
|
return target->GetPowerType() != POWER_MANA;
|
|
|
|
return true;
|
|
}
|
|
};
|
|
|
|
class spell_gen_replenishment : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_replenishment);
|
|
|
|
void RemoveInvalidTargets(std::list<WorldObject*>& targets)
|
|
{
|
|
// In arenas Replenishment may only affect the caster
|
|
if (Player* caster = GetCaster()->ToPlayer())
|
|
{
|
|
if (caster->InArena())
|
|
{
|
|
targets.clear();
|
|
targets.push_back(caster);
|
|
return;
|
|
}
|
|
}
|
|
|
|
targets.remove_if(ReplenishmentCheck());
|
|
|
|
uint8 const maxTargets = 10;
|
|
|
|
if (targets.size() > maxTargets)
|
|
{
|
|
targets.sort(Trinity::PowerPctOrderPred(POWER_MANA));
|
|
targets.resize(maxTargets);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_replenishment::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID);
|
|
}
|
|
};
|
|
|
|
class spell_gen_replenishment_aura : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_replenishment_aura);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetUnitOwner()->GetPowerType() == POWER_MANA;
|
|
}
|
|
|
|
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
|
{
|
|
switch (GetSpellInfo()->Id)
|
|
{
|
|
case SPELL_REPLENISHMENT:
|
|
amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.002f;
|
|
break;
|
|
case SPELL_INFINITE_REPLENISHMENT:
|
|
amount = GetUnitOwner()->GetMaxPower(POWER_MANA) * 0.0025f;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_replenishment_aura::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE);
|
|
}
|
|
};
|
|
|
|
enum RunningWildMountIds
|
|
{
|
|
SPELL_ALTERED_FORM = 97709
|
|
};
|
|
|
|
class spell_gen_running_wild : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_running_wild);
|
|
|
|
bool Validate(SpellInfo const* /*spell*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_ALTERED_FORM });
|
|
}
|
|
|
|
bool Load() override
|
|
{
|
|
// Definitely not a good thing, but currently the only way to do something at cast start
|
|
// Should be replaced as soon as possible with a new hook: BeforeCastStart
|
|
GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
|
|
return false;
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
}
|
|
};
|
|
|
|
class spell_gen_running_wild_aura : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_running_wild_aura);
|
|
|
|
bool Validate(SpellInfo const* /*spell*/) override
|
|
{
|
|
if (!sCreatureDisplayInfoStore.LookupEntry(DISPLAYID_HIDDEN_MOUNT))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
void HandleMount(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
Unit* target = GetTarget();
|
|
PreventDefaultAction();
|
|
|
|
target->Mount(DISPLAYID_HIDDEN_MOUNT, 0, 0);
|
|
|
|
// cast speed aura
|
|
if (MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(aurEff->GetAmount()))
|
|
target->CastSpell(target, mountCapability->ModSpellAuraID, TRIGGERED_FULL_MASK);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectApply += AuraEffectApplyFn(spell_gen_running_wild_aura::HandleMount, EFFECT_1, SPELL_AURA_MOUNTED, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
class spell_gen_two_forms : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_two_forms);
|
|
|
|
SpellCastResult CheckCast()
|
|
{
|
|
if (GetCaster()->IsInCombat())
|
|
{
|
|
SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
|
|
return SPELL_FAILED_CUSTOM_ERROR;
|
|
}
|
|
|
|
// Player cannot transform to human form if he is forced to be worgen for some reason (Darkflight)
|
|
if (GetCaster()->GetAuraEffectsByType(SPELL_AURA_WORGEN_ALTERED_FORM).size() > 1)
|
|
{
|
|
SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_CANT_TRANSFORM);
|
|
return SPELL_FAILED_CUSTOM_ERROR;
|
|
}
|
|
|
|
return SPELL_CAST_OK;
|
|
}
|
|
|
|
void HandleTransform(SpellEffIndex effIndex)
|
|
{
|
|
Unit* target = GetHitUnit();
|
|
PreventHitDefaultEffect(effIndex);
|
|
if (target->HasAuraType(SPELL_AURA_WORGEN_ALTERED_FORM))
|
|
target->RemoveAurasByType(SPELL_AURA_WORGEN_ALTERED_FORM);
|
|
else // Basepoints 1 for this aura control whether to trigger transform transition animation or not.
|
|
target->CastSpell(target, SPELL_ALTERED_FORM, CastSpellExtraArgs(TRIGGERED_FULL_MASK).AddSpellMod(SPELLVALUE_BASE_POINT0, 1));
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnCheckCast += SpellCheckCastFn(spell_gen_two_forms::CheckCast);
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_two_forms::HandleTransform, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_darkflight : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_darkflight);
|
|
|
|
void TriggerTransform()
|
|
{
|
|
GetCaster()->CastSpell(GetCaster(), SPELL_ALTERED_FORM, TRIGGERED_FULL_MASK);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterCast += SpellCastFn(spell_gen_darkflight::TriggerTransform);
|
|
}
|
|
};
|
|
|
|
enum SeaforiumSpells
|
|
{
|
|
SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT = 60937
|
|
};
|
|
|
|
class spell_gen_seaforium_blast : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_seaforium_blast);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT });
|
|
}
|
|
|
|
bool Load() override
|
|
{
|
|
return GetGObjCaster()->GetOwnerGUID().IsPlayer();
|
|
}
|
|
|
|
void AchievementCredit(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Unit* owner = GetGObjCaster()->GetOwner())
|
|
if (GameObject* go = GetHitGObj())
|
|
if (go->GetGOInfo()->type == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
|
|
owner->CastSpell(nullptr, SPELL_PLANT_CHARGES_CREDIT_ACHIEVEMENT, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_seaforium_blast::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE);
|
|
}
|
|
};
|
|
|
|
enum SpectatorCheerTrigger
|
|
{
|
|
EMOTE_ONE_SHOT_CHEER = 4,
|
|
EMOTE_ONE_SHOT_EXCLAMATION = 5,
|
|
EMOTE_ONE_SHOT_APPLAUD = 21
|
|
};
|
|
|
|
uint8 const EmoteArray[3] = { EMOTE_ONE_SHOT_CHEER, EMOTE_ONE_SHOT_EXCLAMATION, EMOTE_ONE_SHOT_APPLAUD };
|
|
|
|
class spell_gen_spectator_cheer_trigger : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_spectator_cheer_trigger);
|
|
|
|
void HandleDummy(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (roll_chance_i(40))
|
|
GetCaster()->HandleEmoteCommand(EmoteArray[urand(0, 2)]);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_spectator_cheer_trigger::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_spirit_healer_res : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_spirit_healer_res);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetOriginalCaster() && GetOriginalCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex /* effIndex */)
|
|
{
|
|
Player* originalCaster = GetOriginalCaster()->ToPlayer();
|
|
if (Unit* target = GetHitUnit())
|
|
{
|
|
WorldPackets::NPC::SpiritHealerConfirm spiritHealerConfirm;
|
|
spiritHealerConfirm.Unit = target->GetGUID();
|
|
originalCaster->SendDirectMessage(spiritHealerConfirm.Write());
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_spirit_healer_res::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum SummonElemental
|
|
{
|
|
SPELL_SUMMON_FIRE_ELEMENTAL = 8985,
|
|
SPELL_SUMMON_EARTH_ELEMENTAL = 19704
|
|
};
|
|
|
|
class spell_gen_summon_elemental : public SpellScriptLoader
|
|
{
|
|
public:
|
|
spell_gen_summon_elemental(char const* name, uint32 spellId) : SpellScriptLoader(name), _spellId(spellId) { }
|
|
|
|
class spell_gen_summon_elemental_AuraScript : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_summon_elemental_AuraScript);
|
|
|
|
public:
|
|
spell_gen_summon_elemental_AuraScript(uint32 spellId) : AuraScript(), _spellId(spellId) { }
|
|
|
|
private:
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ _spellId });
|
|
}
|
|
|
|
void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
if (GetCaster())
|
|
if (Unit* owner = GetCaster()->GetOwner())
|
|
owner->CastSpell(owner, _spellId, true);
|
|
}
|
|
|
|
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
if (GetCaster())
|
|
if (Unit* owner = GetCaster()->GetOwner())
|
|
if (owner->GetTypeId() == TYPEID_PLAYER) /// @todo this check is maybe wrong
|
|
owner->ToPlayer()->RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterEffectApply += AuraEffectApplyFn(spell_gen_summon_elemental_AuraScript::AfterApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_gen_summon_elemental_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
|
|
uint32 _spellId;
|
|
};
|
|
|
|
AuraScript* GetAuraScript() const override
|
|
{
|
|
return new spell_gen_summon_elemental_AuraScript(_spellId);
|
|
}
|
|
|
|
private:
|
|
uint32 _spellId;
|
|
};
|
|
|
|
enum TournamentMountsSpells
|
|
{
|
|
SPELL_LANCE_EQUIPPED = 62853
|
|
};
|
|
|
|
class spell_gen_summon_tournament_mount : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_summon_tournament_mount);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_LANCE_EQUIPPED });
|
|
}
|
|
|
|
SpellCastResult CheckIfLanceEquiped()
|
|
{
|
|
if (GetCaster()->IsInDisallowedMountForm())
|
|
GetCaster()->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT);
|
|
|
|
if (!GetCaster()->HasAura(SPELL_LANCE_EQUIPPED))
|
|
{
|
|
SetCustomCastResultMessage(SPELL_CUSTOM_ERROR_MUST_HAVE_LANCE_EQUIPPED);
|
|
return SPELL_FAILED_CUSTOM_ERROR;
|
|
}
|
|
|
|
return SPELL_CAST_OK;
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnCheckCast += SpellCheckCastFn(spell_gen_summon_tournament_mount::CheckIfLanceEquiped);
|
|
}
|
|
};
|
|
|
|
// 41213, 43416, 69222, 73076 - Throw Shield
|
|
class spell_gen_throw_shield : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_throw_shield);
|
|
|
|
void HandleScriptEffect(SpellEffIndex effIndex)
|
|
{
|
|
PreventHitDefaultEffect(effIndex);
|
|
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_throw_shield::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum MountedDuelSpells
|
|
{
|
|
SPELL_ON_TOURNAMENT_MOUNT = 63034,
|
|
SPELL_MOUNTED_DUEL = 62875
|
|
};
|
|
|
|
class spell_gen_tournament_duel : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_tournament_duel);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_ON_TOURNAMENT_MOUNT,
|
|
SPELL_MOUNTED_DUEL
|
|
});
|
|
}
|
|
|
|
void HandleScriptEffect(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Unit* rider = GetCaster()->GetCharmer())
|
|
{
|
|
if (Player* playerTarget = GetHitPlayer())
|
|
{
|
|
if (playerTarget->HasAura(SPELL_ON_TOURNAMENT_MOUNT) && playerTarget->GetVehicleBase())
|
|
rider->CastSpell(playerTarget, SPELL_MOUNTED_DUEL, true);
|
|
}
|
|
else if (Unit* unitTarget = GetHitUnit())
|
|
{
|
|
if (unitTarget->GetCharmer() && unitTarget->GetCharmer()->GetTypeId() == TYPEID_PLAYER && unitTarget->GetCharmer()->HasAura(SPELL_ON_TOURNAMENT_MOUNT))
|
|
rider->CastSpell(unitTarget->GetCharmer(), SPELL_MOUNTED_DUEL, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_tournament_duel::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
class spell_gen_tournament_pennant : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_tournament_pennant);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
void HandleApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
if (Unit* caster = GetCaster())
|
|
if (!caster->GetVehicleBase())
|
|
caster->RemoveAurasDueToSpell(GetId());
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectApply += AuraEffectApplyFn(spell_gen_tournament_pennant::HandleApplyEffect, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
|
|
}
|
|
};
|
|
|
|
class spell_gen_trigger_exclude_caster_aura_spell : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_trigger_exclude_caster_aura_spell);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return ValidateSpellInfo({ spellInfo->ExcludeCasterAuraSpell });
|
|
}
|
|
|
|
void HandleTrigger()
|
|
{
|
|
// Blizz seems to just apply aura without bothering to cast
|
|
GetCaster()->AddAura(GetSpellInfo()->ExcludeCasterAuraSpell, GetCaster());
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterCast += SpellCastFn(spell_gen_trigger_exclude_caster_aura_spell::HandleTrigger);
|
|
}
|
|
};
|
|
|
|
class spell_gen_trigger_exclude_target_aura_spell : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_trigger_exclude_target_aura_spell);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return ValidateSpellInfo({ spellInfo->ExcludeTargetAuraSpell });
|
|
}
|
|
|
|
void HandleTrigger()
|
|
{
|
|
if (Unit* target = GetHitUnit())
|
|
// Blizz seems to just apply aura without bothering to cast
|
|
GetCaster()->AddAura(GetSpellInfo()->ExcludeTargetAuraSpell, target);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterHit += SpellHitFn(spell_gen_trigger_exclude_target_aura_spell::HandleTrigger);
|
|
}
|
|
};
|
|
|
|
enum PvPTrinketTriggeredSpells
|
|
{
|
|
SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER = 72752,
|
|
SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF = 72757
|
|
};
|
|
|
|
template <uint32 TriggeredSpellId>
|
|
class spell_pvp_trinket_wotf_shared_cd : public SpellScriptLoader
|
|
{
|
|
public:
|
|
spell_pvp_trinket_wotf_shared_cd(char const* ScriptName) : SpellScriptLoader(ScriptName) { }
|
|
|
|
template <uint32 Triggered>
|
|
class spell_pvp_trinket_wotf_shared_cd_SpellScript : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_pvp_trinket_wotf_shared_cd_SpellScript);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ Triggered });
|
|
}
|
|
|
|
void HandleScript()
|
|
{
|
|
/*
|
|
* @workaround: PendingCast flag normally means 'triggered' spell, however
|
|
* if the spell is cast triggered, the core won't send SMSG_SPELL_GO packet
|
|
* so client never registers the cooldown (see Spell::IsNeedSendToClient)
|
|
*
|
|
* ServerToClient: SMSG_SPELL_GO (0x0132) Length: 42 ConnIdx: 0 Time: 07/19/2010 02:32:35.000 Number: 362675
|
|
* Caster GUID: Full: Player
|
|
* Caster Unit GUID: Full: Player
|
|
* Cast Count: 0
|
|
* Spell ID: 72752 (72752)
|
|
* Cast Flags: PendingCast, Unknown3, Unknown7 (265)
|
|
* Time: 3901468825
|
|
* Hit Count: 1
|
|
* [0] Hit GUID: Player
|
|
* Miss Count: 0
|
|
* Target Flags: Unit (2)
|
|
* Target GUID: 0x0
|
|
*/
|
|
|
|
// Spell flags need further research, until then just cast not triggered
|
|
GetCaster()->CastSpell(nullptr, Triggered, false);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterCast += SpellCastFn(spell_pvp_trinket_wotf_shared_cd_SpellScript::HandleScript);
|
|
}
|
|
};
|
|
|
|
SpellScript* GetSpellScript() const override
|
|
{
|
|
return new spell_pvp_trinket_wotf_shared_cd_SpellScript<TriggeredSpellId>();
|
|
}
|
|
};
|
|
|
|
enum FriendOrFowl
|
|
{
|
|
SPELL_TURKEY_VENGEANCE = 25285
|
|
};
|
|
|
|
class spell_gen_turkey_marker : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_turkey_marker);
|
|
|
|
void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
// store stack apply times, so we can pop them while they expire
|
|
_applyTimes.push_back(GameTime::GetGameTimeMS());
|
|
Unit* target = GetTarget();
|
|
|
|
// on stack 15 cast the achievement crediting spell
|
|
if (GetStackAmount() >= 15)
|
|
target->CastSpell(target, SPELL_TURKEY_VENGEANCE, CastSpellExtraArgs(aurEff)
|
|
.SetOriginalCaster(GetCasterGUID()));
|
|
}
|
|
|
|
void OnPeriodic(AuraEffect const* /*aurEff*/)
|
|
{
|
|
if (_applyTimes.empty())
|
|
return;
|
|
|
|
// pop stack if it expired for us
|
|
if (_applyTimes.front() + GetMaxDuration() < GameTime::GetGameTimeMS())
|
|
ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterEffectApply += AuraEffectApplyFn(spell_gen_turkey_marker::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK);
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_turkey_marker::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
|
}
|
|
|
|
std::list<uint32> _applyTimes;
|
|
};
|
|
|
|
enum FoamSword
|
|
{
|
|
ITEM_FOAM_SWORD_GREEN = 45061,
|
|
ITEM_FOAM_SWORD_PINK = 45176,
|
|
ITEM_FOAM_SWORD_BLUE = 45177,
|
|
ITEM_FOAM_SWORD_RED = 45178,
|
|
ITEM_FOAM_SWORD_YELLOW = 45179
|
|
};
|
|
|
|
class spell_gen_upper_deck_create_foam_sword : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_upper_deck_create_foam_sword);
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Player* player = GetHitPlayer())
|
|
{
|
|
static uint32 const itemId[5] = { ITEM_FOAM_SWORD_GREEN, ITEM_FOAM_SWORD_PINK, ITEM_FOAM_SWORD_BLUE, ITEM_FOAM_SWORD_RED, ITEM_FOAM_SWORD_YELLOW };
|
|
// player can only have one of these items
|
|
for (uint8 i = 0; i < 5; ++i)
|
|
{
|
|
if (player->HasItemCount(itemId[i], 1, true))
|
|
return;
|
|
}
|
|
|
|
CreateItem(itemId[urand(0, 4)], ItemContext::NONE);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_upper_deck_create_foam_sword::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum VampiricTouch
|
|
{
|
|
SPELL_VAMPIRIC_TOUCH_HEAL = 52724
|
|
};
|
|
|
|
// 52723 - Vampiric Touch
|
|
// 60501 - Vampiric Touch
|
|
class spell_gen_vampiric_touch : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_vampiric_touch);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_VAMPIRIC_TOUCH_HEAL });
|
|
}
|
|
|
|
void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
|
|
{
|
|
PreventDefaultAction();
|
|
DamageInfo* damageInfo = eventInfo.GetDamageInfo();
|
|
if (!damageInfo || !damageInfo->GetDamage())
|
|
return;
|
|
|
|
Unit* caster = eventInfo.GetActor();
|
|
CastSpellExtraArgs args(aurEff);
|
|
args.AddSpellBP0(damageInfo->GetDamage() / 2);
|
|
caster->CastSpell(caster, SPELL_VAMPIRIC_TOUCH_HEAL, args);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectProc += AuraEffectProcFn(spell_gen_vampiric_touch::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum VehicleScaling
|
|
{
|
|
SPELL_GEAR_SCALING = 66668
|
|
};
|
|
|
|
class spell_gen_vehicle_scaling : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_vehicle_scaling);
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
|
|
{
|
|
Unit* caster = GetCaster();
|
|
float factor;
|
|
uint16 baseItemLevel;
|
|
|
|
/// @todo Reserach coeffs for different vehicles
|
|
switch (GetId())
|
|
{
|
|
case SPELL_GEAR_SCALING:
|
|
factor = 1.0f;
|
|
baseItemLevel = 205;
|
|
break;
|
|
default:
|
|
factor = 1.0f;
|
|
baseItemLevel = 170;
|
|
break;
|
|
}
|
|
|
|
float avgILvl = caster->ToPlayer()->GetAverageItemLevel();
|
|
if (avgILvl < baseItemLevel)
|
|
return; /// @todo Research possibility of scaling down
|
|
|
|
amount = uint16((avgILvl - baseItemLevel) * factor);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT);
|
|
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE);
|
|
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_vehicle_scaling::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT);
|
|
}
|
|
};
|
|
|
|
enum VendorBarkTrigger
|
|
{
|
|
NPC_AMPHITHEATER_VENDOR = 30098,
|
|
SAY_AMPHITHEATER_VENDOR = 0
|
|
};
|
|
|
|
class spell_gen_vendor_bark_trigger : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_vendor_bark_trigger);
|
|
|
|
void HandleDummy(SpellEffIndex /* effIndex */)
|
|
{
|
|
if (Creature* vendor = GetCaster()->ToCreature())
|
|
if (vendor->GetEntry() == NPC_AMPHITHEATER_VENDOR)
|
|
vendor->AI()->Talk(SAY_AMPHITHEATER_VENDOR);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_vendor_bark_trigger::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_wg_water : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_wg_water);
|
|
|
|
SpellCastResult CheckCast()
|
|
{
|
|
if (!GetSpellInfo()->CheckTargetCreatureType(GetCaster()))
|
|
return SPELL_FAILED_DONT_REPORT;
|
|
return SPELL_CAST_OK;
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnCheckCast += SpellCheckCastFn(spell_gen_wg_water::CheckCast);
|
|
}
|
|
};
|
|
|
|
enum WhisperGulchYoggSaronWhisper
|
|
{
|
|
SPELL_YOGG_SARON_WHISPER_DUMMY = 29072
|
|
};
|
|
|
|
class spell_gen_whisper_gulch_yogg_saron_whisper : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_YOGG_SARON_WHISPER_DUMMY });
|
|
}
|
|
|
|
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
|
|
{
|
|
PreventDefaultAction();
|
|
GetTarget()->CastSpell(nullptr, SPELL_YOGG_SARON_WHISPER_DUMMY, true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_eject_all_passengers : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_eject_all_passengers);
|
|
|
|
void RemoveVehicleAuras()
|
|
{
|
|
if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit())
|
|
vehicle->RemoveAllPassengers();
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterHit += SpellHitFn(spell_gen_eject_all_passengers::RemoveVehicleAuras);
|
|
}
|
|
};
|
|
|
|
class spell_gen_eject_passenger : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_eject_passenger);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
if (spellInfo->GetEffects().empty())
|
|
return false;
|
|
if (spellInfo->GetEffect(EFFECT_0).CalcValue() < 1)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
void EjectPassenger(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Vehicle* vehicle = GetHitUnit()->GetVehicleKit())
|
|
{
|
|
if (Unit* passenger = vehicle->GetPassenger(GetEffectValue() - 1))
|
|
passenger->ExitVehicle();
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_eject_passenger::EjectPassenger, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum GMFreeze
|
|
{
|
|
SPELL_GM_FREEZE = 9454
|
|
};
|
|
|
|
class spell_gen_gm_freeze : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_gm_freeze);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_GM_FREEZE });
|
|
}
|
|
|
|
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
// Do what was done before to the target in HandleFreezeCommand
|
|
if (Player* player = GetTarget()->ToPlayer())
|
|
{
|
|
// stop combat + make player unattackable + duel stop + stop some spells
|
|
player->SetFaction(FACTION_FRIENDLY);
|
|
player->CombatStop();
|
|
if (player->IsNonMeleeSpellCast(true))
|
|
player->InterruptNonMeleeSpells(true);
|
|
player->AddUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
|
|
// if player class = hunter || warlock remove pet if alive
|
|
if ((player->getClass() == CLASS_HUNTER) || (player->getClass() == CLASS_WARLOCK))
|
|
{
|
|
if (Pet* pet = player->GetPet())
|
|
{
|
|
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
|
|
// not let dismiss dead pet
|
|
if (pet->IsAlive())
|
|
player->RemovePet(pet, PET_SAVE_NOT_IN_SLOT);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
// Do what was done before to the target in HandleUnfreezeCommand
|
|
if (Player* player = GetTarget()->ToPlayer())
|
|
{
|
|
// Reset player faction + allow combat + allow duels
|
|
player->setFactionForRace(player->getRace());
|
|
player->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
|
|
// save player
|
|
player->SaveToDB();
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectApply += AuraEffectApplyFn(spell_gen_gm_freeze::OnApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_gm_freeze::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
class spell_gen_stand : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_stand);
|
|
|
|
void HandleScript(SpellEffIndex /*eff*/)
|
|
{
|
|
Creature* target = GetHitCreature();
|
|
if (!target)
|
|
return;
|
|
|
|
target->SetStandState(UNIT_STAND_STATE_STAND);
|
|
target->HandleEmoteCommand(EMOTE_STATE_NONE);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_stand::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum RequiredMixologySpells
|
|
{
|
|
SPELL_MIXOLOGY = 53042,
|
|
// Flasks
|
|
SPELL_FLASK_OF_THE_FROST_WYRM = 53755,
|
|
SPELL_FLASK_OF_STONEBLOOD = 53758,
|
|
SPELL_FLASK_OF_ENDLESS_RAGE = 53760,
|
|
SPELL_FLASK_OF_PURE_MOJO = 54212,
|
|
SPELL_LESSER_FLASK_OF_RESISTANCE = 62380,
|
|
SPELL_LESSER_FLASK_OF_TOUGHNESS = 53752,
|
|
SPELL_FLASK_OF_BLINDING_LIGHT = 28521,
|
|
SPELL_FLASK_OF_CHROMATIC_WONDER = 42735,
|
|
SPELL_FLASK_OF_FORTIFICATION = 28518,
|
|
SPELL_FLASK_OF_MIGHTY_RESTORATION = 28519,
|
|
SPELL_FLASK_OF_PURE_DEATH = 28540,
|
|
SPELL_FLASK_OF_RELENTLESS_ASSAULT = 28520,
|
|
SPELL_FLASK_OF_CHROMATIC_RESISTANCE = 17629,
|
|
SPELL_FLASK_OF_DISTILLED_WISDOM = 17627,
|
|
SPELL_FLASK_OF_SUPREME_POWER = 17628,
|
|
SPELL_FLASK_OF_THE_TITANS = 17626,
|
|
// Elixirs
|
|
SPELL_ELIXIR_OF_MIGHTY_AGILITY = 28497,
|
|
SPELL_ELIXIR_OF_ACCURACY = 60340,
|
|
SPELL_ELIXIR_OF_DEADLY_STRIKES = 60341,
|
|
SPELL_ELIXIR_OF_MIGHTY_DEFENSE = 60343,
|
|
SPELL_ELIXIR_OF_EXPERTISE = 60344,
|
|
SPELL_ELIXIR_OF_ARMOR_PIERCING = 60345,
|
|
SPELL_ELIXIR_OF_LIGHTNING_SPEED = 60346,
|
|
SPELL_ELIXIR_OF_MIGHTY_FORTITUDE = 53751,
|
|
SPELL_ELIXIR_OF_MIGHTY_MAGEBLOOD = 53764,
|
|
SPELL_ELIXIR_OF_MIGHTY_STRENGTH = 53748,
|
|
SPELL_ELIXIR_OF_MIGHTY_TOUGHTS = 60347,
|
|
SPELL_ELIXIR_OF_PROTECTION = 53763,
|
|
SPELL_ELIXIR_OF_SPIRIT = 53747,
|
|
SPELL_GURUS_ELIXIR = 53749,
|
|
SPELL_SHADOWPOWER_ELIXIR = 33721,
|
|
SPELL_WRATH_ELIXIR = 53746,
|
|
SPELL_ELIXIR_OF_EMPOWERMENT = 28514,
|
|
SPELL_ELIXIR_OF_MAJOR_MAGEBLOOD = 28509,
|
|
SPELL_ELIXIR_OF_MAJOR_SHADOW_POWER = 28503,
|
|
SPELL_ELIXIR_OF_MAJOR_DEFENSE = 28502,
|
|
SPELL_FEL_STRENGTH_ELIXIR = 38954,
|
|
SPELL_ELIXIR_OF_IRONSKIN = 39628,
|
|
SPELL_ELIXIR_OF_MAJOR_AGILITY = 54494,
|
|
SPELL_ELIXIR_OF_DRAENIC_WISDOM = 39627,
|
|
SPELL_ELIXIR_OF_MAJOR_FIREPOWER = 28501,
|
|
SPELL_ELIXIR_OF_MAJOR_FROST_POWER = 28493,
|
|
SPELL_EARTHEN_ELIXIR = 39626,
|
|
SPELL_ELIXIR_OF_MASTERY = 33726,
|
|
SPELL_ELIXIR_OF_HEALING_POWER = 28491,
|
|
SPELL_ELIXIR_OF_MAJOR_FORTITUDE = 39625,
|
|
SPELL_ELIXIR_OF_MAJOR_STRENGTH = 28490,
|
|
SPELL_ADEPTS_ELIXIR = 54452,
|
|
SPELL_ONSLAUGHT_ELIXIR = 33720,
|
|
SPELL_MIGHTY_TROLLS_BLOOD_ELIXIR = 24361,
|
|
SPELL_GREATER_ARCANE_ELIXIR = 17539,
|
|
SPELL_ELIXIR_OF_THE_MONGOOSE = 17538,
|
|
SPELL_ELIXIR_OF_BRUTE_FORCE = 17537,
|
|
SPELL_ELIXIR_OF_SAGES = 17535,
|
|
SPELL_ELIXIR_OF_SUPERIOR_DEFENSE = 11348,
|
|
SPELL_ELIXIR_OF_DEMONSLAYING = 11406,
|
|
SPELL_ELIXIR_OF_GREATER_FIREPOWER = 26276,
|
|
SPELL_ELIXIR_OF_SHADOW_POWER = 11474,
|
|
SPELL_MAGEBLOOD_ELIXIR = 24363,
|
|
SPELL_ELIXIR_OF_GIANTS = 11405,
|
|
SPELL_ELIXIR_OF_GREATER_AGILITY = 11334,
|
|
SPELL_ARCANE_ELIXIR = 11390,
|
|
SPELL_ELIXIR_OF_GREATER_INTELLECT = 11396,
|
|
SPELL_ELIXIR_OF_GREATER_DEFENSE = 11349,
|
|
SPELL_ELIXIR_OF_FROST_POWER = 21920,
|
|
SPELL_ELIXIR_OF_AGILITY = 11328,
|
|
SPELL_MAJOR_TROLLS_BLLOOD_ELIXIR = 3223,
|
|
SPELL_ELIXIR_OF_FORTITUDE = 3593,
|
|
SPELL_ELIXIR_OF_OGRES_STRENGTH = 3164,
|
|
SPELL_ELIXIR_OF_FIREPOWER = 7844,
|
|
SPELL_ELIXIR_OF_LESSER_AGILITY = 3160,
|
|
SPELL_ELIXIR_OF_DEFENSE = 3220,
|
|
SPELL_STRONG_TROLLS_BLOOD_ELIXIR = 3222,
|
|
SPELL_ELIXIR_OF_MINOR_ACCURACY = 63729,
|
|
SPELL_ELIXIR_OF_WISDOM = 3166,
|
|
SPELL_ELIXIR_OF_GIANTH_GROWTH = 8212,
|
|
SPELL_ELIXIR_OF_MINOR_AGILITY = 2374,
|
|
SPELL_ELIXIR_OF_MINOR_FORTITUDE = 2378,
|
|
SPELL_WEAK_TROLLS_BLOOD_ELIXIR = 3219,
|
|
SPELL_ELIXIR_OF_LIONS_STRENGTH = 2367,
|
|
SPELL_ELIXIR_OF_MINOR_DEFENSE = 673
|
|
};
|
|
|
|
class spell_gen_mixology_bonus : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_mixology_bonus);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_MIXOLOGY }) && !spellInfo->GetEffects().empty();
|
|
}
|
|
|
|
bool Load() override
|
|
{
|
|
return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
|
|
}
|
|
|
|
void SetBonusValueForEffect(SpellEffIndex effIndex, int32 value, AuraEffect const* aurEff)
|
|
{
|
|
if (aurEff->GetEffIndex() == uint32(effIndex))
|
|
bonus = value;
|
|
}
|
|
|
|
void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
|
|
{
|
|
if (GetCaster()->HasAura(SPELL_MIXOLOGY) && GetCaster()->HasSpell(GetEffectInfo(EFFECT_0).TriggerSpell))
|
|
{
|
|
switch (GetId())
|
|
{
|
|
case SPELL_WEAK_TROLLS_BLOOD_ELIXIR:
|
|
case SPELL_MAGEBLOOD_ELIXIR:
|
|
bonus = amount;
|
|
break;
|
|
case SPELL_ELIXIR_OF_FROST_POWER:
|
|
case SPELL_LESSER_FLASK_OF_TOUGHNESS:
|
|
case SPELL_LESSER_FLASK_OF_RESISTANCE:
|
|
bonus = CalculatePct(amount, 80);
|
|
break;
|
|
case SPELL_ELIXIR_OF_MINOR_DEFENSE:
|
|
case SPELL_ELIXIR_OF_LIONS_STRENGTH:
|
|
case SPELL_ELIXIR_OF_MINOR_AGILITY:
|
|
case SPELL_MAJOR_TROLLS_BLLOOD_ELIXIR:
|
|
case SPELL_ELIXIR_OF_SHADOW_POWER:
|
|
case SPELL_ELIXIR_OF_BRUTE_FORCE:
|
|
case SPELL_MIGHTY_TROLLS_BLOOD_ELIXIR:
|
|
case SPELL_ELIXIR_OF_GREATER_FIREPOWER:
|
|
case SPELL_ONSLAUGHT_ELIXIR:
|
|
case SPELL_EARTHEN_ELIXIR:
|
|
case SPELL_ELIXIR_OF_MAJOR_AGILITY:
|
|
case SPELL_FLASK_OF_THE_TITANS:
|
|
case SPELL_FLASK_OF_RELENTLESS_ASSAULT:
|
|
case SPELL_FLASK_OF_STONEBLOOD:
|
|
case SPELL_ELIXIR_OF_MINOR_ACCURACY:
|
|
bonus = CalculatePct(amount, 50);
|
|
break;
|
|
case SPELL_ELIXIR_OF_PROTECTION:
|
|
bonus = 280;
|
|
break;
|
|
case SPELL_ELIXIR_OF_MAJOR_DEFENSE:
|
|
bonus = 200;
|
|
break;
|
|
case SPELL_ELIXIR_OF_GREATER_DEFENSE:
|
|
case SPELL_ELIXIR_OF_SUPERIOR_DEFENSE:
|
|
bonus = 140;
|
|
break;
|
|
case SPELL_ELIXIR_OF_FORTITUDE:
|
|
bonus = 100;
|
|
break;
|
|
case SPELL_FLASK_OF_ENDLESS_RAGE:
|
|
bonus = 82;
|
|
break;
|
|
case SPELL_ELIXIR_OF_DEFENSE:
|
|
bonus = 70;
|
|
break;
|
|
case SPELL_ELIXIR_OF_DEMONSLAYING:
|
|
bonus = 50;
|
|
break;
|
|
case SPELL_FLASK_OF_THE_FROST_WYRM:
|
|
bonus = 47;
|
|
break;
|
|
case SPELL_WRATH_ELIXIR:
|
|
bonus = 32;
|
|
break;
|
|
case SPELL_ELIXIR_OF_MAJOR_FROST_POWER:
|
|
case SPELL_ELIXIR_OF_MAJOR_FIREPOWER:
|
|
case SPELL_ELIXIR_OF_MAJOR_SHADOW_POWER:
|
|
bonus = 29;
|
|
break;
|
|
case SPELL_ELIXIR_OF_MIGHTY_TOUGHTS:
|
|
bonus = 27;
|
|
break;
|
|
case SPELL_FLASK_OF_SUPREME_POWER:
|
|
case SPELL_FLASK_OF_BLINDING_LIGHT:
|
|
case SPELL_FLASK_OF_PURE_DEATH:
|
|
case SPELL_SHADOWPOWER_ELIXIR:
|
|
bonus = 23;
|
|
break;
|
|
case SPELL_ELIXIR_OF_MIGHTY_AGILITY:
|
|
case SPELL_FLASK_OF_DISTILLED_WISDOM:
|
|
case SPELL_ELIXIR_OF_SPIRIT:
|
|
case SPELL_ELIXIR_OF_MIGHTY_STRENGTH:
|
|
case SPELL_FLASK_OF_PURE_MOJO:
|
|
case SPELL_ELIXIR_OF_ACCURACY:
|
|
case SPELL_ELIXIR_OF_DEADLY_STRIKES:
|
|
case SPELL_ELIXIR_OF_MIGHTY_DEFENSE:
|
|
case SPELL_ELIXIR_OF_EXPERTISE:
|
|
case SPELL_ELIXIR_OF_ARMOR_PIERCING:
|
|
case SPELL_ELIXIR_OF_LIGHTNING_SPEED:
|
|
bonus = 20;
|
|
break;
|
|
case SPELL_FLASK_OF_CHROMATIC_RESISTANCE:
|
|
bonus = 17;
|
|
break;
|
|
case SPELL_ELIXIR_OF_MINOR_FORTITUDE:
|
|
case SPELL_ELIXIR_OF_MAJOR_STRENGTH:
|
|
bonus = 15;
|
|
break;
|
|
case SPELL_FLASK_OF_MIGHTY_RESTORATION:
|
|
bonus = 13;
|
|
break;
|
|
case SPELL_ARCANE_ELIXIR:
|
|
bonus = 12;
|
|
break;
|
|
case SPELL_ELIXIR_OF_GREATER_AGILITY:
|
|
case SPELL_ELIXIR_OF_GIANTS:
|
|
bonus = 11;
|
|
break;
|
|
case SPELL_ELIXIR_OF_AGILITY:
|
|
case SPELL_ELIXIR_OF_GREATER_INTELLECT:
|
|
case SPELL_ELIXIR_OF_SAGES:
|
|
case SPELL_ELIXIR_OF_IRONSKIN:
|
|
case SPELL_ELIXIR_OF_MIGHTY_MAGEBLOOD:
|
|
bonus = 10;
|
|
break;
|
|
case SPELL_ELIXIR_OF_HEALING_POWER:
|
|
bonus = 9;
|
|
break;
|
|
case SPELL_ELIXIR_OF_DRAENIC_WISDOM:
|
|
case SPELL_GURUS_ELIXIR:
|
|
bonus = 8;
|
|
break;
|
|
case SPELL_ELIXIR_OF_FIREPOWER:
|
|
case SPELL_ELIXIR_OF_MAJOR_MAGEBLOOD:
|
|
case SPELL_ELIXIR_OF_MASTERY:
|
|
bonus = 6;
|
|
break;
|
|
case SPELL_ELIXIR_OF_LESSER_AGILITY:
|
|
case SPELL_ELIXIR_OF_OGRES_STRENGTH:
|
|
case SPELL_ELIXIR_OF_WISDOM:
|
|
case SPELL_ELIXIR_OF_THE_MONGOOSE:
|
|
bonus = 5;
|
|
break;
|
|
case SPELL_STRONG_TROLLS_BLOOD_ELIXIR:
|
|
case SPELL_FLASK_OF_CHROMATIC_WONDER:
|
|
bonus = 4;
|
|
break;
|
|
case SPELL_ELIXIR_OF_EMPOWERMENT:
|
|
bonus = -10;
|
|
break;
|
|
case SPELL_ADEPTS_ELIXIR:
|
|
SetBonusValueForEffect(EFFECT_0, 13, aurEff);
|
|
SetBonusValueForEffect(EFFECT_1, 13, aurEff);
|
|
SetBonusValueForEffect(EFFECT_2, 8, aurEff);
|
|
break;
|
|
case SPELL_ELIXIR_OF_MIGHTY_FORTITUDE:
|
|
SetBonusValueForEffect(EFFECT_0, 160, aurEff);
|
|
break;
|
|
case SPELL_ELIXIR_OF_MAJOR_FORTITUDE:
|
|
SetBonusValueForEffect(EFFECT_0, 116, aurEff);
|
|
SetBonusValueForEffect(EFFECT_1, 6, aurEff);
|
|
break;
|
|
case SPELL_FEL_STRENGTH_ELIXIR:
|
|
SetBonusValueForEffect(EFFECT_0, 40, aurEff);
|
|
SetBonusValueForEffect(EFFECT_1, 40, aurEff);
|
|
break;
|
|
case SPELL_FLASK_OF_FORTIFICATION:
|
|
SetBonusValueForEffect(EFFECT_0, 210, aurEff);
|
|
SetBonusValueForEffect(EFFECT_1, 5, aurEff);
|
|
break;
|
|
case SPELL_GREATER_ARCANE_ELIXIR:
|
|
SetBonusValueForEffect(EFFECT_0, 19, aurEff);
|
|
SetBonusValueForEffect(EFFECT_1, 19, aurEff);
|
|
SetBonusValueForEffect(EFFECT_2, 5, aurEff);
|
|
break;
|
|
case SPELL_ELIXIR_OF_GIANTH_GROWTH:
|
|
SetBonusValueForEffect(EFFECT_0, 5, aurEff);
|
|
break;
|
|
default:
|
|
TC_LOG_ERROR("spells", "SpellId %u couldn't be processed in spell_gen_mixology_bonus", GetId());
|
|
break;
|
|
}
|
|
amount += bonus;
|
|
}
|
|
}
|
|
|
|
int32 bonus = 0;
|
|
|
|
void Register() override
|
|
{
|
|
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_gen_mixology_bonus::CalculateAmount, EFFECT_ALL, SPELL_AURA_ANY);
|
|
}
|
|
};
|
|
|
|
enum LandmineKnockbackAchievement
|
|
{
|
|
SPELL_LANDMINE_KNOCKBACK_ACHIEVEMENT = 57064
|
|
};
|
|
|
|
class spell_gen_landmine_knockback_achievement : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_landmine_knockback_achievement);
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Player* target = GetHitPlayer())
|
|
{
|
|
Aura const* aura = GetHitAura();
|
|
if (!aura || aura->GetStackAmount() < 10)
|
|
return;
|
|
|
|
target->CastSpell(target, SPELL_LANDMINE_KNOCKBACK_ACHIEVEMENT, true);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_landmine_knockback_achievement::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
// 34098 - ClearAllDebuffs
|
|
class spell_gen_clear_debuffs : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_clear_debuffs);
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Unit* target = GetHitUnit())
|
|
{
|
|
target->RemoveOwnedAuras([](Aura const* aura)
|
|
{
|
|
SpellInfo const* spellInfo = aura->GetSpellInfo();
|
|
return !spellInfo->IsPositive() && !spellInfo->IsPassive();
|
|
});
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_clear_debuffs::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
enum PonySpells
|
|
{
|
|
ACHIEV_PONY_UP = 3736,
|
|
MOUNT_PONY = 29736
|
|
};
|
|
|
|
class spell_gen_pony_mount_check : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_pony_mount_check);
|
|
|
|
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
|
|
{
|
|
Unit* caster = GetCaster();
|
|
if (!caster)
|
|
return;
|
|
Player* owner = caster->GetOwner()->ToPlayer();
|
|
if (!owner || !owner->HasAchieved(ACHIEV_PONY_UP))
|
|
return;
|
|
|
|
if (owner->IsMounted())
|
|
{
|
|
caster->Mount(MOUNT_PONY);
|
|
caster->SetSpeedRate(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN));
|
|
}
|
|
else if (caster->IsMounted())
|
|
{
|
|
caster->Dismount();
|
|
caster->SetSpeedRate(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN));
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_pony_mount_check::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum CorruptinPlagueEntrys
|
|
{
|
|
NPC_APEXIS_FLAYER = 22175,
|
|
NPC_SHARD_HIDE_BOAR = 22180,
|
|
NPC_AETHER_RAY = 22181,
|
|
SPELL_CORRUPTING_PLAGUE = 40350
|
|
};
|
|
|
|
// 40350 - Corrupting Plague
|
|
class CorruptingPlagueSearcher
|
|
{
|
|
public:
|
|
CorruptingPlagueSearcher(Unit* obj, float distance) : _unit(obj), _distance(distance) { }
|
|
|
|
bool operator()(Unit* u) const
|
|
{
|
|
if (_unit->GetDistance2d(u) < _distance &&
|
|
(u->GetEntry() == NPC_APEXIS_FLAYER || u->GetEntry() == NPC_SHARD_HIDE_BOAR || u->GetEntry() == NPC_AETHER_RAY) &&
|
|
!u->HasAura(SPELL_CORRUPTING_PLAGUE))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
private:
|
|
Unit* _unit;
|
|
float _distance;
|
|
};
|
|
|
|
// 40349 - Corrupting Plague
|
|
class spell_corrupting_plague_aura : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_corrupting_plague_aura);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_CORRUPTING_PLAGUE });
|
|
}
|
|
|
|
void OnPeriodic(AuraEffect const* /*aurEff*/)
|
|
{
|
|
Unit* owner = GetTarget();
|
|
|
|
std::list<Creature*> targets;
|
|
CorruptingPlagueSearcher creature_check(owner, 15.0f);
|
|
Trinity::CreatureListSearcher<CorruptingPlagueSearcher> creature_searcher(owner, targets, creature_check);
|
|
Cell::VisitGridObjects(owner, creature_searcher, 15.0f);
|
|
|
|
if (!targets.empty())
|
|
return;
|
|
|
|
PreventDefaultAction();
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_corrupting_plague_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
|
|
}
|
|
};
|
|
|
|
enum SiegeTankControl
|
|
{
|
|
SPELL_SIEGE_TANK_CONTROL = 47963
|
|
};
|
|
|
|
class spell_gen_vehicle_control_link : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_vehicle_control_link);
|
|
|
|
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
GetTarget()->RemoveAurasDueToSpell(SPELL_SIEGE_TANK_CONTROL); //aurEff->GetAmount()
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
AfterEffectRemove += AuraEffectRemoveFn(spell_gen_vehicle_control_link::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
// 34779 - Freezing Circle
|
|
enum FreezingCircleMisc
|
|
{
|
|
SPELL_FREEZING_CIRCLE_PIT_OF_SARON_NORMAL = 69574,
|
|
SPELL_FREEZING_CIRCLE_PIT_OF_SARON_HEROIC = 70276,
|
|
SPELL_FREEZING_CIRCLE = 34787,
|
|
SPELL_FREEZING_CIRCLE_SCENARIO = 141383,
|
|
MAP_ID_BLOOD_IN_THE_SNOW_SCENARIO = 1130
|
|
};
|
|
|
|
class spell_freezing_circle : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_freezing_circle);
|
|
|
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_FREEZING_CIRCLE_PIT_OF_SARON_NORMAL,
|
|
SPELL_FREEZING_CIRCLE_PIT_OF_SARON_HEROIC,
|
|
SPELL_FREEZING_CIRCLE,
|
|
SPELL_FREEZING_CIRCLE_SCENARIO
|
|
});
|
|
}
|
|
|
|
void HandleDamage(SpellEffIndex /*effIndex*/)
|
|
{
|
|
Unit* caster = GetCaster();
|
|
uint32 spellId = 0;
|
|
Map* map = caster->GetMap();
|
|
|
|
if (map->IsDungeon())
|
|
spellId = map->IsHeroic() ? SPELL_FREEZING_CIRCLE_PIT_OF_SARON_HEROIC : SPELL_FREEZING_CIRCLE_PIT_OF_SARON_NORMAL;
|
|
else
|
|
spellId = map->GetId() == MAP_ID_BLOOD_IN_THE_SNOW_SCENARIO ? SPELL_FREEZING_CIRCLE_SCENARIO : SPELL_FREEZING_CIRCLE;
|
|
|
|
if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId, GetCastDifficulty()))
|
|
if (!spellInfo->GetEffects().empty())
|
|
SetHitDamage(spellInfo->GetEffect(EFFECT_0).CalcValue());
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_freezing_circle::HandleDamage, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE);
|
|
}
|
|
};
|
|
|
|
// 169869 - Transformation Sickness
|
|
class spell_gen_decimatus_transformation_sickness : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_decimatus_transformation_sickness);
|
|
|
|
void HandleScript(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (Unit* target = GetHitUnit())
|
|
target->SetHealth(target->CountPctFromMaxHealth(25));
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_decimatus_transformation_sickness::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT);
|
|
}
|
|
};
|
|
|
|
// 189491 - Summon Towering Infernal.
|
|
class spell_gen_anetheron_summon_towering_infernal : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_anetheron_summon_towering_infernal);
|
|
|
|
void HandleDummy(SpellEffIndex /* effIndex */)
|
|
{
|
|
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_anetheron_summon_towering_infernal::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum KazrogalHellfireMark
|
|
{
|
|
SPELL_MARK_OF_KAZROGAL_HELLFIRE = 189512,
|
|
SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE = 189515
|
|
};
|
|
|
|
class MarkTargetHellfireFilter
|
|
{
|
|
public:
|
|
bool operator()(WorldObject* target) const
|
|
{
|
|
if (Unit* unit = target->ToUnit())
|
|
return unit->GetPowerType() != POWER_MANA;
|
|
return false;
|
|
}
|
|
};
|
|
|
|
class spell_gen_mark_of_kazrogal_hellfire : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_mark_of_kazrogal_hellfire);
|
|
|
|
void FilterTargets(std::list<WorldObject*>& targets)
|
|
{
|
|
targets.remove_if(MarkTargetHellfireFilter());
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gen_mark_of_kazrogal_hellfire::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
|
}
|
|
};
|
|
|
|
class spell_gen_mark_of_kazrogal_hellfire_aura : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_mark_of_kazrogal_hellfire_aura);
|
|
|
|
bool Validate(SpellInfo const* /*spell*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE });
|
|
}
|
|
|
|
void OnPeriodic(AuraEffect const* aurEff)
|
|
{
|
|
Unit* target = GetTarget();
|
|
|
|
if (target->GetPower(POWER_MANA) == 0)
|
|
{
|
|
target->CastSpell(target, SPELL_MARK_OF_KAZROGAL_DAMAGE_HELLFIRE, aurEff);
|
|
// Remove aura
|
|
SetDuration(0);
|
|
}
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectPeriodic += AuraEffectPeriodicFn(spell_gen_mark_of_kazrogal_hellfire_aura::OnPeriodic, EFFECT_0, SPELL_AURA_POWER_BURN);
|
|
}
|
|
};
|
|
|
|
class spell_gen_azgalor_rain_of_fire_hellfire_citadel : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_gen_azgalor_rain_of_fire_hellfire_citadel);
|
|
|
|
void HandleDummy(SpellEffIndex /* effIndex */)
|
|
{
|
|
GetCaster()->CastSpell(GetHitUnit(), uint32(GetEffectValue()), true);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_gen_azgalor_rain_of_fire_hellfire_citadel::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
enum AuraProcRemoveSpells
|
|
{
|
|
SPELL_FACE_RAGE = 99947,
|
|
SPELL_IMPATIENT_MIND = 187213
|
|
};
|
|
|
|
// 99947 - Face Rage
|
|
class spell_gen_face_rage : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_face_rage);
|
|
|
|
bool Validate(SpellInfo const* spellInfo) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_FACE_RAGE }) && spellInfo->GetEffects().size() > EFFECT_2;
|
|
}
|
|
|
|
void OnRemove(AuraEffect const* /*effect*/, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
GetTarget()->RemoveAurasDueToSpell(GetEffectInfo(EFFECT_2).TriggerSpell);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_face_rage::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
// 187213 - Impatient Mind
|
|
class spell_gen_impatient_mind : public AuraScript
|
|
{
|
|
PrepareAuraScript(spell_gen_impatient_mind);
|
|
|
|
bool Validate(SpellInfo const* /*spell*/) override
|
|
{
|
|
return ValidateSpellInfo({ SPELL_IMPATIENT_MIND });
|
|
}
|
|
|
|
void OnRemove(AuraEffect const* effect, AuraEffectHandleModes /*mode*/)
|
|
{
|
|
GetTarget()->RemoveAurasDueToSpell(effect->GetSpellEffectInfo().TriggerSpell);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectRemove += AuraEffectRemoveFn(spell_gen_impatient_mind::OnRemove, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL);
|
|
}
|
|
};
|
|
|
|
enum DefenderOfAzerothData
|
|
{
|
|
SPELL_DEATH_GATE_TELEPORT_STORMWIND = 316999,
|
|
SPELL_DEATH_GATE_TELEPORT_ORGRIMMAR = 317000,
|
|
|
|
QUEST_DEFENDER_OF_AZEROTH_ALLIANCE = 58902,
|
|
QUEST_DEFENDER_OF_AZEROTH_HORDE = 58903,
|
|
|
|
NPC_NAZGRIM = 161706,
|
|
NPC_TROLLBANE = 161707,
|
|
NPC_WHITEMANE = 161708,
|
|
NPC_MOGRAINE = 161709,
|
|
};
|
|
|
|
struct BindLocation
|
|
{
|
|
BindLocation(uint32 mapId, float x, float y, float z, float o, uint32 areaId)
|
|
: Loc(mapId, x, y, z, o), AreaId(areaId) { }
|
|
WorldLocation Loc;
|
|
uint32 AreaId;
|
|
};
|
|
|
|
BindLocation const StormwindInnLoc(0, -8868.1f, 675.82f, 97.9f, 5.164778709411621093f, 5148);
|
|
BindLocation const OrgrimmarInnLoc(1, 1573.18f, -4441.62f, 16.06f, 1.818284034729003906f, 8618);
|
|
|
|
class spell_defender_of_azeroth_death_gate_selector : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_defender_of_azeroth_death_gate_selector);
|
|
|
|
bool Validate(SpellInfo const* /*spell*/) override
|
|
{
|
|
return ValidateSpellInfo(
|
|
{
|
|
SPELL_DEATH_GATE_TELEPORT_STORMWIND,
|
|
SPELL_DEATH_GATE_TELEPORT_ORGRIMMAR
|
|
});
|
|
}
|
|
|
|
void HandleDummy(SpellEffIndex /*effIndex*/)
|
|
{
|
|
Player* player = GetHitUnit()->ToPlayer();
|
|
if (!player)
|
|
return;
|
|
|
|
if (player->GetQuestStatus(QUEST_DEFENDER_OF_AZEROTH_ALLIANCE) == QUEST_STATUS_NONE && player->GetQuestStatus(QUEST_DEFENDER_OF_AZEROTH_HORDE) == QUEST_STATUS_NONE)
|
|
return;
|
|
|
|
BindLocation bindLoc = player->GetTeam() == ALLIANCE ? StormwindInnLoc : OrgrimmarInnLoc;
|
|
player->SetHomebind(bindLoc.Loc, bindLoc.AreaId);
|
|
player->SendBindPointUpdate();
|
|
player->SendPlayerBound(player->GetGUID(), bindLoc.AreaId);
|
|
|
|
player->CastSpell(player, player->GetTeam() == ALLIANCE ? SPELL_DEATH_GATE_TELEPORT_STORMWIND : SPELL_DEATH_GATE_TELEPORT_ORGRIMMAR);
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_defender_of_azeroth_death_gate_selector::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
class spell_defender_of_azeroth_speak_with_mograine : public SpellScript
|
|
{
|
|
PrepareSpellScript(spell_defender_of_azeroth_speak_with_mograine);
|
|
|
|
void HandleDummy(SpellEffIndex /*effIndex*/)
|
|
{
|
|
if (!GetCaster())
|
|
return;
|
|
|
|
Player* player = GetCaster()->ToPlayer();
|
|
if (!player)
|
|
return;
|
|
|
|
if (Creature* nazgrim = GetHitUnit()->FindNearestCreature(NPC_NAZGRIM, 10.0f))
|
|
nazgrim->HandleEmoteCommand(EMOTE_ONESHOT_POINT, player);
|
|
if (Creature* trollbane = GetHitUnit()->FindNearestCreature(NPC_TROLLBANE, 10.0f))
|
|
trollbane->HandleEmoteCommand(EMOTE_ONESHOT_POINT, player);
|
|
if (Creature* whitemane = GetHitUnit()->FindNearestCreature(NPC_WHITEMANE, 10.0f))
|
|
whitemane->HandleEmoteCommand(EMOTE_ONESHOT_POINT, player);
|
|
|
|
// @TODO: spawntracking - show death gate for casting player
|
|
}
|
|
|
|
void Register() override
|
|
{
|
|
OnEffectHitTarget += SpellEffectFn(spell_defender_of_azeroth_speak_with_mograine::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY);
|
|
}
|
|
};
|
|
|
|
void AddSC_generic_spell_scripts()
|
|
{
|
|
RegisterAuraScript(spell_gen_absorb0_hitlimit1);
|
|
RegisterAuraScript(spell_gen_adaptive_warding);
|
|
RegisterSpellScript(spell_gen_allow_cast_from_item_only);
|
|
RegisterAuraScript(spell_gen_animal_blood);
|
|
RegisterSpellScript(spell_gen_arcane_charge);
|
|
RegisterAuraScript(spell_gen_arena_drink);
|
|
RegisterAuraScript(spell_gen_aura_of_anger);
|
|
RegisterAuraScript(spell_gen_aura_of_fear);
|
|
RegisterAuraScript(spell_gen_aura_service_uniform);
|
|
RegisterAuraScript(spell_gen_av_drekthar_presence);
|
|
RegisterSpellScript(spell_gen_bandage);
|
|
RegisterAuraScript(spell_gen_blood_reserve);
|
|
RegisterSpellScript(spell_gen_bonked);
|
|
new spell_gen_break_shield("spell_gen_break_shield");
|
|
new spell_gen_break_shield("spell_gen_tournament_counterattack");
|
|
RegisterAuraScript(spell_gen_burn_brutallus);
|
|
RegisterAuraScript(spell_gen_burning_depths_necrolyte_image);
|
|
RegisterSpellScript(spell_gen_cannibalize);
|
|
RegisterAuraScript(spell_gen_chains_of_ice);
|
|
RegisterSpellScript(spell_gen_chaos_blast);
|
|
RegisterSpellScript(spell_gen_clone);
|
|
RegisterSpellScript(spell_gen_clone_weapon);
|
|
RegisterAuraScript(spell_gen_clone_weapon_aura);
|
|
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);
|
|
RegisterSpellScript(spell_gen_create_lance);
|
|
RegisterAuraScript(spell_gen_creature_permanent_feign_death);
|
|
new spell_gen_dalaran_disguise("spell_gen_sunreaver_disguise");
|
|
new spell_gen_dalaran_disguise("spell_gen_silver_covenant_disguise");
|
|
new spell_gen_decay_over_time_fungal_decay();
|
|
new spell_gen_decay_over_time_tail_sting();
|
|
RegisterAuraScript(spell_gen_defend);
|
|
RegisterSpellScript(spell_gen_despawn_self);
|
|
RegisterSpellScript(spell_gen_divine_storm_cd_reset);
|
|
RegisterSpellScript(spell_gen_ds_flush_knockback);
|
|
RegisterSpellScript(spell_gen_dungeon_credit);
|
|
RegisterSpellScript(spell_gen_elune_candle);
|
|
RegisterAuraScript(spell_ethereal_pet_aura);
|
|
RegisterSpellScript(spell_ethereal_pet_onsummon);
|
|
RegisterSpellScript(spell_ethereal_pet_aura_remove);
|
|
RegisterAuraScript(spell_steal_essence_visual);
|
|
RegisterSpellScript(spell_gen_fishing);
|
|
RegisterSpellScript(spell_gen_gadgetzan_transporter_backfire);
|
|
RegisterAuraScript(spell_gen_gift_of_naaru);
|
|
RegisterSpellScript(spell_gen_gnomish_transporter);
|
|
new spell_gen_increase_stats_buff("spell_pal_blessing_of_kings");
|
|
new spell_gen_increase_stats_buff("spell_pal_blessing_of_might");
|
|
new spell_gen_increase_stats_buff("spell_dru_mark_of_the_wild");
|
|
new spell_gen_increase_stats_buff("spell_pri_power_word_fortitude");
|
|
new spell_gen_increase_stats_buff("spell_pri_shadow_protection");
|
|
RegisterAuraScript(spell_gen_interrupt);
|
|
new spell_gen_lifebloom("spell_hexlord_lifebloom", SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL);
|
|
new spell_gen_lifebloom("spell_tur_ragepaw_lifebloom", SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL);
|
|
new spell_gen_lifebloom("spell_cenarion_scout_lifebloom", SPELL_CENARION_SCOUT_LIFEBLOOM_FINAL_HEAL);
|
|
new spell_gen_lifebloom("spell_twisted_visage_lifebloom", SPELL_TWISTED_VISAGE_LIFEBLOOM_FINAL_HEAL);
|
|
new spell_gen_lifebloom("spell_faction_champion_dru_lifebloom", SPELL_FACTION_CHAMPIONS_DRU_LIFEBLOOM_FINAL_HEAL);
|
|
RegisterSpellScript(spell_gen_mounted_charge);
|
|
RegisterAuraScript(spell_gen_moss_covered_feet);
|
|
RegisterAuraScript(spell_gen_negative_energy_periodic);
|
|
RegisterSpellScript(spell_gen_netherbloom);
|
|
RegisterSpellScript(spell_gen_nightmare_vine);
|
|
RegisterAuraScript(spell_gen_nitrous_boost);
|
|
RegisterAuraScript(spell_gen_obsidian_armor);
|
|
RegisterSpellScript(spell_gen_oracle_wolvar_reputation);
|
|
RegisterSpellScript(spell_gen_orc_disguise);
|
|
RegisterAuraScript(spell_gen_paralytic_poison);
|
|
new spell_gen_proc_below_pct_damaged("spell_item_soul_harvesters_charm");
|
|
new spell_gen_proc_below_pct_damaged("spell_item_commendation_of_kaelthas");
|
|
new spell_gen_proc_below_pct_damaged("spell_item_corpse_tongue_coin");
|
|
new spell_gen_proc_below_pct_damaged("spell_item_corpse_tongue_coin_heroic");
|
|
new spell_gen_proc_below_pct_damaged("spell_item_petrified_twilight_scale");
|
|
new spell_gen_proc_below_pct_damaged("spell_item_petrified_twilight_scale_heroic");
|
|
RegisterAuraScript(spell_gen_proc_charge_drop_only);
|
|
RegisterAuraScript(spell_gen_parachute);
|
|
RegisterSpellScript(spell_gen_pet_summoned);
|
|
RegisterSpellScript(spell_gen_profession_research);
|
|
RegisterSpellScript(spell_gen_pvp_trinket);
|
|
RegisterSpellScript(spell_gen_remove_flight_auras);
|
|
RegisterAuraScript(spell_gen_restoration);
|
|
RegisterSpellAndAuraScriptPair(spell_gen_replenishment, spell_gen_replenishment_aura);
|
|
// Running Wild
|
|
RegisterSpellAndAuraScriptPair(spell_gen_running_wild, spell_gen_running_wild_aura);
|
|
RegisterSpellScript(spell_gen_two_forms);
|
|
RegisterSpellScript(spell_gen_darkflight);
|
|
/* */
|
|
RegisterAuraScript(spell_gen_remove_on_health_pct);
|
|
RegisterAuraScript(spell_gen_remove_on_full_health);
|
|
RegisterAuraScript(spell_gen_remove_on_full_health_pct);
|
|
RegisterSpellScript(spell_gen_seaforium_blast);
|
|
RegisterSpellScript(spell_gen_spectator_cheer_trigger);
|
|
RegisterSpellScript(spell_gen_spirit_healer_res);
|
|
new spell_gen_summon_elemental("spell_gen_summon_fire_elemental", SPELL_SUMMON_FIRE_ELEMENTAL);
|
|
new spell_gen_summon_elemental("spell_gen_summon_earth_elemental", SPELL_SUMMON_EARTH_ELEMENTAL);
|
|
RegisterSpellScript(spell_gen_summon_tournament_mount);
|
|
RegisterSpellScript(spell_gen_throw_shield);
|
|
RegisterSpellScript(spell_gen_tournament_duel);
|
|
RegisterAuraScript(spell_gen_tournament_pennant);
|
|
RegisterSpellScript(spell_gen_trigger_exclude_caster_aura_spell);
|
|
RegisterSpellScript(spell_gen_trigger_exclude_target_aura_spell);
|
|
new spell_pvp_trinket_wotf_shared_cd<SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER>("spell_pvp_trinket_shared_cd");
|
|
new spell_pvp_trinket_wotf_shared_cd<SPELL_WILL_OF_THE_FORSAKEN_COOLDOWN_TRIGGER_WOTF>("spell_wotf_shared_cd");
|
|
RegisterAuraScript(spell_gen_turkey_marker);
|
|
RegisterSpellScript(spell_gen_upper_deck_create_foam_sword);
|
|
RegisterAuraScript(spell_gen_vampiric_touch);
|
|
RegisterAuraScript(spell_gen_vehicle_scaling);
|
|
RegisterSpellScript(spell_gen_vendor_bark_trigger);
|
|
RegisterSpellScript(spell_gen_wg_water);
|
|
RegisterAuraScript(spell_gen_whisper_gulch_yogg_saron_whisper);
|
|
RegisterSpellScript(spell_gen_eject_all_passengers);
|
|
RegisterSpellScript(spell_gen_eject_passenger);
|
|
RegisterAuraScript(spell_gen_gm_freeze);
|
|
RegisterSpellScript(spell_gen_stand);
|
|
RegisterAuraScript(spell_gen_mixology_bonus);
|
|
RegisterSpellScript(spell_gen_landmine_knockback_achievement);
|
|
RegisterSpellScript(spell_gen_clear_debuffs);
|
|
RegisterAuraScript(spell_gen_pony_mount_check);
|
|
RegisterAuraScript(spell_corrupting_plague_aura);
|
|
RegisterAuraScript(spell_gen_vehicle_control_link);
|
|
RegisterSpellScript(spell_freezing_circle);
|
|
RegisterSpellScript(spell_gen_decimatus_transformation_sickness);
|
|
RegisterSpellScript(spell_gen_anetheron_summon_towering_infernal);
|
|
RegisterSpellAndAuraScriptPair(spell_gen_mark_of_kazrogal_hellfire, spell_gen_mark_of_kazrogal_hellfire_aura);
|
|
RegisterSpellScript(spell_gen_azgalor_rain_of_fire_hellfire_citadel);
|
|
RegisterAuraScript(spell_gen_face_rage);
|
|
RegisterAuraScript(spell_gen_impatient_mind);
|
|
RegisterSpellScript(spell_defender_of_azeroth_death_gate_selector);
|
|
RegisterSpellScript(spell_defender_of_azeroth_speak_with_mograine);
|
|
}
|