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 {
439 absorbAmount = 0;
440 return;
441 }
442
444 GetTarget()->SetHealth(GetTarget()->CountPctFromMaxHealth(effect1->GetAmount()));
448 }
449
454};
455
456// 235219 - Cold Snap
458{
465
466 bool Validate(SpellInfo const* /*spellInfo*/) override
467 {
469 }
470
471 void HandleDummy(SpellEffIndex /*effIndex*/)
472 {
473 for (uint32 spellId : SpellsToReset)
474 GetCaster()->GetSpellHistory()->ResetCooldown(spellId, true);
475
476 GetCaster()->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FROST_NOVA, GetCastDifficulty())->ChargeCategoryId);
477 }
478
483};
484
486{
487public:
488 CometStormEvent(Unit* caster, ObjectGuid originalCastId, Position const& dest) : _caster(caster), _originalCastId(originalCastId), _dest(dest), _count(0) { }
489
490 bool Execute(uint64 time, uint32 /*diff*/) override
491 {
492 Position destPosition = {_dest.GetPositionX() + frand(-3.0f, 3.0f), _dest.GetPositionY() + frand(-3.0f, 3.0f), _dest.GetPositionZ()};
495 ++_count;
496
497 if (_count >= 7)
498 return true;
499
500 _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(100ms, 275ms));
501 return false;
502 }
503
504private:
509};
510
511// 153595 - Comet Storm (launch)
513{
514 bool Validate(SpellInfo const* /*spellInfo*/) override
515 {
517 }
518
519 void EffectHit(SpellEffIndex /*effIndex*/)
520 {
521 GetCaster()->m_Events.AddEventAtOffset(new CometStormEvent(GetCaster(), GetSpell()->m_castId, *GetHitDest()), randtime(100ms, 275ms));
522 }
523
528};
529
530// 228601 - Comet Storm (damage)
549
550// 120 - Cone of Cold
552{
553 bool Validate(SpellInfo const* /*spellInfo*/) override
554 {
556 }
557
558 void HandleSlow(SpellEffIndex /*effIndex*/)
559 {
561 }
562
567};
568
569// 190336 - Conjure Refreshment
571{
572 bool Validate(SpellInfo const* /*spellInfo*/) override
573 {
574 return ValidateSpellInfo
575 ({
578 });
579 }
580
581 void HandleDummy(SpellEffIndex /*effIndex*/)
582 {
583 if (Player* caster = GetCaster()->ToPlayer())
584 {
585 Group* group = caster->GetGroup();
586 if (group)
587 caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE, true);
588 else
589 caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT, true);
590 }
591 }
592
597};
598
599// 410939 - Ethereal Blink
601{
602 bool Validate(SpellInfo const* /*spellInfo*/) override
603 {
605 }
606
607 void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
608 {
610
611 // this proc only works for players because teleport relocation happens after an ACK
613 .SetTriggeringSpell(procInfo.GetProcSpell())
614 .SetCustomArg(GetTarget()->GetPosition()));
615 }
616
621};
622
623// 410941 - Ethereal Blink
625{
626 bool Validate(SpellInfo const* /*spellInfo*/) override
627 {
630 }
631
632 void FilterTargets(std::list<WorldObject*>& targets)
633 {
634 Position const* src = std::any_cast<Position>(&GetSpell()->m_customArg);
635 WorldLocation const* dst = GetExplTargetDest();
636 if (!src || !dst)
637 {
638 targets.clear();
639 return;
640 }
641
642 targets.remove_if([&](WorldObject* target)
643 {
644 return !target->IsInBetween(*src, *dst, (target->GetCombatReach() + GetCaster()->GetCombatReach()) / 2.0f);
645 });
646
648 if (!reductionEffect)
649 return;
650
651 FloatSeconds reduction = FloatSeconds(reductionEffect->GetAmount()) * targets.size();
652
653 if (AuraEffect const* cap = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_3))
654 if (reduction > FloatSeconds(cap->GetAmount()))
655 reduction = FloatSeconds(cap->GetAmount());
656
657 if (reduction > 0s)
658 {
659 GetCaster()->GetSpellHistory()->ModifyCooldown(SPELL_MAGE_BLINK, -duration_cast<SpellHistory::Duration>(reduction));
660 GetCaster()->GetSpellHistory()->ModifyCooldown(SPELL_MAGE_SHIMMER, -duration_cast<SpellHistory::Duration>(reduction));
661 }
662 }
663
664 void TriggerSlow(SpellEffIndex /*effIndex*/)
665 {
666 SpellEffectValue effectivenessPct = 100;
667 if (AuraEffect const* effectivenessEffect = GetCaster()->GetAuraEffect(SPELL_MAGE_ETHEREAL_BLINK, EFFECT_1))
668 effectivenessPct = effectivenessEffect->GetAmount();
669
670 SpellEffectValue slowPct = sSpellMgr->AssertSpellInfo(SPELL_MAGE_SLOW, DIFFICULTY_NONE)->GetEffect(EFFECT_0).CalcBaseValue(GetCaster(), GetHitUnit(), 0, -1);
671 ApplyPct(slowPct, effectivenessPct);
672
674 .AddSpellMod(SPELLVALUE_BASE_POINT0, slowPct));
675 }
676
682};
683
684// 383395 - Feel the Burn
686{
687 bool Validate(SpellInfo const* /*spellInfo*/) override
688 {
690 }
691
692 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
693 {
694 if (Unit* caster = GetCaster())
695 if (AuraEffect const* valueHolder = caster->GetAuraEffect(SPELL_MAGE_FEEL_THE_BURN, EFFECT_0))
696 amount = valueHolder->GetAmount();
697
698 canBeRecalculated = false;
699 }
700
705};
706
707// 383637 - Fiery Rush (attached to 190319 - Combustion)
725
726// 112965 - Fingers of Frost
759
760// 133 - Fireball
761// 11366 - Pyroblast
763{
764 bool Validate(SpellInfo const* /*spellInfo*/) override
765 {
767 }
768
769 void CalcCritChance(Unit const* victim, float& critChance)
770 {
771 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
772 if (victim->GetHealthPct() >= aurEff->GetAmount())
773 critChance = 100.0f;
774 }
775
780};
781
782// 321712 - Pyroblast
784{
785 bool Validate(SpellInfo const* /*spellInfo*/) override
786 {
788 }
789
790 void CalcCritChance(AuraEffect const* /*aurEff*/, Unit const* victim, float& critChance)
791 {
792 if (AuraEffect const* aurEff = GetCaster()->GetAuraEffect(SPELL_MAGE_FIRESTARTER, EFFECT_0))
793 if (victim->GetHealthPct() >= aurEff->GetAmount())
794 critChance = 100.0f;
795 }
796
801};
802
803// 108853 - Fire Blast
805{
806 void CalcCritChance(Unit const* /*victim*/, float& critChance)
807 {
808 critChance = 100.0f;
809 }
810
815};
816
817// 453282 - Flame Accelerant
836
837// 205029 - Flame On
839{
840 bool Validate(SpellInfo const* spellInfo) override
841 {
843 && sSpellCategoryStore.HasRecord(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)
844 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } });
845 }
846
847 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
848 {
849 canBeRecalculated = false;
850 amount = -GetPctOf<SpellEffectValue>(GetEffectInfo(EFFECT_2).CalcValue() * int32(IN_MILLISECONDS), sSpellCategoryStore.AssertEntry(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId)->ChargeRecoveryTime);
851 }
852
857};
858
859// 205037 - Flame Patch (attached to 2120 - Flamestrike)
885
886// 205470 - Flame Patch
887// Id - 6122
889{
891
892 void OnCreate(Spell const* /*creatingSpell*/) override
893 {
894 _scheduler.Schedule(1s, [this](TaskContext& task)
895 {
896 if (Unit* caster = at->GetCaster())
898 task.Repeat(1s);
899 });
900 }
901
902 void OnUpdate(uint32 diff) override
903 {
904 _scheduler.Update(diff);
905 }
906
907private:
909};
910
911// 44614 - Flurry
913{
914 class FlurryEvent : public BasicEvent
915 {
916 public:
917 FlurryEvent(Unit* caster, ObjectGuid const& target, ObjectGuid const& originalCastId, int32 count)
918 : _caster(caster), _target(target), _originalCastId(originalCastId), _count(count) { }
919
920 bool Execute(uint64 time, uint32 /*diff*/) override
921 {
923
924 if (!target)
925 return true;
926
928
929 if (!--_count)
930 return true;
931
932 _caster->m_Events.AddEvent(this, Milliseconds(time) + randtime(300ms, 400ms));
933 return false;
934 }
935
936 private:
941 };
942
943 bool Validate(SpellInfo const* /*spellInfo*/) override
944 {
946 }
947
948 void EffectHit(SpellEffIndex /*effIndex*/) const
949 {
950 GetCaster()->m_Events.AddEventAtOffset(new FlurryEvent(GetCaster(), GetHitUnit()->GetGUID(), GetSpell()->m_castId, GetEffectValueAsInt() - 1), randtime(300ms, 400ms));
951 }
952
957};
958
959// 228354 - Flurry (damage)
961{
962 bool Validate(SpellInfo const* /*spellInfo*/) override
963 {
965 }
966
967 void HandleDamage(SpellEffIndex /*effIndex*/) const
968 {
970 }
971
976};
977
978// 116 - Frostbolt
980{
981 bool Validate(SpellInfo const* /*spell*/) override
982 {
984 }
985
991
992 void Register() override
993 {
995 }
996};
997
998// 457735 - Heat Shimmer
1000{
1001 bool Validate(SpellInfo const* /*spell*/) override
1002 {
1004 }
1005
1006 static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
1007 {
1008 eventInfo.GetActor()->CastSpell(eventInfo.GetActor(), SPELL_MAGE_HEAT_SHIMMER);
1009 }
1010
1015};
1016
1017// 2948 - Scorch
1019{
1020 bool Validate(SpellInfo const* /*spell*/) override
1021 {
1023 }
1024
1029
1034};
1035
1036// 44448 - Pyroblast Clearcasting Driver
1038{
1039 bool Validate(SpellInfo const* /*spellInfo*/) override
1040 {
1041 return ValidateSpellInfo
1042 ({
1048 });
1049 }
1050
1051 bool CheckProc(ProcEventInfo const& procEvent) const
1052 {
1053 Unit const* caster = GetTarget();
1054 switch (procEvent.GetSpellInfo()->Id)
1055 {
1057 // talent requirement
1059 return false;
1060 break;
1062 // primary target only
1063 if (procEvent.GetActionTarget()->GetGUID() != procEvent.GetProcSpell()->m_targets.GetObjectTargetGUID())
1064 return false;
1065 break;
1066 default:
1067 break;
1068 }
1069
1070 return true;
1071 }
1072
1073 void HandleProc(ProcEventInfo const& eventInfo) const
1074 {
1075 Unit* caster = GetTarget();
1076
1077 if (eventInfo.GetHitMask() & PROC_HIT_CRITICAL)
1078 {
1079 CastSpellExtraArgs args;
1081
1082 if (!caster->HasAura(SPELL_MAGE_HEATING_UP))
1083 caster->CastSpell(caster, SPELL_MAGE_HEATING_UP, args);
1084 else
1085 {
1087 caster->CastSpell(caster, SPELL_MAGE_HOT_STREAK, args);
1088 }
1089 }
1090 else
1092 }
1093
1099};
1100
1101// 48108 - Hot Streak! (attached to 11366 - Pyroblast and 2120 - Flamestrike)
1103{
1104 bool Validate(SpellInfo const* /*spell*/) override
1105 {
1107 }
1108
1109 int32 CalcCastTime(int32 castTime) override
1110 {
1112 return castTime;
1113 }
1114
1115 void Register() override
1116 {
1117 }
1118
1120
1121public:
1122 static bool IsActive(Spell const* spell)
1123 {
1124 if (spell)
1126 return script->_affectedByHotStreak;
1127 return false;
1128 }
1129};
1130
1131// 386737 - Hyper Impact
1133{
1134 bool Validate(SpellInfo const* /*spellInfo*/) override
1135 {
1137 }
1138
1139 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1140 {
1141 eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MAGE_SUPERNOVA, true);
1142 }
1143
1148};
1149
1150// 11426 - Ice Barrier
1152{
1153 bool Validate(SpellInfo const* /*spellInfo*/) override
1154 {
1155 return ValidateSpellInfo
1156 ({
1158 });
1159 }
1160
1161 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated) const
1162 {
1163 canBeRecalculated = false;
1164 amount = CalculatePct(GetUnitOwner()->GetMaxHealth(), GetEffectInfo(EFFECT_1).CalcValue());
1165 if (Player const* player = GetUnitOwner()->ToPlayer())
1166 AddPct(amount, player->GetRatingBonusValue(CR_VERSATILITY_DAMAGE_DONE) + player->GetTotalAuraModifier(SPELL_AURA_MOD_VERSATILITY));
1167 }
1168
1169 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1170 {
1171 Unit* caster = eventInfo.GetDamageInfo()->GetVictim();
1172 Unit* target = eventInfo.GetDamageInfo()->GetAttacker();
1173
1174 if (caster && target)
1175 caster->CastSpell(target, SPELL_MAGE_CHILLED, true);
1176 }
1177
1183};
1184
1185// 45438 - Ice Block
1212
1213// Ice Lance - 30455
1215{
1228
1229 void IndexTarget(SpellEffIndex /*effIndex*/)
1230 {
1231 _orderedTargets.push_back(GetHitUnit()->GetGUID());
1232 }
1233
1234 void HandleOnHit(SpellEffIndex /*effIndex*/)
1235 {
1236 Unit* caster = GetCaster();
1237 Unit* target = GetHitUnit();
1238
1239 std::ptrdiff_t index = std::distance(_orderedTargets.begin(), std::find(_orderedTargets.begin(), _orderedTargets.end(), target->GetGUID()));
1240
1241 if (index == 0 // only primary target triggers these benefits
1242 && target->HasAuraState(AURA_STATE_FROZEN, GetSpellInfo(), caster))
1243 {
1244 // Thermal Void
1245 if (Aura const* thermalVoid = caster->GetAura(SPELL_MAGE_THERMAL_VOID))
1246 if (!thermalVoid->GetSpellInfo()->GetEffects().empty())
1247 if (Aura* icyVeins = caster->GetAura(SPELL_MAGE_ICY_VEINS))
1248 icyVeins->SetDuration(icyVeins->GetDuration() + thermalVoid->GetSpellInfo()->GetEffect(EFFECT_0).CalcValueAsInt(caster) * IN_MILLISECONDS);
1249
1250 // Chain Reaction
1252 caster->CastSpell(caster, SPELL_MAGE_CHAIN_REACTION, true);
1253 }
1254
1255 // put target index for chain value multiplier into EFFECT_1 base points, otherwise triggered spell doesn't know which damage multiplier to apply
1256 CastSpellExtraArgs args;
1259 caster->CastSpell(target, SPELL_MAGE_ICE_LANCE_TRIGGER, args);
1260 }
1261
1267
1268 std::vector<ObjectGuid> _orderedTargets;
1269};
1270
1271// 228598 - Ice Lance
1273{
1275 {
1276 SpellValue const* spellValue = GetSpellValue();
1277 if (spellValue->CustomBasePointsMask & (1 << EFFECT_1))
1278 {
1279 int32 originalDamage = GetHitDamage();
1280 float targetIndex = float(spellValue->EffectBasePoints[EFFECT_1]);
1281 float multiplier = std::pow(GetEffectInfo().CalcDamageMultiplier(GetCaster(), GetSpell()), targetIndex);
1282 SetHitDamage(int32(originalDamage * multiplier));
1283 }
1284 }
1285
1290};
1291
1292// 12846 - Ignite
1294{
1295 bool Validate(SpellInfo const* /*spellInfo*/) override
1296 {
1299 && sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE, DIFFICULTY_NONE)->GetEffect(EFFECT_0).GetPeriodicTickCount() > 0;
1300 }
1301
1302 bool CheckProc(ProcEventInfo& eventInfo)
1303 {
1304 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
1305 return damageInfo && damageInfo->GetDamage();
1306 }
1307
1308 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
1309 {
1311
1312 SpellEffectInfo const& igniteDot = sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE, GetCastDifficulty())->GetEffect(EFFECT_0);
1313 SpellEffectValue pct = aurEff->GetAmount();
1314
1316 pct *= 2;
1317
1318 SpellEffectValue amount = CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot.GetPeriodicTickCount();
1319
1320 CastSpellExtraArgs args(aurEff);
1321 args.AddSpellMod(SPELLVALUE_BASE_POINT0, amount);
1322 eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_MAGE_IGNITE, args);
1323 }
1324
1330};
1331
1332// 1217359 - Ignition Burst (attached to 458964 - Heat Shimmer)
1334{
1335 bool Validate(SpellInfo const* /*spellInfo*/) override
1336 {
1338 }
1339
1340 bool Load() override
1341 {
1343 }
1344
1345 static void PreventAura(SpellScript const&, WorldObject*& target)
1346 {
1347 target = nullptr;
1348 }
1349
1354};
1355
1356// 37447 - Improved Mana Gems
1357// 61062 - Improved Mana Gems
1359{
1360 bool Validate(SpellInfo const* /*spellInfo*/) override
1361 {
1363 }
1364
1365 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1366 {
1368 eventInfo.GetActor()->CastSpell(nullptr, SPELL_MAGE_MANA_SURGE, true);
1369 }
1370
1375};
1376
1377// 383967 - Improved Combustion (attached to 190319 - Combustion)
1379{
1380 bool Load() override
1381 {
1383 }
1384
1385 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool const& /*canBeRecalculated*/) const
1386 {
1387 if (AuraEffect const* amountHolder = GetEffect(EFFECT_2))
1388 {
1389 int32 critRating = GetUnitOwner()->ToPlayer()->m_activePlayerData->CombatRatings[CR_CRIT_SPELL];
1390 amount = CalculatePct(critRating, amountHolder->GetAmount());
1391 }
1392 }
1393
1394 void UpdatePeriodic(AuraEffect const* aurEff) const
1395 {
1396 if (AuraEffect* bonus = GetEffect(EFFECT_1))
1397 bonus->RecalculateAmount(aurEff);
1398 }
1399
1405};
1406
1407// 383604 - Improved Scorch
1409{
1410 bool Validate(SpellInfo const* /*spellInfo*/) override
1411 {
1413 }
1414
1415 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
1416 {
1417 return eventInfo.GetActionTarget()->HealthBelowPct(aurEff->GetAmount()) || eventInfo.GetActor()->HasAura(SPELL_MAGE_HEAT_SHIMMER);
1418 }
1419
1420 void HandleProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
1421 {
1423 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
1424 .TriggeringAura = aurEff
1425 });
1426 }
1427
1433};
1434
1435// 1463 - Incanter's Flow
1437{
1438 bool Validate(SpellInfo const* /*spellInfo*/) override
1439 {
1441 }
1442
1443 void HandlePeriodicTick(AuraEffect const* /*aurEff*/)
1444 {
1445 // Incanter's flow should not cycle out of combat
1446 if (!GetTarget()->IsInCombat())
1447 return;
1448
1450 {
1451 uint32 stacks = aura->GetStackAmount();
1452
1453 // Force always to values between 1 and 5
1454 if ((modifier == -1 && stacks == 1) || (modifier == 1 && stacks == 5))
1455 {
1456 modifier *= -1;
1457 return;
1458 }
1459
1460 aura->ModStackAmount(modifier);
1461 }
1462 else
1464 }
1465
1470
1471private:
1473};
1474
1475// 44457 - Living Bomb
1494
1495// 44461 - Living Bomb
1520
1521// 217694 - Living Bomb
1523{
1524 bool Validate(SpellInfo const* /*spellInfo*/) override
1525 {
1527 }
1528
1529 void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1530 {
1531 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1532 return;
1533
1534 if (Unit* caster = GetCaster())
1536 }
1537
1542};
1543
1544// 153561 - Meteor
1546{
1547 bool Validate(SpellInfo const* /*spellInfo*/) override
1548 {
1550 }
1551
1559
1564};
1565
1566// 177345 - Meteor
1567// Id - 3467
1569{
1571
1572 void OnRemove() override
1573 {
1574 if (Unit* caster = at->GetCaster())
1575 caster->CastSpell(at->GetPosition(), SPELL_MAGE_METEOR_MISSILE);
1576 }
1577};
1578
1579// 175396 - Meteor Burn
1580// Id - 1712
1582{
1584
1585 void OnUnitEnter(Unit* unit) override
1586 {
1587 if (Unit* caster = at->GetCaster())
1588 if (caster->IsValidAttackTarget(unit))
1590 }
1591
1592 void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
1593 {
1595 }
1596};
1597
1598// 457803 - Molten Fury
1600{
1601 bool Validate(SpellInfo const* /*spellInfo*/) override
1602 {
1604 }
1605
1606 static void HandleEffectProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
1607 {
1608 if (!eventInfo.GetActionTarget()->HealthAbovePct(aurEff->GetAmount()))
1610 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
1611 .TriggeringAura = aurEff
1612 });
1613 else
1615 }
1616
1621};
1622
1624{
1625 NPC_AUROSALIA = 18744
1627
1629// 32826 - Polymorph (Visual)
1631{
1632 static const uint32 PolymorhForms[6];
1633
1634 bool Validate(SpellInfo const* /*spellInfo*/) override
1635 {
1637 }
1638
1639 void HandleDummy(SpellEffIndex /*effIndex*/)
1640 {
1641 if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f))
1642 if (target->GetTypeId() == TYPEID_UNIT)
1643 target->CastSpell(target, PolymorhForms[urand(0, 5)], true);
1644 }
1645
1646 void Register() override
1647 {
1648 // add dummy effect spell handler to Polymorph visual
1650 }
1651};
1652
1662
1663// 235450 - Prismatic Barrier
1665{
1666 bool Validate(SpellInfo const* spellInfo) override
1667 {
1668 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_5 } });
1669 }
1670
1671 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
1672 {
1673 canBeRecalculated = false;
1674 if (Unit* caster = GetCaster())
1675 amount = CalculatePct(caster->GetMaxHealth(), GetEffectInfo(EFFECT_5).CalcValue(caster));
1676 }
1677
1682};
1683
1684// 157642 - Pyrotechnics
1686{
1687 bool Validate(SpellInfo const* /*spellInfo*/) override
1688 {
1690 }
1691
1692 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& procInfo)
1693 {
1694 if (procInfo.GetHitMask() & PROC_HIT_CRITICAL)
1695 {
1698 }
1699 }
1700
1705};
1706
1707// 376103 - Radiant Spark
1709{
1710 bool Validate(SpellInfo const* /*spellInfo*/) override
1711 {
1713 }
1714
1715 bool CheckProc(AuraEffect const* /*aurEff*/, ProcEventInfo& procInfo)
1716 {
1718 }
1719
1720 void HandleProc(AuraEffect* aurEff, ProcEventInfo& procInfo)
1721 {
1722 Aura* vulnerability = procInfo.GetActionTarget()->GetAura(aurEff->GetSpellEffectInfo().TriggerSpell, GetCasterGUID());
1723 if (vulnerability && vulnerability->GetStackAmount() == vulnerability->CalcMaxStackAmount())
1724 {
1726 vulnerability->Remove();
1728 }
1729 }
1730
1736};
1737
1738// 205021 - Ray of Frost
1740{
1741 bool Validate(SpellInfo const* /*spellInfo*/) override
1742 {
1744 }
1745
1747 {
1748 if (Unit* caster = GetCaster())
1750 }
1751
1752 void Register() override
1753 {
1755 }
1756};
1757
1759{
1760 bool Validate(SpellInfo const* /*spellInfo*/) override
1761 {
1763 }
1764
1766 {
1767 if (Unit* caster = GetCaster())
1768 {
1769 if (aurEff->GetTickNumber() > 1) // First tick should deal base damage
1770 caster->CastSpell(caster, SPELL_MAGE_RAY_OF_FROST_BONUS, true);
1771 }
1772 }
1773
1774 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1775 {
1776 if (Unit* caster = GetCaster())
1777 caster->RemoveAurasDueToSpell(SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST);
1778 }
1779
1785};
1786
1787// 136511 - Ring of Frost
1789{
1795
1796 void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
1797 {
1798 if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
1799 GetTarget()->CastSpell(ringOfFrost->GetPosition(), SPELL_MAGE_RING_OF_FROST_FREEZE, true);
1800 }
1801
1802 void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1803 {
1804 std::list<TempSummon*> minions;
1806
1807 // Get the last summoned RoF, save it and despawn older ones
1808 for (TempSummon* summon : minions)
1809 {
1810 if (TempSummon* ringOfFrost = GetRingOfFrostMinion())
1811 {
1812 if (summon->GetTimer() > ringOfFrost->GetTimer())
1813 {
1814 ringOfFrost->DespawnOrUnsummon();
1815 _ringOfFrostGUID = summon->GetGUID();
1816 }
1817 else
1818 summon->DespawnOrUnsummon();
1819 }
1820 else
1821 _ringOfFrostGUID = summon->GetGUID();
1822 }
1823 }
1824
1830
1831private:
1833 {
1835 return creature->ToTempSummon();
1836 return nullptr;
1837 }
1838
1840};
1841
1842// 82691 - Ring of Frost (freeze efect)
1844{
1850
1851 void FilterTargets(std::list<WorldObject*>& targets)
1852 {
1853 WorldLocation const* dest = GetExplTargetDest();
1854 SpellEffectInfo const& spellEffectInfo = sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON, GetCastDifficulty())->GetEffect(EFFECT_2);
1855 SpellRange radius = {
1856 .Min = spellEffectInfo.CalcRadius(nullptr, SpellTargetIndex::TargetA).Max,
1857 .Max = spellEffectInfo.CalcRadius(nullptr, SpellTargetIndex::TargetB).Max
1858 };
1859
1860 targets.remove_if([dest, radius](WorldObject* target)
1861 {
1862 Unit* unit = target->ToUnit();
1863 if (!unit)
1864 return true;
1865 return unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || !unit->IsInRange3d(dest, radius.Min, radius.Max);
1866 });
1867 }
1868
1873};
1874
1894
1895// 450746 - Scald (attached to 2948 - Scorch)
1897{
1898 bool Validate(SpellInfo const* spellInfo) override
1899 {
1901 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
1902 }
1903
1904 bool Load() override
1905 {
1907 }
1908
1909 void CalculateDamage(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* victim, int32& /*damage*/, int32& /*flatMod*/, float& pctMod) const
1910 {
1911 Unit* caster = GetCaster();
1912 if (!victim->HealthBelowPct(GetEffectInfo(EFFECT_1).CalcValue(caster)) || !caster->HasAura(SPELL_MAGE_HEAT_SHIMMER))
1913 return;
1914
1915 if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_MAGE_SCALD, EFFECT_0))
1916 AddPct(pctMod, aurEff->GetAmount());
1917 }
1918
1923};
1924
1925// 2948 - Scorch
1927{
1928 bool Validate(SpellInfo const* /*spellInfo*/) override
1929 {
1931 }
1932
1933 void CalcCritChance(Unit const* victim, float& critChance)
1934 {
1936 critChance = 100.0f;
1937 }
1938
1940 {
1941 Unit* caster = GetCaster();
1942 if (GetHitUnit()->GetHealthPct() < GetEffectInfo(EFFECT_1).CalcValue(GetCaster()) || GetCaster()->HasAura(SPELL_MAGE_HEAT_SHIMMER))
1945 .TriggeringSpell = GetSpell()
1946 });
1947 }
1948
1954};
1955
1956// 451875 - Spontaneous Combustion (attached to 190319 - Combustion)
1958{
1963
1964 bool Load() override
1965 {
1967 }
1968
1969 void HandleCharges() const
1970 {
1971 GetCaster()->GetSpellHistory()->ResetCharges(sSpellMgr->AssertSpellInfo(SPELL_MAGE_FIRE_BLAST, DIFFICULTY_NONE)->ChargeCategoryId);
1973 }
1974
1979};
1980
1981// 157980 - Supernova
1983{
1984 void HandleDamage(SpellEffIndex /*effIndex*/)
1985 {
1986 if (GetExplTargetUnit() == GetHitUnit())
1987 {
1988 int32 damage = GetHitDamage();
1989 AddPct(damage, GetEffectInfo(EFFECT_0).CalcValue());
1990 SetHitDamage(damage);
1991 }
1992 }
1993
1998};
1999
2000// 382289 - Tempest Barrier
2002{
2003 bool Validate(SpellInfo const* /*spellInfo*/) override
2004 {
2006 }
2007
2008 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
2009 {
2011 Unit* target = GetTarget();
2012 SpellEffectValue amount = CalculatePct(target->GetMaxHealth(), aurEff->GetAmount());
2015 .TriggeringAura = aurEff,
2016 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, amount } }
2017 });
2018 }
2019
2024};
2025
2026// 210824 - Touch of the Magi (Aura)
2028{
2029 bool Validate(SpellInfo const* /*spellInfo*/) override
2030 {
2032 }
2033
2034 void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)
2035 {
2036 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
2037 if (damageInfo)
2038 {
2039 if (damageInfo->GetAttacker() == GetCaster() && damageInfo->GetVictim() == GetTarget())
2040 {
2041 SpellEffectValue extra = CalculatePct(damageInfo->GetDamage(), 25);
2042 if (extra > 0)
2043 aurEff->ChangeAmount(aurEff->GetAmount() + extra);
2044 }
2045 }
2046 }
2047
2048 void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
2049 {
2050 SpellEffectValue amount = aurEff->GetAmount();
2051 if (!amount || GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
2052 return;
2053
2054 if (Unit* caster = GetCaster())
2056 }
2057
2063};
2064
2065// 33395 Water Elemental's Freeze
2067{
2068 bool Validate(SpellInfo const* /*spellInfo*/) override
2069 {
2071 }
2072
2074 {
2075 Unit* owner = GetCaster()->GetOwner();
2076 if (!owner)
2077 return;
2078
2079 owner->CastSpell(owner, SPELL_MAGE_FINGERS_OF_FROST, true);
2080 }
2081
2086};
2087
2088// 383493 - Wildfire
2089// 383492 - Wildfire
2091{
2092 bool Validate(SpellInfo const* /*spellInfo*/) override
2093 {
2095 }
2096
2097 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated) const
2098 {
2099 Unit* caster = GetCaster();
2100 if (!caster)
2101 return;
2102
2103 AuraEffect const* wildfireCritEffect = caster->GetAuraEffect(SPELL_MAGE_WILDFIRE_TALENT, _effIndex);
2104 if (!wildfireCritEffect)
2105 return;
2106
2107 canBeRecalculated = false;
2108 amount = wildfireCritEffect->GetAmount();
2109 }
2110
2115
2118
2119public:
2120 explicit spell_mage_wildfire_crit(AuraType auraType, SpellEffIndex effIndex) : _auraType(auraType), _effIndex(effIndex) { }
2121};
2122
2124{
2193}
AreaTriggerExitReason
Definition AreaTrigger.h:70
@ IN_MILLISECONDS
Definition Common.h:38
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
@ DIFFICULTY_NONE
Definition DBCEnums.h:936
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:56
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition Random.cpp:63
bool roll_chance(float chance, PseudoRandomDistributionState &state)
Definition Random.cpp:131
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:43
#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
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_ENERGIZE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ TARGET_UNIT_DEST_AREA_ENEMY
@ TARGET_UNIT_CASTER
@ 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 AuraEffectApplyFn(F, I, N, M)
#define AuraEffectAbsorbOverkillFn(F, I)
#define AuraCheckProcFn(F)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ CR_VERSATILITY_DAMAGE_DONE
Definition Unit.h:359
@ CR_CRIT_SPELL
Definition Unit.h:341
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:461
Unit * GetAttacker() const
Definition Unit.h:460
uint32 GetDamage() const
Definition Unit.h:466
void AddEvent(BasicEvent *event, Milliseconds e_time, bool set_addtime=true)
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
Definition Group.h:209
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:3048
Unit * GetActionTarget() const
Definition Unit.h:514
Spell const * GetProcSpell() const
Definition Unit.h:527
ProcFlagsHit GetHitMask() const
Definition Unit.h:519
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
DamageInfo * GetDamageInfo() const
Definition Unit.h:524
Unit * GetActor() const
Definition Unit.h:513
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:590
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:952
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:647
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:8716
float GetHealthPct() const
Definition Unit.h:808
void SetHealth(uint64 val)
Definition Unit.cpp:10041
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3846
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4622
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:10105
TempSummon * ToTempSummon()
Definition Unit.h:1844
uint64 GetMaxHealth() const
Definition Unit.h:801
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4718
uint64 GetHealth() const
Definition Unit.h:800
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:6165
void GetAllMinionsByEntry(std::list< TempSummon * > &Minions, uint32 entry)
Definition Unit.cpp:6439
bool HealthAbovePct(float pct) const
Definition Unit.h:806
bool HealthBelowPct(float pct) const
Definition Unit.h:804
void NearTeleportTo(TeleportLocation const &target, bool casting=false)
Definition Unit.cpp:13054
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
SpellHistory * GetSpellHistory()
Definition Unit.h:1521
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
Unit * GetOwner() const
Definition Object.cpp:1603
bool IsInBetween(Position const &pos1, Position const &pos2, float size=0) const
Definition Object.cpp:651
EventProcessor m_Events
Definition Object.h:561
bool IsInRange3d(Position const *pos, float minRange, float maxRange) const
Definition Object.cpp:633
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:430
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 &absorbAmount)
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