203 static constexpr std::array<WindfuryProcEventInfo, 3>
Sequence =
245 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
246 .TriggeringSpell = procSpell,
247 .TriggeringAura = aurEff,
248 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, static_cast<SpellEffectValue>(*procSpell->GetPowerTypeCostAmount(POWER_MAELSTROM)) } }
287 .TriggeringAura = aurEff,
324 CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR });
349 if (!gatheringStorms)
389 .TriggeringAura = aurEff,
479 .TriggeringAura = energizeAmount,
509 .TriggeringAura = energizeAmount,
536 if (!convergingStorms)
601 AddPct(pctMod, deluge->GetAmount());
674 duration += ascendanceAura->GetDuration();
679 .TriggeringAura = aurEff,
689 specialization = owner->GetPrimarySpecialization();
733 .TriggeringAura = aurEff
826 .TriggeringAura = aurEff,
851 t29->GetBase()->Remove();
879 .TriggerFlags = TRIGGERED_FULL_MASK
936 if (
float const* damageMultiplier = std::any_cast<float>(&creatingSpell->
m_customArg))
947 .TriggerFlags = TRIGGERED_FULL_MASK,
948 .OriginalCaster = at->GetGUID(),
949 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, caster->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_NATURE) * 0.213 * _damageMultiplier } }
959 return _stunnedUnits.insert(guid).second;
966 float _damageMultiplier = 1.0f;
972 static constexpr std::array<std::pair<uint32, SpellEffIndex>, 3>
DamageBuffs =
986 float damageMultiplier = 1.0f;
991 AddPct(damageMultiplier, buff->GetAmount());
992 buff->GetBase()->Remove();
996 if (damageMultiplier != 1.0f)
1022 auto itr = std::ranges::find(areaTriggers,
GetSpell()->GetOriginalCasterGUID(), [](
AreaTrigger const* at) {
return at->
GetGUID(); });
1023 if (itr != areaTriggers.end())
1025 if (eq->AddStunnedTarget(target->GetGUID()))
1058 std::array<double,
BuffSpells.size()> weights;
1060 for (std::size_t i = 0; i <
BuffSpells.size(); ++i)
1080 t29->GetBase()->Remove();
1107 int32 enchatmentCount = 0;
1117 if (enchatmentCount)
1118 for (
AuraEffect* aurEff : buff->GetAuraEffects())
1119 aurEff->ChangeAmount(valuePerStack * enchatmentCount / 10);
1123 else if (enchatmentCount)
1126 .SpellValueOverrides = {
1213 std::vector<Unit*> targets;
1222 for (
Unit* target : targets)
1243 Unit* target =
nullptr;
1250 .TriggeringAura = aurEff
1308 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
1309 .TriggeringAura = aurEff
1357 .TriggeringAura = aurEff
1364 summon->DespawnOrUnsummon();
1402 script->SetVisualDummy(summon);
1533 .TriggerFlags = TRIGGERED_FULL_MASK,
1534 .TriggeringAura = aurEff
1557 .TriggeringAura = aurEff
1591 .TriggeringAura = aurEff,
1686 hasteBuff->ChangeAmount(hasteBuff->GetAmount() - aurEff->
GetAmount());
1719 if (!
GetSpell()->m_appliedMods.contains(lavaSurge))
1750 if (!caster || !victim)
1803 float flameShocks = 0.0f;
1804 auto work = [&, shaman = caster->
GetGUID()](
Unit const* target)
1807 flameShocks += 1.0f;
1821 procChance += igneousPotential->GetAmount();
1885 .TriggeringAura = energizeAmount,
1910 .TriggeringAura = energizeAmount,
1938 if (targets.size() > 1)
1942 targets.push_back(selected);
1977 while (--stacks >= 0)
1980 if (totalStacks >= 4)
2004 .TriggeringSpell = consumingSpell,
2005 .SpellValueOverrides = {
2017 script->AttemptProc();
2022 .TriggeringSpell = consumingSpell,
2026 if (maelstromWeaponVisibleAura->ModStackAmount(-stacks))
2030 uint8 newStacks = maelstromWeaponVisibleAura->GetStackAmount();
2035 overflowingMaelstrom->SetStackAmount(newStacks - 5);
2037 overflowingMaelstrom->Remove();
2043 maelstromSpellMod->SetStackAmount(std::min<uint8>(newStacks, 5));
2045 maelstromSpellMod->Remove();
2089 if (!maelstromSpellMod)
2092 return procSpell->
m_appliedMods.contains(maelstromSpellMod);
2098 int32 stacksToConsume = 5;
2100 stacksToConsume = 10;
2176 if (!targets.Targets)
2179 targets.Targets->Update(caster);
2181 CastSpellExtraArgs args;
2182 args.OriginalCastId = originalCastId;
2183 caster->CastSpell(targets, overloadSpellId, args);
2195 switch (triggeringSpellId)
2254 float range = 10.0f;
2255 std::vector<WorldObject*> targets;
2262 std::size_t flameShocksMissing =
GetEffectValueAsInt() + 1 - std::ranges::distance(targets.begin(), withoutFlameShockItr);
2264 if (flameShocksMissing)
2272 for (std::size_t i = 0; i < std::min<std::size_t>(targets.size(),
GetEffectValueAsInt() + 1); ++i)
2318 if (!chanceBaseEffect || !chancePerTargetEffect || !targetLimitEffect)
2327 procChance *= std::pow(0.5, counterScript->
ProcCount);
2367 .TriggeringAura = aurEff
2400 newAura->SetDuration(flameShock->GetDuration());
2401 newAura->SetMaxDuration(flameShock->GetDuration());
2425 std::vector<Unit*> targets;
2434 for (
Unit* target : targets)
2453 specialization = caster->GetPrimarySpecialization();
2495 .TriggeringAura = aurEff
2549 AddPct(damage, mastery->GetAmount());
2668 if (!chanceEffect || !damageEffect)
2701 ApplyPct(pctMod, std::any_cast<StormflurryEvent::Data>(&
GetSpell()->m_customArg)->DamagePercent);
2721 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
2722 .TriggeringAura = aurEff
2852 if (!thorimsInvocation)
2896 .TriggeringAura = aurEff,
2897 .SpellValueOverrides =
2958 .TriggeringAura = aurEff
3000 if (!damageInfo || !damageInfo->
GetDamage())
3013 .TriggeringAura = aurEff,
3038 if (!damageInfo || !damageInfo->
GetDamage())
3051 .TriggeringAura = aurEff,
3084 if (newDuration > maxDuration)
3108 if (!healInfo || !healInfo->
GetHeal())
3121 .TriggeringAura = aurEff,
3144 aura->SetStackAmount(aura->GetStackAmount() + 1);
3201 if (!unrelentingStorms)
3204 int64 targetLimit = 0;
3206 targetLimit = limitEffect->GetAmountAsInt();
3245 if (!targets.Targets)
3248 targets.Targets->Update(caster);
3362 uint32 maxStack = forcefulWinds->CalcMaxStackAmount();
3363 if (forcefulWinds->GetStackAmount() < maxStack)
3364 forcefulWinds->SetStackAmount(forcefulWinds->GetStackAmount() + 1);
3372 std::ptrdiff_t attacks = 2;
3421 if (caster->IsValidAttackTarget(unit))
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::chrono::seconds Seconds
Seconds shorthand typedef.
@ GRID_MAP_TYPE_MASK_PLAYER
@ GRID_MAP_TYPE_MASK_CREATURE
#define EXTRA_CELL_SEARCH_RADIUS
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(T chance)
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
#define RegisterAreaTriggerAI(ai_name)
#define RegisterSpellScript(spell_script)
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
@ TARGET_UNIT_DEST_AREA_ALLY
@ TARGET_UNIT_RECT_CASTER_ENEMY
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_CASTER_AREA_RAID
@ 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
double SpellEffectValue
This is a double instead of float to be able to store full range of int32.
@ 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_POWER_COST
Will ignore power and reagent cost.
@ TRIGGERED_IGNORE_GCD
Will ignore GCD.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ TRIGGERED_IGNORE_CAST_TIME
Will always be instantly cast.
@ TARGET_OBJECT_TYPE_UNIT
#define SpellOnCalcCritChanceFn(F)
#define SpellObjectTargetSelectFn(F, I, N)
#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 SpellCalcDamageFn(F)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckProcFn(F)
#define AuraHeartbeatFn(F)
#define AuraEffectCalcSpellModFn(F, I, N)
#define SpellCalcHealingFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
T ApplyPct(T &base, U pct)
T CalculatePct(T base, U pct)
AreaTriggerAI(AreaTrigger *a, uint32 scriptId={}) noexcept
GuidUnorderedSet const & GetInsideUnits() const
ObjectGuid const & GetCasterGuid() const
AuraRemoveMode GetRemoveMode() const
int32 GetAmountAsInt() const
SpellEffectValue GetBaseAmount() const
SpellEffectValue GetAmount() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< AuraHeartbeatHandler > OnHeartbeat
HookList< EffectApplyHandler > AfterEffectRemove
HookList< CheckEffectProcHandler > DoCheckEffectProc
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
HookList< EffectCalcSpellModHandler > DoEffectCalcSpellMod
AuraEffect * GetEffect(uint8 effIndex) const
ObjectGuid GetCasterGUID() const
HookList< AuraProcHandler > AfterProc
Difficulty GetCastDifficulty() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
HookList< AuraProcHandler > OnProc
bool HasEffect(uint8 effIndex) const
uint8 GetStackAmount() const
int32 GetMaxDuration() const
void DropChargeDelayed(uint32 delay, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Unit * GetUnitOwner() const
int32 GetDuration() const
AuraEffect * GetEffect(uint32 index) const
void SetDuration(int32 duration, bool withMods=false)
uint8 GetStackAmount() const
void SetMaxDuration(int32 duration)
Script * GetScript() const
ObjectGuid const & GetGUID() const
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
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 ObjectGuid const Empty
ChrSpecialization GetPrimarySpecialization() const
Item * GetItemByPos(uint16 pos) const
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
HealInfo * GetHealInfo() const
Unit * GetActionTarget() const
Spell const * GetProcSpell() const
SpellInfo const * GetSpellInfo() const
DamageInfo * GetDamageInfo() const
Unit * GetProcTarget() const
uint32 GetPeriodicTickCount() const
void ResetCooldown(uint32 spellId, bool update=false)
void RestoreCharge(uint32 chargeCategoryId)
static void GetCooldownDurations(SpellInfo const *spellInfo, uint32 itemId, Duration *cooldown, uint32 *categoryId, Duration *categoryCooldown)
void ModifyCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown=false)
bool HasCharge(uint32 chargeCategoryId) const
void StartCooldown(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool onHold=false, Optional< Duration > forcedCooldown={})
bool IsAffected(uint32 familyName, flag128 const &familyFlags) 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< DamageAndHealingCalcHandler > CalcDamage
HookList< CastHandler > AfterCast
Aura * GetHitAura(bool dynObjAura=false, bool withRemoved=false) const
int32 GetHitDamage() const
HookList< HitHandler > AfterHit
int32 GetEffectValueAsInt() const
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
int64 GetUnitTargetCountForEffect(SpellEffIndex effect) const
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
HookList< CastHandler > OnCast
Difficulty GetCastDifficulty() const
void SetHitDamage(int32 damage)
HookList< OnCalcCritChanceHandler > OnCalcCritChance
WorldLocation const * GetExplTargetDest() const
HookList< EffectHandler > OnEffectLaunch
void SetHitHeal(int32 heal)
HookList< DamageAndHealingCalcHandler > CalcHealing
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Unit * GetOriginalCaster() const
ObjectGuid m_originalCastId
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
SpellRange GetMinMaxRange(bool strict) const
UsedSpellMods m_appliedMods
uint32 _mainHandDamageSpellId
ObjectGuid _originalCastId
SpellEffectValue _procChance
SpellEffectValue _damagePercent
bool Execute(uint64 time, uint32) override
uint32 _offHandDamageSpellId
StormflurryEvent(Unit *caster, Unit *target, ObjectGuid const &originalCastId, SpellEffectValue damagePercent, uint32 mainHandDamageSpellId, uint32 offHandDamageSpellId, SpellEffectValue procChance)
CastSpellTargetArg _target
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
virtual bool HasSpell(uint32) const
uint32 GetAuraCount(uint32 spellId) const
bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
float GetTotalAuraModifier(AuraType auraType) const
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, uint16 num=1)
bool HealthBelowPct(float pct) 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)
GetCastSpellInfoResult GetCastSpellInfo(SpellInfo const *spellInfo) const
bool Execute(uint64 time, uint32) override
static constexpr std::array< WindfuryProcEventInfo, 3 > Sequence
CastSpellTargetArg _target
decltype(Sequence)::const_iterator EventInfoIterator
WindfuryProcEvent(Unit *shaman, Unit *target, std::ptrdiff_t attacks)
static void Trigger(Unit *shaman, Unit *target)
bool IsWithinDist3d(float x, float y, float z, float dist) const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
static void HandleEffectProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
static void ResizeTargets(SpellScript const &, std::list< WorldObject * > &targets)
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
static bool CheckProc(AuraScript const &, ProcEventInfo const &eventInfo)
static void HandleEffectProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void TriggerBuff(SpellEffIndex effIndex) const
void HandleEffectPeriodic(AuraEffect const *aurEff)
static bool CheckProc(AuraScript const &, ProcEventInfo const &procInfo)
void OnProcHeal(AuraEffect const *aurEff, ProcEventInfo const &procInfo)
bool Validate(SpellInfo const *) override
SpellEffectValue _healToDistribute
void ReduceLavaLashCooldown(AuraEffect const *aurEff, ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
void HandleDamageBuff(SpellEffIndex effIndex) const
bool Validate(SpellInfo const *) override
void HandleCooldownReduction(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex) const
void HandleScript(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void TriggerBuff(SpellEffIndex effIndex) const
bool Validate(SpellInfo const *) override
void TriggerCleaveBuff(SpellEffIndex effIndex) const
bool Validate(SpellInfo const *) override
uint32 _triggeringSpellId
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *spellInfo) override
bool CheckProc(AuraEffect const *, ProcEventInfo const &procInfo)
void DropAura(ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *) const
bool Validate(SpellInfo const *) override
void CalculateHealingBonus(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &, float &pctMod) const
bool Validate(SpellInfo const *) override
bool CheckProc(AuraEffect const *, ProcEventInfo const &procInfo) const
bool Validate(SpellInfo const *) override
void PeriodicTick(AuraEffect const *aurEff) const
void CountEffectivelyHealedTarget()
static void FilterTargets(SpellScript const &, std::list< WorldObject * > &targets)
void HandleCooldown() const
bool Validate(SpellInfo const *spellInfo) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo const &eventInfo) const
bool Validate(SpellInfo const *) override
void AddScriptedDamageMods()
void HandleEffectProc(AuraEffect const *, ProcEventInfo const &eventInfo)
static bool CheckProc(AuraScript const &, ProcEventInfo const &procInfo)
ObjectGuid const & GetProcTargetGuid() const
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) const
static constexpr std::array< std::pair< uint32, SpellEffIndex >, 3 > DamageBuffs
bool Validate(SpellInfo const *) override
static constexpr std::array< uint32, 3 > BuffSpells
bool Validate(SpellInfo const *) override
void AddScriptedDamageMods()
void CheckEnchantments() const
void RemoveAllBuffs(AuraEffect const *, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleHit(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void OnPrecast() override
bool Validate(SpellInfo const *) override
void TriggerDamage(SpellEffIndex) const
void CheckFlameShocks(AuraEffect const *aurEff) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void HandleEffectHitTarget(SpellEffIndex) const
void CalcCleaveMod(AuraEffect const *aurEff, SpellModifier *&spellMod) const
Position GetPosition() const
void HandleEffectPeriodic(AuraEffect const *aurEff) const
void HandleEffecRemoved(AuraEffect const *, AuraEffectHandleModes) const
void SetVisualDummy(TempSummon const *summon)
static void SelectTargets(SpellScript const &, std::list< WorldObject * > &targets)
void InitializeVisualStalker() const
static void SelectTargets(SpellScript const &, std::list< WorldObject * > &targets)
static bool CheckProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void EnergizeMaelstrom(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect const *, ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
static bool CheckProc(AuraScript const &, ProcEventInfo const &eventInfo)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &)
void DiminishHaste(AuraEffect const *aurEff)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &eventInfo)
void HandleScript(SpellEffIndex) const
void EnsureLavaSurgeCanBeImmediatelyConsumed() const
bool Validate(SpellInfo const *) override
void CalcCritChance(Unit const *victim, float &chance) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
void AddBonusFlametongueDamage(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &, float &pctMod) const
bool Validate(SpellInfo const *) override
void ResetCooldown() const
void HandleEffectProc(AuraEffect const *, ProcEventInfo const &)
SpellEffectValue _normalizedTicks
bool CheckProcChance(AuraEffect const *aurEff, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex) const
void HandleScript(SpellEffIndex) const
bool Validate(SpellInfo const *) override
static void HandleTargetSelect(SpellScript const &, std::list< WorldObject * > &targets)
void HandleEffectHitTarget(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo const &procEvent) const
void ExpireMaelstromAuras(AuraEffect const *, AuraEffectHandleModes) const
void RemoveMaelstromAuras(ProcEventInfo const &procEvent) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
void ApplyDamageModifier(SpellEffIndex)
static uint32 GetTriggeredSpellId(uint32 triggeringSpellId)
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &procInfo)
bool Validate(SpellInfo const *) override
void TriggerFlameShocks(SpellEffIndex) const
static void RemoveIncapacitateEffect(SpellScript const &, std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
static void StartCooldown(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
void HandleScript(SpellEffIndex) const
void FilterTargets(std::list< WorldObject * > &targets) const
bool Validate(SpellInfo const *) override
void EnergizeMaelstrom(SpellEffIndex) const
void TriggerDamage(SpellEffIndex) const
void PreventLavaSurge(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void HandleHeal(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
void OnApply(AuraEffect const *aurEff, AuraEffectHandleModes) const
void TriggerDamage() const
bool Validate(SpellInfo const *) override
ObjectGuid AllowedOriginalCastId
void ApplyModifier(SpellEffectInfo const &, Unit *, int32 &, int32 &, float &pctMod) const
bool Validate(SpellInfo const *spellInfo) override
uint32 _mainHandDamageSpellId
uint32 _offHandDamageSpellId
spell_sha_stormflurry(uint32 stormflurrySpellId, uint32 mainHandDamageSpellId, uint32 offHandDamageSpellId)
void HandleProc(SpellEffIndex) const
uint32 _stormflurrySpellId
static void HandleProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
static void PreventAffectingHealingSpells(SpellScript const &, WorldObject *&target)
bool Validate(SpellInfo const *spellInfo) override
void EnergizeMaelstrom(AuraEffect const *aurEff, ProcEventInfo const &) const
bool CheckHailstormProc(ProcEventInfo const &eventInfo) const
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void PeriodicTick(AuraEffect const *)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void UpdateThorimsInvocationSpell() const
bool Validate(SpellInfo const *spellInfo) override
void TriggerLightningSpell(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &procInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void Trigger(SpellEffIndex effIndex) const
static bool CheckProc(AuraScript const &, ProcEventInfo const &eventInfo)
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &)
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void EnergizeMaelstrom(SpellEffIndex) const
void ApplyFlameShock(SpellEffIndex) const
void HandleEffectProc(AuraEffect const *, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void HandleEffect(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
Position GetHealingRainPosition(Aura const *healingRain)
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::ranges::begin(container))
void RandomShuffle(Iterator begin, Iterator end)
Reorder the elements of the iterator range randomly.
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
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_MOLTEN_THUNDER_TALENT
@ SPELL_SHAMAN_ICE_STRIKE_PROC
@ SPELL_SHAMAN_FLAMETONGUE_WEAPON_AURA
@ SPELL_SHAMAN_FIRE_NOVA_DAMAGE
@ SPELL_SHAMAN_DELUGE_TALENT
@ SPELL_SHAMAN_WINDSTRIKE_DAMAGE_OFF_HAND
@ SPELL_SHAMAN_EARTHEN_RAGE_PERIODIC
@ SPELL_SHAMAN_EARTHQUAKE
@ SPELL_SHAMAN_ARCTIC_SNOWSTORM_SLOW
@ SPELL_SHAMAN_DELUGE_AURA
@ SPELL_SHAMAN_CRASH_LIGHTNING_DAMAGE_BUFF
@ SPELL_SHAMAN_ELEMENTAL_BLAST_HASTE
@ SPELL_SHAMAN_MAELSTROM_WEAPON_MOD_AURA
@ SPELL_SHAMAN_FORCEFUL_WINDS_TALENT
@ SPELL_SHAMAN_UNRELENTING_STORMS_TALENT
@ SPELL_SHAMAN_ICEFURY_OVERLOAD
@ SPELL_SHAMAN_CRASH_LIGHTNING
@ SPELL_SHAMAN_LIGHTNING_BOLT_ENERGIZE
@ SPELL_SHAMAN_ASCENDANCE_RESTORATION
@ SPELL_SHAMAN_VOLTAIC_BLAZE_OVERRIDE
@ SPELL_SHAMAN_FLAMETONGUE_ATTACK
@ SPELL_SHAMAN_FERAL_LUNGE
@ SPELL_SHAMAN_MOLTEN_ASSAULT
@ SPELL_SHAMAN_CRASH_LIGHTNING_CLEAVE
@ SPELL_SHAMAN_FIRE_NOVA_ENABLER
@ SPELL_SHAMAN_WINDFURY_VISUAL_1
@ 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_STORMSTRIKE_DAMAGE_MAIN_HAND
@ SPELL_SHAMAN_PRIMORDIAL_WAVE_DAMAGE
@ SPELL_SHAMAN_STORMBLAST_PROC
@ SPELL_SHAMAN_STORMWEAVER_PVP_TALENT
@ 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_MOLTEN_THUNDER_PROC
@ SPELL_SHAMAN_FLAME_SHOCK
@ SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD_ENERGIZE
@ SPELL_SHAMAN_ITEM_LIGHTNING_SHIELD_DAMAGE
@ SPELL_SHAMAN_WINDFURY_VISUAL_3
@ SPELL_SHAMAN_EARTHEN_RAGE_DAMAGE
@ SPELL_SHAMAN_STORMFLURRY
@ SPELL_SHAMAN_STORMWEAVER_PVP_TALENT_BUFF
@ SPELL_SHAMAN_MAELSTROM_WEAPON_VISIBLE_AURA
@ SPELL_SHAMAN_LIGHTNING_BOLT
@ SPELL_SHAMAN_DOOM_WINDS_LEGENDARY_COOLDOWN
@ SPELL_SHAMAN_EARTHQUAKE_KNOCKING_DOWN
@ SPELL_SHAMAN_MAELSTROM_WEAPON_OVERLAY_HEALS
@ SPELL_SHAMAN_FROST_SHOCK
@ SPELL_SHAMAN_STORMSTRIKE
@ SPELL_SHAMAN_STORMKEEPER
@ SPELL_SHAMAN_POWER_SURGE
@ SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD
@ SPELL_SHAMAN_STORMBLAST_DAMAGE
@ 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_THORIMS_INVOCATION
@ SPELL_SHAMAN_UNRELENTING_STORMS_REDUCTION
@ SPELL_SHAMAN_RESTORATIVE_MISTS_INITIAL
@ SPELL_SHAMAN_OVERFLOWING_MAELSTROM_AURA
@ SPELL_SHAMAN_FORCEFUL_WINDS_PROC
@ SPELL_SHAMAN_MAELSTROM_WEAPON_OVERLAY
@ SPELL_SHAMAN_LAVA_BURST_OVERLOAD
@ SPELL_SHAMAN_LIGHTNING_BOLT_OVERLOAD_ENERGIZE
@ SPELL_SHAMAN_RESTORATIVE_MISTS
@ SPELL_SHAMAN_OVERFLOWING_MAELSTROM_TALENT
@ SPELL_SHAMAN_STORMSTRIKE_DAMAGE_OFF_HAND
@ SPELL_SHAMAN_ICE_STRIKE_OVERRIDE_AURA
@ SPELL_SHAMAN_GATHERING_STORMS
@ SPELL_SHAMAN_SPIRIT_WOLF_TALENT
@ SPELL_SHAMAN_HEALING_RAIN
@ SPELL_SHAMAN_WINDSTRIKE_DAMAGE_MAIN_HAND
@ SPELL_SHAMAN_DOOM_WINDS_DAMAGE
@ SPELL_SHAMAN_UNRULY_WINDS
@ 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_WINDFURY_VISUAL_2
@ SPELL_SHAMAN_TOTEMIC_POWER_ATTACK_POWER
@ SPELL_SHAMAN_NATURES_GUARDIAN_COOLDOWN
@ SPELL_SHAMAN_WINDFURY_ENCHANTMENT
@ SPELL_SHAMAN_CONVERGING_STORMS
@ SPELL_SHAMAN_ENERGY_SURGE
@ SPELL_SHAMAN_WINDFURY_AURA
@ SPELL_SHAMAN_SPIRIT_WOLF_PERIODIC
@ SPELL_SHAMAN_ASCENDANCE_ELEMENTAL
@ SPELL_SHAMAN_ASCENDANCE_ENHANCEMENT
@ SPELL_SHAMAN_HAILSTORM_BUFF
@ SPELL_SHAMAN_STORMFLURRY_ARTIFACT
@ SPELL_SHAMAN_PATH_OF_FLAMES_SPREAD
@ SPELL_SHAMAN_FERAL_LUNGE_DAMAGE
@ SPELL_SHAMAN_EARTHEN_RAGE_PASSIVE
@ SPELL_SHAMAN_HAILSTORM_TALENT
@ SPELL_SHAMAN_ELEMENTAL_BLAST
@ SPELL_SHAMAN_VOLTAIC_BLAZE_DAMAGE
@ SPELL_SHAMAN_STORMSURGE_PROC
@ SPELL_SHAMAN_ANCESTRAL_GUIDANCE
@ SPELL_SHAMAN_EARTHQUAKE_TICK
@ SPELL_SHAMAN_EARTH_SHIELD_HEAL
@ SPELL_SHAMAN_ARCTIC_SNOWSTORM_AREATRIGGER
@ SPELL_SHAMAN_CHAIN_LIGHTNING_OVERLOAD
@ SPELL_SHAMAN_ECHOES_OF_GREAT_SUNDERING_TALENT
@ SPELL_SHAMAN_ITEM_MANA_SURGE
@ SPELL_SHAMAN_ELEMENTAL_WEAPONS_BUFF
@ SPELL_SHAMAN_ELEMENTAL_BLAST_MASTERY
@ SPELL_SHAMAN_ENHANCED_ELEMENTS
@ SPELL_SHAMAN_HEALING_RAIN_VISUAL
@ SPELL_SHAMAN_ANCESTRAL_GUIDANCE_HEAL
@ SPELL_SHAMAN_FROST_SHOCK_ENERGIZE
@ SPELL_SHAMAN_STORMBLAST_TALENT
@ SPELL_SHAMAN_TIDAL_WAVES
@ NPC_HEALING_RAIN_INVISIBLE_STALKER
Optional< SpellCastTargets > Targets
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
bool operator()(Unit const *candidate) const
constexpr void GetPosition(float &x, float &y) const
SpellEffectValue DamagePercent
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
void OnUnitEnter(Unit *unit) override
GuidUnorderedSet _stunnedUnits
void OnCreate(Spell const *creatingSpell) override
Milliseconds _refreshTimer
void OnUpdate(uint32 diff) override
bool AddStunnedTarget(ObjectGuid const &guid)
void OnUpdate(uint32 diff) override
static void CastSpeedBuff(Unit *caster, Unit *unit)
void OnUnitEnter(Unit *unit) override
static constexpr uint32 REFRESH_TIME
static void GenerateMaelstromWeapon(Unit *shaman, int32 stacks)
static void ConsumeMaelstromWeapon(Unit *shaman, Aura *maelstromWeaponVisibleAura, int32 stacks, Spell const *consumingSpell=nullptr)