TrinityCore
Loading...
Searching...
No Matches
spell_warlock.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_WARLOCK and SPELLFAMILY_GENERIC spells used by warlock players.
20 * Ordered alphabetically using scriptname.
21 * Scriptnames of files in this file should be prefixed with "spell_warl_".
22 */
23
24#include "ScriptMgr.h"
25#include "Creature.h"
26#include "GameObject.h"
27#include "Log.h"
28#include "ObjectMgr.h"
29#include "Optional.h"
30#include "Player.h"
31#include "Random.h"
32#include "SpellAuraEffects.h"
33#include "SpellMgr.h"
34#include "SpellScript.h"
35
37{
96};
97
104
105// -980 - Curse of Agony
107{
109
110 void ApplyEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
111 {
112 _tick_amount = aurEff->GetAmount();
113 }
114
116 {
117 switch (aurEff->GetTickNumber())
118 {
119 // 1..4 ticks, 1/2 from normal tick damage
120 case 1:
121 aurEff->SetAmount(_tick_amount / 2);
122 break;
123 // 5..8 ticks have normal tick damage
124 case 5:
125 aurEff->SetAmount(_tick_amount);
126 break;
127 // 9..12 ticks, 3/2 from normal tick damage
128 case 9:
129 aurEff->SetAmount((_tick_amount + 1) * 3 / 2); // +1 prevent 0.5 damage possible lost at 1..4 ticks
130 break;
131 // 13 and 14 ticks (glyphed only), twice normal tick damage
132 case 13:
133 aurEff->SetAmount(_tick_amount * 2);
134 break;
135 }
136 }
137
143private:
145};
146
147// -710 - Banish
149{
151
152public:
154
155private:
157 {
158 if (missInfo != SPELL_MISS_IMMUNE)
159 return;
160
161 if (Unit* target = GetHitUnit())
162 {
163 // Casting Banish on a banished target will remove applied aura
164 if (Aura * banishAura = target->GetAura(GetSpellInfo()->Id, GetCaster()->GetGUID()))
165 banishAura->Remove();
166 }
167 }
168
173};
174
175// -6201 - Create Healthstone (and ranks)
177{
178 public:
179 spell_warl_create_healthstone() : SpellScriptLoader("spell_warl_create_healthstone") { }
180
182 {
184
185 static uint32 const iTypes[8][3];
186
191
193 {
194 if (Player* caster = GetCaster()->ToPlayer())
195 {
196 uint8 spellRank = GetSpellInfo()->GetRank();
197 ItemPosCountVec dest;
198 InventoryResult msg = caster->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, iTypes[spellRank - 1][0], 1, nullptr);
199 if (msg != EQUIP_ERR_OK)
201 }
202 return SPELL_CAST_OK;
203 }
204
206 {
207 if (Unit* unitTarget = GetHitUnit())
208 {
209 uint32 rank = 0;
210 // Improved Healthstone
211 if (AuraEffect const* aurEff = unitTarget->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, 284, 0))
212 {
213 switch (aurEff->GetId())
214 {
216 rank = 1;
217 break;
219 rank = 2;
220 break;
221 default:
222 TC_LOG_ERROR("spells", "Unknown rank of Improved Healthstone id: {}", aurEff->GetId());
223 break;
224 }
225 }
226 uint8 spellRank = GetSpellInfo()->GetRank();
227 if (spellRank > 0 && spellRank <= 8)
228 CreateItem(iTypes[spellRank - 1][rank]);
229 }
230 }
231
237 };
238
239 SpellScript* GetSpellScript() const override
240 {
242 }
243};
244
246 { 5512, 19004, 19005}, // Minor Healthstone
247 { 5511, 19006, 19007}, // Lesser Healthstone
248 { 5509, 19008, 19009}, // Healthstone
249 { 5510, 19010, 19011}, // Greater Healthstone
250 { 9421, 19012, 19013}, // Major Healthstone
251 {22103, 22104, 22105}, // Master Healthstone
252 {36889, 36890, 36891}, // Demonic Healthstone
253 {36892, 36893, 36894} // Fel Healthstone
254};
255
256// -603 - Curse of Doom
258{
260
261 bool Validate(SpellInfo const* /*spellInfo*/) override
262 {
264 }
265
266 bool Load() override
267 {
268 return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER;
269 }
270
271 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
272 {
273 if (!GetCaster())
274 return;
275
277 if (removeMode != AURA_REMOVE_BY_DEATH || !IsExpired())
278 return;
279
280 if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget()))
282 }
283
288};
289
290// -63156 - Decimation
292{
294
295 bool CheckProc(ProcEventInfo& eventInfo)
296 {
297 if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo())
298 if (eventInfo.GetActionTarget()->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellInfo, eventInfo.GetActor()))
299 return true;
300
301 return false;
302 }
303
308};
309
310// 48018 - Demonic Circle: Summon
312{
314
315 void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode)
316 {
317 // If effect is removed by expire remove the summoned demonic circle too.
318 if (!(mode & AURA_EFFECT_HANDLE_REAPPLY))
319 GetTarget()->RemoveGameObject(GetId(), true);
320
322 }
323
324 void HandleDummyTick(AuraEffect const* /*aurEff*/)
325 {
326 if (GameObject* circle = GetTarget()->GetGameObject(GetId()))
327 {
328 // Here we check if player is in demonic circle teleport range, if so add
329 // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT.
330 // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST.
331
332 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT);
333
334 if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true)))
335 {
338 }
339 else
341 }
342 }
343
349};
350
351// 48020 - Demonic Circle: Teleport
353{
355
356 void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
357 {
358 if (Player* player = GetTarget()->ToPlayer())
359 {
360 if (GameObject* circle = player->GetGameObject(SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON))
361 {
362 player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation());
363 player->RemoveMovementImpairingAuras(false);
364 }
365 }
366 }
367
372};
373
374// 47193 - Demonic Empowerment
376{
378
390
392 {
393 if (Creature* targetCreature = GetHitCreature())
394 {
395 if (targetCreature->IsPet())
396 {
397 CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry());
398 ASSERT(ci);
399 switch (ci->family)
400 {
402 targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, true);
403 break;
405 {
406 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER);
407 int32 hp = targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(spellInfo->GetEffect(EFFECT_0)));
409 args.AddSpellBP0(hp);
410 targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, args);
411 //unitTarget->CastSpell(unitTarget, 54441, true);
412 break;
413 }
415 targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, true);
416 break;
418 targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, true);
419 break;
421 targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP, true);
422 break;
423 default:
424 break;
425 }
426 }
427 }
428 }
429
434};
435
436// -1120 - Drain Soul
438{
440
452
453 bool CheckProc(ProcEventInfo& eventInfo)
454 {
455 // Drain Soul's proc tries to happen each time the warlock lands a killing blow on a unit while channeling.
456 // Make sure that dying unit is afflicted by the caster's Drain Soul debuff in order to avoid a false positive.
457
458 Unit* caster = eventInfo.GetActor();
459 Unit* victim = eventInfo.GetActionTarget();
461 }
462
463 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
464 {
466
467 Unit* caster = eventInfo.GetActor();
468 // Improved Drain Soul
469 Aura const* impDrainSoul = caster->GetAuraOfRankedSpell(SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, caster->GetGUID());
470 if (!impDrainSoul)
471 return;
472
473 int32 amount = CalculatePct(caster->GetMaxPower(POWER_MANA), impDrainSoul->GetSpellInfo()->GetEffect(EFFECT_2).CalcValue());
474 CastSpellExtraArgs args(aurEff);
475 args.AddSpellBP0(amount);
477 }
478
479 void HandleTick(AuraEffect const* aurEff)
480 {
481 Unit* caster = GetCaster();
482 Unit* target = GetTarget();
483 if (caster && caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target))
484 {
485 if (roll_chance_i(20))
486 {
487 caster->CastSpell(caster, SPELL_WARLOCK_CREATE_SOULSHARD, aurEff);
488 // Glyph of Drain Soul - chance to create an additional Soul Shard
490 if (roll_chance_i(aur->GetMiscValue()))
492 }
493 }
494 }
495
502};
503
504// 47422 - Everlasting Affliction
506{
508
510 {
511 Unit* caster = GetCaster();
512 if (Unit* target = GetHitUnit())
513 {
514 // Refresh corruption on target
515 if (AuraEffect* aur = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, caster->GetGUID()))
516 {
517 aur->ChangeAmount(aur->CalculateAmount(aur->GetCaster()), false);
518 aur->CalculatePeriodic(caster, false, false);
519 aur->GetBase()->RefreshDuration(true);
520 }
521 }
522 }
523
528};
529
530// -47230 - Fel Synergy
532{
534
535 bool Validate(SpellInfo const* /*spellInfo*/) override
536 {
538 }
539
540 bool CheckProc(ProcEventInfo& eventInfo)
541 {
542 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
543 if (!damageInfo || !damageInfo->GetDamage())
544 return false;
545
546 return GetTarget()->GetGuardianPet() != nullptr;
547 }
548
549 void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
550 {
552
553 int32 heal = CalculatePct(static_cast<int32>(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
554 CastSpellExtraArgs args(aurEff);
555 args.AddSpellBP0(heal);
556 GetTarget()->CastSpell(nullptr, SPELL_WARLOCK_FEL_SYNERGY_HEAL, args); // TARGET_UNIT_PET
557 }
558
564};
565
566// -18094 - Nightfall
567// 56218 - Glyph of Corruption
569{
571
572 bool Validate(SpellInfo const* /*spellInfo*/) override
573 {
575 }
576
577 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
578 {
580 Unit* caster = eventInfo.GetActor();
581 caster->CastSpell(caster, SPELL_WARLOCK_SHADOW_TRANCE, aurEff);
582 }
583
588};
589
590// 63320 - Glyph of Life Tap
592{
594
595 bool Validate(SpellInfo const* /*spellInfo*/) override
596 {
598 }
599
600 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
601 {
603 Unit* caster = eventInfo.GetActor();
605 }
606
611};
612
613// 63310 - Glyph of Shadowflame
634
635// -48181 - Haunt
637{
639
641 {
642 if (Aura* aura = GetHitAura())
643 if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1))
644 aurEff->SetAmount(CalculatePct(GetHitDamage(), aurEff->GetAmount()));
645 }
646
647 void Register() override
648 {
650 }
651};
652
654{
656
657 bool Validate(SpellInfo const* /*spellInfo*/) override
658 {
660 }
661
662 void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
663 {
664 if (Unit* caster = GetCaster())
665 {
666 CastSpellExtraArgs args(aurEff);
668 args.AddSpellBP0(aurEff->GetAmount());
670 }
671 }
672
677};
678
679// -755 - Health Funnel
710
711// -1454 - Life Tap
713{
715
716 bool Load() override
717 {
718 return GetCaster()->GetTypeId() == TYPEID_PLAYER;
719 }
720
721 bool Validate(SpellInfo const* /*spellInfo*/) override
722 {
724 }
725
727 {
728 Unit* caster = GetCaster();
729 int32 base = GetEffectInfo(effIndex).CalcValue();
730
732 float fmana = (float)base + caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + AsUnderlyingType(SPELL_SCHOOL_SHADOW)) * 0.5f * penalty;
733
734 // Improved Life Tap mod
736 AddPct(fmana, aurEff->GetAmount());
737 int32 mana = round(fmana);
738
739 // Shouldn't Appear in Combat Log
740 caster->ModifyHealth(-base);
741
743 args.AddSpellBP0(mana);
744 caster->CastSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, args);
745
746 // Mana Feed
747 int32 manaFeedVal = 0;
749 manaFeedVal = aurEff->GetAmount();
750
751 if (manaFeedVal > 0)
752 {
753 ApplyPct(manaFeedVal, mana);
755 manaFeedArgs.AddSpellBP0(manaFeedVal);
756 caster->CastSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, manaFeedArgs);
757 }
758 }
759
761 {
762 if (int32(GetCaster()->GetHealth()) > int32(GetEffectInfo(EFFECT_0).CalcValue()))
763 return SPELL_CAST_OK;
764 return SPELL_FAILED_FIZZLE;
765 }
766
772};
773
774// -30299 - Nether Protection
776{
778
791
792 bool CheckProc(ProcEventInfo& eventInfo)
793 {
794 if (DamageInfo* damageInfo = eventInfo.GetDamageInfo())
795 {
796 switch (GetFirstSchoolInMask(damageInfo->GetSchoolMask()))
797 {
804 return true;
805 default:
806 break;
807 }
808 }
809
810 return false;
811 }
812
813 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
814 {
816 uint32 triggerspell = 0;
817
818 switch (GetFirstSchoolInMask(eventInfo.GetDamageInfo()->GetSchoolMask()))
819 {
822 break;
825 break;
828 break;
831 break;
834 break;
837 break;
838 default:
839 return;
840 }
841
842 if (Unit* target = eventInfo.GetActionTarget())
843 target->CastSpell(target, triggerspell, aurEff);
844 }
845
851};
852
853// 54909, 53646 - Demonic Pact
855{
857
858 bool Validate(SpellInfo const* /*spellInfo*/) override
859 {
861 }
862
863 bool CheckProc(ProcEventInfo& eventInfo)
864 {
865 return eventInfo.GetActor() && eventInfo.GetActor()->IsPet();
866 }
867
868 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
869 {
871
872 if (Unit* owner = eventInfo.GetActor()->GetOwner())
873 {
874 if (AuraEffect* aurEff = owner->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_DEMONIC_PACT, EFFECT_0))
875 {
876 int32 bp = static_cast<int32>((aurEff->GetAmount() * owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) + 100.0f) / 100.0f);
877 CastSpellExtraArgs args(aurEff);
878 args.AddSpellBP0(bp);
880 owner->CastSpell(nullptr, SPELL_WARLOCK_DEMONIC_PACT_PROC, args);
881 }
882 }
883 }
884
890};
891
892// 18541 - Ritual of Doom Effect
908
909// 34145, 58888 - Ritual of Souls Rank X - Trigger Create Soulwell
911{
913
914 bool Validate(SpellInfo const* /*spellInfo*/) override
915 {
917 }
918
919 void HandleScript(SpellEffIndex /*effIndex*/)
920 {
921 Unit* caster = GetCaster();
922 uint32 spellId = _createSoulwellSpellIds[0];
924 spellId = _createSoulwellSpellIds[2];
926 spellId = _createSoulwellSpellIds[1];
927
928 caster->CastSpell(caster, spellId, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetOriginalCaster(Object::GetGUID(GetOriginalCaster())));
929 }
930
935
936 std::array<uint32, 3> _createSoulwellSpellIds;
937
938public:
939 spell_warl_ritual_of_souls(std::array<uint32, 3> createSoulwellSpellIds) : _createSoulwellSpellIds(createSoulwellSpellIds) { }
940};
941
942// 6358 - Seduction
944{
946
947 bool Validate(SpellInfo const* /*spellInfo*/) override
948 {
950 }
951
952 void HandleDummy(SpellEffIndex /*effIndex*/)
953 {
954 Unit* owner = GetCaster()->GetOwner();
955 if (!owner || !owner->HasAura(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS))
956 return;
957
958 Unit* target = GetHitUnit();
959 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
962 }
963
968};
969
970// -27285 - Seed of Corruption
972{
974
975 void FilterTargets(std::list<WorldObject*>& targets)
976 {
977 targets.remove_if([&](WorldObject const* target)
978 {
979 if (Unit const* unitTarget = target->ToUnit())
980 if (WorldLocation const* dest = GetExplTargetDest())
981 if (!unitTarget->IsWithinLOS(dest->GetPositionX(), dest->GetPositionY(), dest->GetPositionZ()))
982 return true;
983
984 return false;
985 });
986 }
987
992};
993
994// -27243 - Seed of Corruption
996{
998
999 bool Validate(SpellInfo const* /*spellInfo*/) override
1000 {
1002 }
1003
1004 void CalculateBuffer(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/)
1005 {
1006 Unit* caster = GetCaster();
1007 if (!caster)
1008 return;
1009
1010 // effect 1 scales with 14% of caster's SP (DBC data)
1011 amount = caster->SpellDamageBonusDone(GetUnitOwner(), GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE, aurEff->GetSpellEffectInfo(), GetAura()->GetDonePct());
1012 }
1013
1014 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
1015 {
1017 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
1018 if (!damageInfo || !damageInfo->GetDamage())
1019 return;
1020
1021 int32 amount = aurEff->GetAmount() - damageInfo->GetDamage();
1022 if (amount > 0)
1023 {
1024 const_cast<AuraEffect*>(aurEff)->SetAmount(amount);
1025 if (!GetTarget()->HealthBelowPctDamaged(1, damageInfo->GetDamage()))
1026 return;
1027 }
1028
1029 Remove();
1030
1031 Unit* caster = GetCaster();
1032 if (!caster)
1033 return;
1034
1035 uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1, GetSpellInfo()->GetRank());
1036 caster->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff);
1037 }
1038
1044};
1045
1046// 32863 - Seed of Corruption
1047// 36123 - Seed of Corruption
1048// 38252 - Seed of Corruption
1049// 39367 - Seed of Corruption
1050// 44141 - Seed of Corruption
1051// 70388 - Seed of Corruption
1052// Monster spells, triggered only on amount drop (not on death)
1054{
1056
1057 bool Validate(SpellInfo const* /*spellInfo*/) override
1058 {
1060 }
1061
1062 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
1063 {
1065 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
1066 if (!damageInfo || !damageInfo->GetDamage())
1067 return;
1068
1069 int32 amount = aurEff->GetAmount() - damageInfo->GetDamage();
1070 if (amount > 0)
1071 {
1072 const_cast<AuraEffect*>(aurEff)->SetAmount(amount);
1073 return;
1074 }
1075
1076 Remove();
1077
1078 Unit* caster = GetCaster();
1079 if (!caster)
1080 return;
1081
1083 }
1084
1089};
1090
1091// -6229 - Shadow Ward
1093{
1095
1096 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
1097 {
1098 canBeRecalculated = false;
1099 if (Unit* caster = GetCaster())
1100 {
1101 // +80.68% from sp bonus
1102 float bonus = 0.8068f;
1103
1104 bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask());
1105 bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo());
1106
1107 amount += int32(bonus);
1108 }
1109 }
1110
1115};
1116
1117// 63108 - Siphon Life
1119{
1121
1122 bool Validate(SpellInfo const* /*spellInfo*/) override
1123 {
1124 return ValidateSpellInfo(
1125 {
1128 });
1129 }
1130
1131 bool CheckProc(ProcEventInfo& eventInfo)
1132 {
1133 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
1134 if (!damageInfo || !damageInfo->GetDamage())
1135 return false;
1136
1137 return GetTarget()->IsAlive();
1138 }
1139
1140 void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
1141 {
1143
1144 int32 amount = CalculatePct(static_cast<int32>(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
1145 // Glyph of Siphon Life
1146 if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0))
1147 AddPct(amount, glyph->GetAmount());
1148
1149 CastSpellExtraArgs args(aurEff);
1150 args.AddSpellBP0(amount);
1152 }
1153
1159};
1160
1161// -30293 - Soul Leech
1163{
1165
1179
1180 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
1181 {
1184
1186 DamageInfo* damageInfo = eventInfo.GetDamageInfo();
1187 if (!damageInfo || !damageInfo->GetDamage())
1188 return;
1189
1190 Unit* caster = eventInfo.GetActor();
1192 args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount()));
1193 caster->CastSpell(caster, SPELL_WARLOCK_SOUL_LEECH_HEAL, args);
1194
1195 // Improved Soul Leech code below
1197 if (!impSoulLeech)
1198 return;
1199
1200 uint8 impSoulLeechRank = impSoulLeech->GetSpellInfo()->GetRank();
1201 uint32 selfSpellId = casterMana[impSoulLeechRank - 1];
1202 uint32 petSpellId = petMana[impSoulLeechRank - 1];
1203
1204 caster->CastSpell(nullptr, selfSpellId, aurEff);
1205 caster->CastSpell(nullptr, petSpellId, aurEff);
1206
1207 if (roll_chance_i(impSoulLeech->GetAmount()))
1208 caster->CastSpell(nullptr, SPELL_REPLENISHMENT, aurEff);
1209 }
1210
1215};
1216
1217// 29858 - Soulshatter
1219{
1221
1222 bool Validate(SpellInfo const* /*spellInfo*/) override
1223 {
1225 }
1226
1227 void HandleDummy(SpellEffIndex /*effIndex*/)
1228 {
1229 Unit* caster = GetCaster();
1230 if (Unit* target = GetHitUnit())
1231 if (target->GetThreatManager().IsThreatenedBy(caster, true))
1232 caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER_EFFECT, true);
1233 }
1234
1239};
1240
1241// 37377 - Shadowflame
1242// 39437 - Shadowflame Hellfire and RoF
1243template <uint32 TriggerSpellId>
1245{
1247
1248 bool Validate(SpellInfo const* /*spellInfo*/) override
1249 {
1250 return ValidateSpellInfo({ TriggerSpellId });
1251 }
1252
1253 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
1254 {
1256 Unit* caster = eventInfo.GetActor();
1257 caster->CastSpell(caster, TriggerSpellId, aurEff);
1258 }
1259
1264};
1265
1266// -30108 - Unstable Affliction
1268{
1270
1271 bool Validate(SpellInfo const* /*spellInfo*/) override
1272 {
1274 }
1275
1276 void HandleDispel(DispelInfo* dispelInfo)
1277 {
1278 if (Unit* caster = GetCaster())
1279 {
1280 if (AuraEffect const* aurEff = GetEffect(EFFECT_0))
1281 {
1282 if (Unit* target = dispelInfo->GetDispeller()->ToUnit())
1283 {
1284 int32 bp = aurEff->GetAmount();
1285 bp = target->SpellDamageBonusTaken(caster, aurEff->GetSpellInfo(), bp, DOT);
1286 bp *= 9;
1287
1288 // backfire damage and silence
1289 CastSpellExtraArgs args(aurEff);
1290 args.AddSpellBP0(bp);
1291 caster->CastSpell(target, SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, args);
1292 }
1293 }
1294 }
1295 }
1296
1301};
1302
1304{
1338}
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
#define ASSERT
Definition Errors.h:68
InventoryResult
Definition ItemDefines.h:25
@ EQUIP_ERR_OK
Definition ItemDefines.h:26
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
#define sObjectMgr
Definition ObjectMgr.h:1721
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:624
bool roll_chance_i(int chance)
Definition Random.h:59
if(posix_memalign(&__mallocedMemory, __align, __size)) return NULL
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition ScriptMgr.h:1130
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1127
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_SCHOOL_SHADOW
@ SPELL_SCHOOL_NATURE
@ SPELL_SCHOOL_FROST
@ SPELL_SCHOOL_ARCANE
@ SPELL_SCHOOL_FIRE
@ SPELL_SCHOOL_HOLY
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_APPLY_AURA
@ TARGET_UNIT_DEST_AREA_ENEMY
@ CREATURE_FAMILY_FELGUARD
@ CREATURE_FAMILY_IMP
@ CREATURE_FAMILY_VOIDWALKER
@ CREATURE_FAMILY_FELHUNTER
@ CREATURE_FAMILY_SUCCUBUS
@ SPELL_SCHOOL_MASK_MAGIC
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
@ SPELLFAMILY_WARLOCK
@ POWER_MANA
SpellMissInfo
@ SPELL_MISS_IMMUNE
@ AURA_STATE_HEALTHLESS_35_PERCENT
SpellCastResult
@ SPELL_FAILED_TOO_MANY_OF_ITEM
@ SPELL_FAILED_FIZZLE
@ SPELL_CAST_OK
AuraRemoveMode
@ AURA_REMOVE_BY_DEATH
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK
@ AURA_EFFECT_HANDLE_REAPPLY
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_ADD_FLAT_MODIFIER
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MECHANIC_IMMUNITY
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_PERIODIC_LEECH
@ SPELL_AURA_PERIODIC_DUMMY
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_BASE_POINT1
#define sSpellMgr
Definition SpellMgr.h:738
#define BeforeSpellHitFn(F)
#define SpellCheckCastFn(F)
#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 AuraEffectUpdatePeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckProcFn(F)
#define SpellHitFn(F)
#define AuraDispelFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ NULL_BAG
Definition Unit.h:61
@ NULL_SLOT
Definition Unit.h:62
@ DOT
Definition Unit.h:355
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:354
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
T AddPct(T &base, U pct)
Definition Util.h:77
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:554
T ApplyPct(T &base, U pct)
Definition Util.h:83
T CalculatePct(T base, U pct)
Definition Util.h:71
AuraRemoveMode GetRemoveMode() const
Definition SpellAuras.h:80
uint32 GetTickNumber() const
SpellInfo const * GetSpellInfo() const
SpellEffectInfo const & GetSpellEffectInfo() const
void SetAmount(int32 amount)
ObjectGuid GetCasterGUID() const
int32 GetAmount() const
void PreventDefaultAction()
bool IsExpired() const
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
HookList< EffectApplyHandler > AfterEffectApply
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
Unit * GetCaster() const
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
AuraEffect * GetEffect(uint8 effIndex) const
Aura * GetAura() const
Unit * GetTarget() const
ObjectGuid GetCasterGUID() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
HookList< AuraDispelHandler > AfterDispel
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
HookList< AuraProcHandler > OnProc
HookList< EffectApplyHandler > OnEffectApply
uint32 GetId() const
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:115
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:461
uint32 GetDamage() const
Definition Unit.h:464
WorldObject * GetDispeller() const
Definition Unit.h:404
static ObjectGuid const Empty
Definition ObjectGuid.h:140
static Unit * ToUnit(Object *o)
Definition Object.h:192
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:249
TypeID GetTypeId() const
Definition Object.h:93
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
ObjectGuid GetGUID() const
Definition Object.h:79
static Player * ToPlayer(Object *o)
Definition Object.h:180
bool isHonorOrXPTarget(Unit const *victim) const
Definition Player.cpp:23573
Unit * GetActionTarget() const
Definition Unit.h:509
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:268
Unit * GetActor()
Definition Unit.h:508
DamageInfo * GetDamageInfo() const
Definition Unit.h:519
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr) const
float GetMaxRange(bool positive=false, WorldObject *caster=nullptr, Spell *spell=nullptr) const
uint8 GetRank() const
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:483
HookList< CheckCastHandler > OnCheckCast
Creature * GetHitCreature() const
int32 GetHitDamage() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
int32 GetEffectValue() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Aura * GetHitAura(bool dynObjAura=false) const
HookList< EffectHandler > OnEffectLaunchTarget
HookList< BeforeHitHandler > BeforeHit
void CreateItem(uint32 itemId)
WorldLocation const * GetExplTargetDest() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Unit * GetOriginalCaster() const
Definition Unit.h:769
int32 ModifyHealth(int32 val)
Definition Unit.cpp:8381
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3765
void RemoveGameObject(GameObject *gameObj, bool del)
Definition Unit.cpp:5111
float CalculateSpellpowerCoefficientLevelPenalty(SpellInfo const *spellInfo) const
Definition Unit.cpp:2326
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4439
Aura * GetAuraOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4457
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3638
bool IsPet() const
Definition Unit.h:884
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4359
bool IsAlive() const
Definition Unit.h:1234
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
uint32 SpellDamageBonusDone(Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const &spellEffectInfo, Optional< float > const &donePctTotal, uint32 stack=1) const
Definition Unit.cpp:6453
uint32 GetMaxPower(Powers power) const
Definition Unit.h:936
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:5815
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4373
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:4445
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:918
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition Unit.cpp:4415
Guardian * GetGuardianPet() const
Definition Unit.cpp:5894
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
Unit * GetOwner() const
Definition Object.cpp:2180
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
PrepareSpellScript(spell_warl_banish)
void HandleBanish(SpellMissInfo missInfo)
void Register() override
SpellScript * GetSpellScript() const override
PrepareAuraScript(spell_warl_curse_of_agony)
void ApplyEffect(AuraEffect const *aurEff, AuraEffectHandleModes)
void HandleEffectPeriodicUpdate(AuraEffect *aurEff)
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
PrepareAuraScript(spell_warl_curse_of_doom)
bool Validate(SpellInfo const *) override
void Register() override
PrepareAuraScript(spell_warl_decimation)
bool CheckProc(ProcEventInfo &eventInfo)
PrepareAuraScript(spell_warl_demonic_circle_summon)
void HandleRemove(AuraEffect const *, AuraEffectHandleModes mode)
void HandleDummyTick(AuraEffect const *)
PrepareAuraScript(spell_warl_demonic_circle_teleport)
void HandleTeleport(AuraEffect const *, AuraEffectHandleModes)
void HandleScriptEffect(SpellEffIndex)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_warl_demonic_empowerment)
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo &eventInfo)
PrepareAuraScript(spell_warl_demonic_pact)
void HandleProc(AuraEffect const *, ProcEventInfo &eventInfo)
void Register() override
bool CheckProc(ProcEventInfo &eventInfo)
void HandleTick(AuraEffect const *aurEff)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_warl_drain_soul)
PrepareSpellScript(spell_warl_everlasting_affliction)
bool Validate(SpellInfo const *) override
bool CheckProc(ProcEventInfo &eventInfo)
PrepareAuraScript(spell_warl_fel_synergy)
void OnProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_warl_glyph_of_corruption_nightfall)
PrepareAuraScript(spell_warl_glyph_of_life_tap)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_warl_glyph_of_shadowflame)
void HandleRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
void Register() override
PrepareAuraScript(spell_warl_haunt_aura)
bool Validate(SpellInfo const *) override
void Register() override
PrepareSpellScript(spell_warl_haunt)
void ApplyEffect(AuraEffect const *, AuraEffectHandleModes)
void RemoveEffect(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_warl_health_funnel)
void HandleDummy(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
SpellCastResult CheckCast()
void Register() override
PrepareSpellScript(spell_warl_life_tap)
bool Load() override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_warl_nether_protection)
bool CheckProc(ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_warl_ritual_of_doom_effect)
PrepareSpellScript(spell_warl_ritual_of_souls)
bool Validate(SpellInfo const *) override
spell_warl_ritual_of_souls(std::array< uint32, 3 > createSoulwellSpellIds)
std::array< uint32, 3 > _createSoulwellSpellIds
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
void HandleDummy(SpellEffIndex)
PrepareSpellScript(spell_warl_seduction)
void Register() override
PrepareAuraScript(spell_warl_seed_of_corruption_dummy)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
void CalculateBuffer(AuraEffect const *aurEff, int32 &amount, bool &)
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_warl_seed_of_corruption_generic)
void FilterTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_warl_seed_of_corruption)
PrepareAuraScript(spell_warl_shadow_ward)
void CalculateAmount(AuraEffect const *, int32 &amount, bool &canBeRecalculated)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_warl_siphon_life)
void OnProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool CheckProc(ProcEventInfo &eventInfo)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
bool Validate(SpellInfo const *) override
PrepareAuraScript(spell_warl_soul_leech)
void HandleDummy(SpellEffIndex)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_warl_soulshatter)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_warl_t4_2p_bonus)
bool Validate(SpellInfo const *) override
void HandleDispel(DispelInfo *dispelInfo)
PrepareAuraScript(spell_warl_unstable_affliction)
bool Validate(SpellInfo const *) override
void AddSC_warlock_spell_scripts()
@ SPELL_WARLOCK_HAUNT_HEAL
@ SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT
@ SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT
@ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS
@ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2
@ SPELL_WARLOCK_SIPHON_LIFE_HEAL
@ SPELL_WARLOCK_NETHER_PROTECTION_FIRE
@ SPELL_WARLOCK_SHADOWFLAME
@ SPELL_WARLOCK_CREATE_SOULWELL_R2
@ SPELL_WARLOCK_NETHER_PROTECTION_ARCANE
@ SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2
@ SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED
@ SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1
@ SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1
@ SPELL_WARLOCK_IMP_SOUL_LEECH_R1
@ SPELL_WARLOCK_DEMONIC_PACT_PROC
@ SPELL_WARLOCK_NETHER_PROTECTION_FROST
@ SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON
@ SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1
@ SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC
@ SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA
@ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1
@ SPELL_WARLOCK_SHADOW_TRANCE
@ SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2
@ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD
@ SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2
@ SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC
@ SPELL_WARLOCK_HAUNT
@ SPELL_WARLOCK_DRAIN_SOUL_R1
@ SPELL_WARLOCK_CREATE_SOULWELL_R1_IMP_HS_R1
@ SPELL_WARLOCK_SOULSHATTER_EFFECT
@ SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1
@ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER
@ SPELL_WARLOCK_FEL_SYNERGY_HEAL
@ SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC
@ SPELL_WARLOCK_LIFE_TAP_ENERGIZE
@ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER
@ SPELL_WARLOCK_SOUL_LEECH_HEAL
@ SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST
@ SPELL_WARLOCK_CREATE_SOULSHARD
@ SPELL_WARLOCK_CREATE_SOULWELL_R1
@ SPELL_WARLOCK_GLYPH_OF_SUCCUBUS
@ SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME
@ SPELL_REPLENISHMENT
@ SPELL_WARLOCK_FLAMESHADOW
@ SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R1
@ SPELL_WARLOCK_CREATE_SOULWELL_R2_IMP_HS_R1
@ SPELL_WARLOCK_NETHER_PROTECTION_NATURE
@ SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE
@ SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL
@ SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP
@ SPELL_WARLOCK_CREATE_SOULWELL_R1_IMP_HS_R2
@ SPELL_WARLOCK_NETHER_PROTECTION_HOLY
@ SPELL_WARLOCK_IMPROVED_HEALTHSTONE_R2
@ SPELL_WARLOCK_NETHER_PROTECTION_SHADOW
@ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2
@ SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1
@ SPELL_WARLOCK_CREATE_SOULWELL_R2_IMP_HS_R2
WarlockSpellIcons
@ WARLOCK_ICON_ID_MANA_FEED
@ WARLOCK_ICON_ID_IMPROVED_LIFE_TAP
@ WARLOCK_ICON_ID_DEMONIC_PACT
CastSpellExtraArgs & AddSpellBP0(int32 val)
CastSpellExtraArgs & AddSpellMod(SpellValueMod mod, int32 val)
ObjectGuid OriginalCaster
CreatureFamily family