TrinityCore
Loading...
Searching...
No Matches
spell_evoker.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/*
19 * Scripts for spells with SPELLFAMILY_EVOKER and SPELLFAMILY_GENERIC spells used by evoker players.
20 * Ordered alphabetically using scriptname.
21 * Scriptnames of files in this file should be prefixed with "spell_evo_".
22 */
23
24#include "AreaTrigger.h"
25#include "AreaTriggerAI.h"
26#include "Containers.h"
27#include "DB2Stores.h"
28#include "Player.h"
29#include "ScriptMgr.h"
30#include "Spell.h"
31#include "SpellAuraEffects.h"
32#include "SpellHistory.h"
33#include "SpellMgr.h"
34#include "SpellScript.h"
35#include "TaskScheduler.h"
36
38{
82};
83
88
93
94// 362969 - Azure Strike (blue)
96{
97 void FilterTargets(std::list<WorldObject*>& targets)
98 {
99 targets.remove(GetExplTargetUnit());
100 Trinity::Containers::RandomResize(targets, GetEffectInfo(EFFECT_0).CalcValueAsInt(GetCaster()) - 1);
101 targets.push_back(GetExplTargetUnit());
102 }
103
108};
109
110// 381732 - Blessing of the Bronze (Bronze)
111// 381741 - Blessing of the Bronze (Bronze)
112// 381746 - Blessing of the Bronze (Bronze)
113// 381748 - Blessing of the Bronze (Bronze)
114// 381749 - Blessing of the Bronze (Bronze)
115// 381750 - Blessing of the Bronze (Bronze)
116// 381751 - Blessing of the Bronze (Bronze)
117// 381752 - Blessing of the Bronze (Bronze)
118// 381753 - Blessing of the Bronze (Bronze)
119// 381754 - Blessing of the Bronze (Bronze)
120// 381756 - Blessing of the Bronze (Bronze)
121// 381757 - Blessing of the Bronze (Bronze)
122// 381758 - Blessing of the Bronze (Bronze)
124{
125 void RemoveInvalidTargets(std::list<WorldObject*>& targets) const
126 {
127 targets.remove_if([&](WorldObject const* target)
128 {
129 Unit const* unitTarget = target->ToUnit();
130 if (!unitTarget)
131 return true;
132
133 switch (GetSpellInfo()->Id)
134 {
148 default:
149 break;
150 }
151 return true;
152 });
153 }
154
159};
160
161// 375801 - Burnout
163{
164 bool Validate(SpellInfo const* /*spellInfo*/) override
165 {
167 }
168
169 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
170 {
171 return roll_chance(aurEff->GetAmount());
172 }
173
174 static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
175 {
177 }
178
184};
185
186// 373834 - Call of Ysera (attached to 361195 - Verdant Embrace (Green))
212
214
215// Called by 356995 - Disintegrate (Blue)
217{
218 bool Validate(SpellInfo const* /*spellInfo*/) override
219 {
221 }
222
223 bool Load() override
224 {
226 }
227
228 void OnTick(AuraEffect const* /*aurEff*/) const
229 {
230 if (AuraEffect const* causality = GetCaster()->GetAuraEffect(SPELL_EVOKER_CAUSALITY, EFFECT_0))
232 GetCaster()->GetSpellHistory()->ModifyCooldown(spell, Milliseconds(causality->GetAmountAsInt()));
233 }
234
239};
240
241// Called by 357212 - Pyre (Red)
243{
244 static constexpr int64 TargetLimit = 5;
245
246 bool Validate(SpellInfo const* /*spellInfo*/) override
247 {
249 }
250
251 bool Load() override
252 {
254 }
255
256 void HandleCooldown() const
257 {
259 if (!causality)
260 return;
261
262 Milliseconds cooldownReduction = Milliseconds(std::min(GetUnitTargetCountForEffect(EFFECT_0), TargetLimit) * causality->GetAmountAsInt());
264 GetCaster()->GetSpellHistory()->ModifyCooldown(spell, cooldownReduction);
265 }
266
271};
272
273// 370455 - Charged Blast
275{
276 bool CheckProc(ProcEventInfo& procInfo)
277 {
278 return procInfo.GetSpellInfo() && procInfo.GetSpellInfo()->HasLabel(SPELL_LABEL_EVOKER_BLUE);
279 }
280
285};
286
287// 355913 - Emerald Blossom (Green)
288// ID - 23318
299
300// 355916 - Emerald Blossom (Green)
302{
303 bool Validate(SpellInfo const* spellInfo) override
304 {
305 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
306 }
307
308 void FilterTargets(std::list<WorldObject*>& targets) const
309 {
310 uint32 const maxTargets = uint32(GetSpellInfo()->GetEffect(EFFECT_1).CalcValueAsInt(GetCaster()));
311 Trinity::SelectRandomInjuredTargets(targets, maxTargets, true);
312 }
313
318};
319
320// Called by 362969 - Azure Strike
321// Called by 361469 - Living Flame (Red)
323{
324public:
325 explicit spell_evo_essence_burst_trigger(uint32 talentAuraId) : _talentAuraId(talentAuraId) { }
326
327 bool Validate(SpellInfo const* /*spellInfo*/) override
328 {
330 }
331
332 bool Load() override
333 {
335 return aurEff && roll_chance(aurEff->GetAmount());
336 }
337
345
350
352};
353
354// 357208 Fire Breath (Red)
355// 382266 Fire Breath (Red)
357{
358public:
359 struct data
360 {
362 };
363
364 bool Validate(SpellInfo const* /*spellInfo*/) override
365 {
367 }
368
369 void OnComplete(int32 completedStageCount) const
370 {
371 SpellEffectValue dotTicks = 10 - (completedStageCount - 1) * 3;
373 dotTicks += blastFurnace->GetAmount() / 2;
374
376 .SetTriggeringSpell(GetSpell())
378 .AddSpellMod(SPELLVALUE_DURATION_PCT, 100 * dotTicks)
379 .SetCustomArg(data{ .EmpowerLevel = completedStageCount }));
380 }
381
386};
387
388// 357209 Fire Breath (Red)
390{
391 bool Validate(SpellInfo const* spellInfo) override
392 {
393 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } })
394 && spellInfo->GetEffect(EFFECT_2).IsAura(SPELL_AURA_MOD_SILENCE); // validate we are removing the correct effect
395 }
396
397 void AddBonusUpfrontDamage(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* victim, int32& /*damage*/, int32& flatMod, float& /*pctMod*/) const
398 {
399 spell_evo_fire_breath::data const* params = std::any_cast<spell_evo_fire_breath::data>(&GetSpell()->m_customArg);
400 if (!params)
401 return;
402
403 // damage is done after aura is applied, grab periodic amount
404 if (AuraEffect const* fireBreath = victim->GetAuraEffect(GetSpellInfo()->Id, EFFECT_1, GetCaster()->GetGUID()))
405 flatMod += fireBreath->GetEstimatedAmount().value_or(fireBreath->GetAmount()) * (params->EmpowerLevel - 1) * 3;
406 }
407
408 void RemoveUnusedEffect(std::list<WorldObject*>& targets) const
409 {
410 targets.clear();
411 }
412
418};
419
420// 369372 - Firestorm (Red)
422{
424
426 {
428 };
429
431 {
432 if (firestorm->m_customArg.type() != typeid(extra_create_data))
433 return firestorm->m_customArg.emplace<extra_create_data>();
434
435 return *std::any_cast<extra_create_data>(&firestorm->m_customArg);
436 }
437
438 void OnCreate(Spell const* creatingSpell) override
439 {
440 _damageSpellCustomArg = creatingSpell->m_customArg;
441
442 _scheduler.Schedule(0ms, [this](TaskContext& task)
443 {
444 FloatMilliseconds period = 2s; // 2s, affected by haste
445 if (Unit* caster = at->GetCaster())
446 {
447 period *= *caster->m_unitData->ModCastingSpeed;
448 caster->CastSpell(at->GetPosition(), SPELL_EVOKER_FIRESTORM_DAMAGE, CastSpellExtraArgsInit{
449 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
450 .CustomArg = _damageSpellCustomArg
451 });
452 }
453
454 task.Repeat(duration_cast<Milliseconds>(period));
455 });
456 }
457
458 void OnUpdate(uint32 diff) override
459 {
460 _scheduler.Update(diff);
461 }
462
463private:
466};
467
468// 358733 - Glide (Racial)
470{
471 bool Validate(SpellInfo const* /*spellInfo*/) override
472 {
474 }
475
477 {
478 Unit* caster = GetCaster();
479
480 if (!caster->IsFalling())
482
483 return SPELL_CAST_OK;
484 }
485
487 {
488 Player* caster = GetCaster()->ToPlayer();
489 if (!caster)
490 return;
491
492 caster->CastSpell(caster, SPELL_EVOKER_GLIDE_KNOCKBACK, true);
493
494 caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_EVOKER_HOVER, GetCastDifficulty()), 0, nullptr, false, 250ms);
495 caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_EVOKER_SOAR_RACIAL, GetCastDifficulty()), 0, nullptr, false, 250ms);
496 }
497
503};
504
505// 361469 - Living Flame (Red)
507{
512
514 {
515 Unit* caster = GetCaster();
516 Unit* hitUnit = GetHitUnit();
517 if (caster->IsValidAssistTarget(hitUnit))
518 caster->CastSpell(hitUnit, SPELL_EVOKER_LIVING_FLAME_HEAL, true);
519 else
520 caster->CastSpell(hitUnit, SPELL_EVOKER_LIVING_FLAME_DAMAGE, true);
521 }
522
524 {
525 Unit* caster = GetCaster();
526 if (caster->IsValidAssistTarget(GetHitUnit()))
527 return;
528
530 {
531 int32 manaCost = GetSpell()->GetPowerTypeCostAmount(POWER_MANA).value_or(0);
532 if (manaCost != 0)
533 GetCaster()->ModifyPower(POWER_MANA, CalculatePct(manaCost, auraEffect->GetAmount()));
534 }
535 }
536
542};
543
544// 387761 Panacea (Green) (attached to 355913 - Emerald Blossom (Green) and 360995 - Verdant Embrace (Green))
546{
547 bool Validate(SpellInfo const* /*spellInfo*/) override
548 {
550 }
551
552 bool Load() override
553 {
555 }
556
564
569};
570
571// 381773 - Permeating Chill
573{
574 bool Validate(SpellInfo const* /*spellInfo*/) override
575 {
577 }
578
579 bool CheckProc(ProcEventInfo& procInfo)
580 {
581 SpellInfo const* spellInfo = procInfo.GetSpellInfo();
582 if (!spellInfo)
583 return false;
584
585 if (!spellInfo->HasLabel(SPELL_LABEL_EVOKER_BLUE))
586 return false;
587
589 if (!spellInfo->IsAffected(SPELLFAMILY_EVOKER, { 0x40, 0, 0, 0 })) // disintegrate
590 return false;
591
592 return true;
593 }
594
599};
600
601// 393568 - Pyre
603{
604 bool Validate(SpellInfo const* /*spellInfo*/) override
605 {
607 }
608
609 void HandleDamage(SpellEffIndex /*effIndex*/)
610 {
611 GetCaster()->CastSpell(GetHitUnit()->GetPosition(), SPELL_EVOKER_PYRE_DAMAGE, true);
612 }
613
618};
619
620// 361500 Living Flame (Red)
621// 361509 Living Flame (Red)
623{
624 bool Validate(SpellInfo const* spellInfo) override
625 {
627 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } })
629 && spellInfo->GetEffect(EFFECT_1).ApplyAuraPeriod != 0;
630 }
631
632 bool Load() override
633 {
635 }
636
637 static void PreventPeriodic(SpellScript const&, WorldObject*& target)
638 {
639 target = nullptr;
640 }
641
647};
648
649// 357209 Fire Breath (Red)
651{
652 bool Validate(SpellInfo const* /*spellInfo*/) override
653 {
655 }
656
657 void HandleScouringFlame(std::list<WorldObject*>& targets) const
658 {
660 targets.clear();
661 }
662
664 {
665 if (spell_evo_fire_breath::data const* params = std::any_cast<spell_evo_fire_breath::data>(&GetSpell()->m_customArg))
666 SetEffectValue(params->EmpowerLevel);
667 }
668
674};
675
676// Called by 368847 - Firestorm (Red)
678{
679 bool Validate(SpellInfo const* /*spellInfo*/) override
680 {
682 }
683
684 bool Load() override
685 {
687 }
688
689 void OnPrecast() override
690 {
691 if (AuraEffect const* snapfire = GetCaster()->GetAuraEffect(SPELL_EVOKER_SNAPFIRE, EFFECT_1))
692 if (GetSpell()->m_appliedMods.contains(snapfire->GetBase()))
693 AddPct(at_evo_firestorm::GetOrCreateExtraData(GetSpell()).SnapshotDamageMultipliers, snapfire->GetAmount());
694 }
695
696 void Register() override { }
697};
698
699// Called by 369374 - Firestorm (Red)
701{
702 void CalculateDamageBonus(SpellEffectInfo const& /*spellEffectInfo*/, Unit* /*victim*/, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
703 {
704 if (at_evo_firestorm::extra_create_data const* bonus = std::any_cast<at_evo_firestorm::extra_create_data>(&GetSpell()->m_customArg))
705 pctMod *= bonus->SnapshotDamageMultipliers;
706 }
707
712};
713
714// 360995 - Verdant Embrace (Green)
745
746// 396557 - Verdant Embrace
767
DB2Storage< SpellVisualKitEntry > sSpellVisualKitStore("SpellVisualKit.db2", &SpellVisualKitLoadInfo::Instance)
int64_t int64
Definition Define.h:149
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::unordered_set< uint32 > params[2]
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
std::chrono::duration< double, Milliseconds::period > FloatMilliseconds
Definition Duration.h:25
bool roll_chance(T chance)
Definition Random.h:55
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1382
SpellEffIndex
@ EFFECT_3
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_MONK
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_DEMON_HUNTER
@ CLASS_PALADIN
@ CLASS_ROGUE
@ CLASS_EVOKER
@ TARGET_UNIT_DEST_AREA_ALLY
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_TARGET_ALLY
@ TARGET_UNIT_CASTER_AREA_RAID
@ TARGET_UNIT_TARGET_ENEMY
@ TARGET_UNIT_CONE_CASTER_TO_DEST_ENEMY
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_DISPEL
@ SPELL_EFFECT_APPLY_AURA
@ POWER_MANA
SpellCastResult
@ SPELL_FAILED_NOT_ON_GROUND
@ SPELL_CAST_OK
#define EFFECT_ALL
@ SPELLFAMILY_EVOKER
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_SILENCE
double SpellEffectValue
This is a double instead of float to be able to store full range of int32.
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_DURATION_PCT
#define sSpellMgr
Definition SpellMgr.h:812
#define SpellObjectTargetSelectFn(F, I, N)
#define SpellCheckCastFn(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 SpellOnEmpowerStageCompletedFn(F)
#define SpellCalcDamageFn(F)
#define SpellCastFn(F)
#define AuraCheckProcFn(F)
T AddPct(T &base, U pct)
Definition Util.h:85
T CalculatePct(T base, U pct)
Definition Util.h:72
AreaTrigger *const at
AreaTriggerAI(AreaTrigger *a, uint32 scriptId={}) noexcept
Unit * GetCaster() const
int32 GetAmountAsInt() const
SpellEffectValue GetAmount() const
HookList< CheckEffectProcHandler > DoCheckEffectProc
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetCaster() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectProcHandler > OnEffectProc
Player * ToPlayer()
Definition Object.h:126
Unit * ToUnit()
Definition Object.h:116
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
Unit * GetActor() const
Definition Unit.h:499
bool IsAura() const
bool IsEffect() const
uint32 ApplyAuraPeriod
Definition SpellInfo.h:217
void ModifyCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown=false)
void StartCooldown(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool onHold=false, Optional< Duration > forcedCooldown={})
bool IsAffected(uint32 familyName, flag128 const &familyFlags) const
uint32 const Id
Definition SpellInfo.h:328
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:588
bool HasLabel(uint32 labelId) const
uint32 m_scriptSpellId
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
HookList< CheckCastHandler > OnCheckCast
Unit * GetCaster() const
void SetEffectValue(SpellEffectValue value)
int64 GetUnitTargetCountForEffect(SpellEffIndex effect) const
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
HookList< CastHandler > OnCast
Spell * GetSpell() const
HookList< EffectHandler > OnEffectLaunchTarget
Difficulty GetCastDifficulty() const
HookList< EmpowerStageCompletedHandler > OnEmpowerCompleted
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition Spell.h:277
std::any m_customArg
Definition Spell.h:649
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
Definition Spell.cpp:8157
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & Schedule(duration_t time, task_handler_t task)
Definition Unit.h:635
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:8697
uint8 GetClass() const
Definition Unit.h:764
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4604
void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration) const
Definition Unit.cpp:12342
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
SpellHistory * GetSpellHistory()
Definition Unit.h:1498
bool IsFalling() const
Definition Unit.cpp:12939
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2482
void Register() override
void FilterTargets(std::list< WorldObject * > &targets)
void RemoveInvalidTargets(std::list< WorldObject * > &targets) const
bool Validate(SpellInfo const *) override
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &)
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
void Register() override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void OnTick(AuraEffect const *) const
static constexpr int64 TargetLimit
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo &procInfo)
void FilterTargets(std::list< WorldObject * > &targets) const
bool Validate(SpellInfo const *spellInfo) override
spell_evo_essence_burst_trigger(uint32 talentAuraId)
bool Validate(SpellInfo const *) override
void RemoveUnusedEffect(std::list< WorldObject * > &targets) const
bool Validate(SpellInfo const *spellInfo) override
void AddBonusUpfrontDamage(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &flatMod, float &) const
void Register() override
void OnComplete(int32 completedStageCount) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
SpellCastResult CheckCast()
void Register() override
void HandleHitTarget(SpellEffIndex)
void Register() override
bool Validate(SpellInfo const *) override
void HandleLaunchTarget(SpellEffIndex)
bool Load() override
bool Validate(SpellInfo const *) override
void Register() override
void HandlePanacea() const
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo &procInfo)
void Register() override
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex)
bool Validate(SpellInfo const *spellInfo) override
static void PreventPeriodic(SpellScript const &, WorldObject *&target)
void Register() override
bool Validate(SpellInfo const *) override
void CalcDispelCount(SpellEffIndex)
void HandleScouringFlame(std::list< WorldObject * > &targets) const
void CalculateDamageBonus(SpellEffectInfo const &, Unit *, int32 &, int32 &, float &pctMod) const
bool Validate(SpellInfo const *) override
void Register() override
void OnPrecast() override
bool Load() override
bool Validate(SpellInfo const *) override
void HandleHitTarget(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleLaunchTarget(SpellEffIndex) const
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:67
void SelectRandomInjuredTargets(std::list< WorldObject * > &targets, size_t maxTargets, bool prioritizePlayers, Unit const *prioritizeGroupMembersOf)
Definition Spell.cpp:9577
static constexpr std::array< uint32, 2 > CausalityAffectedEmpowerSpells
EvokerSpellVisuals
@ SPELL_VISUAL_KIT_EVOKER_VERDANT_EMBRACE_JUMP
EvokerSpells
@ SPELL_EVOKER_SCOURING_FLAME
@ SPELL_EVOKER_RUBY_ESSENCE_BURST
@ SPELL_EVOKER_CALL_OF_YSERA
@ SPELL_EVOKER_ESSENCE_BURST
@ SPELL_EVOKER_CAUSALITY
@ SPELL_EVOKER_VERDANT_EMBRACE_JUMP
@ SPELL_EVOKER_BLAST_FURNACE
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_WARLOCK
@ SPELL_EVOKER_HOVER
@ SPELL_EVOKER_FIRE_BREATH
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_PRIEST
@ SPELL_EVOKER_LIVING_FLAME
@ SPELL_EVOKER_PANACEA_TALENT
@ SPELL_EVOKER_AZURE_ESSENCE_BURST
@ SPELL_EVOKER_SOAR_RACIAL
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_DH
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_MAGE
@ SPELL_EVOKER_RUBY_EMBERS
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_PALADIN
@ SPELL_EVOKER_PANACEA_HEAL
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_EVOKER
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_HUNTER
@ SPELL_EVOKER_BURNOUT
@ SPELL_EVOKER_CALL_OF_YSERA_TALENT
@ SPELL_EVOKER_ETERNITY_SURGE
@ SPELL_EVOKER_GLIDE_KNOCKBACK
@ SPELL_EVOKER_DISINTEGRATE
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_ROGUE
@ SPELL_EVOKER_ENERGIZING_FLAME
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_DK
@ SPELL_EVOKER_LIVING_FLAME_DAMAGE
@ SPELL_EVOKER_FIRESTORM_DAMAGE
@ SPELL_EVOKER_SNAPFIRE
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_DRUID
@ SPELL_EVOKER_LIVING_FLAME_HEAL
@ SPELL_EVOKER_PYRE_DAMAGE
@ SPELL_EVOKER_VERDANT_EMBRACE_HEAL
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_SHAMAN
@ SPELL_EVOKER_FIRE_BREATH_DAMAGE
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_MONK
@ SPELL_EVOKER_BLESSING_OF_THE_BRONZE_WARRIOR
@ SPELL_EVOKER_EMERALD_BLOSSOM_HEAL
@ SPELL_EVOKER_PERMEATING_CHILL_TALENT
EvokerSpellLabels
@ SPELL_LABEL_EVOKER_BLUE
void AddSC_evoker_spell_scripts()
TriggerCastFlags TriggerFlags
CastSpellExtraArgs & SetTriggeringSpell(Spell const *triggeringSpell)
Definition Spell.cpp:9707
CastSpellExtraArgs & SetTriggerFlags(TriggerCastFlags flag)
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
void OnRemove() override
TaskScheduler _scheduler
void OnCreate(Spell const *creatingSpell) override
std::any _damageSpellCustomArg
static extra_create_data & GetOrCreateExtraData(Spell *firestorm)
void OnUpdate(uint32 diff) override