Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
spell_item.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/*
7 * Scripts for spells with SPELLFAMILY_GENERIC spells used by items.
8 * Ordered alphabetically using scriptname.
9 * Scriptnames of files in this file should be prefixed with "spell_item_".
10 */
11
12#include "Player.h"
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "SpellScript.h"
16#include "SpellAuraEffects.h"
17#include "SkillDiscovery.h"
18#include "Battleground.h"
19
20// Generic script for handling item dummy effects which trigger another spell.
22{
23 private:
25
26 public:
27 spell_item_trigger_spell(const char* name, uint32 triggeredSpellId) : SpellScriptLoader(name), _triggeredSpellId(triggeredSpellId) { }
28
30 {
32 private:
34
35 public:
36 spell_item_trigger_spell_SpellScript(uint32 triggeredSpellId) : SpellScript(), _triggeredSpellId(triggeredSpellId) { }
37
38 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
39 {
40 if (!sSpellMgr->GetSpellInfo(_triggeredSpellId))
41 return false;
42 return true;
43 }
44
45 void HandleDummy(SpellEffIndex /*effIndex*/)
46 {
47 Unit* caster = GetCaster();
48 if (Item* item = GetCastItem())
49 caster->CastSpell(caster, _triggeredSpellId, true, item);
50 }
51
56 };
57
62};
63
68
69// 23780 - Aegis of Preservation
71{
72 public:
73 spell_item_aegis_of_preservation() : SpellScriptLoader("spell_item_aegis_of_preservation") { }
74
97
102};
103
104// 26400 - Arcane Shroud
106{
107 public:
108 spell_item_arcane_shroud() : SpellScriptLoader("spell_item_arcane_shroud") { }
109
111 {
113
114 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
115 {
116 int32 diff = GetUnitOwner()->getLevel() - 60;
117 if (diff > 0)
118 amount += 2 * diff;
119 }
120
125 };
126
131};
132
133// 64411 - Blessing of Ancient Kings (Val'anyr, Hammer of Ancient Kings)
138
140{
141 public:
142 spell_item_blessing_of_ancient_kings() : SpellScriptLoader("spell_item_blessing_of_ancient_kings") { }
143
145 {
147
148 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
149 {
151 return false;
152 return true;
153 }
154
155 bool CheckProc(ProcEventInfo& eventInfo)
156 {
157 return eventInfo.GetProcTarget();
158 }
159
160 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
161 {
163
164 int32 absorb = int32(CalculatePct(eventInfo.GetHealInfo()->GetHeal(), 15.0f));
165 if (AuraEffect* protEff = eventInfo.GetProcTarget()->GetAuraEffect(SPELL_PROTECTION_OF_ANCIENT_KINGS, 0, eventInfo.GetActor()->GetGUID()))
166 {
167 // The shield can grow to a maximum size of 20,000 damage absorbtion
168 protEff->SetAmount(std::min<int32>(protEff->GetAmount() + absorb, 20000));
169
170 // Refresh and return to prevent replacing the aura
171 protEff->GetBase()->RefreshDuration();
172 }
173 else
175 }
176
182 };
183
188};
189
190// 8342 - Defibrillate (Goblin Jumper Cables) have 33% chance on success
191// 22999 - Defibrillate (Goblin Jumper Cables XL) have 50% chance on success
192// 54732 - Defibrillate (Gnomish Army Knife) have 67% chance on success
198
200{
201 public:
202 spell_item_defibrillate(char const* name, uint8 chance, uint32 failSpell = 0) : SpellScriptLoader(name), _chance(chance), _failSpell(failSpell) { }
203
205 {
207
208 public:
209 spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell) : SpellScript(), _chance(chance), _failSpell(failSpell) { }
210
211 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
212 {
213 if (_failSpell && !sSpellMgr->GetSpellInfo(_failSpell))
214 return false;
215 return true;
216 }
217
219 {
221 {
222 PreventHitDefaultEffect(effIndex);
223 if (_failSpell)
225 }
226 }
227
232
233 private:
236 };
237
242
243 private:
246};
247
252
253// 33896 - Desperate Defense
255{
256 public:
257 spell_item_desperate_defense() : SpellScriptLoader("spell_item_desperate_defense") { }
258
260 {
262
263 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
264 {
265 if (!sSpellMgr->GetSpellInfo(SPELL_DESPERATE_RAGE))
266 return false;
267 return true;
268 }
269
270 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/)
271 {
273 GetTarget()->CastSpell(GetTarget(), SPELL_DESPERATE_RAGE, true, NULL, aurEff);
274 }
275
280 };
281
286};
287
288// http://www.wowhead.com/item=6522 Deviate Fish
289// 8063 Deviate Fish
298
300{
301 public:
302 spell_item_deviate_fish() : SpellScriptLoader("spell_item_deviate_fish") { }
303
305 {
307
309 {
311 }
312
313 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
314 {
315 for (uint32 spellId = SPELL_SLEEPY; spellId <= SPELL_HEALTHY_SPIRIT; ++spellId)
316 if (!sSpellMgr->GetSpellInfo(spellId))
317 return false;
318 return true;
319 }
320
321 void HandleDummy(SpellEffIndex /*effIndex*/)
322 {
323 Unit* caster = GetCaster();
324 uint32 spellId = std::rand() % SPELL_HEALTHY_SPIRIT + SPELL_SLEEPY;
325 caster->CastSpell(caster, spellId, true, NULL);
326 }
327
332 };
333
338};
339
340// http://www.wowhead.com/item=47499 Flask of the North
341// 67019 Flask of the North
348
350{
351 public:
352 spell_item_flask_of_the_north() : SpellScriptLoader("spell_item_flask_of_the_north") { }
353
355 {
357
358 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
359 {
361 return false;
362 return true;
363 }
364
365 void HandleDummy(SpellEffIndex /*effIndex*/)
366 {
367 Unit* caster = GetCaster();
368 std::vector<uint32> possibleSpells;
369 switch (caster->getClass())
370 {
371 case CLASS_WARLOCK:
372 case CLASS_MAGE:
373 case CLASS_PRIEST:
374 possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP);
375 break;
377 case CLASS_WARRIOR:
378 possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_STR);
379 break;
380 case CLASS_ROGUE:
381 case CLASS_HUNTER:
382 possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_AP);
383 break;
384 case CLASS_DRUID:
385 case CLASS_PALADIN:
386 possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP);
387 possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_STR);
388 break;
389 case CLASS_SHAMAN:
390 possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_SP);
391 possibleSpells.push_back(SPELL_FLASK_OF_THE_NORTH_AP);
392 break;
393 }
394
395 caster->CastSpell(caster, possibleSpells[std::rand() % possibleSpells.size()], true, NULL);
396 }
397
402 };
403
408};
409
410// http://www.wowhead.com/item=10645 Gnomish Death Ray
411// 13280 Gnomish Death Ray
417
419{
420 public:
421 spell_item_gnomish_death_ray() : SpellScriptLoader("spell_item_gnomish_death_ray") { }
422
424 {
426
427 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
428 {
430 return false;
431 return true;
432 }
433
434 void HandleDummy(SpellEffIndex /*effIndex*/)
435 {
436 Unit* caster = GetCaster();
437 if (Unit* target = GetHitUnit())
438 {
439 if ((std::rand() % 99) < 15)
440 caster->CastSpell(caster, SPELL_GNOMISH_DEATH_RAY_SELF, true, NULL); // failure
441 else
442 caster->CastSpell(target, SPELL_GNOMISH_DEATH_RAY_TARGET, true, NULL);
443 }
444 }
445
450 };
451
456};
457
458// http://www.wowhead.com/item=27388 Mr. Pinchy
459// 33060 Make a Wish
468
470{
471 public:
472 spell_item_make_a_wish() : SpellScriptLoader("spell_item_make_a_wish") { }
473
475 {
477
479 {
481 }
482
483 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
484 {
486 return false;
487 return true;
488 }
489
490 void HandleDummy(SpellEffIndex /*effIndex*/)
491 {
492 Unit* caster = GetCaster();
494 switch (std::rand() % 5 + 1)
495 {
496 case 1: spellId = SPELL_MR_PINCHYS_BLESSING; break;
497 case 2: spellId = SPELL_SUMMON_MIGHTY_MR_PINCHY; break;
498 case 3: spellId = SPELL_SUMMON_FURIOUS_MR_PINCHY; break;
499 case 4: spellId = SPELL_TINY_MAGICAL_CRAWDAD; break;
500 }
501 caster->CastSpell(caster, spellId, true, NULL);
502 }
503
508 };
509
514};
515
516// http://www.wowhead.com/item=32686 Mingo's Fortune Giblets
517// 40802 Mingo's Fortune Generator
519{
520 public:
521 spell_item_mingos_fortune_generator() : SpellScriptLoader("spell_item_mingos_fortune_generator") { }
522
524 {
526
528 {
529 // Selecting one from Bloodstained Fortune item
530 uint32 newitemid;
531 switch (std::rand() % 20 + 1)
532 {
533 case 1: newitemid = 32688; break;
534 case 2: newitemid = 32689; break;
535 case 3: newitemid = 32690; break;
536 case 4: newitemid = 32691; break;
537 case 5: newitemid = 32692; break;
538 case 6: newitemid = 32693; break;
539 case 7: newitemid = 32700; break;
540 case 8: newitemid = 32701; break;
541 case 9: newitemid = 32702; break;
542 case 10: newitemid = 32703; break;
543 case 11: newitemid = 32704; break;
544 case 12: newitemid = 32705; break;
545 case 13: newitemid = 32706; break;
546 case 14: newitemid = 32707; break;
547 case 15: newitemid = 32708; break;
548 case 16: newitemid = 32709; break;
549 case 17: newitemid = 32710; break;
550 case 18: newitemid = 32711; break;
551 case 19: newitemid = 32712; break;
552 case 20: newitemid = 32713; break;
553 default:
554 return;
555 }
556
557 CreateItem(effIndex, newitemid);
558 }
559
564 };
565
570};
571
572// 71875, 71877 - Item - Black Bruise: Necrotic Touch Proc
577
579{
580 public:
581 spell_item_necrotic_touch() : SpellScriptLoader("spell_item_necrotic_touch") { }
582
584 {
586
587 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
588 {
589 if (!sSpellMgr->GetSpellInfo(SPELL_ITEM_NECROTIC_TOUCH_PROC))
590 return false;
591 return true;
592 }
593
594 bool CheckProc(ProcEventInfo& eventInfo)
595 {
596 return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive();
597 }
598
599 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
600 {
602 int32 bp = CalculatePct(int32(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount());
604 }
605
611 };
612
617};
618
619// http://www.wowhead.com/item=10720 Gnomish Net-o-Matic Projector
620// 13120 Net-o-Matic
627
629{
630 public:
631 spell_item_net_o_matic() : SpellScriptLoader("spell_item_net_o_matic") { }
632
634 {
636
637 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
638 {
640 return false;
641 return true;
642 }
643
644 void HandleDummy(SpellEffIndex /*effIndex*/)
645 {
646 if (Unit* target = GetHitUnit())
647 {
649 uint32 roll = std::rand() % 99;
650 if (roll < 2) // 2% for 30 sec self root (off-like chance unknown)
652 else if (roll < 4) // 2% for 20 sec root, charge to target (off-like chance unknown)
654
655 GetCaster()->CastSpell(target, spellId, true, NULL);
656 }
657 }
658
663 };
664
669};
670
671// http://www.wowhead.com/item=8529 Noggenfogger Elixir
672// 16589 Noggenfogger Elixir
679
681{
682 public:
683 spell_item_noggenfogger_elixir() : SpellScriptLoader("spell_item_noggenfogger_elixir") { }
684
686 {
688
690 {
692 }
693
694 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
695 {
697 return false;
698 return true;
699 }
700
701 void HandleDummy(SpellEffIndex /*effIndex*/)
702 {
703 Unit* caster = GetCaster();
705 switch (std::rand() % 3 + 1)
706 {
707 case 1: spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1; break;
708 case 2: spellId = SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2; break;
709 }
710
711 caster->CastSpell(caster, spellId, true, NULL);
712 }
713
718 };
719
724};
725
726// 17512 - Piccolo of the Flaming Fire
754
755// http://www.wowhead.com/item=6657 Savory Deviate Delight
756// 8213 Savory Deviate Delight
764
766{
767 public:
768 spell_item_savory_deviate_delight() : SpellScriptLoader("spell_item_savory_deviate_delight") { }
769
771 {
773
775 {
777 }
778
779 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
780 {
781 for (uint32 spellId = SPELL_FLIP_OUT_MALE; spellId <= SPELL_YAAARRRR_FEMALE; ++spellId)
782 if (!sSpellMgr->GetSpellInfo(spellId))
783 return false;
784 return true;
785 }
786
787 void HandleDummy(SpellEffIndex /*effIndex*/)
788 {
789 Unit* caster = GetCaster();
790 uint32 spellId = 0;
791 switch (std::rand() % 2 + 1)
792 {
793 // Flip Out - ninja
794 case 1: spellId = (caster->getGender() == GENDER_MALE ? SPELL_FLIP_OUT_MALE : SPELL_FLIP_OUT_FEMALE); break;
795 // Yaaarrrr - pirate
796 case 2: spellId = (caster->getGender() == GENDER_MALE ? SPELL_YAAARRRR_MALE : SPELL_YAAARRRR_FEMALE); break;
797 }
798 caster->CastSpell(caster, spellId, true, NULL);
799 }
800
805 };
806
811};
812
813// 48129 - Scroll of Recall
814// 60320 - Scroll of Recall II
815// 60321 - Scroll of Recall III
825
827{
828 public:
829 spell_item_scroll_of_recall() : SpellScriptLoader("spell_item_scroll_of_recall") { }
830
832 {
834
836 {
838 }
839
841 {
842 Unit* caster = GetCaster();
843 uint8 maxSafeLevel = 0;
844 switch (GetSpellInfo()->Id)
845 {
846 case SPELL_SCROLL_OF_RECALL_I: // Scroll of Recall
847 maxSafeLevel = 40;
848 break;
849 case SPELL_SCROLL_OF_RECALL_II: // Scroll of Recall II
850 maxSafeLevel = 70;
851 break;
852 case SPELL_SCROLL_OF_RECALL_III: // Scroll of Recal III
853 maxSafeLevel = 80;
854 break;
855 default:
856 break;
857 }
858
859 if (caster->getLevel() > maxSafeLevel)
860 {
861 caster->CastSpell(caster, SPELL_LOST, true);
862
863 // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335
865 if (GetCaster()->ToPlayer()->GetTeam() == HORDE)
867
868 GetCaster()->CastSpell(GetCaster(), spellId + std::rand() % 7, true);
869
870 PreventHitDefaultEffect(effIndex);
871 }
872 }
873
878 };
879
884};
885
886// 71169 - Shadow's Fate (Shadowmourne questline)
888{
891};
892
894{
895 public:
896 spell_item_unsated_craving() : SpellScriptLoader("spell_item_unsated_craving") { }
897
899 {
901
902 bool CheckProc(ProcEventInfo& procInfo)
903 {
904 Unit* caster = procInfo.GetActor();
905 if (!caster || caster->GetTypeId() != TypeID::TYPEID_PLAYER)
906 return false;
907
908 Unit* target = procInfo.GetActionTarget();
909 if (!target || target->GetTypeId() != TypeID::TYPEID_UNIT || target->GetCreatureType() == CREATURE_TYPE_CRITTER || (target->GetEntry() != NPC_SINDRAGOSA && target->IsSummon()))
910 return false;
911
912 return true;
913 }
914
919 };
920
925};
926
928{
929 public:
930 spell_item_shadows_fate() : SpellScriptLoader("spell_item_shadows_fate") { }
931
933 {
935
936 void HandleProc(ProcEventInfo& procInfo)
937 {
938 Unit* caster = procInfo.GetActor();
939 Unit* target = GetCaster();
940 if (!caster || !target)
941 return;
942
944 }
945
950 };
951
956};
957
966
967// 71903 - Item - Shadowmourne Legendary
969{
970 public:
971 spell_item_shadowmourne() : SpellScriptLoader("spell_item_shadowmourne") { }
972
974 {
976
977 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
978 {
980 return false;
982 return false;
984 return false;
985 return true;
986 }
987
988 bool CheckProc(ProcEventInfo& eventInfo)
989 {
990 if (GetTarget()->HasAura(SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF)) // cant collect shards while under effect of Chaos Bane buff
991 return false;
992 return eventInfo.GetProcTarget() && eventInfo.GetProcTarget()->IsAlive();
993 }
994
995 void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)
996 {
999
1000 // this can't be handled in AuraScript of SoulFragments because we need to know victim
1001 if (Aura* soulFragments = GetTarget()->GetAura(SPELL_SHADOWMOURNE_SOUL_FRAGMENT))
1002 {
1003 if (soulFragments->GetStackAmount() >= 10)
1004 {
1005 GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE, true, NULL, aurEff);
1006 soulFragments->Remove();
1007 }
1008 }
1009 }
1010
1016 };
1017
1019 {
1021 }
1022};
1023
1024// 71905 - Soul Fragment
1026{
1027 public:
1028 spell_item_shadowmourne_soul_fragment() : SpellScriptLoader("spell_item_shadowmourne_soul_fragment") { }
1029
1031 {
1033
1034 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
1035 {
1037 return false;
1038 return true;
1039 }
1040
1041 void OnStackChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1042 {
1043 Unit* target = GetTarget();
1044 switch (GetStackAmount())
1045 {
1046 case 1:
1047 target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_LOW, true);
1048 break;
1049 case 6:
1051 target->CastSpell(target, SPELL_SHADOWMOURNE_VISUAL_HIGH, true);
1052 break;
1053 case 10:
1055 target->CastSpell(target, SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF, true);
1056 break;
1057 default:
1058 break;
1059 }
1060 }
1061
1062 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1063 {
1064 Unit* target = GetTarget();
1067 }
1068
1074 };
1075
1080};
1081
1082// http://www.wowhead.com/item=7734 Six Demon Bag
1083// 14537 Six Demon Bag
1093
1095{
1096 public:
1097 spell_item_six_demon_bag() : SpellScriptLoader("spell_item_six_demon_bag") { }
1098
1100 {
1102
1103 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
1104 {
1105 if (!sSpellMgr->GetSpellInfo(SPELL_FROSTBOLT) || !sSpellMgr->GetSpellInfo(SPELL_POLYMORPH) || !sSpellMgr->GetSpellInfo(SPELL_SUMMON_FELHOUND_MINION) || !sSpellMgr->GetSpellInfo(SPELL_FIREBALL) || !sSpellMgr->GetSpellInfo(SPELL_CHAIN_LIGHTNING) || !sSpellMgr->GetSpellInfo(SPELL_ENVELOPING_WINDS))
1106 return false;
1107 return true;
1108 }
1109
1110 void HandleDummy(SpellEffIndex /*effIndex*/)
1111 {
1112 Unit* caster = GetCaster();
1113 if (Unit* target = GetHitUnit())
1114 {
1115 uint32 spellId = 0;
1116 uint32 rand = std::rand() % 99;
1117 if (rand < 25) // Fireball (25% chance)
1118 spellId = SPELL_FIREBALL;
1119 else if (rand < 50) // Frostball (25% chance)
1120 spellId = SPELL_FROSTBOLT;
1121 else if (rand < 70) // Chain Lighting (20% chance)
1122 spellId = SPELL_CHAIN_LIGHTNING;
1123 else if (rand < 80) // Polymorph (10% chance)
1124 {
1125 spellId = SPELL_POLYMORPH;
1126 if ((std::rand() % 100) <= 30) // 30% chance to self-cast
1127 target = caster;
1128 }
1129 else if (rand < 95) // Enveloping Winds (15% chance)
1130 spellId = SPELL_ENVELOPING_WINDS;
1131 else // Summon Felhund minion (5% chance)
1132 {
1134 target = caster;
1135 }
1136
1137 caster->CastSpell(target, spellId, true, GetCastItem());
1138 }
1139 }
1140
1145 };
1146
1151};
1152
1153// 28862 - The Eye of Diminution
1155{
1156 public:
1157 spell_item_the_eye_of_diminution() : SpellScriptLoader("spell_item_the_eye_of_diminution") { }
1158
1160 {
1162
1163 void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/)
1164 {
1165 int32 diff = GetUnitOwner()->getLevel() - 60;
1166 if (diff > 0)
1167 amount += diff;
1168 }
1169
1174 };
1175
1180};
1181
1182// http://www.wowhead.com/item=44012 Underbelly Elixir
1183// 59640 Underbelly Elixir
1190
1192{
1193 public:
1194 spell_item_underbelly_elixir() : SpellScriptLoader("spell_item_underbelly_elixir") { }
1195
1197 {
1199
1201 {
1203 }
1204 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
1205 {
1207 return false;
1208 return true;
1209 }
1210
1211 void HandleDummy(SpellEffIndex /*effIndex*/)
1212 {
1213 Unit* caster = GetCaster();
1215 switch (std::rand() % 3 + 1)
1216 {
1217 case 1: spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED1; break;
1218 case 2: spellId = SPELL_UNDERBELLY_ELIXIR_TRIGGERED2; break;
1219 }
1220 caster->CastSpell(caster, spellId, true, NULL);
1221 }
1222
1227 };
1228
1233};
1234
1241
1243{
1244 public:
1245 spell_item_red_rider_air_rifle() : SpellScriptLoader("spell_item_red_rider_air_rifle") { }
1246
1248 {
1250
1251 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1252 {
1253 if (!sSpellMgr->GetSpellInfo(SPELL_AIR_RIFLE_HOLD_VISUAL) || !sSpellMgr->GetSpellInfo(SPELL_AIR_RIFLE_SHOOT) || !sSpellMgr->GetSpellInfo(SPELL_AIR_RIFLE_SHOOT_SELF))
1254 return false;
1255 return true;
1256 }
1257
1259 {
1260 PreventHitDefaultEffect(effIndex);
1261 Unit* caster = GetCaster();
1262 if (Unit* target = GetHitUnit())
1263 {
1264 caster->CastSpell(caster, SPELL_AIR_RIFLE_HOLD_VISUAL, true);
1265 // needed because this spell shares GCD with its triggered spells (which must not be cast with triggered flag)
1266 if (Player* player = caster->ToPlayer())
1267 player->GetGlobalCooldownMgr().CancelGlobalCooldown(GetSpellInfo());
1268 if (std::rand() % 4)
1269 caster->CastSpell(target, SPELL_AIR_RIFLE_SHOOT, false);
1270 else
1271 caster->CastSpell(caster, SPELL_AIR_RIFLE_SHOOT_SELF, false);
1272 }
1273 }
1274
1279 };
1280
1285};
1286
1294
1306
1337
1339{
1340 public:
1341 spell_item_book_of_glyph_mastery() : SpellScriptLoader("spell_item_book_of_glyph_mastery") { }
1342
1344 {
1346
1348 {
1350 }
1351
1362
1363 void HandleScript(SpellEffIndex /*effIndex*/)
1364 {
1365 Player* caster = GetCaster()->ToPlayer();
1366 uint32 spellId = GetSpellInfo()->Id;
1367
1368 // learn random explicit discovery recipe (if any)
1369 if (uint32 discoveredSpellId = GetExplicitDiscoverySpell(spellId, caster))
1370 caster->learnSpell(discoveredSpellId, false);
1371 }
1372
1378 };
1379
1384};
1385
1387{
1388 NPC_GHOUL = 28845,
1390};
1391
1425
1432
1465
1472
1474{
1475 public:
1476 spell_item_vanquished_clutches() : SpellScriptLoader("spell_item_vanquished_clutches") { }
1477
1479 {
1481
1482 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
1483 {
1484 if (!sSpellMgr->GetSpellInfo(SPELL_CRUSHER) || !sSpellMgr->GetSpellInfo(SPELL_CONSTRICTOR) || !sSpellMgr->GetSpellInfo(SPELL_CORRUPTOR))
1485 return false;
1486 return true;
1487 }
1488
1489 void HandleDummy(SpellEffIndex /*effIndex*/)
1490 {
1492 Unit* caster = GetCaster();
1493 caster->CastSpell(caster, spellId, true);
1494 }
1495
1500 };
1501
1506};
1507
1509{
1510 SOUND_ASHBRINGER_1 = 8906, // "I was pure once"
1511 SOUND_ASHBRINGER_2 = 8907, // "Fought for righteousness"
1512 SOUND_ASHBRINGER_3 = 8908, // "I was once called Ashbringer"
1513 SOUND_ASHBRINGER_4 = 8920, // "Betrayed by my order"
1514 SOUND_ASHBRINGER_5 = 8921, // "Destroyed by Kel'Thuzad"
1515 SOUND_ASHBRINGER_6 = 8922, // "Made to serve"
1516 SOUND_ASHBRINGER_7 = 8923, // "My son watched me die"
1517 SOUND_ASHBRINGER_8 = 8924, // "Crusades fed his rage"
1518 SOUND_ASHBRINGER_9 = 8925, // "Truth is unknown to him"
1519 SOUND_ASHBRINGER_10 = 8926, // "Scarlet Crusade is pure no longer"
1520 SOUND_ASHBRINGER_11 = 8927, // "Balnazzar's crusade corrupted my son"
1521 SOUND_ASHBRINGER_12 = 8928, // "Kill them all!"
1522};
1523
1525{
1526 public:
1527 spell_item_ashbringer() : SpellScriptLoader("spell_item_ashbringer") { }
1528
1530 {
1532
1534 {
1536 }
1537
1539 {
1540 PreventHitDefaultEffect(effIndex);
1541
1542 Player* player = GetCaster()->ToPlayer();
1545
1546 // Ashbringers effect (spellID 28441) retriggers every 5 seconds, with a chance of making it say one of the above 12 sounds
1547 if ((std::rand() % 60) < 1)
1548 player->PlayDirectSound(sound_id, player);
1549 }
1550
1555 };
1556
1561};
1562
1572
1574{
1575 public:
1576 spell_magic_eater_food() : SpellScriptLoader("spell_magic_eater_food") { }
1577
1579 {
1581
1582 void HandleTriggerSpell(AuraEffect const* /*aurEff*/)
1583 {
1585 Unit* target = GetTarget();
1586 switch (std::rand() % 5)
1587 {
1588 case 0:
1589 target->CastSpell(target, SPELL_WILD_MAGIC, true);
1590 break;
1591 case 1:
1592 target->CastSpell(target, SPELL_WELL_FED_1, true);
1593 break;
1594 case 2:
1595 target->CastSpell(target, SPELL_WELL_FED_2, true);
1596 break;
1597 case 3:
1598 target->CastSpell(target, SPELL_WELL_FED_3, true);
1599 break;
1600 case 4:
1601 target->CastSpell(target, SPELL_WELL_FED_4, true);
1602 break;
1603 case 5:
1604 target->CastSpell(target, SPELL_WELL_FED_5, true);
1605 break;
1606 }
1607 }
1608
1613 };
1614
1616 {
1618 }
1619};
1620
1647
1653
1655{
1656 public:
1657 spell_item_purify_helboar_meat() : SpellScriptLoader("spell_item_purify_helboar_meat") { }
1658
1660 {
1662
1664 {
1666 }
1667
1668 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1669 {
1671 return false;
1672 return true;
1673 }
1674
1675 void HandleDummy(SpellEffIndex /* effIndex */)
1676 {
1677 Unit* caster = GetCaster();
1679 }
1680
1685 };
1686
1691};
1692
1697
1699{
1700 public:
1701 spell_item_crystal_prison_dummy_dnd() : SpellScriptLoader("spell_item_crystal_prison_dummy_dnd") { }
1702
1704 {
1706
1707 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1708 {
1709 if (!sObjectMgr->GetGameObjectTemplate(OBJECT_IMPRISONED_DOOMGUARD))
1710 return false;
1711 return true;
1712 }
1713
1714 void HandleDummy(SpellEffIndex /* effIndex */)
1715 {
1716 if (Creature* target = GetHitCreature())
1717 if (target->isDead() && !target->IsPet())
1718 {
1719 GetCaster()->SummonGameObject(OBJECT_IMPRISONED_DOOMGUARD, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0, 0, 0, 0, uint32(target->GetRespawnTime()-time(NULL)));
1720 target->DespawnOrUnsummon();
1721 }
1722 }
1723
1728 };
1729
1734};
1735
1744
1746{
1747 public:
1748 spell_item_reindeer_transformation() : SpellScriptLoader("spell_item_reindeer_transformation") { }
1749
1751 {
1753
1754 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1755 {
1756 if (!sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_310) || !sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_280)
1757 || !sSpellMgr->GetSpellInfo(SPELL_FLYING_REINDEER_60) || !sSpellMgr->GetSpellInfo(SPELL_REINDEER_100)
1758 || !sSpellMgr->GetSpellInfo(SPELL_REINDEER_60))
1759 return false;
1760 return true;
1761 }
1762
1763 void HandleDummy(SpellEffIndex /* effIndex */)
1764 {
1765 Unit* caster = GetCaster();
1766 if (caster->HasAuraType(SPELL_AURA_MOUNTED))
1767 {
1768 float flyspeed = caster->GetSpeedRate(MOVE_FLIGHT);
1769 float speed = caster->GetSpeedRate(MOVE_RUN);
1770
1772 //5 different spells used depending on mounted speed and if mount can fly or not
1773
1774 if (flyspeed >= 4.1f)
1775 // Flying Reindeer
1776 caster->CastSpell(caster, SPELL_FLYING_REINDEER_310, true); //310% flying Reindeer
1777 else if (flyspeed >= 3.8f)
1778 // Flying Reindeer
1779 caster->CastSpell(caster, SPELL_FLYING_REINDEER_280, true); //280% flying Reindeer
1780 else if (flyspeed >= 1.6f)
1781 // Flying Reindeer
1782 caster->CastSpell(caster, SPELL_FLYING_REINDEER_60, true); //60% flying Reindeer
1783 else if (speed >= 2.0f)
1784 // Reindeer
1785 caster->CastSpell(caster, SPELL_REINDEER_100, true); //100% ground Reindeer
1786 else
1787 // Reindeer
1788 caster->CastSpell(caster, SPELL_REINDEER_60, true); //60% ground Reindeer
1789 }
1790 }
1791
1796 };
1797
1802};
1803
1809
1811{
1812 public:
1813 spell_item_nigh_invulnerability() : SpellScriptLoader("spell_item_nigh_invulnerability") { }
1814
1816 {
1818
1819 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1820 {
1821 if (!sSpellMgr->GetSpellInfo(SPELL_NIGH_INVULNERABILITY) || !sSpellMgr->GetSpellInfo(SPELL_COMPLETE_VULNERABILITY))
1822 return false;
1823 return true;
1824 }
1825
1826 void HandleDummy(SpellEffIndex /* effIndex */)
1827 {
1828 Unit* caster = GetCaster();
1829 if (Item* castItem = GetCastItem())
1830 {
1831 if (roll_chance_i(86)) // Nigh-Invulnerability - success
1832 caster->CastSpell(caster, SPELL_NIGH_INVULNERABILITY, true, castItem);
1833 else // Complete Vulnerability - backfire in 14% casts
1834 caster->CastSpell(caster, SPELL_COMPLETE_VULNERABILITY, true, castItem);
1835 }
1836 }
1837
1842 };
1843
1848};
1849
1855
1857{
1858 public:
1859 spell_item_poultryizer() : SpellScriptLoader("spell_item_poultryizer") { }
1860
1883
1888};
1889
1895
1897{
1898 public:
1899 spell_item_socrethars_stone() : SpellScriptLoader("spell_item_socrethars_stone") { }
1900
1902 {
1904
1906 {
1907 return (GetCaster()->GetAreaId() == 3900 || GetCaster()->GetAreaId() == 3742);
1908 }
1909 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1910 {
1911 if (!sSpellMgr->GetSpellInfo(SPELL_SOCRETHAR_TO_SEAT) || !sSpellMgr->GetSpellInfo(SPELL_SOCRETHAR_FROM_SEAT))
1912 return false;
1913 return true;
1914 }
1915
1916 void HandleDummy(SpellEffIndex /* effIndex */)
1917 {
1918 Unit* caster = GetCaster();
1919 switch (caster->GetAreaId())
1920 {
1921 case 3900:
1922 caster->CastSpell(caster, SPELL_SOCRETHAR_TO_SEAT, true);
1923 break;
1924 case 3742:
1925 caster->CastSpell(caster, SPELL_SOCRETHAR_FROM_SEAT, true);
1926 break;
1927 default:
1928 return;
1929 }
1930 }
1931
1936 };
1937
1942};
1943
1950
1952{
1953 public:
1954 spell_item_demon_broiled_surprise() : SpellScriptLoader("spell_item_demon_broiled_surprise") { }
1955
1957 {
1959
1960 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
1961 {
1962 if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_DEMON_BROILED_SURPRISE) || !sObjectMgr->GetCreatureTemplate(NPC_ABYSSAL_FLAMEBRINGER) || !sObjectMgr->GetQuestTemplate(QUEST_SUPER_HOT_STEW))
1963 return false;
1964 return true;
1965 }
1966
1968 {
1970 }
1971
1972 void HandleDummy(SpellEffIndex /* effIndex */)
1973 {
1974 Unit* player = GetCaster();
1975 player->CastSpell(player, SPELL_CREATE_DEMON_BROILED_SURPRISE, false);
1976 }
1977
1989
1995 };
1996
2001};
2002
2007
2009{
2010 public:
2011 spell_item_complete_raptor_capture() : SpellScriptLoader("spell_item_complete_raptor_capture") { }
2012
2014 {
2016
2017 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2018 {
2019 if (!sSpellMgr->GetSpellInfo(SPELL_RAPTOR_CAPTURE_CREDIT))
2020 return false;
2021 return true;
2022 }
2023
2024 void HandleDummy(SpellEffIndex /* effIndex */)
2025 {
2026 Unit* caster = GetCaster();
2027 if (GetHitCreature())
2028 {
2030
2031 //cast spell Raptor Capture Credit
2032 caster->CastSpell(caster, SPELL_RAPTOR_CAPTURE_CREDIT, true, NULL);
2033 }
2034 }
2035
2040 };
2041
2046};
2047
2053
2055{
2056 public:
2057 spell_item_impale_leviroth() : SpellScriptLoader("spell_item_impale_leviroth") { }
2058
2060 {
2062
2063 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2064 {
2065 if (!sObjectMgr->GetCreatureTemplate(NPC_LEVIROTH))
2066 return false;
2067 return true;
2068 }
2069
2070 void HandleDummy(SpellEffIndex /* effIndex */)
2071 {
2072 if (Unit* target = GetHitCreature())
2073 if (target->GetEntry() == NPC_LEVIROTH && !target->HealthBelowPct(95))
2074 target->CastSpell(target, SPELL_LEVIROTH_SELF_IMPALE, true);
2075 }
2076
2081 };
2082
2087};
2088
2098
2100{
2101 public:
2102 spell_item_brewfest_mount_transformation() : SpellScriptLoader("spell_item_brewfest_mount_transformation") { }
2103
2105 {
2107
2108 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2109 {
2110 if (!sSpellMgr->GetSpellInfo(SPELL_MOUNT_RAM_100) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_RAM_60) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_KODO_100) || !sSpellMgr->GetSpellInfo(SPELL_MOUNT_KODO_60))
2111 return false;
2112 return true;
2113 }
2114
2115 void HandleDummy(SpellEffIndex /* effIndex */)
2116 {
2117 Player* caster = GetCaster()->ToPlayer();
2118 if (caster->HasAuraType(SPELL_AURA_MOUNTED))
2119 {
2121 uint32 spell_id;
2122
2123 switch (GetSpellInfo()->Id)
2124 {
2126 if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f)
2127 spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100;
2128 else
2129 spell_id = caster->GetTeam() == ALLIANCE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60;
2130 break;
2132 if (caster->GetSpeedRate(MOVE_RUN) >= 2.0f)
2133 spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_100 : SPELL_MOUNT_KODO_100;
2134 else
2135 spell_id = caster->GetTeam() == HORDE ? SPELL_MOUNT_RAM_60 : SPELL_MOUNT_KODO_60;
2136 break;
2137 default:
2138 return;
2139 }
2140 caster->CastSpell(caster, spell_id, true);
2141 }
2142 }
2143
2148 };
2149
2154};
2155
2161
2163{
2164 public:
2165 spell_item_nitro_boots() : SpellScriptLoader("spell_item_nitro_boots") { }
2166
2168 {
2170
2172 {
2173 if (!GetCastItem())
2174 return false;
2175 return true;
2176 }
2177
2178 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2179 {
2180 if (!sSpellMgr->GetSpellInfo(SPELL_NITRO_BOOTS_SUCCESS) || !sSpellMgr->GetSpellInfo(SPELL_NITRO_BOOTS_BACKFIRE))
2181 return false;
2182 return true;
2183 }
2184
2185 void HandleDummy(SpellEffIndex /* effIndex */)
2186 {
2187 Unit* caster = GetCaster();
2189 }
2190
2195 };
2196
2201};
2202
2208
2210{
2211 public:
2212 spell_item_teach_language() : SpellScriptLoader("spell_item_teach_language") { }
2213
2215 {
2217
2219 {
2221 }
2222
2223 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2224 {
2225 if (!sSpellMgr->GetSpellInfo(SPELL_LEARN_GNOMISH_BINARY) || !sSpellMgr->GetSpellInfo(SPELL_LEARN_GOBLIN_BINARY))
2226 return false;
2227 return true;
2228 }
2229
2230 void HandleDummy(SpellEffIndex /* effIndex */)
2231 {
2232 Player* caster = GetCaster()->ToPlayer();
2233
2234 if (roll_chance_i(34))
2235 caster->CastSpell(caster, caster->GetTeam() == ALLIANCE ? SPELL_LEARN_GNOMISH_BINARY : SPELL_LEARN_GOBLIN_BINARY, true);
2236 }
2237
2242 };
2243
2248};
2249
2254
2256{
2257 public:
2258 spell_item_rocket_boots() : SpellScriptLoader("spell_item_rocket_boots") { }
2259
2261 {
2263
2265 {
2267 }
2268
2269 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2270 {
2271 if (!sSpellMgr->GetSpellInfo(SPELL_ROCKET_BOOTS_PROC))
2272 return false;
2273 return true;
2274 }
2275
2276 void HandleDummy(SpellEffIndex /* effIndex */)
2277 {
2278 Player* caster = GetCaster()->ToPlayer();
2279 if (Battleground* bg = caster->GetBattleground())
2280 bg->EventPlayerDroppedFlag(caster);
2281
2283 caster->CastSpell(caster, SPELL_ROCKET_BOOTS_PROC, true, NULL);
2284 }
2285
2292
2298 };
2299
2304};
2305
2311
2313{
2314 public:
2315 spell_item_pygmy_oil() : SpellScriptLoader("spell_item_pygmy_oil") { }
2316
2318 {
2320
2321 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2322 {
2323 if (!sSpellMgr->GetSpellInfo(SPELL_PYGMY_OIL_PYGMY_AURA) || !sSpellMgr->GetSpellInfo(SPELL_PYGMY_OIL_SMALLER_AURA))
2324 return false;
2325 return true;
2326 }
2327
2328 void HandleDummy(SpellEffIndex /* effIndex */)
2329 {
2330 Unit* caster = GetCaster();
2331 if (Aura* aura = caster->GetAura(SPELL_PYGMY_OIL_PYGMY_AURA))
2332 aura->RefreshDuration();
2333 else
2334 {
2335 aura = caster->GetAura(SPELL_PYGMY_OIL_SMALLER_AURA);
2336 if (!aura || aura->GetStackAmount() < 5 || !roll_chance_i(50))
2337 caster->CastSpell(caster, SPELL_PYGMY_OIL_SMALLER_AURA, true);
2338 else
2339 {
2340 aura->Remove();
2341 caster->CastSpell(caster, SPELL_PYGMY_OIL_PYGMY_AURA, true);
2342 }
2343 }
2344 }
2345
2350 };
2351
2353 {
2355 }
2356};
2357
2384
2392
2394{
2395 public:
2396 spell_item_chicken_cover() : SpellScriptLoader("spell_item_chicken_cover") { }
2397
2399 {
2401
2403 {
2405 }
2406
2407 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
2408 {
2409 if (!sSpellMgr->GetSpellInfo(SPELL_CHICKEN_NET) || !sSpellMgr->GetSpellInfo(SPELL_CAPTURE_CHICKEN_ESCAPE) || !sObjectMgr->GetQuestTemplate(QUEST_CHICKEN_PARTY) || !sObjectMgr->GetQuestTemplate(QUEST_FLOWN_THE_COOP))
2410 return false;
2411 return true;
2412 }
2413
2414 void HandleDummy(SpellEffIndex /* effIndex */)
2415 {
2416 Player* caster = GetCaster()->ToPlayer();
2417 if (Unit* target = GetHitUnit())
2418 {
2420 {
2421 caster->CastSpell(caster, SPELL_CAPTURE_CHICKEN_ESCAPE, true);
2422 target->Kill(target);
2423 }
2424 }
2425 }
2426
2431 };
2432
2437};
2438
2440{
2441 public:
2442 spell_item_muisek_vessel() : SpellScriptLoader("spell_item_muisek_vessel") { }
2443
2445 {
2447
2448 void HandleDummy(SpellEffIndex /*effIndex*/)
2449 {
2450 if (Creature* target = GetHitCreature())
2451 if (target->isDead())
2452 target->DespawnOrUnsummon();
2453 }
2454
2459 };
2460
2465};
2466
2497
2499{
2500 // 23074 Arcanite Dragonling
2501 new spell_item_trigger_spell("spell_item_arcanite_dragonling", SPELL_ARCANITE_DRAGONLING);
2502 // 23133 Gnomish Battle Chicken
2503 new spell_item_trigger_spell("spell_item_gnomish_battle_chicken", SPELL_BATTLE_CHICKEN);
2504 // 23076 Mechanical Dragonling
2505 new spell_item_trigger_spell("spell_item_mechanical_dragonling", SPELL_MECHANICAL_DRAGONLING);
2506 // 23075 Mithril Mechanical Dragonling
2507 new spell_item_trigger_spell("spell_item_mithril_mechanical_dragonling", SPELL_MITHRIL_MECHANICAL_DRAGONLING);
2508
2512 new spell_item_defibrillate("spell_item_goblin_jumper_cables", 67, SPELL_GOBLIN_JUMPER_CABLES_FAIL);
2513 new spell_item_defibrillate("spell_item_goblin_jumper_cables_xl", 50, SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL);
2514 new spell_item_defibrillate("spell_item_gnomish_army_knife", 33);
2535
2541
2563}
#define M_PI
Definition Common.h:192
const T & RAND(const T &v1, const T &v2)
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ TYPEID_PLAYER
Definition Object.h:55
@ TYPEID_UNIT
Definition Object.h:54
#define sObjectMgr
Definition ObjectMgr.h:1617
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:89
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ EMOTE_STATE_DANCE
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_RESURRECT
@ SPELL_EFFECT_TELEPORT_UNITS
@ GENDER_MALE
@ CREATURE_TYPE_CRITTER
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_PALADIN
@ CLASS_ROGUE
@ SPELL_CUSTOM_ERROR_TOO_MANY_GHOULS
@ SPELL_CUSTOM_ERROR_MUST_BE_CLOSE_TO_SINKHOLE
@ SPELL_CUSTOM_ERROR_LEARNED_EVERYTHING
@ ALLIANCE
@ HORDE
SpellCastResult
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
uint32 GetExplicitDiscoverySpell(uint32 spellId, Player *player)
bool HasDiscoveredAllSpells(uint32 spellId, Player *player)
@ SPELL_AURA_MOD_THREAT
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_STAT
@ SPELL_AURA_MOUNTED
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAPPLY
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define AuraProcFn(F)
#define SpellCheckCastFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define AuraEffectCalcAmountFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraCheckProcFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
@ SPELLVALUE_BASE_POINT0
Definition Unit.h:114
@ JUST_RESPAWNED
Definition Unit.h:507
@ TRIGGERED_FULL_MASK
Will ignore most target checks (mostly DBC target checks).
Definition Unit.h:435
@ MOVE_FLIGHT
Definition Unit.h:561
@ MOVE_RUN
Definition Unit.h:556
float frand(float min, float max)
Definition Util.cpp:39
bool roll_chance_i(int chance)
Definition Util.h:89
T CalculatePct(T base, U pct)
Definition Util.h:103
@ SPELL_FROSTBOLT
@ SPELL_FIREBALL
@ SPELL_SHRINK
@ SPELL_CHAIN_LIGHTNING
int32 GetAmount() const
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
Unit * GetCaster() const
Aura * GetAura() const
Unit * GetTarget() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
HookList< AuraProcHandler > OnProc
uint8 GetStackAmount() const
void DespawnOrUnsummon(uint32 msTimeToDespawn=0)
uint32 GetDamage() const
Definition Unit.h:923
uint32 GetHeal() const
Definition Unit.h:959
Definition Item.h:202
uint64 GetGUID() const
Definition Object.h:119
Player * ToPlayer()
Definition Object.h:204
TypeID GetTypeId() const
Definition Object.h:131
uint32 GetEntry() const
Definition Object.h:125
uint32 GetTeam() const
Definition Player.h:2527
Battleground * GetBattleground() const
Definition Player.cpp:19212
void learnSpell(uint32 spell_id, bool dependent)
Definition Player.cpp:4021
QuestStatus GetQuestStatus(uint32 quest_id) const
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:4284
HealInfo * GetHealInfo() const
Definition Unit.h:986
Unit * GetActionTarget() const
Definition Unit.h:973
DamageInfo * GetDamageInfo() const
Definition Unit.h:985
Unit * GetProcTarget() const
Definition Unit.h:974
Unit * GetActor() const
Definition Unit.h:972
uint32 Id
Definition SpellInfo.h:160
Creature * GetHitCreature()
HookList< CheckCastHandler > OnCheckCast
Player * GetHitPlayer()
SpellInfo const * GetSpellInfo()
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Item * GetCastItem()
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
void SetCustomCastResultMessage(SpellCustomErrors result)
void CreateItem(uint32 effIndex, uint32 itemId)
Unit * GetCaster()
SpellScriptLoader(const char *name)
Definition Unit.h:1367
uint8 getGender() const
Definition Unit.h:1551
void SetFacingTo(float ori)
Definition Unit.cpp:9114
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID=0, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Aura * GetAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
uint8 getClass() const
Definition Unit.h:1543
bool IsAlive() const
Definition Unit.h:2032
uint32 GetCreatureType() const
Definition Unit.cpp:4910
bool IsSummon() const
Definition Unit.h:1503
bool HasAuraType(AuraType auraType) const
void RemoveAurasByType(AuraType auraType, uint64 casterGUID=0, Aura *except=NULL, bool negative=true, bool positive=true)
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, uint64 casterGUID=0) const
float GetSpeedRate(UnitMoveType mtype) const
Definition Unit.h:2581
void CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
uint8 getLevel() const
Definition Unit.h:1528
void GetAllMinionsByEntry(std::list< Creature * > &Minions, uint32 entry)
Definition Unit.cpp:2592
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2801
GameObject * SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime)
Definition Object.cpp:2729
uint32 GetAreaId() const
Definition Object.cpp:1602
void PlayDirectSound(uint32 sound_id, Player *target=NULL)
Definition Object.cpp:3442
AuraScript * GetAuraScript() const OVERRIDE
void CalculateAmount(AuraEffect const *, int32 &amount, bool &)
PrepareAuraScript(spell_item_arcane_shroud_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_item_ashbringer_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_chicken_cover_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell)
PrepareSpellScript(spell_item_defibrillate_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
spell_item_defibrillate(char const *name, uint8 chance, uint32 failSpell=0)
SpellScript * GetSpellScript() const OVERRIDE
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_item_deviate_fish_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_gnomish_death_ray_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_impale_leviroth_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_make_a_wish_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_muisek_vessel_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareAuraScript(spell_item_necrotic_touch_AuraScript)
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_item_net_o_matic_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_nitro_boots_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_poultryizer_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_pygmy_oil_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_rocket_boots_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_scroll_of_recall_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
void HandleProc(AuraEffect const *aurEff, ProcEventInfo &eventInfo)
PrepareAuraScript(spell_item_shadowmourne_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
PrepareAuraScript(spell_item_shadows_fate_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_item_shimmering_vessel_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_six_demon_bag_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_socrethars_stone_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_teach_language_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_item_trigger_spell_SpellScript)
spell_item_trigger_spell(const char *name, uint32 triggeredSpellId)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_item_underbelly_elixir_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareAuraScript(spell_item_unsated_craving_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
PrepareSpellScript(spell_item_unusual_compass_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
PrepareAuraScript(spell_magic_eater_food_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
@ NPC_SINDRAGOSA
GnomishDeathRay
@ SPELL_GNOMISH_DEATH_RAY_SELF
@ SPELL_GNOMISH_DEATH_RAY_TARGET
ScrollOfRecall
@ SPELL_SCROLL_OF_RECALL_III
@ SPELL_LOST
@ SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1
@ SPELL_SCROLL_OF_RECALL_I
@ SPELL_SCROLL_OF_RECALL_II
@ SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1
VanquishedClutchesSpells
@ SPELL_CONSTRICTOR
@ SPELL_CRUSHER
@ SPELL_CORRUPTOR
BlessingOfAncientKings
@ SPELL_PROTECTION_OF_ANCIENT_KINGS
FlaskOfTheNorthSpells
@ SPELL_FLASK_OF_THE_NORTH_SP
@ SPELL_FLASK_OF_THE_NORTH_STR
@ SPELL_FLASK_OF_THE_NORTH_AP
CreateHeartCandy
@ ITEM_HEART_CANDY_1
@ ITEM_HEART_CANDY_4
@ ITEM_HEART_CANDY_6
@ ITEM_HEART_CANDY_7
@ ITEM_HEART_CANDY_8
@ ITEM_HEART_CANDY_3
@ ITEM_HEART_CANDY_5
@ ITEM_HEART_CANDY_2
GenericData
@ SPELL_MECHANICAL_DRAGONLING
@ SPELL_MITHRIL_MECHANICAL_DRAGONLING
@ SPELL_BATTLE_CHICKEN
@ SPELL_ARCANITE_DRAGONLING
UnderbellyElixirSpells
@ SPELL_UNDERBELLY_ELIXIR_TRIGGERED2
@ SPELL_UNDERBELLY_ELIXIR_TRIGGERED1
@ SPELL_UNDERBELLY_ELIXIR_TRIGGERED3
GiftOfTheHarvester
@ NPC_GHOUL
@ MAX_GHOULS
Poultryzer
@ SPELL_POULTRYIZER_SUCCESS
@ SPELL_POULTRYIZER_BACKFIRE
NoggenfoggerElixirSpells
@ SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED1
@ SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED2
@ SPELL_NOGGENFOGGER_ELIXIR_TRIGGERED3
DesperateDefense
@ SPELL_DESPERATE_RAGE
Defibrillate
@ SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL
@ SPELL_GOBLIN_JUMPER_CABLES_FAIL
RocketBoots
@ SPELL_ROCKET_BOOTS_PROC
ReindeerTransformation
@ SPELL_REINDEER_60
@ SPELL_REINDEER_100
@ SPELL_FLYING_REINDEER_280
@ SPELL_FLYING_REINDEER_310
@ SPELL_FLYING_REINDEER_60
DemonBroiledSurprise
@ NPC_ABYSSAL_FLAMEBRINGER
@ SPELL_CREATE_DEMON_BROILED_SURPRISE
@ QUEST_SUPER_HOT_STEW
NecroticTouch
@ SPELL_ITEM_NECROTIC_TOUCH_PROC
MagicEater
@ SPELL_WELL_FED_3
@ SPELL_WELL_FED_5
@ SPELL_WILD_MAGIC
@ SPELL_WELL_FED_2
@ SPELL_WELL_FED_1
@ SPELL_WELL_FED_4
AirRifleSpells
@ SPELL_AIR_RIFLE_SHOOT_SELF
@ SPELL_AIR_RIFLE_HOLD_VISUAL
@ SPELL_AIR_RIFLE_SHOOT
MakeAWish
@ SPELL_SUMMON_FURIOUS_MR_PINCHY
@ SPELL_MR_PINCHYS_GIFT
@ SPELL_TINY_MAGICAL_CRAWDAD
@ SPELL_SUMMON_MIGHTY_MR_PINCHY
@ SPELL_MR_PINCHYS_BLESSING
NighInvulnerability
@ SPELL_COMPLETE_VULNERABILITY
@ SPELL_NIGH_INVULNERABILITY
ShadowsFate
@ SPELL_SOUL_FEAST
@ NPC_SINDRAGOSA
GreatmothersSoulcather
@ SPELL_FORCE_CAST_SUMMON_GNOME_SOUL
void AddSC_item_spell_scripts()
NitroBoots
@ SPELL_NITRO_BOOTS_BACKFIRE
@ SPELL_NITRO_BOOTS_SUCCESS
CompleteRaptorCapture
@ SPELL_RAPTOR_CAPTURE_CREDIT
DeviateFishSpells
@ SPELL_PARTY_TIME
@ SPELL_INVIGORATE
@ SPELL_HEALTHY_SPIRIT
@ SPELL_SLEEPY
AshbringerSounds
@ SOUND_ASHBRINGER_6
@ SOUND_ASHBRINGER_11
@ SOUND_ASHBRINGER_12
@ SOUND_ASHBRINGER_5
@ SOUND_ASHBRINGER_1
@ SOUND_ASHBRINGER_4
@ SOUND_ASHBRINGER_3
@ SOUND_ASHBRINGER_2
@ SOUND_ASHBRINGER_7
@ SOUND_ASHBRINGER_10
@ SOUND_ASHBRINGER_8
@ SOUND_ASHBRINGER_9
ChickenCover
@ QUEST_CHICKEN_PARTY
@ SPELL_CAPTURE_CHICKEN_ESCAPE
@ QUEST_FLOWN_THE_COOP
@ SPELL_CHICKEN_NET
@ SPELL_SHADOWMOURNE_VISUAL_HIGH
@ SPELL_SHADOWMOURNE_CHAOS_BANE_BUFF
@ SPELL_SHADOWMOURNE_SOUL_FRAGMENT
@ SPELL_SHADOWMOURNE_CHAOS_BANE_DAMAGE
@ SPELL_SHADOWMOURNE_VISUAL_LOW
Sinkholes
@ NPC_NORTHEAST_SINKHOLE
@ NPC_SOUTH_SINKHOLE
@ NPC_NORTHWEST_SINKHOLE
PurifyHelboarMeat
@ SPELL_SUMMON_TOXIC_HELBOAR_MEAT
@ SPELL_SUMMON_PURIFIED_HELBOAR_MEAT
SavoryDeviateDelight
@ SPELL_FLIP_OUT_FEMALE
@ SPELL_FLIP_OUT_MALE
@ SPELL_YAAARRRR_FEMALE
@ SPELL_YAAARRRR_MALE
SixDemonBagSpells
@ SPELL_FROSTBOLT
@ SPELL_SUMMON_FELHOUND_MINION
@ SPELL_FIREBALL
@ SPELL_CHAIN_LIGHTNING
@ SPELL_ENVELOPING_WINDS
@ SPELL_POLYMORPH
PygmyOil
@ SPELL_PYGMY_OIL_SMALLER_AURA
@ SPELL_PYGMY_OIL_PYGMY_AURA
AegisOfPreservation
@ SPELL_AEGIS_HEAL
TeachLanguage
@ SPELL_LEARN_GOBLIN_BINARY
@ SPELL_LEARN_GNOMISH_BINARY
NetOMaticSpells
@ SPELL_NET_O_MATIC_TRIGGERED2
@ SPELL_NET_O_MATIC_TRIGGERED1
@ SPELL_NET_O_MATIC_TRIGGERED3
ImpaleLeviroth
@ NPC_LEVIROTH
@ SPELL_LEVIROTH_SELF_IMPALE
SocretharsStone
@ SPELL_SOCRETHAR_FROM_SEAT
@ SPELL_SOCRETHAR_TO_SEAT
BrewfestMountTransformation
@ SPELL_BREWFEST_MOUNT_TRANSFORM_REVERSE
@ SPELL_MOUNT_RAM_60
@ SPELL_BREWFEST_MOUNT_TRANSFORM
@ SPELL_MOUNT_RAM_100
@ SPELL_MOUNT_KODO_100
@ SPELL_MOUNT_KODO_60
CrystalPrison
@ OBJECT_IMPRISONED_DOOMGUARD