TrinityCore
Loading...
Searching...
No Matches
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 "TaskScheduler.h"
36#include "TemporarySummon.h"
37
39{
128
129// 110909 - Alter Time Aura
130// 342246 - Alter Time Aura
132{
133 bool Validate(SpellInfo const* /*spellInfo*/) override
134 {
135 return ValidateSpellInfo
136 ({
140 });
141 }
142
143 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
144 {
145 Unit* unit = GetTarget();
146 _health = unit->GetHealth();
147 _pos = unit->GetPosition();
148 }
149
150 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
151 {
152 Unit* unit = GetTarget();
153 if (unit->GetDistance(_pos) <= 100.0f && GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE)
154 {
155 unit->SetHealth(_health);
156 unit->NearTeleportTo(_pos);
157
159 {
160 SpellInfo const* blink = sSpellMgr->AssertSpellInfo(SPELL_MAGE_BLINK, DIFFICULTY_NONE);
162 }
164 }
165 }
166
172
173private:
176};
177
178// 127140 - Alter Time Active
179// 342247 - Alter Time Active
203
204// 44425 - Arcane Barrage
206{
207 bool Validate(SpellInfo const* spellInfo) override
208 {
210 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
211 }
212
214 {
215 Unit* caster = GetCaster();
216
217 // Consume all arcane charges
218 if (int32 arcaneCharges = -caster->ModifyPower(POWER_ARCANE_CHARGES, -caster->GetMaxPower(POWER_ARCANE_CHARGES), false))
219 if (AuraEffect const* auraEffect = caster->GetAuraEffect(SPELL_MAGE_ARCANE_BARRAGE_R3, EFFECT_0, caster->GetGUID()))
220 caster->CastSpell(caster, SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE, { SPELLVALUE_BASE_POINT0, arcaneCharges * auraEffect->GetAmount() / 100 });
221 }
222
224 {
225 if (GetHitUnit()->GetGUID() != _primaryTarget)
227 }
228
230 {
232 }
233
240
242};
243
244// 195302 - Arcane Charge
262
263// 1449 - Arcane Explosion
265{
266 bool Validate(SpellInfo const* spellInfo) override
267 {
269 return false;
270
271 if (!ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }))
272 return false;
273
275 }
276
282
284 {
285 bool procTriggered = [&]()
286 {
287 Unit const* caster = GetCaster();
288 AuraEffect const* triggerChance = caster->GetAuraEffect(SPELL_MAGE_REVERBERATE, EFFECT_0);
289 if (!triggerChance)
290 return false;
291
292 AuraEffect const* requiredTargets = caster->GetAuraEffect(SPELL_MAGE_REVERBERATE, EFFECT_1);
293 if (!requiredTargets)
294 return false;
295
296 return GetUnitTargetCountForEffect(EFFECT_1) >= requiredTargets->GetAmount() && roll_chance(triggerChance->GetAmount());
297 }();
298
299 if (!procTriggered)
300 PreventHitDefaultEffect(effIndex);
301 }
302
308};
309
310// 235313 - Blazing Barrier
312{
313 bool Validate(SpellInfo const* /*spellInfo*/) override
314 {
316 }
317
318 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
319 {
320 canBeRecalculated = false;
321 if (Unit* caster = GetCaster())
322 amount = caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f;
323 }
324
325 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
326 {
328 Unit* caster = eventInfo.GetDamageInfo()->GetVictim();
329 Unit* target = eventInfo.GetDamageInfo()->GetAttacker();
330
331 if (caster && target)
332 caster->CastSpell(target, SPELL_MAGE_BLAZING_BARRIER_TRIGGER, true);
333 }
334
340};
341
342// 190356 - Blizzard
343// 4658 - AreaTrigger Create Properties
345{
347
348 static constexpr Milliseconds TICK_PERIOD = Milliseconds(1000);
349
350 void OnUpdate(uint32 diff) override
351 {
352 _tickTimer -= Milliseconds(diff);
353
354 while (_tickTimer <= 0s)
355 {
356 if (Unit* caster = at->GetCaster())
357 caster->CastSpell(at->GetPosition(), SPELL_MAGE_BLIZZARD_DAMAGE);
358
360 }
361 }
362
363private:
365};
366
367// 190357 - Blizzard (Damage)
385
386// 198063 - Burning Determination
388{
389 bool CheckProc(ProcEventInfo& eventInfo)
390 {
391 if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo())
392 if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE)))
393 return true;
394
395 return false;
396 }
397
402};
403
404// 86949 - Cauterize
417
419{
420 bool Validate(SpellInfo const* spellInfo) override
421 {
422 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } }) && ValidateSpellInfo
423 ({
426 spellInfo->GetEffect(EFFECT_2).TriggerSpell
427 });
428 }
429
430 void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& /*absorbAmount*/)
431 {
432 AuraEffect const* effect1 = GetEffect(EFFECT_1);
433 if (!effect1 ||
435 dmgInfo.GetDamage() < GetTarget()->GetHealth() ||
436 dmgInfo.GetDamage() > GetTarget()->GetMaxHealth() * 2 ||
438 {
440 return;
441 }
442
443 GetTarget()->SetHealth(GetTarget()->CountPctFromMaxHealth(effect1->GetAmount()));
447 }
448
453};
454
455// 235219 - Cold Snap
457{
464
465 bool Validate(SpellInfo const* /*spellInfo*/) override
466 {
468 }
469
470 void HandleDummy(SpellEffIndex /*effIndex*/)
471 {
472 for (uint32 spellId : SpellsToReset)
473 GetCaster()->GetSpellHistory()->ResetCooldown(spellId, true);
474
475 GetCaster()->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FROST_NOVA, GetCastDifficulty())->ChargeCategoryId);
476 }
477
482};
483
485{
486public:
487 CometStormEvent(Unit* caster, ObjectGuid originalCastId, Position const& dest) : _caster(caster), _originalCastId(originalCastId), _dest(dest), _count(0) { }
488
489 bool Execute(uint64 time, uint32 /*diff*/) override
490 {
491 Position destPosition = {_dest.GetPositionX() + frand(-3.0f, 3.0f), _dest.GetPositionY() + frand(-3.0f, 3.0f), _dest.GetPositionZ()};
494 ++_count;
495
496 if (_count >= 7)
497 return true;
498
499 _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(100ms, 275ms));
500 return false;
501 }
502
503private:
508};
509
510// 153595 - Comet Storm (launch)
512{
513 bool Validate(SpellInfo const* /*spellInfo*/) override
514 {
516 }
517
518 void EffectHit(SpellEffIndex /*effIndex*/)
519 {
520 GetCaster()->m_Events.AddEventAtOffset(new CometStormEvent(GetCaster(), GetSpell()->m_castId, *GetHitDest()), randtime(100ms, 275ms));
521 }
522
527};
528
529// 228601 - Comet Storm (damage)
548
549// 120 - Cone of Cold
551{
552 bool Validate(SpellInfo const* /*spellInfo*/) override
553 {
555 }
556
557 void HandleSlow(SpellEffIndex /*effIndex*/)
558 {
560 }
561
566};
567
568// 190336 - Conjure Refreshment
570{
571 bool Validate(SpellInfo const* /*spellInfo*/) override
572 {
573 return ValidateSpellInfo
574 ({
577 });
578 }
579
580 void HandleDummy(SpellEffIndex /*effIndex*/)
581 {
582 if (Player* caster = GetCaster()->ToPlayer())
583 {
584 Group* group = caster->GetGroup();
585 if (group)
586 caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE, true);
587 else
588 caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT, true);
589 }
590 }
591
596};
597
598// 410939 - Ethereal Blink
600{
601 bool Validate(SpellInfo const* /*spellInfo*/) override
602 {
604 }
605
606 void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
607 {
609
610 // this proc only works for players because teleport relocation happens after an ACK
612 .SetTriggeringSpell(procInfo.GetProcSpell())
613 .SetCustomArg(GetTarget()->GetPosition()));
614 }
615
620};
621
622// 410941 - Ethereal Blink
624{
625 bool Validate(SpellInfo const* /*spellInfo*/) override
626 {
629 }
630
631 void FilterTargets(std::list<WorldObject*>& targets)
632 {
633 Position const* src = std::any_cast<Position>(&GetSpell()->m_customArg);
634 WorldLocation const* dst = GetExplTargetDest();
635 if (!src || !dst)
636 {
637 targets.clear();
638 return;
639 }
640
641 targets.remove_if([&](WorldObject* target)
642 {
643 return !target->IsInBetween(*src, *dst, (target->GetCombatReach() + GetCaster()->GetCombatReach()) / 2.0f);
644 });
645
647 if (!reductionEffect)
648 return;
649
650 FloatSeconds reduction = FloatSeconds(reductionEffect->GetAmount()) * targets.size();
651
652 if (AuraEffect const* cap = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_3))
653 if (reduction > FloatSeconds(cap->GetAmount()))
654 reduction = FloatSeconds(cap->GetAmount());
655
656 if (reduction > 0s)
657 {
658 GetCaster()->GetSpellHistory()->ModifyCooldown(SPELL_MAGE_BLINK, -duration_cast<SpellHistory::Duration>(reduction));
659 GetCaster()->GetSpellHistory()->ModifyCooldown(SPELL_MAGE_SHIMMER, -duration_cast<SpellHistory::Duration>(reduction));
660 }
661 }
662
663 void TriggerSlow(SpellEffIndex /*effIndex*/)
664 {
665 SpellEffectValue effectivenessPct = 100;
666 if (AuraEffect const* effectivenessEffect = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_1))
667 effectivenessPct = effectivenessEffect->GetAmount();
668
669 SpellEffectValue slowPct = sSpellMgr->AssertSpellInfo(SPELL_MAGE_SLOW, DIFFICULTY_NONE)->GetEffect(EFFECT_0).CalcBaseValue(GetCaster(), GetHitUnit(), 0, -1);
670 ApplyPct(slowPct, effectivenessPct);
671
673 .AddSpellMod(SPELLVALUE_BASE_POINT0, slowPct));
674 }
675
681};
682
683// 383395 - Feel the Burn
685{
686 bool Validate(SpellInfo const* /*spellInfo*/) override
687 {
689 }
690
691 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
692 {
693 if (Unit* caster = GetCaster())
694 if (AuraEffect const* valueHolder = caster->GetAuraEffect(SPELL_MAGE_FEEL_THE_BURN, EFFECT_0))
695 amount = valueHolder->GetAmount();
696
697 canBeRecalculated = false;
698 }
699
704};
705
706// 383637 - Fiery Rush (attached to 190319 - Combustion)
724
725// 112965 - Fingers of Frost
758
759// 133 - Fireball
760// 11366 - Pyroblast
762{
763 bool Validate(SpellInfo const* /*spellInfo*/) override
764 {
766 }
767
768 void CalcCritChance(Unit const* victim, float& critChance)
769 {
770 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
771 if (victim->GetHealthPct() >= aurEff->GetAmount())
772 critChance = 100.0f;
773 }
774
779};
780
781// 321712 - Pyroblast
783{
784 bool Validate(SpellInfo const* /*spellInfo*/) override
785 {
787 }
788
789 void CalcCritChance(AuraEffect const* /*aurEff*/, Unit const* victim, float& critChance)
790 {
791 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
792 if (victim->GetHealthPct() >= aurEff->GetAmount())
793 critChance = 100.0f;
794 }
795
800};
801
802// 108853 - Fire Blast
804{
805 void CalcCritChance(Unit const* /*victim*/, float& critChance)
806 {
807 critChance = 100.0f;
808 }
809
814};
815
816// 453282 - Flame Accelerant
835
836// 205029 - Flame On
838{
839 bool Validate(SpellInfo const* spellInfo) override
840 {
842 && sSpellCategoryStore.HasRecord(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)
843 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
844 }
845
846 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
847 {
848 canBeRecalculated = false;
849 amount = -GetPctOf<SpellEffectValue>(GetEffectInfo(EFFECT_2).CalcValue() * int32(IN_MILLISECONDS), sSpellCategoryStore.AssertEntry(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)->ChargeRecoveryTime);
850 }
851
856};
857
858// 205037 - Flame Patch (attached to 2120 - Flamestrike)
884
885// 205470 - Flame Patch
886// Id - 6122
888{
890
891 void OnCreate(Spell const* /*creatingSpell*/) override
892 {
893 _scheduler.Schedule(1s, [this](TaskContext& task)
894 {
895 if (Unit* caster = at->GetCaster())
897 task.Repeat(1s);
898 });
899 }
900
901 void OnUpdate(uint32 diff) override
902 {
903 _scheduler.Update(diff);
904 }
905
906private:
908};
909
910// 44614 - Flurry
912{
913 class FlurryEvent : public BasicEvent
914 {
915 public:
916 FlurryEvent(Unit* caster, ObjectGuid const& target, ObjectGuid const& originalCastId, int32 count)
917 : _caster(caster), _target(target), _originalCastId(originalCastId), _count(count) { }
918
919 bool Execute(uint64 time, uint32 /*diff*/) override
920 {
922
923 if (!target)
924 return true;
925
927
928 if (!--_count)
929 return true;
930
931 _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(300ms, 400ms));
932 return false;
933 }
934
935 private:
940 };
941
942 bool Validate(SpellInfo const* /*spellInfo*/) override
943 {
945 }
946
947 void EffectHit(SpellEffIndex /*effIndex*/) const
948 {
949 GetCaster()->m_Events.AddEventAtOffset(new FlurryEvent(GetCaster(), GetHitUnit()->GetGUID(), GetSpell()->m_castId, GetEffectValueAsInt() - 1), randtime(300ms, 400ms));
950 }
951
956};
957
958// 228354 - Flurry (damage)
960{
961 bool Validate(SpellInfo const* /*spellInfo*/) override
962 {
964 }
965
966 void HandleDamage(SpellEffIndex /*effIndex*/) const
967 {
969 }
970
975};
976
977// 116 - Frostbolt
979{
980 bool Validate(SpellInfo const* /*spell*/) override
981 {
983 }
984
990
991 void Register() override
992 {
994 }
995};
996
997// 457735 - Heat Shimmer
999{
1000 bool Validate(SpellInfo const* /*spell*/) override
1001 {
1003 }
1004
1005 static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
1006 {
1007 eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_MAGE_HEAT_SHIMMER);
1008 }
1009
1014};
1015
1016// 2948 - Scorch
1018{
1019 bool Validate(SpellInfo const* /*spell*/) override
1020 {
1022 }
1023
1028
1033};
1034
1035// 44448 - Pyroblast Clearcasting Driver
1037{
1038 bool Validate(SpellInfo const* /*spellInfo*/) override
1039 {
1040 return ValidateSpellInfo
1041 ({
1047 });
1048 }
1049
1050 bool CheckProc(ProcEventInfo const& procEvent) const
1051 {
1052 Unit const* caster = GetTarget();
1053 switch (procEvent.GetSpellInfo()->Id)
1054 {
1056 // talent requirement
1058 return false;
1059 break;
1061 // primary target only
1062 if (procEvent.GetActionTarget()->GetGUID() != procEvent.GetProcSpell()->m_targets.GetObjectTargetGUID())
1063 return false;
1064 break;
1065 default:
1066 break;
1067 }
1068
1069 return true;
1070 }
1071
1072 void HandleProc(ProcEventInfo const& eventInfo) const
1073 {
1074 Unit* caster = GetTarget();
1075
1076 if (eventInfo.GetHitMask() & PROC_HIT_CRITICAL)
1077 {
1078 CastSpellExtraArgs args;
1080
1081 if (!caster->HasAura(SPELL_MAGE_HEATING_UP))
1082 caster->CastSpell(caster, SPELL_MAGE_HEATING_UP, args);
1083 else
1084 {
1086 caster->CastSpell(caster, SPELL_MAGE_HOT_STREAK, args);
1087 }
1088 }
1089 else
1091 }
1092
1098};
1099
1100// 48108 - Hot Streak! (attached to 11366 - Pyroblast and 2120 - Flamestrike)
1102{
1103 bool Validate(SpellInfo const* /*spell*/) override
1104 {
1106 }
1107
1108 int32 CalcCastTime(int32 castTime) override
1109 {
1111 return castTime;
1112 }
1113
1114 void Register() override
1115 {
1116 }
1117
1119
1120public:
1121 static bool IsActive(Spell const* spell)
1122 {
1123 if (spell)
1125 return script->_affectedByHotStreak;
1126 return false;
1127 }
1128};
1129
1130// 386737 - Hyper Impact
1132{
1133 bool Validate(SpellInfo const* /*spellInfo*/) override
1134 {
1136 }
1137
1138 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1139 {
1140 eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MAGE_SUPERNOVA, true);
1141 }
1142
1147};
1148
1149// 11426 - Ice Barrier
1151{
1152 bool Validate(SpellInfo const* /*spellInfo*/) override
1153 {
1154 return ValidateSpellInfo
1155 ({
1157 });
1158 }
1159
1160 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated) const
1161 {
1162 canBeRecalculated = false;
1163 amount = CalculatePct(GetUnitOwner()->GetMaxHealth(), GetEffectInfo(EFFECT_1).CalcValue());
1164 if (Player const* player = GetUnitOwner()->ToPlayer())
1165 AddPct(amount, player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) + player->GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY));
1166 }
1167
1168 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1169 {
1170 Unit* caster = eventInfo.GetDamageInfo()->GetVictim();
1171 Unit* target = eventInfo.GetDamageInfo()->GetAttacker();
1172
1173 if (caster && target)
1174 caster->CastSpell(target, SPELL_MAGE_CHILLED, true);
1175 }
1176
1182};
1183
1184// 45438 - Ice Block
1211
1212// Ice Lance - 30455
1214{
1227
1228 void IndexTarget(SpellEffIndex /*effIndex*/)
1229 {
1230 _orderedTargets.push_back(GetHitUnit()->GetGUID());
1231 }
1232
1233 void HandleOnHit(SpellEffIndex /*effIndex*/)
1234 {
1235 Unit* caster = GetCaster();
1236 Unit* target = GetHitUnit();
1237
1238 std::ptrdiff_t index = std::distance(_orderedTargets.begin(), std::find(_orderedTargets.begin(), _orderedTargets.end(), target->GetGUID()));
1239
1240 if (index == 0 // only primary target triggers these benefits
1241 && target->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), caster))
1242 {
1243 // Thermal Void
1244 if (Aura const* thermalVoid = caster->GetAura(SPELL_MAGE_THERMAL_VOID))
1245 if (!thermalVoid->GetSpellInfo()->GetEffects().empty())
1246 if (Aura* icyVeins = caster->GetAura(SPELL_MAGE_ICY_VEINS))
1247 icyVeins->SetDuration(icyVeins->GetDuration() + thermalVoid->GetSpellInfo()->GetEffect(EFFECT_0).CalcValueAsInt(caster) * IN_MILLISECONDS);
1248
1249 // Chain Reaction
1251 caster->CastSpell(caster, SPELL_MAGE_CHAIN_REACTION, true);
1252 }
1253
1254 // put target index for chain value multiplier into EFFECT_1 base points, otherwise triggered spell doesn't know which damage multiplier to apply
1255 CastSpellExtraArgs args;
1258 caster->CastSpell(target, SPELL_MAGE_ICE_LANCE_TRIGGER, args);
1259 }
1260
1266
1267 std::vector<ObjectGuid> _orderedTargets;
1268};
1269
1270// 228598 - Ice Lance
1272{
1274 {
1275 SpellValue const* spellValue = GetSpellValue();
1276 if (spellValue->CustomBasePointsMask & (1 << EFFECT_1))
1277 {
1278 int32 originalDamage = GetHitDamage();
1279 float targetIndex = float(spellValue->EffectBasePoints[EFFECT_1]);
1280 float multiplier = std::pow(GetEffectInfo().CalcDamageMultiplier(GetCaster(), GetSpell()), targetIndex);
1281 SetHitDamage(int32(originalDamage * multiplier));
1282 }
1283 }
1284
1289};
1290
1291// 12846 - Ignite
1293{
1294 bool Validate(SpellInfo const* /*spellInfo*/) override
1295 {
1298 && sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE, DIFFICULTY_NONE)->GetEffect(EFFECT_0).GetPeriodicTickCount() > 0;
1299 }
1300
1301 bool CheckProc(ProcEventInfo& eventInfo)
1302 {
1303 return eventInfo.GetProcTarget() != nullptr;
1304 }
1305
1306 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
1307 {
1309
1310 SpellEffectInfo const& igniteDot = sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE, GetCastDifficulty())->GetEffect(EFFECT_0);
1311 SpellEffectValue pct = aurEff->GetAmount();
1312
1314 pct *= 2;
1315
1316 SpellEffectValue amount = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot.GetPeriodicTickCount();
1317
1318 CastSpellExtraArgs args(aurEff);
1319 args.AddSpellMod(SPELLVALUE_BASE_POINT0, amount);
1320 GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_IGNITE, args);
1321 }
1322
1328};
1329
1330// 1217359 - Ignition Burst (attached to 458964 - Heat Shimmer)
1332{
1333 bool Validate(SpellInfo const* /*spellInfo*/) override
1334 {
1336 }
1337
1338 bool Load() override
1339 {
1341 }
1342
1343 static void PreventAura(SpellScript const&, WorldObject*& target)
1344 {
1345 target = nullptr;
1346 }
1347
1352};
1353
1354// 37447 - Improved Mana Gems
1355// 61062 - Improved Mana Gems
1357{
1358 bool Validate(SpellInfo const* /*spellInfo*/) override
1359 {
1361 }
1362
1363 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1364 {
1366 eventInfo.GetActor()->CastSpell(nullptr, SPELL_MAGE_MANA_SURGE, true);
1367 }
1368
1373};
1374
1375// 383967 - Improved Combustion (attached to 190319 - Combustion)
1377{
1378 bool Load() override
1379 {
1381 }
1382
1383 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool const& /*canBeRecalculated*/) const
1384 {
1385 if (AuraEffect const* amountHolder = GetEffect(EFFECT_2))
1386 {
1387 int32 critRating = GetUnitOwner()->ToPlayer()->m_activePlayerData->CombatRatings[CR_CRIT_SPELL];
1388 amount = CalculatePct(critRating, amountHolder->GetAmount());
1389 }
1390 }
1391
1392 void UpdatePeriodic(AuraEffect const* aurEff) const
1393 {
1394 if (AuraEffect* bonus = GetEffect(EFFECT_1))
1395 bonus->RecalculateAmount(aurEff);
1396 }
1397
1403};
1404
1405// 383604 - Improved Scorch
1407{
1408 bool Validate(SpellInfo const* /*spellInfo*/) override
1409 {
1411 }
1412
1413 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
1414 {
1415 return eventInfo.GetProcTarget()->HealthBelowPct(aurEff->GetAmount()) || eventInfo.GetActor()->HasAura(SPELL_MAGE_HEAT_SHIMMER);
1416 }
1417
1418 void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
1419 {
1421 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
1422 .TriggeringAura = aurEff
1423 });
1424 }
1425
1431};
1432
1433// 1463 - Incanter's Flow
1435{
1436 bool Validate(SpellInfo const* /*spellInfo*/) override
1437 {
1439 }
1440
1441 void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
1442 {
1443 // Incanter's flow should not cycle out of combat
1444 if (!GetTarget()->IsInCombat())
1445 return;
1446
1448 {
1449 uint32 stacks = aura->GetStackAmount();
1450
1451 // Force always to values between 1 and 5
1452 if ((modifier == -1 && stacks == 1) || (modifier == 1 && stacks == 5))
1453 {
1454 modifier *= -1;
1455 return;
1456 }
1457
1458 aura->ModStackAmount(modifier);
1459 }
1460 else
1462 }
1463
1468
1469private:
1471};
1472
1473// 44457 - Living Bomb
1492
1493// 44461 - Living Bomb
1518
1519// 217694 - Living Bomb
1521{
1522 bool Validate(SpellInfo const* /*spellInfo*/) override
1523 {
1525 }
1526
1527 void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1528 {
1529 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1530 return;
1531
1532 if (Unit* caster = GetCaster())
1534 }
1535
1540};
1541
1542// 153561 - Meteor
1544{
1545 bool Validate(SpellInfo const* /*spellInfo*/) override
1546 {
1548 }
1549
1557
1562};
1563
1564// 177345 - Meteor
1565// Id - 3467
1567{
1569
1570 void OnRemove() override
1571 {
1572 if (Unit* caster = at->GetCaster())
1573 caster->CastSpell(at->GetPosition(), SPELL_MAGE_METEOR_MISSILE);
1574 }
1575};
1576
1577// 175396 - Meteor Burn
1578// Id - 1712
1580{
1582
1583 void OnUnitEnter(Unit* unit) override
1584 {
1585 if (Unit* caster = at->GetCaster())
1586 if (caster->IsValidAttackTarget(unit))
1588 }
1589
1590 void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
1591 {
1593 }
1594};
1595
1596// 457803 - Molten Fury
1598{
1599 bool Validate(SpellInfo const* /*spellInfo*/) override
1600 {
1602 }
1603
1604 static void HandleEffectProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
1605 {
1606 if (!eventInfo.GetActionTarget()->HealthAbovePct(aurEff->GetAmount()))
1608 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
1609 .TriggeringAura = aurEff
1610 });
1611 else
1613 }
1614
1619};
1620
1622{
1623 NPC_AUROSALIA = 18744
1625
1627// 32826 - Polymorph (Visual)
1629{
1630 static const uint32 PolymorhForms[6];
1631
1632 bool Validate(SpellInfo const* /*spellInfo*/) override
1633 {
1635 }
1636
1637 void HandleDummy(SpellEffIndex /*effIndex*/)
1638 {
1639 if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f))
1640 if (target->GetTypeId() == TYPEID_UNIT)
1641 target->CastSpell(target, PolymorhForms[urand(0, 5)], true);
1642 }
1643
1644 void Register() override
1645 {
1646 // add dummy effect spell handler to Polymorph visual
1648 }
1649};
1650
1660
1661// 235450 - Prismatic Barrier
1663{
1664 bool Validate(SpellInfo const* spellInfo) override
1665 {
1666 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_5 } });
1667 }
1668
1669 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
1670 {
1671 canBeRecalculated = false;
1672 if (Unit* caster = GetCaster())
1673 amount = CalculatePct(caster->GetMaxHealth(), GetEffectInfo(EFFECT_5).CalcValue(caster));
1674 }
1675
1680};
1681
1682// 157642 - Pyrotechnics
1684{
1685 bool Validate(SpellInfo const* /*spellInfo*/) override
1686 {
1688 }
1689
1690 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& procInfo)
1691 {
1692 if (procInfo.GetHitMask() & PROC_HIT_CRITICAL)
1693 {
1696 }
1697 }
1698
1703};
1704
1705// 376103 - Radiant Spark
1707{
1708 bool Validate(SpellInfo const* /*spellInfo*/) override
1709 {
1711 }
1712
1713 bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
1714 {
1716 }
1717
1718 void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
1719 {
1720 Aura* vulnerability = procInfo.GetProcTarget()->GetAura(aurEff->GetSpellEffectInfo().TriggerSpell, GetCasterGUID());
1721 if (vulnerability && vulnerability->GetStackAmount() == vulnerability->CalcMaxStackAmount())
1722 {
1724 vulnerability->Remove();
1726 }
1727 }
1728
1733};
1734
1735// 205021 - Ray of Frost
1737{
1738 bool Validate(SpellInfo const* /*spellInfo*/) override
1739 {
1741 }
1742
1744 {
1745 if (Unit* caster = GetCaster())
1747 }
1748
1749 void Register() override
1750 {
1752 }
1753};
1754
1756{
1757 bool Validate(SpellInfo const* /*spellInfo*/) override
1758 {
1760 }
1761
1763 {
1764 if (Unit* caster = GetCaster())
1765 {
1766 if (aurEff->GetTickNumber() > 1) // First tick should deal base damage
1767 caster->CastSpell(caster, SPELL_MAGE_RAY_OF_FROST_BONUS, true);
1768 }
1769 }
1770
1771 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1772 {
1773 if (Unit* caster = GetCaster())
1774 caster->RemoveAurasDueToSpell(SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST);
1775 }
1776
1782};
1783
1784// 136511 - Ring of Frost
1786{
1792
1793 void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
1794 {
1795 if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
1796 GetTarget()->CastSpell(ringOfFrost->GetPosition(), SPELL_MAGE_RING_OF_FROST_FREEZE, true);
1797 }
1798
1799 void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1800 {
1801 std::list<TempSummon*> minions;
1803
1804 // Get the last summoned RoF, save it and despawn older ones
1805 for (TempSummon* summon : minions)
1806 {
1807 if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
1808 {
1809 if (summon->GetTimer() > ringOfFrost->GetTimer())
1810 {
1811 ringOfFrost->DespawnOrUnsummon();
1812 _ringOfFrostGUID = summon->GetGUID();
1813 }
1814 else
1815 summon->DespawnOrUnsummon();
1816 }
1817 else
1818 _ringOfFrostGUID = summon->GetGUID();
1819 }
1820 }
1821
1827
1828private:
1830 {
1832 return creature->ToTempSummon();
1833 return nullptr;
1834 }
1835
1837};
1838
1839// 82691 - Ring of Frost (freeze efect)
1841{
1847
1848 void FilterTargets(std::list<WorldObject*>& targets)
1849 {
1850 WorldLocation const* dest = GetExplTargetDest();
1851 SpellEffectInfo const& spellEffectInfo = sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON, GetCastDifficulty())->GetEffect(EFFECT_2);
1852 SpellRange radius = {
1853 .Min = spellEffectInfo.CalcRadius(nullptr, SpellTargetIndex::TargetA).Max,
1854 .Max = spellEffectInfo.CalcRadius(nullptr, SpellTargetIndex::TargetB).Max
1855 };
1856
1857 targets.remove_if([dest, radius](WorldObject* target)
1858 {
1859 Unit* unit = target->ToUnit();
1860 if (!unit)
1861 return true;
1862 return unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || !unit->IsInRange3d(dest, radius.Min, radius.Max);
1863 });
1864 }
1865
1870};
1871
1891
1892// 450746 - Scald (attached to 2948 - Scorch)
1894{
1895 bool Validate(SpellInfo const* spellInfo) override
1896 {
1898 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
1899 }
1900
1901 bool Load() override
1902 {
1904 }
1905
1906 void CalculateDamage(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
1907 {
1908 Unit* caster = GetCaster();
1909 if (!victim->HealthBelowPct(GetEffectInfo(EFFECT_1).CalcValue(caster)) || !caster->HasAura(SPELL_MAGE_HEAT_SHIMMER))
1910 return;
1911
1912 if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_MAGE_SCALD, EFFECT_0))
1913 AddPct(pctMod, aurEff->GetAmount());
1914 }
1915
1920};
1921
1922// 2948 - Scorch
1924{
1925 bool Validate(SpellInfo const* /*spellInfo*/) override
1926 {
1928 }
1929
1930 void CalcCritChance(Unit const* victim, float& critChance)
1931 {
1933 critChance = 100.0f;
1934 }
1935
1937 {
1938 Unit* caster = GetCaster();
1939 if (GetHitUnit()->GetHealthPct() < GetEffectInfo(EFFECT_1).CalcValue(GetCaster()) || GetCaster()->HasAura(SPELL_MAGE_HEAT_SHIMMER))
1942 .TriggeringSpell = GetSpell()
1943 });
1944 }
1945
1951};
1952
1953// 451875 - Spontaneous Combustion (attached to 190319 - Combustion)
1955{
1960
1961 bool Load() override
1962 {
1964 }
1965
1966 void HandleCharges() const
1967 {
1968 GetCaster()->GetSpellHistory()->ResetCharges(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId);
1970 }
1971
1976};
1977
1978// 157980 - Supernova
1980{
1981 void HandleDamage(SpellEffIndex /*effIndex*/)
1982 {
1983 if (GetExplTargetUnit() == GetHitUnit())
1984 {
1985 int32 damage = GetHitDamage();
1986 AddPct(damage, GetEffectInfo(EFFECT_0).CalcValue());
1987 SetHitDamage(damage);
1988 }
1989 }
1990
1995};
1996
1997// 382289 - Tempest Barrier
1999{
2000 bool Validate(SpellInfo const* /*spellInfo*/) override
2001 {
2003 }
2004
2005 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
2006 {
2008 Unit* target = GetTarget();
2009 SpellEffectValue amount = CalculatePct(target->GetMaxHealth(), aurEff->GetAmount());
2012 .TriggeringAura = aurEff,
2013 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, amount } }
2014 });
2015 }
2016
2021};
2022
2023// 210824 - Touch of the Magi (Aura)
2025{
2026 bool Validate(SpellInfo const* /*spellInfo*/) override
2027 {
2029 }
2030
2031 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
2032 {
2033 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
2034 if (damageInfo)
2035 {
2036 if (damageInfo->GetAttacker() == GetCaster() && damageInfo->GetVictim() == GetTarget())
2037 {
2038 SpellEffectValue extra = CalculatePct(damageInfo->GetDamage(), 25);
2039 if (extra > 0)
2040 aurEff->ChangeAmount(aurEff->GetAmount() + extra);
2041 }
2042 }
2043 }
2044
2045 void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
2046 {
2047 SpellEffectValue amount = aurEff->GetAmount();
2048 if (!amount || GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
2049 return;
2050
2051 if (Unit* caster = GetCaster())
2053 }
2054
2060};
2061
2062// 33395 Water Elemental's Freeze
2064{
2065 bool Validate(SpellInfo const* /*spellInfo*/) override
2066 {
2068 }
2069
2071 {
2072 Unit* owner = GetCaster()->GetOwner();
2073 if (!owner)
2074 return;
2075
2076 owner->CastSpell(owner, SPELL_MAGE_FINGERS_OF_FROST, true);
2077 }
2078
2083};
2084
2085// 383493 - Wildfire
2086// 383492 - Wildfire
2088{
2089 bool Validate(SpellInfo const* /*spellInfo*/) override
2090 {
2092 }
2093
2094 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated) const
2095 {
2096 Unit* caster = GetCaster();
2097 if (!caster)
2098 return;
2099
2100 AuraEffect const* wildfireCritEffect = caster->GetAuraEffect(SPELL_MAGE_WILDFIRE_TALENT, _effIndex);
2101 if (!wildfireCritEffect)
2102 return;
2103
2104 canBeRecalculated = false;
2105 amount = wildfireCritEffect->GetAmount();
2106 }
2107
2112
2115
2116public:
2117 explicit spell_mage_wildfire_crit(AuraType auraType, SpellEffIndex effIndex) : _auraType(auraType), _effIndex(effIndex) { }
2118};
2119
2121{
2190}
AreaTriggerExitReason
Definition AreaTrigger.h:69
@ IN_MILLISECONDS
Definition Common.h:38
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
@ DIFFICULTY_NONE
Definition DBCEnums.h:933
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
std::chrono::duration< double, Seconds::period > FloatSeconds
Definition Duration.h:29
@ TYPEID_UNIT
Definition ObjectGuid.h:43
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(T chance)
Definition Random.h:55
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition ScriptMgr.h:1381
#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_6
@ EFFECT_1
@ EFFECT_5
@ EFFECT_0
@ EFFECT_2
@ 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
@ SPELLFAMILY_MAGE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_ADD_PCT_MODIFIER
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_MOD_RATING
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MASTERY
@ SPELL_AURA_MOD_CRIT_PCT
@ SPELL_AURA_CHARGE_RECOVERY_MULTIPLIER
@ SPELL_AURA_MOD_VERSATILITY
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS
@ SPELL_AURA_MOD_STUN
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_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_BASE_POINT1
@ SPELLVALUE_BASE_POINT2
@ SPELLVALUE_BASE_POINT0
#define sSpellMgr
Definition SpellMgr.h:812
@ PROC_HIT_CRITICAL
Definition SpellMgr.h:236
#define AuraProcFn(F)
#define SpellOnCalcCritChanceFn(F)
#define SpellObjectTargetSelectFn(F, I, N)
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define AuraEffectCalcAmountFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectCalcCritChanceFn(F, I, N)
#define AuraCheckEffectProcFn(F, I, N)
#define SpellCalcDamageFn(F)
#define SpellCastFn(F)
#define AuraEffectAbsorbFn(F, I)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckProcFn(F)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ CR_VERSATILITY_DAMAGE_DONE
Definition Unit.h:345
@ CR_CRIT_SPELL
Definition Unit.h:327
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
AreaTriggerAI(AreaTrigger *a, uint32 scriptId={}) noexcept
ObjectGuid const & GetCasterGuid() const
Unit * GetCaster() const
void ChangeAmount(SpellEffectValue newAmount, bool mark=true, bool onStackOrReapply=false, AuraEffect const *triggeredBy=nullptr)
uint32 GetTickNumber() const
SpellEffectInfo const & GetSpellEffectInfo() const
SpellEffectValue GetAmount() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< CheckEffectProcHandler > DoCheckEffectProc
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
WorldObject * GetOwner() const
HookList< EffectProcHandler > AfterEffectProc
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
Unit * GetCaster() const
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
AuraEffect * GetEffect(uint8 effIndex) const
HookList< EffectAbsorbHandler > OnEffectAbsorb
HookList< EffectCalcCritChanceHandler > DoEffectCalcCritChance
Aura * GetAura() const
Unit * GetTarget() const
ObjectGuid GetCasterGUID() const
Difficulty GetCastDifficulty() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
HookList< AuraProcHandler > OnProc
bool HasEffect(uint8 effIndex) const
HookList< EffectApplyHandler > OnEffectApply
uint32 CalcMaxStackAmount() const
uint8 GetStackAmount() const
Definition SpellAuras.h:238
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
ObjectGuid _originalCastId
bool Execute(uint64 time, uint32) override
CometStormEvent(Unit *caster, ObjectGuid originalCastId, Position const &dest)
Unit * GetVictim() const
Definition Unit.h:447
Unit * GetAttacker() const
Definition Unit.h:446
uint32 GetDamage() const
Definition Unit.h:452
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
Definition Group.h:205
static ObjectGuid const Empty
Definition ObjectGuid.h:314
Player * ToPlayer()
Definition Object.h:126
Unit * ToUnit()
Definition Object.h:116
UF::UpdateField< UF::ActivePlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_ACTIVE_PLAYER > m_activePlayerData
Definition Player.h:3062
Unit * GetActionTarget() const
Definition Unit.h:500
Spell const * GetProcSpell() const
Definition Unit.h:514
ProcFlagsHit GetHitMask() const
Definition Unit.h:506
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
DamageInfo * GetDamageInfo() const
Definition Unit.h:511
Unit * GetProcTarget() const
Definition Unit.h:501
Unit * GetActor() const
Definition Unit.h:499
SpellDestination const * GetDst() const
Definition Spell.cpp:331
ObjectGuid GetObjectTargetGUID() const
Definition Spell.cpp:251
uint32 GetPeriodicTickCount() const
uint32 TriggerSpell
Definition SpellInfo.h:234
bool IsEffect() const
SpellRange CalcRadius(WorldObject const *caster=nullptr, SpellTargetIndex targetIndex=SpellTargetIndex::TargetA, Spell *spell=nullptr) const
void ResetCooldown(uint32 spellId, bool update=false)
void RestoreCharge(uint32 chargeCategoryId)
void ResetCharges(uint32 chargeCategoryId)
void ModifyCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown=false)
bool IsAffected(uint32 familyName, flag128 const &familyFlags) const
uint32 const Id
Definition SpellInfo.h:328
uint32 ChargeCategoryId
Definition SpellInfo.h:420
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:588
bool NeedsExplicitUnitTarget() 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
WorldLocation * GetHitDest() const
int32 GetHitDamage() const
Unit * GetCaster() 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
SpellValue const * GetSpellValue() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
Spell * GetSpell() const
WorldObject * GetExplTargetWorldObject() const
HookList< EffectHandler > OnEffectLaunchTarget
Difficulty GetCastDifficulty() const
void SetHitDamage(int32 damage)
HookList< OnCalcCritChanceHandler > OnCalcCritChance
WorldLocation const * GetExplTargetDest() const
HookList< EffectHandler > OnEffectLaunch
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition Spell.h:277
SpellCastTargets m_targets
Definition Spell.h:651
Script * GetScript() const
Definition Spell.h:951
UsedSpellMods m_appliedMods
Definition Spell.h:654
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
Definition Unit.h:635
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:8697
float GetHealthPct() const
Definition Unit.h:796
void SetHealth(uint64 val)
Definition Unit.cpp:9973
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3828
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4604
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10037
TempSummon * ToTempSummon()
Definition Unit.h:1828
uint64 GetMaxHealth() const
Definition Unit.h:789
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
uint64 GetHealth() const
Definition Unit.h:788
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:6146
void GetAllMinionsByEntry(std::list< TempSummon * > &Minions, uint32 entry)
Definition Unit.cpp:6420
bool HealthAbovePct(float pct) const
Definition Unit.h:794
bool HealthBelowPct(float pct) const
Definition Unit.h:792
void NearTeleportTo(TeleportLocation const &target, bool casting=false)
Definition Unit.cpp:12958
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
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
Unit * GetOwner() const
Definition Object.cpp:1598
bool IsInBetween(Position const &pos1, Position const &pos2, float size=0) const
Definition Object.cpp:653
EventProcessor m_Events
Definition Object.h:561
bool IsInRange3d(Position const *pos, float minRange, float maxRange) const
Definition Object.cpp:635
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:432
virtual float GetCombatReach() const
Definition Object.h:302
void RemoveAlterTimeAura(SpellEffIndex)
bool Validate(SpellInfo const *) override
void OnApply(AuraEffect const *, AuraEffectHandleModes)
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *spellInfo) override
void HandleEffectHitTarget(SpellEffIndex)
void MarkPrimaryTarget(SpellEffIndex)
bool Validate(SpellInfo const *) override
void RemoveArcaneCharge(SpellEffIndex)
void CheckRequiredAuraForBaselineEnergize(SpellEffIndex effIndex)
bool Validate(SpellInfo const *spellInfo) override
void HandleReverberate(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated)
void HandleSlow(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *spellInfo) override
void HandleAbsorb(AuraEffect *, DamageInfo &dmgInfo, uint32 &)
void Register() override
void SuppressSpeedBuff(SpellEffIndex effIndex)
static uint32 constexpr SpellsToReset[]
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
void Register() override
void HandleEffectHitTarget(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void EffectHit(SpellEffIndex)
void Register() override
void HandleSlow(SpellEffIndex)
void Register() override
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
bool Validate(SpellInfo const *) override
void Register() override
void CalcAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void AfterRemove(AuraEffect const *, AuraEffectHandleModes) const
void Trigger(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool CheckFrozenOrbProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool CheckFrostboltProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void Register() override
void CalcCritChance(Unit const *, float &critChance)
bool Validate(SpellInfo const *) override
void CalcCritChance(AuraEffect const *, Unit const *victim, float &critChance)
void CalcCritChance(Unit const *victim, float &critChance)
bool Validate(SpellInfo const *) override
void Register() override
void HandlePeriodicTick(AuraEffect const *) const
bool Validate(SpellInfo const *) override
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated)
bool Validate(SpellInfo const *spellInfo) override
void Register() override
bool Load() override
void HandleFlamePatch() const
void Register() override
bool Validate(SpellInfo const *) override
bool Execute(uint64 time, uint32) override
FlurryEvent(Unit *caster, ObjectGuid const &target, ObjectGuid const &originalCastId, int32 count)
void Register() override
void HandleDamage(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void EffectHit(SpellEffIndex) const
void Register() override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void Register() override
bool Validate(SpellInfo const *) override
void Register() override
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
int32 CalcCastTime(int32 castTime) override
bool Validate(SpellInfo const *) override
static bool IsActive(Spell const *spell)
void HandleProc(ProcEventInfo const &eventInfo) const
void Register() override
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo const &procEvent) const
void Register() override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void Register() override
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated) const
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
void PreventEverwarmSocks(WorldObject *&target)
bool Validate(SpellInfo const *) override
void Register() override
void PreventStunWithEverwarmSocks(WorldObject *&target)
void ApplyDamageMultiplier(SpellEffIndex)
void Register() override
void IndexTarget(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleOnHit(SpellEffIndex)
std::vector< ObjectGuid > _orderedTargets
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
bool CheckProc(ProcEventInfo &eventInfo)
void Register() override
bool Validate(SpellInfo const *) override
static void PreventAura(SpellScript const &, WorldObject *&target)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void UpdatePeriodic(AuraEffect const *aurEff) const
void CalcAmount(AuraEffect const *, SpellEffectValue &amount, bool const &) const
bool Validate(SpellInfo const *) override
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo) const
bool Validate(SpellInfo const *) override
void HandlePeriodicTick(AuraEffect const *)
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
void Register() override
bool Validate(SpellInfo const *) override
void EffectHit(SpellEffIndex)
static void HandleEffectProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void Register() override
bool Validate(SpellInfo const *) override
static const uint32 PolymorhForms[6]
void HandleDummy(SpellEffIndex)
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated)
bool Validate(SpellInfo const *spellInfo) override
void Register() override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &procInfo)
bool CheckProc(AuraEffect const *, ProcEventInfo &procInfo)
bool Validate(SpellInfo const *) 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
bool Load() override
bool Validate(SpellInfo const *spellInfo) override
void CalculateDamage(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &, float &pctMod) const
void Register() override
bool Validate(SpellInfo const *) override
void Register() override
void CalcCritChance(Unit const *victim, float &critChance)
void HandleFreneticSpeed(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex)
void Register() override
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &)
void HandleProc(AuraEffect *aurEff, ProcEventInfo &eventInfo)
void AfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
spell_mage_wildfire_crit(AuraType auraType, SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated) const
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
@ SPELL_MAGE_FLAME_ACCELERANT
@ SPELL_MAGE_HEAT_SHIMMER
@ SPELL_MAGE_FLAMESTRIKE
@ SPELL_MAGE_FLAME_PATCH_AREATRIGGER
@ SPELL_MAGE_RADIANT_SPARK_PROC_BLOCKER
@ SPELL_MAGE_SUPERNOVA
@ SPELL_MAGE_FIRE_BLAST
@ SPELL_MAGE_ICE_BLOCK
@ SPELL_MAGE_TOUCH_OF_THE_MAGI_EXPLODE
@ SPELL_MAGE_MANA_SURGE
@ SPELL_MAGE_ARCANE_CHARGE
@ SPELL_MAGE_CONJURE_REFRESHMENT
@ SPELL_MAGE_FRENETIC_SPEED
@ SPELL_MAGE_WORGEN_FORM
@ SPELL_MAGE_ALTER_TIME_AURA
@ SPELL_MAGE_ICY_VEINS
@ SPELL_MAGE_IGNITION_BURST
@ SPELL_MAGE_HOT_STREAK
@ SPELL_MAGE_METEOR_AREATRIGGER
@ SPELL_MAGE_IMPROVED_SCORCH
@ SPELL_MAGE_ALEXSTRASZAS_FURY
@ SPELL_MAGE_ARCANE_BARRAGE_ENERGIZE
@ SPELL_MAGE_BLAZING_BARRIER_TRIGGER
@ SPELL_MAGE_WINTERS_CHILL
@ SPELL_MAGE_ETHEREAL_BLINK
@ SPELL_MAGE_CONJURE_REFRESHMENT_TABLE
@ SPELL_MAGE_TEMPEST_BARRIER_ABSORB
@ SPELL_MAGE_RAY_OF_FROST_BONUS
@ SPELL_MAGE_LIVING_BOMB_PERIODIC
@ SPELL_MAGE_RING_OF_FROST_SUMMON
@ SPELL_MAGE_ARCANE_ALTER_TIME_AURA
@ SPELL_MAGE_METEOR_BURN_DAMAGE
@ SPELL_MAGE_PYROBLAST
@ SPELL_MAGE_PHOENIX_FLAMES_DAMAGE
@ SPELL_MAGE_COMET_STORM_DAMAGE
@ SPELL_MAGE_WILDFIRE_TALENT
@ SPELL_PET_NETHERWINDS_FATIGUED
@ SPELL_MAGE_SCALD
@ SPELL_MAGE_REVERBERATE
@ SPELL_MAGE_MASTER_OF_TIME
@ SPELL_MAGE_IGNITE
@ SPELL_MAGE_SHIMMER
@ SPELL_MAGE_COMET_STORM_VISUAL
@ SPELL_MAGE_PHOENIX_FLAMES
@ SPELL_MAGE_INCANTERS_FLOW
@ SPELL_MAGE_FLAME_PATCH_TALENT
@ SPELL_MAGE_GIRAFFE_FORM
@ SPELL_MAGE_CONE_OF_COLD_SLOW
@ SPELL_MAGE_FINGERS_OF_FROST
@ SPELL_MAGE_PYROTECHNICS
@ SPELL_MAGE_BLINK
@ SPELL_MAGE_BLIZZARD_DAMAGE
@ SPELL_MAGE_DRAGONS_BREATH
@ SPELL_MAGE_FLURRY_DAMAGE
@ SPELL_MAGE_ALTER_TIME_VISUAL
@ SPELL_MAGE_SLOW
@ SPELL_MAGE_DRAGONHAWK_FORM
@ SPELL_MAGE_RING_OF_FROST_FREEZE
@ SPELL_MAGE_ICE_LANCE_TRIGGER
@ SPELL_MAGE_SQUIRREL_FORM
@ SPELL_MAGE_LIVING_BOMB_EXPLOSION
@ SPELL_MAGE_CONE_OF_COLD
@ SPELL_MAGE_EVERWARM_SOCKS
@ SPELL_MAGE_HEATING_UP
@ SPELL_MAGE_ARCANE_MAGE
@ SPELL_MAGE_CHAIN_REACTION
@ SPELL_MAGE_ICE_BARRIER
@ SPELL_MAGE_FEEL_THE_BURN
@ SPELL_MAGE_FIRESTARTER
@ SPELL_MAGE_SPONTANEOUS_COMBUSTION
@ SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST
@ SPELL_MAGE_SERPENT_FORM
@ SPELL_MAGE_BLIZZARD_SLOW
@ SPELL_MAGE_CHILLED
@ SPELL_MAGE_IMPROVED_COMBUSTION
@ SPELL_MAGE_CAUTERIZE_DOT
@ SPELL_MAGE_THERMAL_VOID
@ SPELL_MAGE_FLAME_PATCH_DAMAGE
@ SPELL_MAGE_MOLTEN_FURY
@ SPELL_MAGE_FROST_NOVA
@ SPELL_MAGE_ARCANE_BARRAGE_R3
@ SPELL_MAGE_SHEEP_FORM
@ SPELL_MAGE_FIERY_RUSH_AURA
@ SPELL_MAGE_RING_OF_FROST_DUMMY
@ SPELL_MAGE_CHAIN_REACTION_DUMMY
@ SPELL_MAGE_METEOR_MISSILE
SilvermoonPolymorph
@ NPC_AUROSALIA
TriggerCastFlags TriggerFlags
CastSpellExtraArgs & SetCustomArg(std::any customArg)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
constexpr float GetPositionZ() const
Definition Position.h:89
uint32 CustomBasePointsMask
Definition Spell.h:243
SpellEffectValue EffectBasePoints[MAX_SPELL_EFFECTS]
Definition Spell.h:242
void OnUpdate(uint32 diff) override
static constexpr Milliseconds TICK_PERIOD
areatrigger_mage_blizzard(AreaTrigger *areatrigger)
void OnCreate(Spell const *) override
void OnUpdate(uint32 diff) override
TaskScheduler _scheduler
void OnUnitEnter(Unit *unit) override
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
void OnRemove() override