361 template<u
int32 requiredSpellId>
373 template<u
int32 ascendanceSpellId>
381 if (
Aura const* ascendanceAura = target->
GetAura(ascendanceSpellId))
382 duration += ascendanceAura->GetDuration();
384 target->
CastSpell(target, ascendanceSpellId,
386 .SetTriggeringAura(aurEff)
520 t29->GetBase()->Remove();
601 if (
float const* damageMultiplier = std::any_cast<float>(&creatingSpell->
m_customArg))
635 static constexpr std::array<std::pair<uint32, SpellEffIndex>, 3>
DamageBuffs =
649 float damageMultiplier = 1.0f;
654 AddPct(damageMultiplier, buff->GetAmount());
655 buff->GetBase()->Remove();
659 if (damageMultiplier != 1.0f)
685 auto itr = std::find_if(areaTriggers.begin(), areaTriggers.end(), [&](
AreaTrigger const* at)
687 return at->GetGUID() == GetSpell()->GetOriginalCasterGUID();
689 if (itr != areaTriggers.end())
691 if (eq->AddStunnedTarget(target->GetGUID()))
736 return !caster->
HasAura(buffSpellId) ? 1.0 : 0.0;
747 t29->GetBase()->Remove();
835 summon->DespawnOrUnsummon();
865 script->SetVisualDummy(summon);
982 auto m = std::find_if(costs.begin(), costs.end(), [](
SpellPowerCost const& cost) { return cost.Power == POWER_MANA; });
983 if (m != costs.end())
1083 hasteBuff->ChangeAmount(hasteBuff->GetAmount() - aurEff->
GetAmount());
1113 if (!
GetSpell()->m_appliedMods.count(lavaSurge))
1144 if (!caster || !victim)
1170 procChance += igneousPotential->GetAmount();
1273 if (targets.size() > 1)
1277 targets.push_back(selected);
1343 if (!targets.Targets)
1346 targets.Targets->Update(caster);
1348 CastSpellExtraArgs args;
1349 args.OriginalCastId = originalCastId;
1350 caster->CastSpell(targets, overloadSpellId, args);
1362 switch (triggeringSpellId)
1441 newAura->SetDuration(flameShock->GetDuration());
1442 newAura->SetMaxDuration(flameShock->GetDuration());
1578 caster->
CastSpell(target, spellId, aurEff);
1618 if (!damageInfo || !damageInfo->
GetDamage())
1654 if (!damageInfo || !damageInfo->
GetDamage())
1699 if (newDuration > maxDuration)
1722 if (!healInfo || !healInfo->
GetHeal())
1757 aura->SetStackAmount(aura->GetStackAmount() + 1);
1832 for (
uint32 i = 0; i < 2; ++i)
1888 if (!caster->IsFriendlyTo(unit))
1903 if (!caster->IsFriendlyTo(unit))
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::unordered_set< ObjectGuid > GuidUnorderedSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ EQUIPMENT_SLOT_MAINHAND
#define INVENTORY_SLOT_BAG_0
bool roll_chance_f(float chance)
bool roll_chance_i(int chance)
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
#define RegisterAreaTriggerAI(ai_name)
#define RegisterSpellScript(spell_script)
@ TARGET_UNIT_DEST_AREA_ALLY
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_SRC_AREA_ALLY
@ TARGET_UNIT_CONE_CASTER_TO_DEST_ENEMY
@ SPELL_SCHOOL_MASK_NATURE
@ SPELL_EFFECT_CREATE_AREATRIGGER
@ SPELL_EFFECT_TRIGGER_MISSILE
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_ADD_PCT_MODIFIER
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore Spell and Category cooldowns.
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
@ TRIGGERED_IGNORE_GCD
Will ignore GCD.
#define SpellOnCalcCritChanceFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraCheckEffectProcFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckProcFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
T CalculatePct(T base, U pct)
GuidUnorderedSet const & GetInsideUnits() const
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
HookList< CheckEffectProcHandler > DoCheckEffectProc
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
AuraEffect * GetEffect(uint8 effIndex) const
ObjectGuid GetCasterGUID() const
Difficulty GetCastDifficulty() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
bool HasEffect(uint8 effIndex) const
int32 GetMaxDuration() const
int32 GetDuration() const
void SetDuration(int32 duration, bool withMods=false)
void SetMaxDuration(int32 duration)
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
uint32 GetOriginalHeal() const
ItemTemplate const * GetTemplate() const
TempSummon * SummonCreature(uint32 entry, Position const &pos, SummonPropertiesEntry const *properties=nullptr, Milliseconds duration=0ms, WorldObject *summoner=nullptr, uint32 spellId=0, uint32 vehId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty, SmoothPhasingInfo const *smoothPhasingInfo=nullptr)
static Unit * ToUnit(Object *o)
static ObjectGuid GetGUID(Object const *o)
static Player * ToPlayer(Object *o)
ChrSpecialization GetPrimarySpecialization() const
Item * GetItemByPos(uint16 pos) const
HealInfo * GetHealInfo() const
Unit * GetActionTarget() const
Spell const * GetProcSpell() const
SpellInfo const * GetSpellInfo() const
DamageInfo * GetDamageInfo() const
Unit * GetProcTarget() const
void RestoreCharge(uint32 chargeCategoryId)
bool HasCharge(uint32 chargeCategoryId) const
void StartCooldown(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool onHold=false, Optional< Duration > forcedCooldown={})
uint32 GetMaxTicks() const
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
bool HasLabel(uint32 labelId) const
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
HookList< CastHandler > AfterCast
int32 GetHitDamage() const
HookList< HitHandler > AfterHit
HookList< HitHandler > OnHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
int64 GetUnitTargetCountForEffect(SpellEffIndex effect) const
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Aura * GetHitAura(bool dynObjAura=false) const
Difficulty GetCastDifficulty() const
void SetHitDamage(int32 damage)
HookList< OnCalcCritChanceHandler > OnCalcCritChance
WorldLocation const * GetExplTargetDest() const
HookList< EffectHandler > OnEffectLaunch
void SetHitHeal(int32 heal)
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Unit * GetOriginalCaster() const
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
std::vector< SpellPowerCost > const & GetPowerCost() const
UsedSpellMods m_appliedMods
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
bool HealthBelowPct(int32 pct) const
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
int32 GetTotalAuraModifier(AuraType auraType) const
float GetTotalAttackPowerValue(WeaponAttackType attType, bool includeWeapon=true) const
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
SpellHistory * GetSpellHistory()
std::vector< AreaTrigger * > GetAreaTriggers(uint32 spellId) const
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
bool CheckProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
void HandleEffectProc(AuraEffect *, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
static void ResizeTargets(std::list< WorldObject * > &targets)
void HandleEffectProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool CheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *aurEff)
void OnProcHeal(AuraEffect *, ProcEventInfo &procInfo)
bool CheckProc(ProcEventInfo &procInfo)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void CountTargets(std::list< WorldObject * > &targets)
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *spellInfo) override
bool CheckProc(AuraEffect const *, ProcEventInfo &procInfo)
bool Validate(SpellInfo const *) override
bool CheckProc(AuraEffect const *, ProcEventInfo &procInfo)
void CountEffectivelyHealedTarget()
void FilterTargets(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *spellInfo) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &)
bool CheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void AddScriptedDamageMods()
bool CheckProc(ProcEventInfo &procInfo)
ObjectGuid const & GetProcTargetGuid() const
void HandleEffectProc(AuraEffect *, ProcEventInfo &eventInfo)
ObjectGuid _procTargetGuid
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *)
bool Validate(SpellInfo const *spellInfo) override
void SnapshotDamageMultiplier(SpellEffIndex)
static constexpr std::array< std::pair< uint32, SpellEffIndex >, 3 > DamageBuffs
bool Validate(SpellInfo const *) override
void HandleEnergize(SpellEffIndex)
bool Validate(SpellInfo const *) override
static constexpr uint32 BuffSpells[]
void AddScriptedDamageMods()
void HandleEffectProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectHitTarget(SpellEffIndex)
void HandleEffectPeriodic(AuraEffect const *aurEff)
void HandleEffecRemoved(AuraEffect const *, AuraEffectHandleModes)
void SetVisualDummy(TempSummon *summon)
void SelectTargets(std::list< WorldObject * > &targets)
void InitializeVisualStalker()
void SelectTargets(std::list< WorldObject * > &targets)
void HandleEffectProc(AuraEffect *, ProcEventInfo &)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo &eventInfo)
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
void HandleEffectProc(AuraEffect *aurEff, ProcEventInfo &)
bool Validate(SpellInfo const *) override
void DiminishHaste(AuraEffect const *aurEff)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void EnsureLavaSurgeCanBeImmediatelyConsumed()
bool Validate(SpellInfo const *) override
void CalcCritChance(Unit const *victim, float &chance)
bool Validate(SpellInfo const *) override
bool CheckProcChance(AuraEffect const *aurEff, ProcEventInfo &)
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect *, ProcEventInfo &)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleEffectHitTarget(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleTargetSelect(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
void ApplyDamageModifier(SpellEffIndex)
bool CheckProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
void HandleProc(AuraEffect *, ProcEventInfo &procInfo)
uint32 GetTriggeredSpellId(uint32 triggeringSpellId)
bool Validate(SpellInfo const *) override
bool CheckProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
void FilterTargets(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
void FilterTargets(std::list< WorldObject * > &targets)
void HandleHeal(SpellEffIndex)
bool Validate(SpellInfo const *) override
void OnApply(AuraEffect const *aurEff, AuraEffectHandleModes)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void PeriodicTick(AuraEffect const *)
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect *aurEff, ProcEventInfo &)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *, ProcEventInfo &)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *, ProcEventInfo &procInfo)
void HandleEffectProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleEffect(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void PreventLavaSurge(SpellEffIndex effIndex)
void PreventVolcanicSurge(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomWeightedContainerElement(C const &container, std::span< double > const &weights) -> decltype(std::begin(container))
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
void RandomResize(C &container, std::size_t requestedSize)
void SelectRandomInjuredTargets(std::list< WorldObject * > &targets, size_t maxTargets, bool prioritizePlayers, Unit const *prioritizeGroupMembersOf)
void AddSC_shaman_spell_scripts()
@ SPELL_LABEL_SHAMAN_WINDFURY_TOTEM
@ SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA
@ SPELL_SHAMAN_EARTHEN_RAGE_PERIODIC
@ SPELL_SHAMAN_EARTHQUAKE
@ SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE
@ SPELL_SHAMAN_ICEFURY_OVERLOAD
@ SPELL_SHAMAN_LIGHTNING_BOLT_ENERGIZE
@ SPELL_SHAMAN_ASCENDANCE_RESTORATION
@ SPELL_SHAMAN_FLAMETONGUE_ATTACK
@ SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE
@ SPELL_SHAMAN_LAVA_SURGE
@ SPELL_SHAMAN_LIQUID_MAGMA_HIT
@ SPELL_SHAMAN_UNLIMITED_POWER_BUFF
@ SPELL_SHAMAN_SPIRIT_WOLF_AURA
@ SPELL_SHAMAN_HEALING_RAIN_HEAL
@ SPELL_SHAMAN_TOTEMIC_POWER_SPELL_POWER
@ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD
@ SPELL_SHAMAN_LAVA_BURST_BONUS_DAMAGE
@ SPELL_SHAMAN_CHAIN_LIGHTNING
@ SPELL_SHAMAN_PATH_OF_FLAMES_TALENT
@ SPELL_SHAMAN_MASTERY_ELEMENTAL_OVERLOAD
@ SPELL_SHAMAN_FLAME_SHOCK
@ SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE
@ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE
@ SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE
@ SPELL_SHAMAN_LIGHTNING_BOLT
@ SPELL_SHAMAN_DOOM_WINDS_LEGENDARY_COOLDOWN
@ SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN
@ SPELL_SHAMAN_STORMSTRIKE
@ SPELL_SHAMAN_STORMKEEPER
@ SPELL_SHAMAN_LAVA_BEAM_OVERLOAD
@ SPELL_SHAMAN_POWER_SURGE
@ SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD
@ SPELL_SHAMAN_TOTEMIC_POWER_MP5
@ SPELL_SHAMAN_ELEMENTAL_BLAST_OVERLOAD
@ SPELL_SHAMAN_ELEMENTAL_MASTERY
@ SPELL_SHAMAN_ELEMENTAL_BLAST_CRIT
@ SPELL_SHAMAN_CHAINED_HEAL
@ SPELL_SHAMAN_ELEMENTAL_BLAST_ENERGIZE
@ SPELL_SHAMAN_RESTORATIVE_MISTS_INITIAL
@ SPELL_SHAMAN_LAVA_BURST_OVERLOAD
@ SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_ENERGIZE
@ SPELL_SHAMAN_RESTORATIVE_MISTS
@ SPELL_SHAMAN_GATHERING_STORMS
@ SPELL_SHAMAN_SPIRIT_WOLF_TALENT
@ SPELL_SHAMAN_UNDULATION_PROC
@ SPELL_SHAMAN_IGNEOUS_POTENTIAL
@ SPELL_SHAMAN_FLAMETONGUE_WEAPON_ENCHANT
@ SPELL_SHAMAN_GATHERING_STORMS_BUFF
@ SPELL_SHAMAN_TOTEMIC_POWER_ARMOR
@ SPELL_SHAMAN_T29_2P_ELEMENTAL_DAMAGE_BUFF
@ SPELL_SHAMAN_GHOST_WOLF
@ SPELL_SHAMAN_LAVA_BURST
@ SPELL_SHAMAN_ELECTRIFIED
@ SPELL_SHAMAN_ECHOES_OF_GREAT_SUNDERING_LEGENDARY
@ SPELL_SHAMAN_CHAIN_LIGHTNING_ENERGIZE
@ SPELL_SHAMAN_AFTERSHOCK_ENERGIZE
@ SPELL_SHAMAN_MAELSTROM_CONTROLLER
@ SPELL_SHAMAN_WINDFURY_ATTACK
@ SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER
@ SPELL_SHAMAN_VOLCANIC_SURGE
@ SPELL_SHAMAN_WINDFURY_ENCHANTMENT
@ SPELL_SHAMAN_ENERGY_SURGE
@ SPELL_SHAMAN_SPIRIT_WOLF_PERIODIC
@ SPELL_SHAMAN_ASCENDANCE_ELEMENTAL
@ SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT
@ SPELL_SHAMAN_PATH_OF_FLAMES_SPREAD
@ SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE
@ SPELL_SHAMAN_ELEMENTAL_BLAST
@ SPELL_SHAMAN_ANCESTRAL_GUIDANCE
@ SPELL_SHAMAN_EARTHQUAKE_TICK
@ SPELL_SHAMAN_EARTH_SHIELD_HEAL
@ SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD
@ SPELL_SHAMAN_ECHOES_OF_GREAT_SUNDERING_TALENT
@ SPELL_SHAMAN_ITEM_MANA_SURGE
@ SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY
@ SPELL_SHAMAN_HEALING_RAIN_VISUAL
@ SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL
@ SPELL_SHAMAN_FROST_SHOCK_ENERGIZE
@ SPELL_SHAMAN_TIDAL_WAVES
@ NPC_HEALING_RAIN_INVISIBLE_STALKER
constexpr void GetPosition(float &x, float &y) const
GuidUnorderedSet _stunnedUnits
void OnCreate(Spell const *creatingSpell) override
areatrigger_sha_earthquake(AreaTrigger *areatrigger)
Milliseconds _refreshTimer
void OnUpdate(uint32 diff) override
bool AddStunnedTarget(ObjectGuid const &guid)
void OnUpdate(uint32 diff) override
void OnUnitEnter(Unit *unit) override
static constexpr uint32 REFRESH_TIME
areatrigger_sha_wind_rush_totem(AreaTrigger *areatrigger)