TrinityCore
spell_mage.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_MAGE and SPELLFAMILY_GENERIC spells used by mage players.
20 * Ordered alphabetically using scriptname.
21 * Scriptnames of files in this file should be prefixed with "spell_mage_".
22 */
23
24#include "AreaTrigger.h"
25#include "AreaTriggerAI.h"
26#include "DB2Stores.h"
27#include "GridNotifiers.h"
28#include "ObjectAccessor.h"
29#include "Player.h"
30#include "ScriptMgr.h"
31#include "SpellAuraEffects.h"
32#include "SpellHistory.h"
33#include "SpellMgr.h"
34#include "SpellScript.h"
35#include "TemporarySummon.h"
36
38{
99};
100
101// 110909 - Alter Time Aura
102// 342246 - Alter Time Aura
104{
105 bool Validate(SpellInfo const* /*spellInfo*/) override
106 {
107 return ValidateSpellInfo
108 ({
112 });
113 }
114
115 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
116 {
117 Unit* unit = GetTarget();
118 _health = unit->GetHealth();
119 _pos = unit->GetPosition();
120 }
121
122 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
123 {
124 Unit* unit = GetTarget();
125 if (unit->GetDistance(_pos) <= 100.0f && GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
126 {
127 unit->SetHealth(_health);
128 unit->NearTeleportTo(_pos);
129
131 {
132 SpellInfo const* blink = sSpellMgr->AssertSpellInfo(SPELL_MAGE_BLINK, DIFFICULTY_NONE);
134 }
136 }
137 }
138
139 void Register() override
140 {
143 }
144
145private:
148};
149
150// 127140 - Alter Time Active
151// 342247 - Alter Time Active
153{
154 bool Validate(SpellInfo const* /*spellInfo*/) override
155 {
156 return ValidateSpellInfo
157 ({
160 });
161 }
162
164 {
165 Unit* unit = GetCaster();
168 }
169
170 void Register() override
171 {
173 }
174};
175
176// 44425 - Arcane Barrage
178{
179 bool Validate(SpellInfo const* spellInfo) override
180 {
182 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
183 }
184
186 {
187 Unit* caster = GetCaster();
188
189 // Consume all arcane charges
190 if (int32 arcaneCharges = -caster->ModifyPower(POWER_ARCANE_CHARGES, -caster->GetMaxPower(POWER_ARCANE_CHARGES), false))
191 if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_MAGE_ARCANE_BARRAGE_R3, EFFECT_0, caster->GetGUID()))
192 caster->CastSpell(caster, SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE, { SPELLVALUE_BASE_POINT0, arcaneCharges * auraEffect->GetAmount() / 100 });
193 }
194
196 {
197 if (GetHitUnit()->GetGUID() != _primaryTarget)
199 }
200
202 {
204 }
205
206 void Register() override
207 {
211 }
212
214};
215
216// 195302 - Arcane Charge
218{
219 bool Validate(SpellInfo const* /*spellInfo*/) override
220 {
222 }
223
225 {
227 }
228
229 void Register() override
230 {
232 }
233};
234
235// 1449 - Arcane Explosion
237{
238 bool Validate(SpellInfo const* spellInfo) override
239 {
241 return false;
242
243 if (!ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }))
244 return false;
245
247 }
248
250 {
252 PreventHitDefaultEffect(effIndex);
253 }
254
256 {
257 bool procTriggered = [&]()
258 {
259 Unit const* caster = GetCaster();
260 AuraEffect const* triggerChance = caster->GetAuraEffect(SPELL_MAGE_REVERBERATE, EFFECT_0);
261 if (!triggerChance)
262 return false;
263
264 AuraEffect const* requiredTargets = caster->GetAuraEffect(SPELL_MAGE_REVERBERATE, EFFECT_1);
265 if (!requiredTargets)
266 return false;
267
268 return GetUnitTargetCountForEffect(EFFECT_1) >= requiredTargets->GetAmount() && roll_chance_i(triggerChance->GetAmount());
269 }();
270
271 if (!procTriggered)
272 PreventHitDefaultEffect(effIndex);
273 }
274
275 void Register() override
276 {
279 }
280};
281
282// 235313 - Blazing Barrier
284{
285 bool Validate(SpellInfo const* /*spellInfo*/) override
286 {
288 }
289
290 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
291 {
292 canBeRecalculated = false;
293 if (Unit* caster = GetCaster())
294 amount = int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f);
295 }
296
297 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
298 {
300 Unit* caster = eventInfo.GetDamageInfo()->GetVictim();
301 Unit* target = eventInfo.GetDamageInfo()->GetAttacker();
302
303 if (caster && target)
304 caster->CastSpell(target, SPELL_MAGE_BLAZING_BARRIER_TRIGGER, true);
305 }
306
307 void Register() override
308 {
311 }
312};
313
314// 190356 - Blizzard
315// 4658 - AreaTrigger Create Properties
317{
319
320 static constexpr Milliseconds TICK_PERIOD = Milliseconds(1000);
321
322 void OnUpdate(uint32 diff) override
323 {
324 _tickTimer -= Milliseconds(diff);
325
326 while (_tickTimer <= 0s)
327 {
328 if (Unit* caster = at->GetCaster())
329 caster->CastSpell(at->GetPosition(), SPELL_MAGE_BLIZZARD_DAMAGE);
330
332 }
333 }
334
335private:
337};
338
339// 190357 - Blizzard (Damage)
341{
342 bool Validate(SpellInfo const* /*spellInfo*/) override
343 {
345 }
346
347 void HandleSlow(SpellEffIndex /*effIndex*/)
348 {
350 }
351
352 void Register() override
353 {
355 }
356};
357
358// 198063 - Burning Determination
360{
361 bool CheckProc(ProcEventInfo& eventInfo)
362 {
363 if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo())
364 if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE)))
365 return true;
366
367 return false;
368 }
369
370 void Register() override
371 {
373 }
374};
375
376// 86949 - Cauterize
378{
380 {
381 PreventHitDefaultEffect(effIndex);
382 }
383
384 void Register() override
385 {
387 }
388};
389
391{
392 bool Validate(SpellInfo const* spellInfo) override
393 {
394 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } }) && ValidateSpellInfo
395 ({
398 spellInfo->GetEffect(EFFECT_2).TriggerSpell
399 });
400 }
401
402 void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& /*absorbAmount*/)
403 {
404 AuraEffect const* effect1 = GetEffect(EFFECT_1);
405 if (!effect1 ||
407 dmgInfo.GetDamage() < GetTarget()->GetHealth() ||
408 dmgInfo.GetDamage() > GetTarget()->GetMaxHealth() * 2 ||
410 {
412 return;
413 }
414
415 GetTarget()->SetHealth(GetTarget()->CountPctFromMaxHealth(effect1->GetAmount()));
419 }
420
421 void Register() override
422 {
424 }
425};
426
427// 235219 - Cold Snap
429{
430 static uint32 constexpr SpellsToReset[] =
431 {
435 };
436
437 bool Validate(SpellInfo const* /*spellInfo*/) override
438 {
440 }
441
442 void HandleDummy(SpellEffIndex /*effIndex*/)
443 {
444 for (uint32 spellId : SpellsToReset)
445 GetCaster()->GetSpellHistory()->ResetCooldown(spellId, true);
446
447 GetCaster()->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FROST_NOVA, GetCastDifficulty())->ChargeCategoryId);
448 }
449
450 void Register() override
451 {
453 }
454};
455
457{
458public:
459 CometStormEvent(Unit* caster, ObjectGuid originalCastId, Position const& dest) : _caster(caster), _originalCastId(originalCastId), _dest(dest), _count(0) { }
460
461 bool Execute(uint64 time, uint32 /*diff*/) override
462 {
463 Position destPosition = {_dest.GetPositionX() + frand(-3.0f, 3.0f), _dest.GetPositionY() + frand(-3.0f, 3.0f), _dest.GetPositionZ()};
466 ++_count;
467
468 if (_count >= 7)
469 return true;
470
471 _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(100ms, 275ms));
472 return false;
473 }
474
475private:
480};
481
482// 153595 - Comet Storm (launch)
484{
485 bool Validate(SpellInfo const* /*spellInfo*/) override
486 {
488 }
489
490 void EffectHit(SpellEffIndex /*effIndex*/)
491 {
492 GetCaster()->m_Events.AddEventAtOffset(new CometStormEvent(GetCaster(), GetSpell()->m_castId, *GetHitDest()), randtime(100ms, 275ms));
493 }
494
495 void Register() override
496 {
498 }
499};
500
501// 228601 - Comet Storm (damage)
503{
504 bool Validate(SpellInfo const* /*spellInfo*/) override
505 {
507 }
508
510 {
512 CastSpellExtraArgs(TRIGGERED_IGNORE_CAST_IN_PROGRESS).SetOriginalCastId(GetSpell()->m_originalCastId));
513 }
514
515 void Register() override
516 {
518 }
519};
520
521// 120 - Cone of Cold
523{
524 bool Validate(SpellInfo const* /*spellInfo*/) override
525 {
527 }
528
529 void HandleSlow(SpellEffIndex /*effIndex*/)
530 {
532 }
533
534 void Register() override
535 {
537 }
538};
539
540// 190336 - Conjure Refreshment
542{
543 bool Validate(SpellInfo const* /*spellInfo*/) override
544 {
545 return ValidateSpellInfo
546 ({
549 });
550 }
551
552 void HandleDummy(SpellEffIndex /*effIndex*/)
553 {
554 if (Player* caster = GetCaster()->ToPlayer())
555 {
556 Group* group = caster->GetGroup();
557 if (group)
558 caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE, true);
559 else
560 caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT, true);
561 }
562 }
563
564 void Register() override
565 {
567 }
568};
569
570// 410939 - Ethereal Blink
572{
573 bool Validate(SpellInfo const* /*spellInfo*/) override
574 {
576 }
577
578 void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
579 {
581
582 // this proc only works for players because teleport relocation happens after an ACK
584 .SetTriggeringSpell(procInfo.GetProcSpell())
585 .SetCustomArg(GetTarget()->GetPosition()));
586 }
587
588 void Register() override
589 {
591 }
592};
593
594// 410941 - Ethereal Blink
596{
597 bool Validate(SpellInfo const* /*spellInfo*/) override
598 {
601 }
602
603 void FilterTargets(std::list<WorldObject*>& targets)
604 {
605 Position const* src = std::any_cast<Position>(&GetSpell()->m_customArg);
606 WorldLocation const* dst = GetExplTargetDest();
607 if (!src || !dst)
608 {
609 targets.clear();
610 return;
611 }
612
613 targets.remove_if([&](WorldObject* target)
614 {
615 return !target->IsInBetween(*src, *dst, (target->GetCombatReach() + GetCaster()->GetCombatReach()) / 2.0f);
616 });
617
619 if (!reductionEffect)
620 return;
621
622 Seconds reduction = Seconds(reductionEffect->GetAmount()) * targets.size();
623
624 if (AuraEffect const* cap = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_3))
625 if (reduction > Seconds(cap->GetAmount()))
626 reduction = Seconds(cap->GetAmount());
627
628 if (reduction > 0s)
629 {
632 }
633 }
634
635 void TriggerSlow(SpellEffIndex /*effIndex*/)
636 {
637 int32 effectivenessPct = 100;
638 if (AuraEffect const* effectivenessEffect = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_1))
639 effectivenessPct = effectivenessEffect->GetAmount();
640
641 int32 slowPct = sSpellMgr->AssertSpellInfo(SPELL_MAGE_SLOW, DIFFICULTY_NONE)->GetEffect(EFFECT_0).CalcBaseValue(GetCaster(), GetHitUnit(), 0, -1);
642 ApplyPct(slowPct, effectivenessPct);
643
645 .AddSpellMod(SPELLVALUE_BASE_POINT0, slowPct));
646 }
647
648 void Register() override
649 {
652 }
653};
654
655// 383395 - Feel the Burn
657{
658 bool Validate(SpellInfo const* /*spellInfo*/) override
659 {
661 }
662
663 void CalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
664 {
665 if (Unit* caster = GetCaster())
666 if (AuraEffect const* valueHolder = caster->GetAuraEffect(SPELL_MAGE_FEEL_THE_BURN, EFFECT_0))
667 amount = valueHolder->GetAmount();
668
669 canBeRecalculated = false;
670 }
671
672 void Register() override
673 {
675 }
676};
677
678// 112965 - Fingers of Frost
680{
681 bool Validate(SpellInfo const* /*spellInfo*/) override
682 {
684 }
685
686 bool CheckFrostboltProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
687 {
688 return eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_MAGE, flag128(0, 0x2000000, 0, 0))
689 && roll_chance_i(aurEff->GetAmount());
690 }
691
692 bool CheckFrozenOrbProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
693 {
694 return eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_MAGE, flag128(0, 0, 0x80, 0))
695 && roll_chance_i(aurEff->GetAmount());
696 }
697
698 void Trigger(AuraEffect* aurEff, ProcEventInfo& eventInfo)
699 {
701 }
702
703 void Register() override
704 {
709 }
710};
711
712// 133 - Fireball
713// 11366 - Pyroblast
715{
716 bool Validate(SpellInfo const* /*spellInfo*/) override
717 {
719 }
720
721 void CalcCritChance(Unit const* victim, float& critChance)
722 {
723 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
724 if (victim->GetHealthPct() >= aurEff->GetAmount())
725 critChance = 100.0f;
726 }
727
728 void Register() override
729 {
731 }
732};
733
734// 321712 - Pyroblast
736{
737 bool Validate(SpellInfo const* /*spellInfo*/) override
738 {
740 }
741
742 void CalcCritChance(AuraEffect const* /*aurEff*/, Unit const* victim, float& critChance)
743 {
744 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
745 if (victim->GetHealthPct() >= aurEff->GetAmount())
746 critChance = 100.0f;
747 }
748
749 void Register() override
750 {
752 }
753};
754
755// 205029 - Flame On
757{
758 bool Validate(SpellInfo const* spellInfo) override
759 {
761 && sSpellCategoryStore.HasRecord(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)
762 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
763 }
764
765 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
766 {
767 canBeRecalculated = false;
768 amount = -GetPctOf(GetEffectInfo(EFFECT_2).CalcValue() * IN_MILLISECONDS, sSpellCategoryStore.AssertEntry(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)->ChargeRecoveryTime);
769 }
770
771 void Register() override
772 {
774 }
775};
776
777// 44614 - Flurry
779{
780 class FlurryEvent : public BasicEvent
781 {
782 public:
783 FlurryEvent(Unit* caster, ObjectGuid const& target, ObjectGuid const& originalCastId, int32 count)
784 : _caster(caster), _target(target), _originalCastId(originalCastId), _count(count) { }
785
786 bool Execute(uint64 time, uint32 /*diff*/) override
787 {
789
790 if (!target)
791 return true;
792
794
795 if (!--_count)
796 return true;
797
798 _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(300ms, 400ms));
799 return false;
800 }
801
802 private:
807 };
808
809 bool Validate(SpellInfo const* /*spellInfo*/) override
810 {
812 }
813
814 void EffectHit(SpellEffIndex /*effIndex*/) const
815 {
816 GetCaster()->m_Events.AddEventAtOffset(new FlurryEvent(GetCaster(), GetHitUnit()->GetGUID(), GetSpell()->m_castId, GetEffectValue() - 1), randtime(300ms, 400ms));
817 }
818
819 void Register() override
820 {
822 }
823};
824
825// 228354 - Flurry (damage)
827{
828 bool Validate(SpellInfo const* /*spellInfo*/) override
829 {
831 }
832
833 void HandleDamage(SpellEffIndex /*effIndex*/) const
834 {
836 }
837
838 void Register() override
839 {
841 }
842};
843
844// 116 - Frostbolt
846{
847 bool Validate(SpellInfo const* /*spell*/) override
848 {
850 }
851
853 {
854 if (Unit* target = GetHitUnit())
856 }
857
858 void Register() override
859 {
861 }
862};
863
864// 386737 - Hyper Impact
866{
867 bool Validate(SpellInfo const* /*spellInfo*/) override
868 {
870 }
871
872 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
873 {
874 eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MAGE_SUPERNOVA, true);
875 }
876
877 void Register() override
878 {
880 }
881};
882
883// 11426 - Ice Barrier
885{
886 bool Validate(SpellInfo const* /*spellInfo*/) override
887 {
888 return ValidateSpellInfo
889 ({
891 });
892 }
893
894 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
895 {
896 canBeRecalculated = false;
897 if (Unit* caster = GetCaster())
898 amount += int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 10.0f);
899 }
900
901 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
902 {
903 Unit* caster = eventInfo.GetDamageInfo()->GetVictim();
904 Unit* target = eventInfo.GetDamageInfo()->GetAttacker();
905
906 if (caster && target)
907 caster->CastSpell(target, SPELL_MAGE_CHILLED, true);
908 }
909
910 void Register() override
911 {
914 }
915};
916
917// 45438 - Ice Block
919{
920 bool Validate(SpellInfo const* /*spellInfo*/) override
921 {
923 }
924
926 {
928 target = nullptr;
929 }
930
932 {
934 target = nullptr;
935 }
936
937 void Register() override
938 {
942 }
943};
944
945// Ice Lance - 30455
947{
948 bool Validate(SpellInfo const* /*spellInfo*/) override
949 {
950 return ValidateSpellInfo
951 ({
958 });
959 }
960
961 void IndexTarget(SpellEffIndex /*effIndex*/)
962 {
963 _orderedTargets.push_back(GetHitUnit()->GetGUID());
964 }
965
966 void HandleOnHit(SpellEffIndex /*effIndex*/)
967 {
968 Unit* caster = GetCaster();
969 Unit* target = GetHitUnit();
970
971 std::ptrdiff_t index = std::distance(_orderedTargets.begin(), std::find(_orderedTargets.begin(), _orderedTargets.end(), target->GetGUID()));
972
973 if (index == 0 // only primary target triggers these benefits
974 && target->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), caster))
975 {
976 // Thermal Void
977 if (Aura const* thermalVoid = caster->GetAura(SPELL_MAGE_THERMAL_VOID))
978 if (!thermalVoid->GetSpellInfo()->GetEffects().empty())
979 if (Aura* icyVeins = caster->GetAura(SPELL_MAGE_ICY_VEINS))
980 icyVeins->SetDuration(icyVeins->GetDuration() + thermalVoid->GetSpellInfo()->GetEffect(EFFECT_0).CalcValue(caster) * IN_MILLISECONDS);
981
982 // Chain Reaction
984 caster->CastSpell(caster, SPELL_MAGE_CHAIN_REACTION, true);
985 }
986
987 // put target index for chain value multiplier into EFFECT_1 base points, otherwise triggered spell doesn't know which damage multiplier to apply
991 caster->CastSpell(target, SPELL_MAGE_ICE_LANCE_TRIGGER, args);
992 }
993
994 void Register() override
995 {
998 }
999
1000 std::vector<ObjectGuid> _orderedTargets;
1001};
1002
1003// 228598 - Ice Lance
1005{
1007 {
1008 SpellValue const* spellValue = GetSpellValue();
1009 if (spellValue->CustomBasePointsMask & (1 << EFFECT_1))
1010 {
1011 int32 originalDamage = GetHitDamage();
1012 float targetIndex = float(spellValue->EffectBasePoints[EFFECT_1]);
1013 float multiplier = std::pow(GetEffectInfo().CalcDamageMultiplier(GetCaster(), GetSpell()), targetIndex);
1014 SetHitDamage(int32(originalDamage * multiplier));
1015 }
1016 }
1017
1018 void Register() override
1019 {
1021 }
1022};
1023
1024// 12846 - Ignite
1026{
1027 bool Validate(SpellInfo const* /*spellInfo*/) override
1028 {
1030 }
1031
1032 bool CheckProc(ProcEventInfo& eventInfo)
1033 {
1034 return eventInfo.GetProcTarget() != nullptr;
1035 }
1036
1037 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
1038 {
1040
1041 SpellInfo const* igniteDot = sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE, GetCastDifficulty());
1042 int32 pct = aurEff->GetAmount();
1043
1044 ASSERT(igniteDot->GetMaxTicks() > 0);
1045 int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks());
1046
1047 CastSpellExtraArgs args(aurEff);
1048 args.AddSpellMod(SPELLVALUE_BASE_POINT0, amount);
1049 GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_IGNITE, args);
1050 }
1051
1052 void Register() override
1053 {
1056 }
1057};
1058
1059// 37447 - Improved Mana Gems
1060// 61062 - Improved Mana Gems
1062{
1063 bool Validate(SpellInfo const* /*spellInfo*/) override
1064 {
1066 }
1067
1068 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1069 {
1071 eventInfo.GetActor()->CastSpell(nullptr, SPELL_MAGE_MANA_SURGE, true);
1072 }
1073
1074 void Register() override
1075 {
1077 }
1078};
1079
1080// 1463 - Incanter's Flow
1082{
1083 bool Validate(SpellInfo const* /*spellInfo*/) override
1084 {
1086 }
1087
1088 void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
1089 {
1090 // Incanter's flow should not cycle out of combat
1091 if (!GetTarget()->IsInCombat())
1092 return;
1093
1095 {
1096 uint32 stacks = aura->GetStackAmount();
1097
1098 // Force always to values between 1 and 5
1099 if ((modifier == -1 && stacks == 1) || (modifier == 1 && stacks == 5))
1100 {
1101 modifier *= -1;
1102 return;
1103 }
1104
1105 aura->ModStackAmount(modifier);
1106 }
1107 else
1109 }
1110
1111 void Register() override
1112 {
1114 }
1115
1116private:
1118};
1119
1120// 44457 - Living Bomb
1122{
1123 bool Validate(SpellInfo const* /*spellInfo*/) override
1124 {
1126 }
1127
1129 {
1130 PreventHitDefaultEffect(effIndex);
1132 }
1133
1134 void Register() override
1135 {
1137 }
1138};
1139
1140// 44461 - Living Bomb
1142{
1143 bool Validate(SpellInfo const* spellInfo) override
1144 {
1146 }
1147
1148 void FilterTargets(std::list<WorldObject*>& targets)
1149 {
1150 targets.remove(GetExplTargetWorldObject());
1151 }
1152
1153 void HandleSpread(SpellEffIndex /*effIndex*/)
1154 {
1155 if (GetSpellValue()->EffectBasePoints[EFFECT_0] > 0)
1157 }
1158
1159 void Register() override
1160 {
1163 }
1164};
1165
1166// 217694 - Living Bomb
1168{
1169 bool Validate(SpellInfo const* /*spellInfo*/) override
1170 {
1172 }
1173
1174 void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1175 {
1176 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1177 return;
1178
1179 if (Unit* caster = GetCaster())
1181 }
1182
1183 void Register() override
1184 {
1186 }
1187};
1188
1190{
1191 NPC_AUROSALIA = 18744
1193
1195// 32826 - Polymorph (Visual)
1197{
1198 static const uint32 PolymorhForms[6];
1199
1200 bool Validate(SpellInfo const* /*spellInfo*/) override
1201 {
1203 }
1204
1205 void HandleDummy(SpellEffIndex /*effIndex*/)
1206 {
1207 if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f))
1208 if (target->GetTypeId() == TYPEID_UNIT)
1209 target->CastSpell(target, PolymorhForms[urand(0, 5)], true);
1210 }
1211
1212 void Register() override
1213 {
1214 // add dummy effect spell handler to Polymorph visual
1216 }
1217};
1218
1220{
1227};
1228
1229// 235450 - Prismatic Barrier
1231{
1232 bool Validate(SpellInfo const* spellInfo) override
1233 {
1234 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_5 } });
1235 }
1236
1237 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
1238 {
1239 canBeRecalculated = false;
1240 if (Unit* caster = GetCaster())
1241 amount = int32(CalculatePct(caster->GetMaxHealth(), GetEffectInfo(EFFECT_5).CalcValue(caster)));
1242 }
1243
1244 void Register() override
1245 {
1247 }
1248};
1249
1250// 376103 - Radiant Spark
1252{
1253 bool Validate(SpellInfo const* /*spellInfo*/) override
1254 {
1256 }
1257
1258 bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
1259 {
1261 }
1262
1263 void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
1264 {
1265 Aura* vulnerability = procInfo.GetProcTarget()->GetAura(aurEff->GetSpellEffectInfo().TriggerSpell, GetCasterGUID());
1266 if (vulnerability && vulnerability->GetStackAmount() == vulnerability->CalcMaxStackAmount())
1267 {
1269 vulnerability->Remove();
1271 }
1272 }
1273
1274 void Register() override
1275 {
1277 }
1278};
1279
1280// 205021 - Ray of Frost
1282{
1283 bool Validate(SpellInfo const* /*spellInfo*/) override
1284 {
1286 }
1287
1289 {
1290 if (Unit* caster = GetCaster())
1292 }
1293
1294 void Register() override
1295 {
1297 }
1298};
1299
1301{
1302 bool Validate(SpellInfo const* /*spellInfo*/) override
1303 {
1305 }
1306
1308 {
1309 if (Unit* caster = GetCaster())
1310 {
1311 if (aurEff->GetTickNumber() > 1) // First tick should deal base damage
1312 caster->CastSpell(caster, SPELL_MAGE_RAY_OF_FROST_BONUS, true);
1313 }
1314 }
1315
1316 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1317 {
1318 if (Unit* caster = GetCaster())
1319 caster->RemoveAurasDueToSpell(SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST);
1320 }
1321
1322 void Register() override
1323 {
1326 }
1327};
1328
1329// 136511 - Ring of Frost
1331{
1332 bool Validate(SpellInfo const* /*spellInfo*/) override
1333 {
1336 }
1337
1338 void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
1339 {
1340 if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
1341 GetTarget()->CastSpell(ringOfFrost->GetPosition(), SPELL_MAGE_RING_OF_FROST_FREEZE, true);
1342 }
1343
1344 void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1345 {
1346 std::list<TempSummon*> minions;
1348
1349 // Get the last summoned RoF, save it and despawn older ones
1350 for (TempSummon* summon : minions)
1351 {
1352 if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
1353 {
1354 if (summon->GetTimer() > ringOfFrost->GetTimer())
1355 {
1356 ringOfFrost->DespawnOrUnsummon();
1357 _ringOfFrostGUID = summon->GetGUID();
1358 }
1359 else
1360 summon->DespawnOrUnsummon();
1361 }
1362 else
1363 _ringOfFrostGUID = summon->GetGUID();
1364 }
1365 }
1366
1367 void Register() override
1368 {
1371 }
1372
1373private:
1375 {
1377 return creature->ToTempSummon();
1378 return nullptr;
1379 }
1380
1382};
1383
1384// 82691 - Ring of Frost (freeze efect)
1386{
1387 bool Validate(SpellInfo const* /*spellInfo*/) override
1388 {
1391 }
1392
1393 void FilterTargets(std::list<WorldObject*>& targets)
1394 {
1395 WorldLocation const* dest = GetExplTargetDest();
1396 float outRadius = sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON, GetCastDifficulty())->GetEffect(EFFECT_0).CalcRadius(nullptr, SpellTargetIndex::TargetB);
1397 float inRadius = 6.5f;
1398
1399 targets.remove_if([dest, outRadius, inRadius](WorldObject* target)
1400 {
1401 Unit* unit = target->ToUnit();
1402 if (!unit)
1403 return true;
1404 return unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || unit->GetExactDist(dest) > outRadius || unit->GetExactDist(dest) < inRadius;
1405 });
1406 }
1407
1408 void Register() override
1409 {
1411 }
1412};
1413
1415{
1416 bool Validate(SpellInfo const* /*spellInfo*/) override
1417 {
1419 }
1420
1421 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1422 {
1423 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1424 if (GetCaster())
1426 }
1427
1428 void Register() override
1429 {
1431 }
1432};
1433
1434// 157980 - Supernova
1436{
1437 void HandleDamage(SpellEffIndex /*effIndex*/)
1438 {
1439 if (GetExplTargetUnit() == GetHitUnit())
1440 {
1441 uint32 damage = GetHitDamage();
1442 AddPct(damage, GetEffectInfo(EFFECT_0).CalcValue());
1443 SetHitDamage(damage);
1444 }
1445 }
1446
1447 void Register() override
1448 {
1450 }
1451};
1452
1453// 210824 - Touch of the Magi (Aura)
1455{
1456 bool Validate(SpellInfo const* /*spellInfo*/) override
1457 {
1459 }
1460
1461 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
1462 {
1463 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
1464 if (damageInfo)
1465 {
1466 if (damageInfo->GetAttacker() == GetCaster() && damageInfo->GetVictim() == GetTarget())
1467 {
1468 uint32 extra = CalculatePct(damageInfo->GetDamage(), 25);
1469 if (extra > 0)
1470 aurEff->ChangeAmount(aurEff->GetAmount() + extra);
1471 }
1472 }
1473 }
1474
1475 void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1476 {
1477 int32 amount = aurEff->GetAmount();
1478 if (!amount || GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1479 return;
1480
1481 if (Unit* caster = GetCaster())
1483 }
1484
1485 void Register() override
1486 {
1489 }
1490};
1491
1492// 33395 Water Elemental's Freeze
1494{
1495 bool Validate(SpellInfo const* /*spellInfo*/) override
1496 {
1498 }
1499
1501 {
1502 Unit* owner = GetCaster()->GetOwner();
1503 if (!owner)
1504 return;
1505
1506 owner->CastSpell(owner, SPELL_MAGE_FINGERS_OF_FROST, true);
1507 }
1508
1509 void Register() override
1510 {
1512 }
1513};
1514
1516{
1562}
@ IN_MILLISECONDS
Definition: Common.h:35
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
@ DIFFICULTY_NONE
Definition: DBCEnums.h:874
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
#define ASSERT
Definition: Errors.h:68
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
float frand(float min, float max)
Definition: Random.cpp:55
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition: Random.cpp:62
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
bool roll_chance_i(int chance)
Definition: Random.h:59
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition: ScriptMgr.h:1371
#define RegisterAreaTriggerAI(ai_name)
Definition: ScriptMgr.h:1416
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_3
Definition: SharedDefines.h:33
@ EFFECT_6
Definition: SharedDefines.h:36
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_5
Definition: SharedDefines.h:35
@ EFFECT_0
Definition: SharedDefines.h:30
@ EFFECT_2
Definition: SharedDefines.h:32
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_CASTER
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_ENERGIZE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ MECHANIC_INTERRUPT
@ MECHANIC_SILENCE
@ POWER_ARCANE_CHARGES
@ AURA_STATE_FROZEN
#define EFFECT_ALL
Definition: SharedDefines.h:72
@ SPELLFAMILY_MAGE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MASTERY
@ SPELL_AURA_CHARGE_RECOVERY_MULTIPLIER
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS
@ SPELL_AURA_MOD_STUN
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
Definition: SpellDefines.h:252
@ SPELLVALUE_BASE_POINT1
Definition: SpellDefines.h:197
@ SPELLVALUE_BASE_POINT2
Definition: SpellDefines.h:198
@ SPELLVALUE_BASE_POINT0
Definition: SpellDefines.h:196
#define sSpellMgr
Definition: SpellMgr.h:849
#define SpellOnCalcCritChanceFn(F)
Definition: SpellScript.h:859
#define SpellObjectTargetSelectFn(F, I, N)
Definition: SpellScript.h:869
#define AuraEffectProcFn(F, I, N)
Definition: SpellScript.h:2160
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define AuraEffectCalcAmountFn(F, I, N)
Definition: SpellScript.h:2058
#define SpellObjectAreaTargetSelectFn(F, I, N)
Definition: SpellScript.h:864
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define AuraEffectCalcCritChanceFn(F, I, N)
Definition: SpellScript.h:2076
#define AuraCheckEffectProcFn(F, I, N)
Definition: SpellScript.h:2136
#define SpellCastFn(F)
Definition: SpellScript.h:825
#define AuraEffectAbsorbFn(F, I)
Definition: SpellScript.h:2090
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
#define AuraCheckProcFn(F)
Definition: SpellScript.h:2130
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
float GetPctOf(T value, T max)
Definition: Util.h:78
T AddPct(T &base, U pct)
Definition: Util.h:85
T ApplyPct(T &base, U pct)
Definition: Util.h:91
T CalculatePct(T base, U pct)
Definition: Util.h:72
AreaTrigger *const at
Definition: AreaTriggerAI.h:33
Unit * GetCaster() const
uint32 GetTickNumber() const
SpellEffectInfo const & GetSpellEffectInfo() const
void ChangeAmount(int32 newAmount, bool mark=true, bool onStackOrReapply=false, AuraEffect const *triggeredBy=nullptr)
int32 GetAmount() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< CheckEffectProcHandler > DoCheckEffectProc
Definition: SpellScript.h:2135
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
SpellInfo const * GetSpellInfo() const
WorldObject * GetOwner() const
HookList< EffectProcHandler > AfterEffectProc
Definition: SpellScript.h:2159
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
Definition: SpellScript.h:2057
Unit * GetCaster() const
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
AuraEffect * GetEffect(uint8 effIndex) const
HookList< EffectAbsorbHandler > OnEffectAbsorb
Definition: SpellScript.h:2089
HookList< EffectCalcCritChanceHandler > DoEffectCalcCritChance
Definition: SpellScript.h:2075
Aura * GetAura() const
Unit * GetTarget() const
ObjectGuid GetCasterGUID() const
Difficulty GetCastDifficulty() const
HookList< CheckProcHandler > DoCheckProc
Definition: SpellScript.h:2129
HookList< EffectProcHandler > OnEffectProc
Definition: SpellScript.h:2155
bool HasEffect(uint8 effIndex) const
HookList< EffectApplyHandler > OnEffectApply
Definition: SpellScript.h:2024
uint32 CalcMaxStackAmount() const
uint8 GetStackAmount() const
Definition: SpellAuras.h:189
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
ObjectGuid _originalCastId
Definition: spell_mage.cpp:477
bool Execute(uint64 time, uint32) override
Definition: spell_mage.cpp:461
CometStormEvent(Unit *caster, ObjectGuid originalCastId, Position const &dest)
Definition: spell_mage.cpp:459
Unit * GetVictim() const
Definition: Unit.h:441
Unit * GetAttacker() const
Definition: Unit.h:440
uint32 GetDamage() const
Definition: Unit.h:446
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
Definition: Group.h:197
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
static Unit * ToUnit(Object *o)
Definition: Object.h:225
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Unit * GetActionTarget() const
Definition: Unit.h:494
Spell const * GetProcSpell() const
Definition: Unit.h:508
SpellInfo const * GetSpellInfo() const
Definition: Unit.cpp:280
DamageInfo * GetDamageInfo() const
Definition: Unit.h:505
Unit * GetProcTarget() const
Definition: Unit.h:495
Unit * GetActor() const
Definition: Unit.h:493
SpellDestination const * GetDst() const
Definition: Spell.cpp:363
uint32 TriggerSpell
Definition: SpellInfo.h:237
bool IsEffect() const
Definition: SpellInfo.cpp:451
void ResetCooldown(uint32 spellId, bool update=false)
void RestoreCharge(uint32 chargeCategoryId)
void ResetCharges(uint32 chargeCategoryId)
void ModifyCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown=false)
uint32 GetMaxTicks() const
Definition: SpellInfo.cpp:3823
bool IsAffected(uint32 familyName, flag128 const &familyFlags) const
Definition: SpellInfo.cpp:1795
uint32 const Id
Definition: SpellInfo.h:325
uint32 ChargeCategoryId
Definition: SpellInfo.h:414
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:577
bool NeedsExplicitUnitTarget() const
Definition: SpellInfo.cpp:1551
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Definition: SpellScript.h:173
HookList< CastHandler > AfterCast
Definition: SpellScript.h:824
WorldLocation * GetHitDest() const
int32 GetHitDamage() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:852
HookList< HitHandler > OnHit
Definition: SpellScript.h:850
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
void PreventHitDefaultEffect(SpellEffIndex effIndex)
int64 GetUnitTargetCountForEffect(SpellEffIndex effect) const
Unit * GetHitUnit() const
SpellValue const * GetSpellValue() const
int32 GetEffectValue() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
Definition: SpellScript.h:868
Spell * GetSpell() const
Definition: SpellScript.h:987
WorldObject * GetExplTargetWorldObject() const
HookList< EffectHandler > OnEffectLaunchTarget
Definition: SpellScript.h:838
Difficulty GetCastDifficulty() const
void SetHitDamage(int32 damage)
HookList< OnCalcCritChanceHandler > OnCalcCritChance
Definition: SpellScript.h:858
WorldLocation const * GetExplTargetDest() const
HookList< EffectHandler > OnEffectLaunch
Definition: SpellScript.h:837
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
SpellCastTargets m_targets
Definition: Spell.h:607
Definition: Unit.h:627
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition: Unit.cpp:8280
float GetHealthPct() const
Definition: Unit.h:784
void SetHealth(uint64 val)
Definition: Unit.cpp:9346
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3685
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition: Unit.cpp:4464
int32 GetMaxPower(Powers power) const
Definition: Unit.cpp:9410
TempSummon * ToTempSummon()
Definition: Unit.h:1756
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
uint64 GetHealth() const
Definition: Unit.h:776
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:5961
void NearTeleportTo(Position const &pos, bool casting=false)
Definition: Unit.cpp:12327
void GetAllMinionsByEntry(std::list< TempSummon * > &Minions, uint32 entry)
Definition: Unit.cpp:6235
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
SpellHistory * GetSpellHistory()
Definition: Unit.h:1457
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
Unit * GetOwner() const
Definition: Object.cpp:2229
bool IsInBetween(Position const &pos1, Position const &pos2, float size=0) const
Definition: Object.cpp:1304
EventProcessor m_Events
Definition: Object.h:777
float GetDistance(WorldObject const *obj) const
Definition: Object.cpp:1078
virtual float GetCombatReach() const
Definition: Object.h:514
void RemoveAlterTimeAura(SpellEffIndex)
Definition: spell_mage.cpp:163
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:154
void OnApply(AuraEffect const *, AuraEffectHandleModes)
Definition: spell_mage.cpp:115
void Register() override
Definition: spell_mage.cpp:139
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
Definition: spell_mage.cpp:122
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:105
bool Validate(SpellInfo const *spellInfo) override
Definition: spell_mage.cpp:179
void Register() override
Definition: spell_mage.cpp:206
void HandleEffectHitTarget(SpellEffIndex)
Definition: spell_mage.cpp:195
void MarkPrimaryTarget(SpellEffIndex)
Definition: spell_mage.cpp:201
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:219
void RemoveArcaneCharge(SpellEffIndex)
Definition: spell_mage.cpp:224
void CheckRequiredAuraForBaselineEnergize(SpellEffIndex effIndex)
Definition: spell_mage.cpp:249
bool Validate(SpellInfo const *spellInfo) override
Definition: spell_mage.cpp:238
void HandleReverberate(SpellEffIndex effIndex)
Definition: spell_mage.cpp:255
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:285
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
Definition: spell_mage.cpp:297
void Register() override
Definition: spell_mage.cpp:307
void CalculateAmount(AuraEffect const *, int32 &amount, bool &canBeRecalculated)
Definition: spell_mage.cpp:290
void Register() override
Definition: spell_mage.cpp:352
void HandleSlow(SpellEffIndex)
Definition: spell_mage.cpp:347
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:342
bool CheckProc(ProcEventInfo &eventInfo)
Definition: spell_mage.cpp:361
bool Validate(SpellInfo const *spellInfo) override
Definition: spell_mage.cpp:392
void HandleAbsorb(AuraEffect *, DamageInfo &dmgInfo, uint32 &)
Definition: spell_mage.cpp:402
void Register() override
Definition: spell_mage.cpp:384
void SuppressSpeedBuff(SpellEffIndex effIndex)
Definition: spell_mage.cpp:379
static uint32 constexpr SpellsToReset[]
Definition: spell_mage.cpp:430
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:437
void HandleDummy(SpellEffIndex)
Definition: spell_mage.cpp:442
void Register() override
Definition: spell_mage.cpp:450
void HandleEffectHitTarget(SpellEffIndex)
Definition: spell_mage.cpp:509
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:504
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:485
void EffectHit(SpellEffIndex)
Definition: spell_mage.cpp:490
void Register() override
Definition: spell_mage.cpp:495
void HandleSlow(SpellEffIndex)
Definition: spell_mage.cpp:529
void Register() override
Definition: spell_mage.cpp:534
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:524
void HandleDummy(SpellEffIndex)
Definition: spell_mage.cpp:552
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:543
void Register() override
Definition: spell_mage.cpp:672
void CalcAmount(AuraEffect const *, int32 &amount, bool &canBeRecalculated)
Definition: spell_mage.cpp:663
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:658
void Trigger(AuraEffect *aurEff, ProcEventInfo &eventInfo)
Definition: spell_mage.cpp:698
bool CheckFrozenOrbProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
Definition: spell_mage.cpp:692
bool CheckFrostboltProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
Definition: spell_mage.cpp:686
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:681
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:737
void CalcCritChance(AuraEffect const *, Unit const *victim, float &critChance)
Definition: spell_mage.cpp:742
void CalcCritChance(Unit const *victim, float &critChance)
Definition: spell_mage.cpp:721
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:716
void Register() override
Definition: spell_mage.cpp:728
void CalculateAmount(AuraEffect const *, int32 &amount, bool &canBeRecalculated)
Definition: spell_mage.cpp:765
bool Validate(SpellInfo const *spellInfo) override
Definition: spell_mage.cpp:758
void Register() override
Definition: spell_mage.cpp:771
bool Execute(uint64 time, uint32) override
Definition: spell_mage.cpp:786
FlurryEvent(Unit *caster, ObjectGuid const &target, ObjectGuid const &originalCastId, int32 count)
Definition: spell_mage.cpp:783
void Register() override
Definition: spell_mage.cpp:838
void HandleDamage(SpellEffIndex) const
Definition: spell_mage.cpp:833
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:828
void EffectHit(SpellEffIndex) const
Definition: spell_mage.cpp:814
void Register() override
Definition: spell_mage.cpp:819
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:809
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:847
void Register() override
Definition: spell_mage.cpp:858
void Register() override
Definition: spell_mage.cpp:877
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:867
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
Definition: spell_mage.cpp:872
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:886
void Register() override
Definition: spell_mage.cpp:910
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
Definition: spell_mage.cpp:901
void CalculateAmount(AuraEffect const *, int32 &amount, bool &canBeRecalculated)
Definition: spell_mage.cpp:894
void PreventEverwarmSocks(WorldObject *&target)
Definition: spell_mage.cpp:931
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:920
void Register() override
Definition: spell_mage.cpp:937
void PreventStunWithEverwarmSocks(WorldObject *&target)
Definition: spell_mage.cpp:925
void ApplyDamageMultiplier(SpellEffIndex)
void Register() override
Definition: spell_mage.cpp:994
void IndexTarget(SpellEffIndex)
Definition: spell_mage.cpp:961
bool Validate(SpellInfo const *) override
Definition: spell_mage.cpp:948
void HandleOnHit(SpellEffIndex)
Definition: spell_mage.cpp:966
std::vector< ObjectGuid > _orderedTargets
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool CheckProc(ProcEventInfo &eventInfo)
void Register() override
bool Validate(SpellInfo const *) override
void Register() override
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void Register() override
void HandlePeriodicTick(AuraEffect const *)
void HandleSpread(SpellEffIndex)
bool Validate(SpellInfo const *spellInfo) override
void FilterTargets(std::list< WorldObject * > &targets)
void AfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void Register() override
void HandleDummy(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
static const uint32 PolymorhForms[6]
void HandleDummy(SpellEffIndex)
bool Validate(SpellInfo const *spellInfo) override
void CalculateAmount(AuraEffect const *, int32 &amount, bool &canBeRecalculated)
bool CheckProc(AuraEffect const *, ProcEventInfo &procInfo)
bool Validate(SpellInfo const *) override
void Register() override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &procInfo)
void HandleEffectPeriodic(AuraEffect const *aurEff)
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void Register() override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets)
void Apply(AuraEffect const *, AuraEffectHandleModes)
void HandleEffectPeriodic(AuraEffect const *)
bool Validate(SpellInfo const *) override
TempSummon * GetRingOfFrostMinion() const
void Register() override
void HandleDamage(SpellEffIndex)
void Register() override
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
void AfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
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)
void AddSC_mage_spell_scripts()
@ SPELL_MAGE_CAUTERIZED
Definition: spell_mage.cpp:51
@ SPELL_MAGE_RADIANT_SPARK_PROC_BLOCKER
Definition: spell_mage.cpp:77
@ SPELL_MAGE_SUPERNOVA
Definition: spell_mage.cpp:89
@ SPELL_MAGE_FIRE_BLAST
Definition: spell_mage.cpp:64
@ SPELL_MAGE_ICE_BLOCK
Definition: spell_mage.cpp:70
@ SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE
Definition: spell_mage.cpp:97
@ SPELL_MAGE_MANA_SURGE
Definition: spell_mage.cpp:75
@ SPELL_MAGE_ARCANE_CHARGE
Definition: spell_mage.cpp:44
@ SPELL_MAGE_CONJURE_REFRESHMENT
Definition: spell_mage.cpp:57
@ SPELL_MAGE_WORGEN_FORM
Definition: spell_mage.cpp:90
@ SPELL_MAGE_ALTER_TIME_AURA
Definition: spell_mage.cpp:39
@ SPELL_MAGE_ICY_VEINS
Definition: spell_mage.cpp:94
@ SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE
Definition: spell_mage.cpp:42
@ SPELL_MAGE_BLAZING_BARRIER_TRIGGER
Definition: spell_mage.cpp:46
@ SPELL_MAGE_WINTERS_CHILL
Definition: spell_mage.cpp:98
@ SPELL_MAGE_ETHEREAL_BLINK
Definition: spell_mage.cpp:60
@ SPELL_MAGE_CONJURE_REFRESHMENT_TABLE
Definition: spell_mage.cpp:58
@ SPELL_MAGE_RAY_OF_FROST_BONUS
Definition: spell_mage.cpp:78
@ SPELL_MAGE_LIVING_BOMB_PERIODIC
Definition: spell_mage.cpp:74
@ SPELL_MAGE_RING_OF_FROST_SUMMON
Definition: spell_mage.cpp:83
@ SPELL_MAGE_ARCANE_ALTER_TIME_AURA
Definition: spell_mage.cpp:41
@ SPELL_MAGE_COMET_STORM_DAMAGE
Definition: spell_mage.cpp:53
@ SPELL_PET_NETHERWINDS_FATIGUED
Definition: spell_mage.cpp:91
@ SPELL_MAGE_REVERBERATE
Definition: spell_mage.cpp:80
@ SPELL_MAGE_MASTER_OF_TIME
Definition: spell_mage.cpp:76
@ SPELL_MAGE_IGNITE
Definition: spell_mage.cpp:71
@ SPELL_MAGE_SHIMMER
Definition: spell_mage.cpp:86
@ SPELL_MAGE_COMET_STORM_VISUAL
Definition: spell_mage.cpp:54
@ SPELL_MAGE_INCANTERS_FLOW
Definition: spell_mage.cpp:72
@ SPELL_MAGE_GIRAFFE_FORM
Definition: spell_mage.cpp:68
@ SPELL_MAGE_CONE_OF_COLD_SLOW
Definition: spell_mage.cpp:56
@ SPELL_MAGE_FINGERS_OF_FROST
Definition: spell_mage.cpp:63
@ SPELL_MAGE_BLINK
Definition: spell_mage.cpp:47
@ SPELL_MAGE_BLIZZARD_DAMAGE
Definition: spell_mage.cpp:48
@ SPELL_MAGE_FLURRY_DAMAGE
Definition: spell_mage.cpp:65
@ SPELL_MAGE_ALTER_TIME_VISUAL
Definition: spell_mage.cpp:40
@ SPELL_MAGE_SLOW
Definition: spell_mage.cpp:87
@ SPELL_MAGE_DRAGONHAWK_FORM
Definition: spell_mage.cpp:59
@ SPELL_MAGE_RING_OF_FROST_FREEZE
Definition: spell_mage.cpp:82
@ SPELL_MAGE_ICE_LANCE_TRIGGER
Definition: spell_mage.cpp:92
@ SPELL_MAGE_SQUIRREL_FORM
Definition: spell_mage.cpp:88
@ SPELL_MAGE_LIVING_BOMB_EXPLOSION
Definition: spell_mage.cpp:73
@ SPELL_MAGE_CONE_OF_COLD
Definition: spell_mage.cpp:55
@ SPELL_MAGE_EVERWARM_SOCKS
Definition: spell_mage.cpp:61
@ SPELL_MAGE_ARCANE_MAGE
Definition: spell_mage.cpp:45
@ SPELL_MAGE_CHAIN_REACTION
Definition: spell_mage.cpp:96
@ SPELL_MAGE_ICE_BARRIER
Definition: spell_mage.cpp:69
@ SPELL_MAGE_FEEL_THE_BURN
Definition: spell_mage.cpp:62
@ SPELL_MAGE_FIRESTARTER
Definition: spell_mage.cpp:66
@ SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST
Definition: spell_mage.cpp:79
@ SPELL_MAGE_SERPENT_FORM
Definition: spell_mage.cpp:84
@ SPELL_MAGE_BLIZZARD_SLOW
Definition: spell_mage.cpp:49
@ SPELL_MAGE_CHILLED
Definition: spell_mage.cpp:52
@ SPELL_MAGE_CAUTERIZE_DOT
Definition: spell_mage.cpp:50
@ SPELL_MAGE_THERMAL_VOID
Definition: spell_mage.cpp:93
@ SPELL_MAGE_FROST_NOVA
Definition: spell_mage.cpp:67
@ SPELL_MAGE_ARCANE_BARRAGE_R3
Definition: spell_mage.cpp:43
@ SPELL_MAGE_SHEEP_FORM
Definition: spell_mage.cpp:85
@ SPELL_MAGE_RING_OF_FROST_DUMMY
Definition: spell_mage.cpp:81
@ SPELL_MAGE_CHAIN_REACTION_DUMMY
Definition: spell_mage.cpp:95
SilvermoonPolymorph
@ NPC_AUROSALIA
TriggerCastFlags TriggerFlags
Definition: SpellDefines.h:478
CastSpellExtraArgs & SetCustomArg(std::any customArg)
Definition: SpellDefines.h:476
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
Definition: SpellDefines.h:474
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
float GetExactDist(float x, float y, float z) const
Definition: Position.h:118
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
constexpr float GetPositionZ() const
Definition: Position.h:78
int32 EffectBasePoints[MAX_SPELL_EFFECTS]
Definition: Spell.h:220
uint32 CustomBasePointsMask
Definition: Spell.h:221
void OnUpdate(uint32 diff) override
Definition: spell_mage.cpp:322
static constexpr Milliseconds TICK_PERIOD
Definition: spell_mage.cpp:320
areatrigger_mage_blizzard(AreaTrigger *areatrigger)
Definition: spell_mage.cpp:318