TrinityCore
SpellInfo.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#include "SpellInfo.h"
19#include "Battleground.h"
20#include "Containers.h"
21#include "Corpse.h"
22#include "DB2Stores.h"
23#include "FlatSet.h"
24#include "GameTables.h"
25#include "InstanceScript.h"
26#include "Item.h"
27#include "ItemTemplate.h"
28#include "Log.h"
29#include "LootMgr.h"
30#include "Map.h"
31#include "ObjectAccessor.h"
32#include "Pet.h"
33#include "Player.h"
34#include "Random.h"
35#include "Spell.h"
36#include "SpellAuraEffects.h"
37#include "SpellMgr.h"
38#include "Vehicle.h"
39#include <G3D/g3dmath.h>
40
42{
43 switch (objType)
44 {
56 return TARGET_FLAG_UNIT;
62 return TARGET_FLAG_ITEM;
65 default:
66 return TARGET_FLAG_NONE;
67 }
68}
69
71{
72 _target = Targets(target);
73}
74
76{
78}
79
81{
82 return _data[_target].SelectionCategory;
83}
84
86{
87 return _data[_target].ReferenceType;
88}
89
91{
92 return _data[_target].ObjectType;
93}
94
96{
97 return _data[_target].SelectionCheckType;
98}
99
101{
102 return _data[_target].DirectionType;
103}
104
106{
107 switch (GetDirectionType())
108 {
109 case TARGET_DIR_FRONT:
110 return 0.0f;
111 case TARGET_DIR_BACK:
112 return static_cast<float>(M_PI);
113 case TARGET_DIR_RIGHT:
114 return static_cast<float>(-M_PI/2);
115 case TARGET_DIR_LEFT:
116 return static_cast<float>(M_PI/2);
118 return static_cast<float>(-M_PI/4);
120 return static_cast<float>(-3*M_PI/4);
122 return static_cast<float>(3*M_PI/4);
124 return static_cast<float>(M_PI/4);
126 return rand_norm() * static_cast<float>(2 * M_PI);
127 default:
128 return 0.0f;
129 }
130}
131
133{
134 return _target;
135}
136
138{
139 uint32 targetMask = 0;
141 {
142 if (!srcSet)
143 targetMask = TARGET_FLAG_SOURCE_LOCATION;
144 if (!dstSet)
145 targetMask |= TARGET_FLAG_DEST_LOCATION;
146 }
147 else
148 {
149 switch (GetReferenceType())
150 {
152 if (srcSet)
153 break;
154 targetMask = TARGET_FLAG_SOURCE_LOCATION;
155 break;
157 if (dstSet)
158 break;
159 targetMask = TARGET_FLAG_DEST_LOCATION;
160 break;
162 switch (GetObjectType())
163 {
165 targetMask = TARGET_FLAG_GAMEOBJECT;
166 break;
168 targetMask = TARGET_FLAG_GAMEOBJECT_ITEM;
169 break;
173 switch (GetCheckType())
174 {
176 targetMask = TARGET_FLAG_UNIT_ENEMY;
177 break;
179 targetMask = TARGET_FLAG_UNIT_ALLY;
180 break;
182 targetMask = TARGET_FLAG_UNIT_PARTY;
183 break;
185 targetMask = TARGET_FLAG_UNIT_RAID;
186 break;
188 targetMask = TARGET_FLAG_UNIT_PASSENGER;
189 break;
191 [[fallthrough]];
192 default:
193 targetMask = TARGET_FLAG_UNIT;
194 break;
195 }
196 break;
197 default:
198 break;
199 }
200 break;
201 default:
202 break;
203 }
204 }
205
206 switch (GetObjectType())
207 {
209 srcSet = true;
210 break;
213 dstSet = true;
214 break;
215 default:
216 break;
217 }
218 return targetMask;
219}
220
222{
223 ImmunityInfo() = default;
224 ~ImmunityInfo() = default;
225
226 ImmunityInfo(ImmunityInfo const&) = delete;
227 ImmunityInfo(ImmunityInfo&&) noexcept = delete;
228 ImmunityInfo& operator=(ImmunityInfo const&) = delete;
229 ImmunityInfo& operator=(ImmunityInfo&&) noexcept = delete;
230
237
238 Trinity::Containers::FlatSet<AuraType> AuraTypeImmune;
240};
241
243{ {
397} };
398
405{
406}
407
409 : EffectAttributes(SpellEffectAttributes::None)
410{
411 ASSERT(spellInfo);
412
413 _spellInfo = spellInfo;
415 Effect = SpellEffectName(_effect.Effect);
421 Amplitude = _effect.EffectAmplitude;
424 MiscValue = _effect.EffectMiscValue[0];
425 MiscValueB = _effect.EffectMiscValue[1];
433 ItemType = _effect.EffectItemType;
437 Scaling.Class = _effect.ScalingClass;
439 Scaling.Variance = _effect.Variance;
441 ImplicitTargetConditions = nullptr;
443 _immunityInfo = nullptr;
444}
445
447SpellEffectInfo& SpellEffectInfo::operator=(SpellEffectInfo&&) noexcept = default;
448
449SpellEffectInfo::~SpellEffectInfo() = default;
450
451bool SpellEffectInfo::IsEffect() const
452{
453 return Effect != 0;
454}
455
457{
458 return Effect == effectName;
459}
460
462{
464}
465
467{
468 return IsAura() && ApplyAuraName == aura;
469}
470
472{
473 return TargetA.IsArea() || TargetB.IsArea();
474}
475
477{
486 return true;
487 return false;
488}
489
491{
493}
494
495int32 SpellEffectInfo::CalcValue(WorldObject const* caster /*= nullptr*/, int32 const* bp /*= nullptr*/, Unit const* target /*= nullptr*/, float* variance /*= nullptr*/, uint32 castItemId /*= 0*/, int32 itemLevel /*= -1*/) const
496{
497 double basePointsPerLevel = RealPointsPerLevel;
498 // TODO: this needs to be a float, not rounded
499 int32 basePoints = CalcBaseValue(caster, target, castItemId, itemLevel);
500 double value = bp ? *bp : basePoints;
501 double comboDamage = PointsPerResource;
502
503 Unit const* casterUnit = nullptr;
504 if (caster)
505 casterUnit = caster->ToUnit();
506
507 if (Scaling.Variance)
508 {
509 float delta = fabs(Scaling.Variance * 0.5f);
510 double valueVariance = frand(-delta, delta);
511 value += double(basePoints) * valueVariance;
512
513 if (variance)
514 *variance = valueVariance;
515 }
516
517 // base amount modification based on spell lvl vs caster lvl
518 if (Scaling.Coefficient != 0.0f)
519 {
521 comboDamage = Scaling.ResourceCoefficient * value;
522 }
524 {
525 if (casterUnit && basePointsPerLevel != 0.0)
526 {
527 int32 level = int32(casterUnit->GetLevel());
528 if (level > int32(_spellInfo->MaxLevel) && _spellInfo->MaxLevel > 0)
529 level = int32(_spellInfo->MaxLevel);
530
531 // if base level is greater than spell level, reduce by base level (eg. pilgrims foods)
532 level -= int32(std::max(_spellInfo->BaseLevel, _spellInfo->SpellLevel));
533 if (level < 0)
534 level = 0;
535 value += level * basePointsPerLevel;
536 }
537 }
538
539 // random damage
540 if (casterUnit)
541 {
542 // bonus amount from combo points
543 if (comboDamage)
544 if (int32 comboPoints = casterUnit->GetPower(POWER_COMBO_POINTS))
545 value += comboDamage * comboPoints;
546 }
547
548 if (caster)
549 value = caster->ApplyEffectModifiers(_spellInfo, EffectIndex, value);
550
551 return int32(round(value));
552}
553
554int32 SpellEffectInfo::CalcBaseValue(WorldObject const* caster, Unit const* target, uint32 itemId, int32 itemLevel) const
555{
556 if (Scaling.Coefficient != 0.0f)
557 {
560 level = target->GetLevel();
561 else if (caster && caster->IsUnit())
562 level = caster->ToUnit()->GetLevel();
563
565 level = _spellInfo->BaseLevel;
566
569
572
573 float value = 0.0f;
574 if (level > 0)
575 {
576 if (!Scaling.Class)
577 return 0;
578
579 uint32 effectiveItemLevel = itemLevel != -1 ? uint32(itemLevel) : 1u;
581 {
583 effectiveItemLevel = _spellInfo->Scaling.ScalesFromItemLevel;
584
585 if (Scaling.Class == -8 || Scaling.Class == -9)
586 {
587 RandPropPointsEntry const* randPropPoints = sRandPropPointsStore.LookupEntry(effectiveItemLevel);
588 if (!randPropPoints)
589 randPropPoints = sRandPropPointsStore.AssertEntry(sRandPropPointsStore.GetNumRows() - 1);
590
591 value = Scaling.Class == -8 ? randPropPoints->DamageReplaceStatF : randPropPoints->DamageSecondaryF;
592 }
593 else
594 value = GetRandomPropertyPoints(effectiveItemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
595 }
596 else
598
599 if (Scaling.Class == -7)
600 if (GtCombatRatingsMultByILvl const* ratingMult = sCombatRatingsMultByILvlGameTable.GetRow(effectiveItemLevel))
601 if (ItemSparseEntry const* itemSparse = sItemSparseStore.LookupEntry(itemId))
602 value *= GetIlvlStatMultiplier(ratingMult, InventoryType(itemSparse->InventoryType));
603
604 if (Scaling.Class == -6)
605 if (GtStaminaMultByILvl const* staminaMult = sStaminaMultByILvlGameTable.GetRow(effectiveItemLevel))
606 if (ItemSparseEntry const* itemSparse = sItemSparseStore.LookupEntry(itemId))
607 value *= GetIlvlStatMultiplier(staminaMult, InventoryType(itemSparse->InventoryType));
608 }
609
610 value *= Scaling.Coefficient;
611 if (value > 0.0f && value < 1.0f)
612 value = 1.0f;
613
614 return int32(round(value));
615 }
616 else
617 {
618 float value = BasePoints;
620 if (stat != ExpectedStatType::None)
621 {
624
625 // TODO - add expansion and content tuning id args?
626 uint32 contentTuningId = _spellInfo->ContentTuningId; // content tuning should be passed as arg, the one stored in SpellInfo is fallback
627 int32 expansion = -2;
628 if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(contentTuningId))
629 expansion = contentTuning->ExpansionID;
630
631 int32 level = 1;
633 level = target->GetLevel();
634 else if (caster && caster->IsUnit())
635 level = caster->ToUnit()->GetLevel();
636
637 value = sDB2Manager.EvaluateExpectedStat(stat, level, expansion, 0, CLASS_NONE, 0) * BasePoints / 100.0f;
638 }
639
640 return int32(round(value));
641 }
642}
643
644float SpellEffectInfo::CalcValueMultiplier(WorldObject* caster, Spell* spell /*= nullptr*/) const
645{
646 float multiplier = Amplitude;
647 if (Player* modOwner = (caster ? caster->GetSpellModOwner() : nullptr))
648 modOwner->ApplySpellMod(_spellInfo, SpellModOp::Amplitude, multiplier, spell);
649 return multiplier;
650}
651
652float SpellEffectInfo::CalcDamageMultiplier(WorldObject* caster, Spell* spell /*= nullptr*/) const
653{
654 float multiplierPercent = ChainAmplitude * 100.0f;
655 if (Player* modOwner = (caster ? caster->GetSpellModOwner() : nullptr))
656 modOwner->ApplySpellMod(_spellInfo, SpellModOp::ChainAmplitude, multiplierPercent, spell);
657 return multiplierPercent / 100.0f;
658}
659
661{
662 switch (targetIndex)
663 {
665 return TargetARadiusEntry != nullptr;
667 return TargetBRadiusEntry != nullptr;
668 default:
669 return false;
670 }
671}
672
673float SpellEffectInfo::CalcRadius(WorldObject* caster /*= nullptr*/, SpellTargetIndex targetIndex /*=SpellTargetIndex::TargetA*/, Spell* spell /*= nullptr*/) const
674{
675 // TargetA -> TargetARadiusEntry
676 // TargetB -> TargetBRadiusEntry
677 // Aura effects have TargetARadiusEntry == TargetBRadiusEntry (mostly)
680 if (targetIndex == SpellTargetIndex::TargetB && HasRadius(targetIndex))
681 {
682 target = TargetB;
683 entry = TargetBRadiusEntry;
684 }
685
686 if (!entry)
687 return 0.0f;
688
689 float radius = entry->RadiusMin;
690
691 // Random targets use random value between RadiusMin and RadiusMax
692 // For other cases, client uses RadiusMax if RadiusMin is 0
693 if (target.GetTarget() == TARGET_DEST_CASTER_RANDOM ||
696 radius += (entry->RadiusMax - radius) * rand_norm();
697 else if (radius == 0.0f)
698 radius = entry->RadiusMax;
699
700 if (caster)
701 {
702 if (Unit const* casterUnit = caster->ToUnit())
703 radius += entry->RadiusPerLevel * casterUnit->GetLevel();
704
705 radius = std::min(radius, entry->RadiusMax);
706
707 if (Player* modOwner = caster->GetSpellModOwner())
708 modOwner->ApplySpellMod(_spellInfo, SpellModOp::Radius, radius, spell);
709
711 if (Unit const* casterUnit = caster->ToUnit(); casterUnit && Spell::CanIncreaseRangeByMovement(casterUnit))
712 radius += 2.0f;
713 }
714
715 return radius;
716}
717
719{
720 // TargetA -> TargetARadiusEntry
721 // TargetB -> TargetBRadiusEntry
722 // Aura effects have TargetARadiusEntry == TargetBRadiusEntry (mostly)
724 if (targetIndex == SpellTargetIndex::TargetB && HasRadius(targetIndex))
725 entry = TargetBRadiusEntry;
726
728 if (!entry)
729 return bounds;
730
731 bounds.emplace(entry->RadiusMin, entry->RadiusMax);
732
733 if (caster)
734 {
735 if (Player* modOwner = caster->GetSpellModOwner())
736 modOwner->ApplySpellMod(_spellInfo, SpellModOp::Radius, bounds->second, spell);
737
739 {
740 if (Unit const* casterUnit = caster->ToUnit(); casterUnit && Spell::CanIncreaseRangeByMovement(casterUnit))
741 {
742 bounds->first = std::max(bounds->first - 2.0f, 0.0f);
743 bounds->second += 2.0f;
744 }
745 }
746 }
747
748 return bounds;
749}
750
752{
754}
755
756uint32 SpellEffectInfo::GetMissingTargetMask(bool srcSet /*= false*/, bool dstSet /*= false*/, uint32 mask /*=0*/) const
757{
758 uint32 effImplicitTargetMask = GetTargetFlagMask(GetUsedTargetObjectType());
759 uint32 providedTargetMask = GetProvidedTargetMask() | mask;
760
761 // remove all flags covered by effect target mask
762 if (providedTargetMask & TARGET_FLAG_UNIT_MASK)
763 effImplicitTargetMask &= ~(TARGET_FLAG_UNIT_MASK);
764 if (providedTargetMask & TARGET_FLAG_CORPSE_MASK)
765 effImplicitTargetMask &= ~(TARGET_FLAG_UNIT_MASK | TARGET_FLAG_CORPSE_MASK);
766 if (providedTargetMask & TARGET_FLAG_GAMEOBJECT_ITEM)
768 if (providedTargetMask & TARGET_FLAG_GAMEOBJECT)
769 effImplicitTargetMask &= ~(TARGET_FLAG_GAMEOBJECT | TARGET_FLAG_GAMEOBJECT_ITEM);
770 if (providedTargetMask & TARGET_FLAG_ITEM)
771 effImplicitTargetMask &= ~(TARGET_FLAG_ITEM | TARGET_FLAG_GAMEOBJECT_ITEM);
772 if (dstSet || providedTargetMask & TARGET_FLAG_DEST_LOCATION)
773 effImplicitTargetMask &= ~(TARGET_FLAG_DEST_LOCATION);
774 if (srcSet || providedTargetMask & TARGET_FLAG_SOURCE_LOCATION)
775 effImplicitTargetMask &= ~(TARGET_FLAG_SOURCE_LOCATION);
776
777 return effImplicitTargetMask;
778}
779
781{
782 return _data[Effect].ImplicitTargetType;
783}
784
786{
787 return _data[Effect].UsedTargetObjectType;
788}
789
791{
792 switch (Effect)
793 {
805 if (MiscValue == POWER_MANA)
821 switch (ApplyAuraName)
822 {
866 if (MiscValue == POWER_MANA)
869 default:
870 break;
871 }
872 break;
873 default:
874 break;
875 }
876
878}
879
880std::array<SpellEffectInfo::StaticData, TOTAL_SPELL_EFFECTS> SpellEffectInfo::_data =
881{ {
882 // implicit target type used target object type
884 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 1 SPELL_EFFECT_INSTAKILL
885 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 2 SPELL_EFFECT_SCHOOL_DAMAGE
886 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 3 SPELL_EFFECT_DUMMY
887 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 4 SPELL_EFFECT_PORTAL_TELEPORT
889 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 6 SPELL_EFFECT_APPLY_AURA
890 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 7 SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
891 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 8 SPELL_EFFECT_POWER_DRAIN
892 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 9 SPELL_EFFECT_HEALTH_LEECH
895 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 12 SPELL_EFFECT_PORTAL
896 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 13 SPELL_EFFECT_TELEPORT_TO_RETURN_POINT
897 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 14 SPELL_EFFECT_INCREASE_CURRENCY_CAP
898 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 15 SPELL_EFFECT_TELEPORT_WITH_SPELL_VISUAL_KIT_LOADING_SCREEN
899 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 16 SPELL_EFFECT_QUEST_COMPLETE
900 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 17 SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL
902 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 19 SPELL_EFFECT_ADD_EXTRA_ATTACKS
903 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 20 SPELL_EFFECT_DODGE
904 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 21 SPELL_EFFECT_EVADE
905 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 22 SPELL_EFFECT_PARRY
906 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 23 SPELL_EFFECT_BLOCK
907 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 24 SPELL_EFFECT_CREATE_ITEM
908 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 25 SPELL_EFFECT_WEAPON
909 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 26 SPELL_EFFECT_DEFENSE
910 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 27 SPELL_EFFECT_PERSISTENT_AREA_AURA
911 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 28 SPELL_EFFECT_SUMMON
913 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 30 SPELL_EFFECT_ENERGIZE
914 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 31 SPELL_EFFECT_WEAPON_PERCENT_DAMAGE
915 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 32 SPELL_EFFECT_TRIGGER_MISSILE
917 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 34 SPELL_EFFECT_SUMMON_CHANGE_ITEM
918 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 35 SPELL_EFFECT_APPLY_AREA_AURA_PARTY
919 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 36 SPELL_EFFECT_LEARN_SPELL
920 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 37 SPELL_EFFECT_SPELL_DEFENSE
921 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 38 SPELL_EFFECT_DISPEL
922 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 39 SPELL_EFFECT_LANGUAGE
923 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 40 SPELL_EFFECT_DUAL_WIELD
925 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 42 SPELL_EFFECT_JUMP_DEST
926 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 43 SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER
927 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 44 SPELL_EFFECT_SKILL_STEP
928 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 45 SPELL_EFFECT_ADD_HONOR
929 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 46 SPELL_EFFECT_SPAWN
930 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 47 SPELL_EFFECT_TRADE_SKILL
931 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 48 SPELL_EFFECT_STEALTH
932 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 49 SPELL_EFFECT_DETECT
933 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 50 SPELL_EFFECT_TRANS_DOOR
934 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 51 SPELL_EFFECT_FORCE_CRITICAL_HIT
935 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 52 SPELL_EFFECT_SET_MAX_BATTLE_PET_COUNT
936 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 53 SPELL_EFFECT_ENCHANT_ITEM
937 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 54 SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY
938 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 55 SPELL_EFFECT_TAMECREATURE
939 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 56 SPELL_EFFECT_SUMMON_PET
940 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 57 SPELL_EFFECT_LEARN_PET_SPELL
941 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 58 SPELL_EFFECT_WEAPON_DAMAGE
942 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 59 SPELL_EFFECT_CREATE_RANDOM_ITEM
943 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 60 SPELL_EFFECT_PROFICIENCY
944 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 61 SPELL_EFFECT_SEND_EVENT
945 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 62 SPELL_EFFECT_POWER_BURN
946 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 63 SPELL_EFFECT_THREAT
947 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 64 SPELL_EFFECT_TRIGGER_SPELL
948 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 65 SPELL_EFFECT_APPLY_AREA_AURA_RAID
949 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 66 SPELL_EFFECT_RECHARGE_ITEM
950 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 67 SPELL_EFFECT_HEAL_MAX_HEALTH
951 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 68 SPELL_EFFECT_INTERRUPT_CAST
953 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 70 SPELL_EFFECT_COMPLETE_AND_REWARD_WORLD_QUEST
954 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 71 SPELL_EFFECT_PICKPOCKET
955 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 72 SPELL_EFFECT_ADD_FARSIGHT
956 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 73 SPELL_EFFECT_UNTRAIN_TALENTS
957 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 74 SPELL_EFFECT_APPLY_GLYPH
958 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 75 SPELL_EFFECT_HEAL_MECHANICAL
959 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 76 SPELL_EFFECT_SUMMON_OBJECT_WILD
960 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 77 SPELL_EFFECT_SCRIPT_EFFECT
961 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 78 SPELL_EFFECT_ATTACK
962 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 79 SPELL_EFFECT_SANCTUARY
963 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 80 SPELL_EFFECT_MODIFY_FOLLOWER_ITEM_LEVEL
964 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 81 SPELL_EFFECT_PUSH_ABILITY_TO_ACTION_BAR
965 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 82 SPELL_EFFECT_BIND_SIGHT
967 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 84 SPELL_EFFECT_STUCK
968 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 85 SPELL_EFFECT_SUMMON_PLAYER
969 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 86 SPELL_EFFECT_ACTIVATE_OBJECT
970 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 87 SPELL_EFFECT_GAMEOBJECT_DAMAGE
971 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 88 SPELL_EFFECT_GAMEOBJECT_REPAIR
972 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_GOBJ}, // 89 SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE
973 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 90 SPELL_EFFECT_KILL_CREDIT
974 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 91 SPELL_EFFECT_THREAT_ALL
975 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 92 SPELL_EFFECT_ENCHANT_HELD_ITEM
976 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 93 SPELL_EFFECT_FORCE_DESELECT
977 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 94 SPELL_EFFECT_SELF_RESURRECT
978 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 95 SPELL_EFFECT_SKINNING
979 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 96 SPELL_EFFECT_CHARGE
980 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 97 SPELL_EFFECT_CAST_BUTTON
981 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 98 SPELL_EFFECT_KNOCK_BACK
982 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 99 SPELL_EFFECT_DISENCHANT
983 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 100 SPELL_EFFECT_INEBRIATE
984 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 101 SPELL_EFFECT_FEED_PET
985 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 102 SPELL_EFFECT_DISMISS_PET
986 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 103 SPELL_EFFECT_REPUTATION
987 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 104 SPELL_EFFECT_SUMMON_OBJECT_SLOT1
988 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 105 SPELL_EFFECT_SURVEY
989 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 106 SPELL_EFFECT_CHANGE_RAID_MARKER
990 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 107 SPELL_EFFECT_SHOW_CORPSE_LOOT
991 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 108 SPELL_EFFECT_DISPEL_MECHANIC
992 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 109 SPELL_EFFECT_RESURRECT_PET
993 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 110 SPELL_EFFECT_DESTROY_ALL_TOTEMS
994 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 111 SPELL_EFFECT_DURABILITY_DAMAGE
996 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 113 SPELL_EFFECT_CANCEL_CONVERSATION
997 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 114 SPELL_EFFECT_ATTACK_ME
998 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 115 SPELL_EFFECT_DURABILITY_DAMAGE_PCT
999 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_CORPSE_ENEMY}, // 116 SPELL_EFFECT_SKIN_PLAYER_CORPSE
1000 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 117 SPELL_EFFECT_SPIRIT_HEAL
1001 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 118 SPELL_EFFECT_SKILL
1002 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 119 SPELL_EFFECT_APPLY_AREA_AURA_PET
1003 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 120 SPELL_EFFECT_TELEPORT_GRAVEYARD
1004 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 121 SPELL_EFFECT_NORMALIZED_WEAPON_DMG
1005 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 122 SPELL_EFFECT_122
1006 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 123 SPELL_EFFECT_SEND_TAXI
1007 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 124 SPELL_EFFECT_PULL_TOWARDS
1008 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 125 SPELL_EFFECT_MODIFY_THREAT_PERCENT
1009 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 126 SPELL_EFFECT_STEAL_BENEFICIAL_BUFF
1010 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 127 SPELL_EFFECT_PROSPECTING
1011 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 128 SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
1012 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 129 SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
1013 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 130 SPELL_EFFECT_REDIRECT_THREAT
1014 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 131 SPELL_EFFECT_PLAY_SOUND
1015 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 132 SPELL_EFFECT_PLAY_MUSIC
1016 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 133 SPELL_EFFECT_UNLEARN_SPECIALIZATION
1017 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 134 SPELL_EFFECT_KILL_CREDIT2
1018 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 135 SPELL_EFFECT_CALL_PET
1019 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 136 SPELL_EFFECT_HEAL_PCT
1020 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 137 SPELL_EFFECT_ENERGIZE_PCT
1021 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 138 SPELL_EFFECT_LEAP_BACK
1022 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 139 SPELL_EFFECT_CLEAR_QUEST
1023 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 140 SPELL_EFFECT_FORCE_CAST
1024 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 141 SPELL_EFFECT_FORCE_CAST_WITH_VALUE
1025 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE
1026 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 143 SPELL_EFFECT_APPLY_AREA_AURA_OWNER
1027 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 144 SPELL_EFFECT_KNOCK_BACK_DEST
1028 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 145 SPELL_EFFECT_PULL_TOWARDS_DEST
1029 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 146 SPELL_EFFECT_RESTORE_GARRISON_TROOP_VITALITY
1030 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 147 SPELL_EFFECT_QUEST_FAIL
1031 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 148 SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE
1032 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 149 SPELL_EFFECT_CHARGE_DEST
1033 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 150 SPELL_EFFECT_QUEST_START
1034 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 151 SPELL_EFFECT_TRIGGER_SPELL_2
1035 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 152 SPELL_EFFECT_SUMMON_RAF_FRIEND
1036 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 153 SPELL_EFFECT_CREATE_TAMED_PET
1037 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 154 SPELL_EFFECT_DISCOVER_TAXI
1038 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_UNIT}, // 155 SPELL_EFFECT_TITAN_GRIP
1039 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 156 SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC
1040 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 157 SPELL_EFFECT_CREATE_LOOT
1041 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 158 SPELL_EFFECT_MILLING
1042 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 159 SPELL_EFFECT_ALLOW_RENAME_PET
1043 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 160 SPELL_EFFECT_FORCE_CAST_2
1044 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 161 SPELL_EFFECT_TALENT_SPEC_COUNT
1045 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 162 SPELL_EFFECT_TALENT_SPEC_SELECT
1046 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 163 SPELL_EFFECT_OBLITERATE_ITEM
1047 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 164 SPELL_EFFECT_REMOVE_AURA
1048 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 165 SPELL_EFFECT_DAMAGE_FROM_MAX_HEALTH_PCT
1049 {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 166 SPELL_EFFECT_GIVE_CURRENCY
1050 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 167 SPELL_EFFECT_UPDATE_PLAYER_PHASE
1051 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 168 SPELL_EFFECT_ALLOW_CONTROL_PET
1052 {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 169 SPELL_EFFECT_DESTROY_ITEM
1053 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 170 SPELL_EFFECT_UPDATE_ZONE_AURAS_AND_PHASES
1054 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 171 SPELL_EFFECT_SUMMON_PERSONAL_GAMEOBJECT
1055 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_CORPSE_ALLY}, // 172 SPELL_EFFECT_RESURRECT_WITH_AURA
1056 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 173 SPELL_EFFECT_UNLOCK_GUILD_VAULT_TAB
1057 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 174 SPELL_EFFECT_APPLY_AURA_ON_PET
1058 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 175 SPELL_EFFECT_175
1059 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 176 SPELL_EFFECT_SANCTUARY_2
1060 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 177 SPELL_EFFECT_DESPAWN_PERSISTENT_AREA_AURA
1061 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 178 SPELL_EFFECT_178
1062 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 179 SPELL_EFFECT_CREATE_AREATRIGGER
1063 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 180 SPELL_EFFECT_UPDATE_AREATRIGGER
1064 {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 181 SPELL_EFFECT_REMOVE_TALENT
1065 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 182 SPELL_EFFECT_DESPAWN_AREATRIGGER
1066 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 183 SPELL_EFFECT_183
1067 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 184 SPELL_EFFECT_REPUTATION_2
1068 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 185 SPELL_EFFECT_185
1069 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 186 SPELL_EFFECT_186
1070 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 187 SPELL_EFFECT_RANDOMIZE_ARCHAEOLOGY_DIGSITES
1071 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_DEST}, // 188 SPELL_EFFECT_SUMMON_STABLED_PET_AS_GUARDIAN
1072 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 189 SPELL_EFFECT_LOOT
1073 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 190 SPELL_EFFECT_CHANGE_PARTY_MEMBERS
1074 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 191 SPELL_EFFECT_TELEPORT_TO_DIGSITE
1075 {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 192 SPELL_EFFECT_UNCAGE_BATTLEPET
1076 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 193 SPELL_EFFECT_START_PET_BATTLE
1077 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 194 SPELL_EFFECT_194
1078 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 195 SPELL_EFFECT_PLAY_SCENE_SCRIPT_PACKAGE
1079 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 196 SPELL_EFFECT_CREATE_SCENE_OBJECT
1080 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 197 SPELL_EFFECT_CREATE_PERSONAL_SCENE_OBJECT
1081 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 198 SPELL_EFFECT_PLAY_SCENE
1082 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 199 SPELL_EFFECT_DESPAWN_SUMMON
1083 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 200 SPELL_EFFECT_HEAL_BATTLEPET_PCT
1084 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 201 SPELL_EFFECT_ENABLE_BATTLE_PETS
1085 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 202 SPELL_EFFECT_APPLY_AREA_AURA_SUMMONS
1086 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 203 SPELL_EFFECT_REMOVE_AURA_2
1087 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 204 SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY
1088 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 205 SPELL_EFFECT_LAUNCH_QUEST_CHOICE
1089 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 206 SPELL_EFFECT_ALTER_IETM
1090 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 207 SPELL_EFFECT_LAUNCH_QUEST_TASK
1091 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 208 SPELL_EFFECT_SET_REPUTATION
1092 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 209 SPELL_EFFECT_209
1093 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 210 SPELL_EFFECT_LEARN_GARRISON_BUILDING
1094 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 211 SPELL_EFFECT_LEARN_GARRISON_SPECIALIZATION
1095 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 212 SPELL_EFFECT_REMOVE_AURA_BY_SPELL_LABEL
1096 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 213 SPELL_EFFECT_JUMP_DEST_2
1097 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 214 SPELL_EFFECT_CREATE_GARRISON
1098 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 215 SPELL_EFFECT_UPGRADE_CHARACTER_SPELLS
1099 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 216 SPELL_EFFECT_CREATE_SHIPMENT
1100 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 217 SPELL_EFFECT_UPGRADE_GARRISON
1101 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 218 SPELL_EFFECT_218
1102 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 219 SPELL_EFFECT_CREATE_CONVERSATION
1103 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 220 SPELL_EFFECT_ADD_GARRISON_FOLLOWER
1104 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 221 SPELL_EFFECT_ADD_GARRISON_MISSION
1105 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 222 SPELL_EFFECT_CREATE_HEIRLOOM_ITEM
1106 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 223 SPELL_EFFECT_CHANGE_ITEM_BONUSES
1107 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 224 SPELL_EFFECT_ACTIVATE_GARRISON_BUILDING
1108 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 225 SPELL_EFFECT_GRANT_BATTLEPET_LEVEL
1109 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 226 SPELL_EFFECT_TRIGGER_ACTION_SET
1110 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 227 SPELL_EFFECT_TELEPORT_TO_LFG_DUNGEON
1111 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 228 SPELL_EFFECT_228
1112 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 229 SPELL_EFFECT_SET_FOLLOWER_QUALITY
1114 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 231 SPELL_EFFECT_INCREASE_FOLLOWER_EXPERIENCE
1115 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 232 SPELL_EFFECT_REMOVE_PHASE
1116 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 233 SPELL_EFFECT_RANDOMIZE_FOLLOWER_ABILITIES
1117 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 234 SPELL_EFFECT_234
1118 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 235 SPELL_EFFECT_235
1119 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 236 SPELL_EFFECT_GIVE_EXPERIENCE
1120 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 237 SPELL_EFFECT_GIVE_RESTED_EXPERIENCE_BONUS
1121 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 238 SPELL_EFFECT_INCREASE_SKILL
1122 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 239 SPELL_EFFECT_END_GARRISON_BUILDING_CONSTRUCTION
1123 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 240 SPELL_EFFECT_GIVE_ARTIFACT_POWER
1124 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 241 SPELL_EFFECT_241
1125 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 242 SPELL_EFFECT_GIVE_ARTIFACT_POWER_NO_BONUS
1126 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 243 SPELL_EFFECT_APPLY_ENCHANT_ILLUSION
1127 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 244 SPELL_EFFECT_LEARN_FOLLOWER_ABILITY
1128 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 245 SPELL_EFFECT_UPGRADE_HEIRLOOM
1129 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 246 SPELL_EFFECT_FINISH_GARRISON_MISSION
1130 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 247 SPELL_EFFECT_ADD_GARRISON_MISSION_SET
1131 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 248 SPELL_EFFECT_FINISH_SHIPMENT
1132 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 249 SPELL_EFFECT_FORCE_EQUIP_ITEM
1133 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 250 SPELL_EFFECT_TAKE_SCREENSHOT
1134 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 251 SPELL_EFFECT_SET_GARRISON_CACHE_SIZE
1135 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT_AND_DEST}, // 252 SPELL_EFFECT_TELEPORT_UNITS
1136 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 253 SPELL_EFFECT_GIVE_HONOR
1137 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_DEST}, // 254 SPELL_EFFECT_JUMP_CHARGE
1138 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 255 SPELL_EFFECT_LEARN_TRANSMOG_SET
1139 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 256 SPELL_EFFECT_256
1140 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 257 SPELL_EFFECT_257
1141 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 258 SPELL_EFFECT_MODIFY_KEYSTONE
1142 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 259 SPELL_EFFECT_RESPEC_AZERITE_EMPOWERED_ITEM
1143 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 260 SPELL_EFFECT_SUMMON_STABLED_PET
1144 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 261 SPELL_EFFECT_SCRAP_ITEM
1145 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 262 SPELL_EFFECT_262
1146 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 263 SPELL_EFFECT_REPAIR_ITEM
1147 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 264 SPELL_EFFECT_REMOVE_GEM
1148 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 265 SPELL_EFFECT_LEARN_AZERITE_ESSENCE_POWER
1149 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 266 SPELL_EFFECT_SET_ITEM_BONUS_LIST_GROUP_ENTRY
1150 {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 267 SPELL_EFFECT_CREATE_PRIVATE_CONVERSATION
1151 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 268 SPELL_EFFECT_APPLY_MOUNT_EQUIPMENT
1152 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 269 SPELL_EFFECT_INCREASE_ITEM_BONUS_LIST_GROUP_STEP
1154 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 271 SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM
1155 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 272 SPELL_EFFECT_SET_COVENANT
1156 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 273 SPELL_EFFECT_CRAFT_RUNEFORGE_LEGENDARY
1157 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 274 SPELL_EFFECT_274
1158 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 275 SPELL_EFFECT_275
1159 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 276 SPELL_EFFECT_LEARN_TRANSMOG_ILLUSION
1160 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 277 SPELL_EFFECT_SET_CHROMIE_TIME
1161 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 278 SPELL_EFFECT_278
1162 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 279 SPELL_EFFECT_LEARN_GARR_TALENT
1163 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 280 SPELL_EFFECT_280
1164 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 281 SPELL_EFFECT_LEARN_SOULBIND_CONDUIT
1165 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 282 SPELL_EFFECT_CONVERT_ITEMS_TO_CURRENCY
1166 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 283 SPELL_EFFECT_COMPLETE_CAMPAIGN
1167 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 284 SPELL_EFFECT_SEND_CHAT_MESSAGE
1168 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 285 SPELL_EFFECT_MODIFY_KEYSTONE_2
1169 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 286 SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE
1170 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 287 SPELL_EFFECT_SET_GARRISON_FOLLOWER_LEVEL
1171 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 288 SPELL_EFFECT_CRAFT_ITEM
1172 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 289 SPELL_EFFECT_MODIFY_AURA_STACKS
1173 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 290 SPELL_EFFECT_MODIFY_COOLDOWN
1174 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 291 SPELL_EFFECT_MODIFY_COOLDOWNS
1175 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 292 SPELL_EFFECT_MODIFY_COOLDOWNS_BY_CATEGORY
1176 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 293 SPELL_EFFECT_MODIFY_CHARGES
1177 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 294 SPELL_EFFECT_CRAFT_LOOT
1178 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 295 SPELL_EFFECT_SALVAGE_ITEM
1179 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 296 SPELL_EFFECT_CRAFT_SALVAGE_ITEM
1180 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 297 SPELL_EFFECT_RECRAFT_ITEM
1181 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 298 SPELL_EFFECT_CANCEL_ALL_PRIVATE_CONVERSATIONS
1182 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 299 SPELL_EFFECT_299
1183 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 300 SPELL_EFFECT_300
1184 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 301 SPELL_EFFECT_CRAFT_ENCHANT
1185 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_NONE}, // 302 SPELL_EFFECT_GATHERING
1186 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 303 SPELL_EFFECT_CREATE_TRAIT_TREE_CONFIG
1187 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 304 SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG
1188 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 305 SPELL_EFFECT_305
1189 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 306 SPELL_EFFECT_UPDATE_INTERACTIONS
1190 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 307 SPELL_EFFECT_307
1191 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 308 SPELL_EFFECT_CANCEL_PRELOAD_WORLD
1192 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 309 SPELL_EFFECT_PRELOAD_WORLD
1193 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 310 SPELL_EFFECT_310
1194 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 311 SPELL_EFFECT_ENSURE_WORLD_LOADED
1195 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 312 SPELL_EFFECT_312
1196 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 313 SPELL_EFFECT_CHANGE_ITEM_BONUSES_2
1197 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 314 SPELL_EFFECT_ADD_SOCKET_BONUS
1198 {EFFECT_IMPLICIT_TARGET_CASTER, TARGET_OBJECT_TYPE_UNIT}, // 315 SPELL_EFFECT_LEARN_TRANSMOG_APPEARANCE_FROM_ITEM_MOD_APPEARANCE_GROUP
1199 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 316 SPELL_EFFECT_KILL_CREDIT_LABEL_1
1200 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 317 SPELL_EFFECT_KILL_CREDIT_LABEL_2
1201 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 318 SPELL_EFFECT_318
1202 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 319 SPELL_EFFECT_319
1203 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 320 SPELL_EFFECT_320
1204 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 321 SPELL_EFFECT_321
1205 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 322 SPELL_EFFECT_322
1206 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 323 SPELL_EFFECT_323
1207 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 324 SPELL_EFFECT_324
1208 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 325 SPELL_EFFECT_325
1209 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 326 SPELL_EFFECT_326
1210 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 327 SPELL_EFFECT_327
1211 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 328 SPELL_EFFECT_328
1212 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 329 SPELL_EFFECT_329
1213 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 330 SPELL_EFFECT_330
1214 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 331 SPELL_EFFECT_331
1215 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 332 SPELL_EFFECT_332
1216 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 333 SPELL_EFFECT_333
1217 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 334 SPELL_EFFECT_334
1218 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 335 SPELL_EFFECT_335
1219 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 336 SPELL_EFFECT_336
1220 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 337 SPELL_EFFECT_337
1221 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 338 SPELL_EFFECT_338
1222 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 339 SPELL_EFFECT_UI_ACTION
1223 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 340 SPELL_EFFECT_340
1224 {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 341 SPELL_EFFECT_LEARN_WARBAND_SCENE
1225} };
1226
1228 : Id(spellName->ID), Difficulty(difficulty)
1229{
1230 _effects.reserve(32);
1231 for (SpellEffectEntry const* spellEffect : data.Effects)
1232 {
1233 if (!spellEffect)
1234 continue;
1235
1237 }
1238
1239 // Correct EffectIndex for blank effects
1240 for (size_t i = 0; i < _effects.size(); ++i)
1241 {
1242 _effects[i]._spellInfo = this;
1243 _effects[i].EffectIndex = SpellEffIndex(i);
1244 }
1245
1246 _effects.shrink_to_fit();
1247
1248 SpellName = &spellName->Name;
1249
1250 // SpellMiscEntry
1251 if (SpellMiscEntry const* _misc = data.Misc)
1252 {
1253 Attributes = _misc->Attributes[0];
1254 AttributesEx = _misc->Attributes[1];
1255 AttributesEx2 = _misc->Attributes[2];
1256 AttributesEx3 = _misc->Attributes[3];
1257 AttributesEx4 = _misc->Attributes[4];
1258 AttributesEx5 = _misc->Attributes[5];
1259 AttributesEx6 = _misc->Attributes[6];
1260 AttributesEx7 = _misc->Attributes[7];
1261 AttributesEx8 = _misc->Attributes[8];
1262 AttributesEx9 = _misc->Attributes[9];
1263 AttributesEx10 = _misc->Attributes[10];
1264 AttributesEx11 = _misc->Attributes[11];
1265 AttributesEx12 = _misc->Attributes[12];
1266 AttributesEx13 = _misc->Attributes[13];
1267 AttributesEx14 = _misc->Attributes[14];
1268 AttributesEx15 = _misc->Attributes[15];
1269 CastTimeEntry = sSpellCastTimesStore.LookupEntry(_misc->CastingTimeIndex);
1270 DurationEntry = sSpellDurationStore.LookupEntry(_misc->DurationIndex);
1271 RangeEntry = sSpellRangeStore.LookupEntry(_misc->RangeIndex);
1272 Speed = _misc->Speed;
1273 LaunchDelay = _misc->LaunchDelay;
1274 SchoolMask = _misc->SchoolMask;
1275 IconFileDataId = _misc->SpellIconFileDataID;
1276 ActiveIconFileDataId = _misc->ActiveIconFileDataID;
1277 ContentTuningId = _misc->ContentTuningID;
1278 ShowFutureSpellPlayerConditionID = _misc->ShowFutureSpellPlayerConditionID;
1279 }
1280
1281 // SpellScalingEntry
1282 if (SpellScalingEntry const* _scaling = data.Scaling)
1283 {
1284 Scaling.MinScalingLevel = _scaling->MinScalingLevel;
1285 Scaling.MaxScalingLevel = _scaling->MaxScalingLevel;
1286 Scaling.ScalesFromItemLevel = _scaling->ScalesFromItemLevel;
1287 }
1288
1289 // SpellAuraOptionsEntry
1290 if (SpellAuraOptionsEntry const* _options = data.AuraOptions)
1291 {
1292 ProcFlags = _options->ProcTypeMask;
1293 ProcChance = _options->ProcChance;
1294 ProcCharges = _options->ProcCharges;
1295 ProcCooldown = _options->ProcCategoryRecovery;
1296 StackAmount = _options->CumulativeAura;
1297 if (SpellProcsPerMinuteEntry const* _ppm = sSpellProcsPerMinuteStore.LookupEntry(_options->SpellProcsPerMinuteID))
1298 {
1299 ProcBasePPM = _ppm->BaseProcRate;
1300 ProcPPMMods = sDB2Manager.GetSpellProcsPerMinuteMods(_ppm->ID);
1301 }
1302 }
1303
1304 // SpellAuraRestrictionsEntry
1305 if (SpellAuraRestrictionsEntry const* _aura = data.AuraRestrictions)
1306 {
1307 CasterAuraState = _aura->CasterAuraState;
1308 TargetAuraState = _aura->TargetAuraState;
1309 ExcludeCasterAuraState = _aura->ExcludeCasterAuraState;
1310 ExcludeTargetAuraState = _aura->ExcludeTargetAuraState;
1311 CasterAuraSpell = _aura->CasterAuraSpell;
1312 TargetAuraSpell = _aura->TargetAuraSpell;
1313 ExcludeCasterAuraSpell = _aura->ExcludeCasterAuraSpell;
1314 ExcludeTargetAuraSpell = _aura->ExcludeTargetAuraSpell;
1315 CasterAuraType = AuraType(_aura->CasterAuraType);
1316 TargetAuraType = AuraType(_aura->TargetAuraType);
1317 ExcludeCasterAuraType = AuraType(_aura->ExcludeCasterAuraType);
1318 ExcludeTargetAuraType = AuraType(_aura->ExcludeTargetAuraType);
1319 }
1320
1321 // SpellCastingRequirementsEntry
1322 if (SpellCastingRequirementsEntry const* _castreq = data.CastingRequirements)
1323 {
1324 RequiresSpellFocus = _castreq->RequiresSpellFocus;
1325 FacingCasterFlags = _castreq->FacingCasterFlags;
1326 RequiredAreasID = _castreq->RequiredAreasID;
1327 }
1328
1329 // SpellCategoriesEntry
1330 if (SpellCategoriesEntry const* _categories = data.Categories)
1331 {
1332 CategoryId = _categories->Category;
1333 Dispel = _categories->DispelType;
1334 Mechanic = _categories->Mechanic;
1335 StartRecoveryCategory = _categories->StartRecoveryCategory;
1336 DmgClass = _categories->DefenseType;
1337 PreventionType = _categories->PreventionType;
1338 ChargeCategoryId = _categories->ChargeCategory;
1339 }
1340
1341 // SpellClassOptionsEntry
1342 if (SpellClassOptionsEntry const* _class = data.ClassOptions)
1343 {
1344 SpellFamilyName = _class->SpellClassSet;
1345 SpellFamilyFlags = _class->SpellClassMask;
1346 }
1347
1348 // SpellCooldownsEntry
1349 if (SpellCooldownsEntry const* _cooldowns = data.Cooldowns)
1350 {
1351 RecoveryTime = _cooldowns->RecoveryTime;
1352 CategoryRecoveryTime = _cooldowns->CategoryRecoveryTime;
1353 StartRecoveryTime = _cooldowns->StartRecoveryTime;
1354 CooldownAuraSpellId = _cooldowns->AuraSpellID;
1355 }
1356
1357 // SpellEmpowerStageEntry
1358 std::ranges::transform(data.EmpowerStages, std::back_inserter(EmpowerStageThresholds), [](SpellEmpowerStageEntry const* stage) { return Milliseconds(stage->DurationMs); });
1359
1360 // SpellEquippedItemsEntry
1361 if (SpellEquippedItemsEntry const* _equipped = data.EquippedItems)
1362 {
1363 EquippedItemClass = _equipped->EquippedItemClass;
1364 EquippedItemSubClassMask = _equipped->EquippedItemSubclass;
1365 EquippedItemInventoryTypeMask = _equipped->EquippedItemInvTypes;
1366 }
1367
1368 // SpellInterruptsEntry
1369 if (SpellInterruptsEntry const* _interrupt = data.Interrupts)
1370 {
1371 InterruptFlags = SpellInterruptFlags(_interrupt->InterruptFlags);
1372 AuraInterruptFlags = SpellAuraInterruptFlags(_interrupt->AuraInterruptFlags[0]);
1373 AuraInterruptFlags2 = SpellAuraInterruptFlags2(_interrupt->AuraInterruptFlags[1]);
1374 ChannelInterruptFlags = SpellAuraInterruptFlags(_interrupt->ChannelInterruptFlags[0]);
1375 ChannelInterruptFlags2 = SpellAuraInterruptFlags2(_interrupt->ChannelInterruptFlags[1]);
1376 }
1377
1378 for (SpellLabelEntry const* label : data.Labels)
1379 Labels.insert(label->LabelID);
1380
1381 // SpellLevelsEntry
1382 if (SpellLevelsEntry const* _levels = data.Levels)
1383 {
1384 MaxLevel = _levels->MaxLevel;
1385 BaseLevel = _levels->BaseLevel;
1386 SpellLevel = _levels->SpellLevel;
1387 }
1388
1389 // SpellPowerEntry
1390 PowerCosts = data.Powers;
1391
1392 // SpellReagentsEntry
1393 if (SpellReagentsEntry const* _reagents = data.Reagents)
1394 {
1395 Reagent = _reagents->Reagent;
1396 ReagentCount = _reagents->ReagentCount;
1397 }
1398
1400
1401 // SpellShapeshiftEntry
1402 if (SpellShapeshiftEntry const* _shapeshift = data.Shapeshift)
1403 {
1404 Stances = MAKE_PAIR64(_shapeshift->ShapeshiftMask[0], _shapeshift->ShapeshiftMask[1]);
1405 StancesNot = MAKE_PAIR64(_shapeshift->ShapeshiftExclude[0], _shapeshift->ShapeshiftExclude[1]);
1406 }
1407
1408 // SpellTargetRestrictionsEntry
1409 if (SpellTargetRestrictionsEntry const* _target = data.TargetRestrictions)
1410 {
1411 ConeAngle = _target->ConeDegrees;
1412 Width = _target->Width;
1413 Targets = _target->Targets;
1414 TargetCreatureType = _target->TargetCreatureType;
1415 MaxAffectedTargets = _target->MaxTargets;
1416 MaxTargetLevel = _target->MaxTargetLevel;
1417 }
1418
1419 // SpellTotemsEntry
1420 if (SpellTotemsEntry const* _totem = data.Totems)
1421 {
1422 TotemCategory = _totem->RequiredTotemCategoryID;
1423 Totem = _totem->Totem;
1424 }
1425
1426 _visuals = data.Visuals;
1427}
1428
1429SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, std::vector<SpellEffectEntry> const& effects)
1430 : Id(spellName->ID), Difficulty(difficulty)
1431{
1432 SpellName = &spellName->Name;
1433
1434 _effects.reserve(32);
1435 for (SpellEffectEntry const& spellEffect : effects)
1436 Trinity::Containers::EnsureWritableVectorIndex(_effects, spellEffect.EffectIndex) = SpellEffectInfo(this, spellEffect);
1437
1438 // Correct EffectIndex for blank effects
1439 for (size_t i = 0; i < _effects.size(); ++i)
1440 {
1441 _effects[i]._spellInfo = this;
1442 _effects[i].EffectIndex = SpellEffIndex(i);
1443 }
1444
1445 _effects.shrink_to_fit();
1446}
1447
1449{
1451}
1452
1454{
1455 return CategoryId;
1456}
1457
1459{
1460 for (SpellEffectInfo const& eff : GetEffects())
1461 if (eff.IsEffect(effect))
1462 return true;
1463
1464 return false;
1465}
1466
1468{
1469 for (SpellEffectInfo const& effect : GetEffects())
1470 if (effect.IsAura(aura))
1471 return true;
1472
1473 return false;
1474}
1475
1477{
1478 for (SpellEffectInfo const& effect : GetEffects())
1479 if (effect.IsAreaAuraEffect())
1480 return true;
1481
1482 return false;
1483}
1484
1486{
1487 for (SpellEffectInfo const& effect : GetEffects())
1488 {
1489 if (effect.IsEffect())
1490 {
1491 switch (effect.Effect)
1492 {
1501 continue;
1502 default:
1503 return false;
1504 }
1505 }
1506 }
1507
1508 return true;
1509}
1510
1512{
1513 for (SpellEffectInfo const& effect : GetEffects())
1514 if (effect.TargetA.GetTarget() == target || effect.TargetB.GetTarget() == target)
1515 return true;
1516
1517 return false;
1518}
1519
1520bool SpellInfo::CanBeInterrupted(WorldObject const* interruptCaster, Unit const* interruptTarget, bool ignoreImmunity /*= false*/) const
1521{
1526 || (interruptCaster && interruptCaster->IsUnit() && interruptCaster->ToUnit()->HasAuraTypeWithMiscvalue(SPELL_AURA_ALLOW_INTERRUPT_SPELL, Id))
1527 || ((!(interruptTarget->GetMechanicImmunityMask() & (1 << MECHANIC_INTERRUPT)) || ignoreImmunity)
1530}
1531
1533{
1535}
1536
1538{
1539 if (GetEffects().size() < 2)
1540 return false;
1541
1545 || Id == 64323;
1546}
1547
1549{
1551}
1552
1554{
1555 for (SpellEffectInfo const& effect : GetEffects())
1556 {
1557 if (effect.Effect == SPELL_EFFECT_SKILL)
1558 {
1559 uint32 skill = effect.MiscValue;
1560
1561 if (IsProfessionSkill(skill))
1562 return true;
1563 }
1564 }
1565 return false;
1566}
1567
1569{
1570 for (SpellEffectInfo const& effect : GetEffects())
1571 {
1572 if (effect.Effect == SPELL_EFFECT_SKILL)
1573 {
1574 uint32 skill = effect.MiscValue;
1575
1576 if (IsPrimaryProfessionSkill(skill))
1577 return true;
1578 }
1579 }
1580 return false;
1581}
1582
1584{
1585 return IsPrimaryProfession() && GetRank() == 1;
1586}
1587
1589{
1590 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(Id);
1591
1592 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
1593 if (_spell_idx->second->SkillLine == skillType)
1594 return true;
1595
1596 return false;
1597}
1598
1600{
1601 for (SpellEffectInfo const& effect : GetEffects())
1602 if (effect.IsEffect() && (effect.IsTargetingArea() || effect.IsEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA) || effect.IsAreaAuraEffect()))
1603 return true;
1604
1605 return false;
1606}
1607
1608// checks if spell targets are selected from area, doesn't include spell effects in check (like area wide auras for example)
1610{
1611 for (SpellEffectInfo const& effect : GetEffects())
1612 if (effect.IsEffect() && effect.IsTargetingArea())
1613 return true;
1614
1615 return false;
1616}
1617
1619{
1621}
1622
1623bool SpellInfo::NeedsToBeTriggeredByCaster(SpellInfo const* triggeringSpell) const
1624{
1626 return true;
1627
1628 /*
1629 for (SpellEffectInfo const& effect : GetEffects())
1630 {
1631 if (effect.IsEffect())
1632 {
1633 if (effect.TargetA.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CHANNEL
1634 || effect.TargetB.GetSelectionCategory() == TARGET_SELECT_CATEGORY_CHANNEL)
1635 return true;
1636 }
1637 }
1638 */
1639
1640 if (triggeringSpell->IsChanneled())
1641 {
1642 uint32 mask = 0;
1643 for (SpellEffectInfo const& effect : GetEffects())
1644 {
1645 if (effect.TargetA.GetTarget() != TARGET_UNIT_CASTER && effect.TargetA.GetTarget() != TARGET_DEST_CASTER
1646 && effect.TargetB.GetTarget() != TARGET_UNIT_CASTER && effect.TargetB.GetTarget() != TARGET_DEST_CASTER)
1647 {
1648 mask |= effect.GetProvidedTargetMask();
1649 }
1650 }
1651
1652 if (mask & TARGET_FLAG_UNIT_MASK)
1653 return true;
1654 }
1655
1656 return false;
1657}
1658
1660{
1662}
1663
1665{
1666 if (IsPassive())
1667 return false;
1669 return false;
1670 return true;
1671}
1672
1674{
1676}
1677
1679{
1680 if (IsPassive())
1681 return false;
1682
1683 // All stance spells. if any better way, change it.
1684 for (SpellEffectInfo const& effect : GetEffects())
1685 {
1686 switch (SpellFamilyName)
1687 {
1689 // Paladin aura Spell
1690 if (effect.Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID)
1691 return false;
1692 break;
1693 case SPELLFAMILY_DRUID:
1694 // Druid form Spell
1695 if (effect.Effect == SPELL_EFFECT_APPLY_AURA &&
1696 effect.ApplyAuraName == SPELL_AURA_MOD_SHAPESHIFT)
1697 return false;
1698 break;
1699 }
1700 }
1701
1702 return true;
1703}
1704
1706{
1708}
1709
1711{
1712 return IsPassive() || Id == 55849 || Id == 40075 || Id == 44413; // Power Spark, Fel Flak Fire, Incanter's Absorption
1713}
1714
1716{
1719}
1720
1722{
1724 return true;
1725
1726 SpellCategoryEntry const* category = sSpellCategoryStore.LookupEntry(CategoryId);
1727 return category && category->Flags & SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT;
1728}
1729
1731{
1733}
1734
1736{
1738}
1739
1741{
1743 return true;
1744
1745 for (SpellEffectInfo const& effect : GetEffects())
1746 {
1747 if (!effect.IsEffect())
1748 continue;
1749
1750 if (effect.TargetA.GetObjectType() == TARGET_OBJECT_TYPE_CORPSE || effect.TargetB.GetObjectType() == TARGET_OBJECT_TYPE_CORPSE)
1751 return true;
1752 }
1753
1754 return false;
1755}
1756
1758{
1759 for (SpellEffectInfo const& effect : GetEffects())
1760 {
1761 switch (effect.TargetA.GetCheckType())
1762 {
1763 case TARGET_CHECK_PARTY:
1764 case TARGET_CHECK_RAID:
1766 return true;
1767 default:
1768 break;
1769 }
1770 }
1771
1772 return false;
1773}
1774
1775bool SpellInfo::CanBeUsedInCombat(Unit const* caster) const
1776{
1779}
1780
1782{
1783 return NegativeEffects.none();
1784}
1785
1787{
1788 return !NegativeEffects.test(effIndex);
1789}
1790
1792{
1794}
1795
1797{
1799}
1800
1802{
1804}
1805
1807{
1808 return (SpellFamilyName == SPELLFAMILY_HUNTER && !(SpellFamilyFlags[1] & 0x10000000)) // for 53352, cannot find better way
1811}
1812
1814{
1816}
1817
1819{
1820 return !EmpowerStageThresholds.empty();
1821}
1822
1824{
1826}
1827
1829{
1830 return Speed > 0.0f || LaunchDelay > 0.0f;
1831}
1832
1834{
1835 WeaponAttackType result;
1836 switch (DmgClass)
1837 {
1840 result = OFF_ATTACK;
1841 else
1842 result = BASE_ATTACK;
1843 break;
1846 break;
1847 default:
1848 // Wands
1850 result = RANGED_ATTACK;
1851 else
1852 result = BASE_ATTACK;
1853 break;
1854 }
1855
1856 return result;
1857}
1858
1860{
1861 // item neutral spell
1862 if (EquippedItemClass == -1)
1863 return true;
1864
1865 // item dependent spell
1866 if (item && item->IsFitToSpellRequirements(this))
1867 return true;
1868
1869 return false;
1870}
1871
1872bool SpellInfo::IsAffected(uint32 familyName, flag128 const& familyFlags) const
1873{
1874 if (!familyName)
1875 return true;
1876
1877 if (familyName != SpellFamilyName)
1878 return false;
1879
1880 if (familyFlags && !(familyFlags & SpellFamilyFlags))
1881 return false;
1882
1883 return true;
1884}
1885
1887{
1889}
1890
1892{
1893 if (!IsAffectedBySpellMods())
1894 return false;
1895
1896 SpellInfo const* affectSpell = sSpellMgr->GetSpellInfo(mod->spellId, Difficulty);
1897 if (!affectSpell)
1898 return false;
1899
1900 switch (mod->type)
1901 {
1902 case SPELLMOD_FLAT:
1903 case SPELLMOD_PCT:
1904 // TEMP: dont use IsAffected - !familyName and !familyFlags are not valid options for spell mods
1905 // TODO: investigate if the !familyName and !familyFlags conditions are even valid for all other (nonmod) uses of SpellInfo::IsAffected
1906 return affectSpell->SpellFamilyName == SpellFamilyName && static_cast<SpellModifierByClassMask const*>(mod)->mask & SpellFamilyFlags;
1908 return HasLabel(static_cast<SpellFlatModifierByLabel const*>(mod)->value.LabelID);
1909 case SPELLMOD_LABEL_PCT:
1910 return HasLabel(static_cast<SpellPctModifierByLabel const*>(mod)->value.LabelID);
1911 default:
1912 break;
1913 }
1914
1915 return false;
1916}
1917
1919{
1920 switch (Id)
1921 {
1922 case 384669: // Overflowing Maelstrom
1923 return true;
1924 default:
1925 break;
1926 }
1927
1928 return false;
1929}
1930
1931bool SpellInfo::CanPierceImmuneAura(SpellInfo const* auraSpellInfo) const
1932{
1933 // Dispels other auras on immunity, check if this spell makes the unit immune to aura
1935 return true;
1936
1937 return false;
1938}
1939
1940bool SpellInfo::CanDispelAura(SpellInfo const* auraSpellInfo) const
1941{
1942 // These auras (like Divine Shield) can't be dispelled
1943 if (auraSpellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
1944 return false;
1945
1946 return true;
1947}
1948
1950{
1951 // all other single target spells have if it has AttributesEx5
1953 return true;
1954
1955 return false;
1956}
1957
1959{
1960 SpellSpecificType spellSpec1 = GetSpellSpecific();
1961 SpellSpecificType spellSpec2 = spellInfo->GetSpellSpecific();
1962 switch (spellSpec1)
1963 {
1974 return spellSpec1 == spellSpec2;
1976 return spellSpec2 == SPELL_SPECIFIC_FOOD
1977 || spellSpec2 == SPELL_SPECIFIC_FOOD_AND_DRINK;
1979 return spellSpec2 == SPELL_SPECIFIC_DRINK
1980 || spellSpec2 == SPELL_SPECIFIC_FOOD_AND_DRINK;
1982 return spellSpec2 == SPELL_SPECIFIC_FOOD
1983 || spellSpec2 == SPELL_SPECIFIC_DRINK
1984 || spellSpec2 == SPELL_SPECIFIC_FOOD_AND_DRINK;
1985 default:
1986 return false;
1987 }
1988}
1989
1991{
1992 SpellSpecificType spellSpec = GetSpellSpecific();
1993 switch (spellSpec)
1994 {
2002 return spellSpec == spellInfo->GetSpellSpecific();
2003 default:
2004 return false;
2005 }
2006}
2007
2009{
2010 // talents that learn spells can have stance requirements that need ignore
2011 // (this requirement only for client-side stance show in talent description)
2012 /* TODO: 6.x fix this in proper way (probably spell flags/attributes?)
2013 if (GetTalentSpellCost(Id) > 0 && HasEffect(SPELL_EFFECT_LEARN_SPELL))
2014 return SPELL_CAST_OK;*/
2015
2016 //if (HasAttribute(SPELL_ATTR13_ACTIVATES_REQUIRED_SHAPESHIFT))
2017 // return SPELL_CAST_OK;
2018
2019 uint64 stanceMask = (form ? UI64LIT(1) << (form - 1) : 0);
2020
2021 if (stanceMask & StancesNot) // can explicitly not be cast in this stance
2023
2024 if (stanceMask & Stances) // can explicitly be cast in this stance
2025 return SPELL_CAST_OK;
2026
2027 bool actAsShifted = false;
2028 SpellShapeshiftFormEntry const* shapeInfo = nullptr;
2029 if (form > 0)
2030 {
2031 shapeInfo = sSpellShapeshiftFormStore.LookupEntry(form);
2032 if (!shapeInfo)
2033 {
2034 TC_LOG_ERROR("spells", "GetErrorAtShapeshiftedCast: unknown shapeshift {}", form);
2035 return SPELL_CAST_OK;
2036 }
2037 actAsShifted = !shapeInfo->GetFlags().HasFlag(SpellShapeshiftFormFlags::Stance);
2038 }
2039
2040 if (actAsShifted)
2041 {
2042 if (HasAttribute(SPELL_ATTR0_NOT_SHAPESHIFTED) || (shapeInfo && shapeInfo->GetFlags().HasFlag(SpellShapeshiftFormFlags::CanOnlyCastShapeshiftSpells))) // not while shapeshifted
2044 else if (Stances != 0) // needs other shapeshift
2046 }
2047 else
2048 {
2049 // needs shapeshift
2052 }
2053
2054 return SPELL_CAST_OK;
2055}
2056
2057SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player) const
2058{
2059 // normal case
2060 if (RequiredAreasID > 0)
2061 {
2062 bool found = false;
2063 std::vector<uint32> areaGroupMembers = sDB2Manager.GetAreasForGroup(RequiredAreasID);
2064 for (uint32 areaId : areaGroupMembers)
2065 {
2066 if (DB2Manager::IsInArea(area_id, areaId))
2067 {
2068 found = true;
2069 break;
2070 }
2071 }
2072
2073 if (!found)
2075 }
2076
2077 // continent limitation (virtual continent)
2079 {
2081 if (player && player->HasAuraType(SPELL_AURA_MOUNT_RESTRICTIONS))
2082 {
2083 for (AuraEffect const* auraEffect : player->GetAuraEffectsByType(SPELL_AURA_MOUNT_RESTRICTIONS))
2084 mountFlags |= AreaMountFlags(auraEffect->GetMiscValue());
2085 }
2086 else if (AreaTableEntry const* areaTable = sAreaTableStore.LookupEntry(area_id))
2087 mountFlags = areaTable->GetMountFlags();
2088
2089 if (!(mountFlags.HasFlag(AreaMountFlags::AllowFlyingMounts)))
2091
2092 if (player && !ConditionMgr::IsPlayerMeetingCondition(player, 72968)) // Hardcoded PlayerCondition id for attribute check in client
2094 }
2095
2096 // raid instance limitation
2098 {
2099 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
2100 if (!mapEntry || mapEntry->IsRaid())
2102 }
2103
2105 {
2106 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
2107 if (!mapEntry || !mapEntry->IsDungeon())
2109 }
2110
2112 {
2113 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
2114 if (!mapEntry || mapEntry->IsBattleground())
2116 }
2117
2118 // DB base check (if non empty then must fit at least single for allow)
2119 SpellAreaMapBounds saBounds = sSpellMgr->GetSpellAreaMapBounds(Id);
2120 if (saBounds.first != saBounds.second)
2121 {
2122 for (SpellAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
2123 {
2124 if (itr->second.IsFitToRequirements(player, zone_id, area_id))
2125 return SPELL_CAST_OK;
2126 }
2128 }
2129
2130 // bg spell checks
2131 switch (Id)
2132 {
2133 case 23333: // Warsong Flag
2134 case 23335: // Silverwing Flag
2135 return map_id == 489 && player && player->InBattleground() ? SPELL_CAST_OK : SPELL_FAILED_REQUIRES_AREA;
2136 case 2584: // Waiting to Resurrect
2137 case 42792: // Recently Dropped Flag
2138 case 43681: // Inactive
2139 case 44535: // Spirit Heal (mana)
2140 {
2141 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
2142 if (!mapEntry)
2144
2145 return zone_id == AREA_WINTERGRASP || (mapEntry->IsBattleground() && player && player->InBattleground()) ? SPELL_CAST_OK : SPELL_FAILED_REQUIRES_AREA;
2146 }
2147 case 44521: // Preparation
2148 {
2149 if (!player)
2151
2152 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
2153 if (!mapEntry)
2155
2156 if (!mapEntry->IsBattleground())
2158
2159 Battleground* bg = player->GetBattleground();
2161 }
2162 case 32724: // Gold Team (Alliance)
2163 case 32725: // Green Team (Alliance)
2164 case 35774: // Gold Team (Horde)
2165 case 35775: // Green Team (Horde)
2166 {
2167 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
2168 if (!mapEntry)
2170
2171 return mapEntry->IsBattleArena() && player && player->InBattleground() ? SPELL_CAST_OK : SPELL_FAILED_REQUIRES_AREA;
2172 }
2173 case 32727: // Arena Preparation
2174 {
2175 if (!player)
2177
2178 MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
2179 if (!mapEntry)
2181
2182 if (!mapEntry->IsBattleArena())
2184
2185 Battleground* bg = player->GetBattleground();
2187 }
2188 }
2189
2190 // aura limitations
2191 if (player)
2192 {
2193 for (SpellEffectInfo const& effect : GetEffects())
2194 {
2195 if (!effect.IsAura())
2196 continue;
2197
2198 switch (effect.ApplyAuraName)
2199 {
2201 {
2202 if (SpellShapeshiftFormEntry const* spellShapeshiftForm = sSpellShapeshiftFormStore.LookupEntry(effect.MiscValue))
2203 if (uint32 mountType = spellShapeshiftForm->MountTypeID)
2204 if (!player->GetMountCapability(mountType))
2205 return SPELL_FAILED_NOT_HERE;
2206 break;
2207 }
2208 case SPELL_AURA_MOUNTED:
2209 {
2210 uint32 mountType = effect.MiscValueB;
2211 if (MountEntry const* mountEntry = sDB2Manager.GetMount(Id))
2212 mountType = mountEntry->MountTypeID;
2213 if (mountType && !player->GetMountCapability(mountType))
2214 return SPELL_FAILED_NOT_HERE;
2215 break;
2216 }
2217 default:
2218 break;
2219 }
2220 }
2221 }
2222
2223 return SPELL_CAST_OK;
2224}
2225
2226SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject const* target, bool implicit /*= true*/) const
2227{
2228 if (HasAttribute(SPELL_ATTR1_EXCLUDE_CASTER) && caster == target)
2230
2231 // check visibility - ignore invisibility/stealth for implicit (area) targets
2232 if (!HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT) && !caster->CanSeeOrDetect(target, implicit))
2234
2235 Unit const* unitTarget = target->ToUnit();
2236
2238 {
2239 auto getCreatorOrSelf = [](WorldObject const* obj)
2240 {
2241 ObjectGuid creator = obj->GetCreatorGUID();
2242 if (creator.IsEmpty())
2243 creator = obj->GetGUID();
2244
2245 return creator;
2246 };
2247 if (getCreatorOrSelf(caster) != getCreatorOrSelf(target))
2249 }
2250
2251 // creature/player specific target checks
2252 if (unitTarget)
2253 {
2254 // spells cannot be cast if target has a pet in combat either
2257
2258 // only spells with SPELL_ATTR3_ONLY_TARGET_GHOSTS can target ghosts
2260 {
2263 else
2265 }
2266
2267 if (caster != unitTarget)
2268 {
2269 if (caster->GetTypeId() == TYPEID_PLAYER)
2270 {
2271 // Do not allow these spells to target creatures not tapped by us (Banish, Polymorph, many quest spells)
2273 if (Creature const* targetCreature = unitTarget->ToCreature())
2274 if (targetCreature->hasLootRecipient() && !targetCreature->isTappedBy(caster->ToPlayer()))
2276
2278 {
2279 Creature const* targetCreature = unitTarget->ToCreature();
2280 if (!targetCreature)
2282
2283 if (!targetCreature->CanHaveLoot() || !LootTemplates_Pickpocketing.HaveLootFor(targetCreature->GetCreatureDifficulty()->PickPocketLootID))
2285 }
2286
2287 // Not allow disarm unarmed player
2289 {
2290 if (unitTarget->GetTypeId() == TYPEID_PLAYER)
2291 {
2292 Player const* player = unitTarget->ToPlayer();
2293 if (!player->GetWeaponForAttack(BASE_ATTACK) || !player->IsUseEquipedWeapon(true))
2295 }
2296 else if (!unitTarget->GetVirtualItemId(0))
2298 }
2299 }
2300 }
2301
2303 if (!unitTarget->IsSummon() || unitTarget->ToTempSummon()->GetSummonerGUID() != caster->GetGUID())
2305
2309
2314 }
2315 // corpse specific target checks
2316 else if (Corpse const* corpseTarget = target->ToCorpse())
2317 {
2318 // cannot target bare bones
2319 if (corpseTarget->GetType() == CORPSE_BONES)
2321 // we have to use owner for some checks (aura preventing resurrection for example)
2322 if (Player* owner = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()))
2323 unitTarget = owner;
2324 // we're not interested in corpses without owner
2325 else
2327 }
2328 // other types of objects - always valid
2329 else return SPELL_CAST_OK;
2330
2331 // corpseOwner and unit specific target checks
2332 if (!unitTarget->IsPlayer())
2333 {
2336
2339 }
2342
2343 if (!IsAllowingDeadTarget() && !unitTarget->IsAlive())
2345
2346 // check this flag only for implicit targets (chain and area), allow to explicitly target units for spells like Shield of Righteousness
2349
2350 // checked in Unit::IsValidAttack/AssistTarget, shouldn't be checked for ENTRY targets
2351 //if (!HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE) && target->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNINTERACTIBLE))
2352 // return SPELL_FAILED_BAD_TARGETS;
2353
2354 if (!CheckTargetCreatureType(unitTarget))
2355 {
2356 if (target->GetTypeId() == TYPEID_PLAYER)
2358 else
2360 }
2361
2362 // check GM mode and GM invisibility - only for player casts (npc casts are controlled by AI) and negative spells
2363 if (unitTarget != caster && (caster->GetAffectingPlayer() || !IsPositive()) && unitTarget->GetTypeId() == TYPEID_PLAYER)
2364 {
2365 if (!unitTarget->ToPlayer()->IsVisible())
2367
2368 if (unitTarget->ToPlayer()->IsGameMaster())
2370 }
2371
2372 // not allow casting on flying player
2375
2376 /* TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to
2377 not allow passengers to be implicitly hit by spells, however this target type should be an exception,
2378 if this is left it kills spells that award kill credit from vehicle to master (few spells),
2379 the use of these 2 covers passenger target check, logically, if vehicle cast this to master it should always hit
2380 him, because it would be it's passenger, there's no such case where this gets to fail legitimacy, this problem
2381 cannot be solved from within the check in other way since target type cannot be called for the spell currently
2382 Spell examples: [ID - 52864 Devour Water, ID - 52862 Devour Wind, ID - 49370 Wyrmrest Defender: Destabilize Azure Dragonshrine Effect] */
2383 if (Unit const* unitCaster = caster->ToUnit())
2384 {
2385 if (!unitCaster->IsVehicle() && !(unitCaster->GetCharmerOrOwner() == target))
2386 {
2387 if (TargetAuraState && !unitTarget->HasAuraState(AuraStateType(TargetAuraState), this, unitCaster))
2389
2390 if (ExcludeTargetAuraState && unitTarget->HasAuraState(AuraStateType(ExcludeTargetAuraState), this, unitCaster))
2392 }
2393 }
2394
2395 if (TargetAuraSpell && !unitTarget->HasAura(TargetAuraSpell))
2397
2400
2401 if (TargetAuraType && !unitTarget->HasAuraType(TargetAuraType))
2403
2406
2410
2412 if (Map* map = caster->GetMap())
2413 if (InstanceMap* iMap = map->ToInstanceMap())
2414 if (InstanceScript* instance = iMap->GetInstanceScript())
2415 if (instance->GetCombatResurrectionCharges() == 0 && instance->IsEncounterInProgress())
2417
2418 return SPELL_CAST_OK;
2419}
2420
2421SpellCastResult SpellInfo::CheckExplicitTarget(WorldObject const* caster, WorldObject const* target, Item const* itemTarget /*= nullptr*/) const
2422{
2423 uint32 neededTargets = RequiredExplicitTargetMask;
2424 if (!target)
2425 {
2427 if (!(neededTargets & TARGET_FLAG_GAMEOBJECT_ITEM) || !itemTarget)
2429 return SPELL_CAST_OK;
2430 }
2431
2432 if (Unit const* unitTarget = target->ToUnit())
2433 {
2435 {
2436 Unit const* unitCaster = caster->ToUnit();
2437 if (neededTargets & TARGET_FLAG_UNIT_ENEMY)
2438 if (caster->IsValidAttackTarget(unitTarget, this))
2439 return SPELL_CAST_OK;
2440 if ((neededTargets & TARGET_FLAG_UNIT_ALLY)
2441 || ((neededTargets & TARGET_FLAG_UNIT_PARTY) && unitCaster && unitCaster->IsInPartyWith(unitTarget))
2442 || ((neededTargets & TARGET_FLAG_UNIT_RAID) && unitCaster && unitCaster->IsInRaidWith(unitTarget)))
2443 if (caster->IsValidAssistTarget(unitTarget, this))
2444 return SPELL_CAST_OK;
2445 if ((neededTargets & TARGET_FLAG_UNIT_MINIPET) && unitCaster)
2446 if (unitTarget->GetGUID() == unitCaster->GetCritterGUID())
2447 return SPELL_CAST_OK;
2448 if ((neededTargets & TARGET_FLAG_UNIT_PASSENGER) && unitCaster)
2449 if (unitTarget->IsOnVehicle(unitCaster))
2450 return SPELL_CAST_OK;
2452 }
2453 }
2454 return SPELL_CAST_OK;
2455}
2456
2458{
2459 // All creatures should be able to cast as passengers freely, restriction and attribute are only for players
2460 if (caster->GetTypeId() != TYPEID_PLAYER)
2461 return SPELL_CAST_OK;
2462
2463 Vehicle* vehicle = caster->GetVehicle();
2464 if (vehicle)
2465 {
2466 uint16 checkMask = 0;
2467 for (SpellEffectInfo const& effect : GetEffects())
2468 {
2469 if (effect.IsAura(SPELL_AURA_MOD_SHAPESHIFT))
2470 {
2471 SpellShapeshiftFormEntry const* shapeShiftFromEntry = sSpellShapeshiftFormStore.LookupEntry(effect.MiscValue);
2472 if (shapeShiftFromEntry && (shapeShiftFromEntry->Flags & 1) == 0) // unk flag
2473 checkMask |= VEHICLE_SEAT_FLAG_UNCONTROLLED;
2474 break;
2475 }
2476 }
2477
2480
2481 if (!checkMask)
2482 checkMask = VEHICLE_SEAT_FLAG_CAN_ATTACK;
2483
2484 VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(caster);
2486 && (vehicleSeat->Flags & checkMask) != checkMask)
2488
2489 // Can only summon uncontrolled minions/guardians when on controlled vehicle
2491 {
2492 for (SpellEffectInfo const& effect : GetEffects())
2493 {
2494 if (!effect.IsEffect(SPELL_EFFECT_SUMMON))
2495 continue;
2496
2497 SummonPropertiesEntry const* props = sSummonPropertiesStore.LookupEntry(effect.MiscValueB);
2498 if (props && props->Control != SUMMON_CATEGORY_WILD)
2500 }
2501 }
2502 }
2503
2504 return SPELL_CAST_OK;
2505}
2506
2508{
2509 // Curse of Doom & Exorcism: not find another way to fix spell target check :/
2511 {
2512 // not allow cast at player
2513 if (target->GetTypeId() == TYPEID_PLAYER)
2514 return false;
2515 else
2516 return true;
2517 }
2518
2519 // if target is magnet (i.e Grounding Totem) the check is skipped
2520 if (target->IsMagnet())
2521 return true;
2522
2523 uint32 creatureType = target->GetCreatureTypeMask();
2524 return !TargetCreatureType || !creatureType || (creatureType & TargetCreatureType) || target->HasAuraType(SPELL_AURA_IGNORE_SPELL_CREATURE_TYPE_REQUIREMENTS);
2525}
2526
2528{
2530}
2531
2533{
2534 uint64 mask = 0;
2535 if (Mechanic)
2536 mask |= UI64LIT(1) << Mechanic;
2537
2538 for (SpellEffectInfo const& effect : GetEffects())
2539 if (effect.IsEffect() && effect.Mechanic)
2540 mask |= UI64LIT(1) << effect.Mechanic;
2541
2542 return mask;
2543}
2544
2546{
2547 uint64 mask = 0;
2548 if (Mechanic)
2549 mask |= UI64LIT(1) << Mechanic;
2550
2551 if (GetEffect(effIndex).IsEffect() && GetEffect(effIndex).Mechanic)
2552 mask |= UI64LIT(1) << GetEffect(effIndex).Mechanic;
2553
2554 return mask;
2555}
2556
2558{
2559 uint64 mask = 0;
2560 if (Mechanic)
2561 mask |= UI64LIT(1) << Mechanic;
2562
2563 for (SpellEffectInfo const& effect : GetEffects())
2564 if ((effectMask & (1 << effect.EffectIndex)) && effect.Mechanic)
2565 mask |= UI64LIT(1) << effect.Mechanic;
2566
2567 return mask;
2568}
2569
2571{
2572 if (GetEffect(effIndex).IsEffect() && GetEffect(effIndex).Mechanic)
2573 return GetEffect(effIndex).Mechanic;
2574
2575 if (Mechanic)
2576 return Mechanics(Mechanic);
2577
2578 return MECHANIC_NONE;
2579}
2580
2582{
2584}
2585
2587{
2588 // If dispel all
2589 if (type == DISPEL_ALL)
2590 return DISPEL_ALL_MASK;
2591 else
2592 return uint32(1 << type);
2593}
2594
2596{
2597 return ExplicitTargetMask;
2598}
2599
2601{
2602 return _auraState;
2603}
2604
2606{
2607 _auraState = [this]()->AuraStateType
2608 {
2609 // Faerie Fire (Feral)
2610 if (GetCategory() == 1133)
2612
2613 // Swiftmend state on Regrowth, Rejuvenation, Wild Growth
2614 if (SpellFamilyName == SPELLFAMILY_DRUID && (SpellFamilyFlags[0] & 0x50 || SpellFamilyFlags[1] & 0x4000000))
2616
2617 // Deadly poison aura state
2618 if (SpellFamilyName == SPELLFAMILY_ROGUE && SpellFamilyFlags[0] & 0x10000)
2620
2621 // Enrage aura state
2622 if (Dispel == DISPEL_ENRAGE)
2623 return AURA_STATE_ENRAGED;
2624
2625 // Bleeding aura state
2627 return AURA_STATE_BLEED;
2628
2630 for (SpellEffectInfo const& effect : GetEffects())
2631 if (effect.IsAura(SPELL_AURA_MOD_STUN) || effect.IsAura(SPELL_AURA_MOD_ROOT) || effect.IsAura(SPELL_AURA_MOD_ROOT_2))
2632 return AURA_STATE_FROZEN;
2633
2634 switch (Id)
2635 {
2636 case 1064: // Dazed
2637 return AURA_STATE_DAZED;
2638 case 32216: // Victorious
2639 return AURA_STATE_VICTORIOUS;
2640 case 71465: // Divine Surge
2641 case 50241: // Evasive Charges
2642 case 81262: // Efflorescence
2644 case 6950: // Faerie Fire
2645 case 9806: // Phantom Strike
2646 case 9991: // Touch of Zanzil
2647 case 13424: // Faerie Fire
2648 case 13752: // Faerie Fire
2649 case 16432: // Plague Mist
2650 case 20656: // Faerie Fire
2651 case 25602: // Faerie Fire
2652 case 32129: // Faerie Fire
2653 case 35325: // Glowing Blood
2654 case 35328: // Lambent Blood
2655 case 35329: // Vibrant Blood
2656 case 35331: // Black Blood
2657 case 49163: // Perpetual Instability
2658 case 65863: // Faerie Fire
2659 case 79559: // Luxscale Light
2660 case 82855: // Dazzling
2661 case 102953: // In the Rumpus
2662 case 127907: // Phosphorescence
2663 case 127913: // Phosphorescence
2664 case 129007: // Zijin Sting
2665 case 130159: // Fae Touch
2666 case 142537: // Spotter Smoke
2667 case 168455: // Spotted!
2668 case 176905: // Super Sticky Glitter Bomb
2669 case 189502: // Marked
2670 case 201785: // Intruder Alert!
2671 case 201786: // Intruder Alert!
2672 case 201935: // Spotted!
2673 case 239233: // Smoke Bomb
2674 case 319400: // Glitter Burst
2675 case 321470: // Dimensional Shifter Mishap
2676 case 331134: // Spotted
2678 default:
2679 break;
2680 }
2681
2683 return AURA_STATE_BANISHED;
2684
2685 return AURA_STATE_NONE;
2686 }();
2687}
2688
2690{
2691 return _spellSpecific;
2692};
2693
2695{
2697 {
2698 switch (SpellFamilyName)
2699 {
2701 {
2702 // Food / Drinks (mostly)
2704 {
2705 bool food = false;
2706 bool drink = false;
2707 for (SpellEffectInfo const& effect : GetEffects())
2708 {
2709 if (!effect.IsAura())
2710 continue;
2711 switch (effect.ApplyAuraName)
2712 {
2713 // Food
2716 food = true;
2717 break;
2718 // Drink
2721 drink = true;
2722 break;
2723 default:
2724 break;
2725 }
2726 }
2727
2728 if (food && drink)
2730 else if (food)
2731 return SPELL_SPECIFIC_FOOD;
2732 else if (drink)
2733 return SPELL_SPECIFIC_DRINK;
2734 }
2735 // scrolls effects
2736 else
2737 {
2738 SpellInfo const* firstRankSpellInfo = GetFirstRankSpell();
2739 switch (firstRankSpellInfo->Id)
2740 {
2741 case 8118: // Strength
2742 case 8099: // Stamina
2743 case 8112: // Spirit
2744 case 8096: // Intellect
2745 case 8115: // Agility
2746 case 8091: // Armor
2747 return SPELL_SPECIFIC_SCROLL;
2748 default:
2749 break;
2750 }
2751 }
2752 break;
2753 }
2754 case SPELLFAMILY_MAGE:
2755 {
2756 // family flags 18(Molten), 25(Frost/Ice), 28(Mage)
2757 if (SpellFamilyFlags[0] & 0x12040000)
2759
2760 // Arcane brillance and Arcane intelect (normal check fails because of flags difference)
2761 if (SpellFamilyFlags[0] & 0x400)
2763
2764 if ((SpellFamilyFlags[0] & 0x1000000) && GetEffect(EFFECT_0).IsAura(SPELL_AURA_MOD_CONFUSE))
2766
2767 break;
2768 }
2770 {
2771 if (Id == 12292) // Death Wish
2773
2774 break;
2775 }
2777 {
2778 // Warlock (Bane of Doom | Bane of Agony | Bane of Havoc)
2779 if (Id == 603 || Id == 980 || Id == 80240)
2780 return SPELL_SPECIFIC_BANE;
2781
2782 // only warlock curses have this
2783 if (Dispel == DISPEL_CURSE)
2784 return SPELL_SPECIFIC_CURSE;
2785
2786 // Warlock (Demon Armor | Demon Skin | Fel Armor)
2787 if (SpellFamilyFlags[1] & 0x20000020 || SpellFamilyFlags[2] & 0x00000010)
2789 break;
2790 }
2791 case SPELLFAMILY_PRIEST:
2792 {
2793 // Divine Spirit and Prayer of Spirit
2794 if (SpellFamilyFlags[0] & 0x20)
2796
2797 break;
2798 }
2799 case SPELLFAMILY_HUNTER:
2800 {
2801 // only hunter stings have this
2802 if (Dispel == DISPEL_POISON)
2803 return SPELL_SPECIFIC_STING;
2804
2805 // only hunter aspects have this (but not all aspects in hunter family)
2806 if (SpellFamilyFlags & flag128(0x00200000, 0x00000000, 0x00001010, 0x00000000))
2807 return SPELL_SPECIFIC_ASPECT;
2808
2809 break;
2810 }
2812 {
2813 // Collection of all the seal family flags. No other paladin spell has any of those.
2814 if (SpellFamilyFlags[1] & 0xA2000800)
2815 return SPELL_SPECIFIC_SEAL;
2816
2817 if (SpellFamilyFlags[0] & 0x00002190)
2818 return SPELL_SPECIFIC_HAND;
2819
2820 // only paladin auras have this (for palaldin class family)
2821 switch (Id)
2822 {
2823 case 465: // Devotion Aura
2824 case 32223: // Crusader Aura
2825 case 183435: // Retribution Aura
2826 case 317920: // Concentration Aura
2827 return SPELL_SPECIFIC_AURA;
2828 default:
2829 break;
2830 }
2831
2832 break;
2833 }
2834 case SPELLFAMILY_SHAMAN:
2835 {
2836 // family flags 10 (Lightning), 42 (Earth), 37 (Water), proc shield from T2 8 pieces bonus
2837 if (SpellFamilyFlags[1] & 0x420
2838 || SpellFamilyFlags[0] & 0x00000400
2839 || Id == 23552)
2841
2842 break;
2843 }
2845 if (Id == 48266 || Id == 48263 || Id == 48265)
2847 break;
2848 }
2849
2850 for (SpellEffectInfo const& effect : GetEffects())
2851 {
2852 if (effect.IsEffect(SPELL_EFFECT_APPLY_AURA))
2853 {
2854 switch (effect.ApplyAuraName)
2855 {
2860 return SPELL_SPECIFIC_CHARM;
2863 if (Id == 30645) // Gas Cloud Tracking
2864 return SPELL_SPECIFIC_NORMAL;
2865 [[fallthrough]];
2869 default:
2870 break;
2871 }
2872 }
2873 }
2874 return SPELL_SPECIFIC_NORMAL;
2875 }();
2876}
2877
2879{
2880 auto diminishingGroupCompute = [this]() -> DiminishingGroup
2881 {
2882 if (IsPositive())
2883 return DIMINISHING_NONE;
2884
2886 return DIMINISHING_TAUNT;
2887
2888 switch (Id)
2889 {
2890 case 20549: // War Stomp (Racial - Tauren)
2891 case 24394: // Intimidation
2892 case 118345: // Pulverize (Primal Earth Elemental)
2893 case 118905: // Static Charge (Capacitor Totem)
2894 return DIMINISHING_STUN;
2895 case 107079: // Quaking Palm
2897 case 155145: // Arcane Torrent (Racial - Blood Elf)
2898 return DIMINISHING_SILENCE;
2899 case 108199: // Gorefiend's Grasp
2900 case 191244: // Sticky Bomb
2902 default:
2903 break;
2904 }
2905
2906 // Explicit Diminishing Groups
2907 switch (SpellFamilyName)
2908 {
2910 // Frost Tomb
2911 if (Id == 48400)
2912 return DIMINISHING_NONE;
2913 // Gnaw
2914 else if (Id == 47481)
2915 return DIMINISHING_STUN;
2916 // ToC Icehowl Arctic Breath
2917 else if (Id == 66689)
2918 return DIMINISHING_NONE;
2919 // Black Plague
2920 else if (Id == 64155)
2921 return DIMINISHING_NONE;
2922 // Screams of the Dead (King Ymiron)
2923 else if (Id == 51750)
2924 return DIMINISHING_NONE;
2925 // Crystallize (Keristrasza heroic)
2926 else if (Id == 48179)
2927 return DIMINISHING_NONE;
2928 break;
2929 case SPELLFAMILY_MAGE:
2930 {
2931 // Frost Nova -- 122
2932 if (SpellFamilyFlags[0] & 0x40)
2933 return DIMINISHING_ROOT;
2934 // Freeze (Water Elemental) -- 33395
2935 if (SpellFamilyFlags[2] & 0x200)
2936 return DIMINISHING_ROOT;
2937
2938 // Dragon's Breath -- 31661
2939 if (SpellFamilyFlags[0] & 0x800000)
2941 // Polymorph -- 118
2942 if (SpellFamilyFlags[0] & 0x1000000)
2944 // Ring of Frost -- 82691
2945 if (SpellFamilyFlags[2] & 0x40)
2947 // Ice Nova -- 157997
2948 if (SpellFamilyFlags[2] & 0x800000)
2950 break;
2951 }
2953 {
2954 // Shockwave -- 132168
2955 if (SpellFamilyFlags[1] & 0x8000)
2956 return DIMINISHING_STUN;
2957 // Storm Bolt -- 132169
2958 if (SpellFamilyFlags[2] & 0x1000)
2959 return DIMINISHING_STUN;
2960
2961 // Intimidating Shout -- 5246
2962 if (SpellFamilyFlags[0] & 0x40000)
2963 return DIMINISHING_DISORIENT;
2964 break;
2965 }
2967 {
2968 // Mortal Coil -- 6789
2969 if (SpellFamilyFlags[0] & 0x80000)
2971 // Banish -- 710
2972 if (SpellFamilyFlags[1] & 0x8000000)
2974
2975 // Fear -- 118699
2976 if (SpellFamilyFlags[1] & 0x400)
2977 return DIMINISHING_DISORIENT;
2978 // Howl of Terror -- 5484
2979 if (SpellFamilyFlags[1] & 0x8)
2980 return DIMINISHING_DISORIENT;
2981
2982 // Shadowfury -- 30283
2983 if (SpellFamilyFlags[1] & 0x1000)
2984 return DIMINISHING_STUN;
2985 // Summon Infernal -- 22703
2986 if (SpellFamilyFlags[0] & 0x1000)
2987 return DIMINISHING_STUN;
2988
2989 // 170995 -- Cripple
2990 if (Id == 170995)
2991 return DIMINISHING_LIMITONLY;
2992 break;
2993 }
2995 {
2996 // Fellash -- 115770
2997 // Whiplash -- 6360
2998 if (SpellFamilyFlags[0] & 0x8000000)
3000
3001 // Mesmerize (Shivarra pet) -- 115268
3002 // Seduction (Succubus pet) -- 6358
3003 if (SpellFamilyFlags[0] & 0x2000000)
3004 return DIMINISHING_DISORIENT;
3005
3006 // Axe Toss (Felguard pet) -- 89766
3007 if (SpellFamilyFlags[1] & 0x4)
3008 return DIMINISHING_STUN;
3009 break;
3010 }
3011 case SPELLFAMILY_DRUID:
3012 {
3013 // Maim -- 22570
3014 if (SpellFamilyFlags[1] & 0x80)
3015 return DIMINISHING_STUN;
3016 // Mighty Bash -- 5211
3017 if (SpellFamilyFlags[0] & 0x2000)
3018 return DIMINISHING_STUN;
3019 // Rake -- 163505 -- no flags on the stun
3020 if (Id == 163505)
3021 return DIMINISHING_STUN;
3022
3023 // Incapacitating Roar -- 99, no flags on the stun, 14
3024 if (SpellFamilyFlags[1] & 0x1)
3026
3027 // Cyclone -- 33786
3028 if (SpellFamilyFlags[1] & 0x20)
3029 return DIMINISHING_DISORIENT;
3030
3031 // Solar Beam -- 81261
3032 if (Id == 81261)
3033 return DIMINISHING_SILENCE;
3034
3035 // Typhoon -- 61391
3036 if (SpellFamilyFlags[1] & 0x1000000)
3038 // Ursol's Vortex -- 118283, no family flags
3039 if (Id == 118283)
3041
3042 // Entangling Roots -- 339
3043 if (SpellFamilyFlags[0] & 0x200)
3044 return DIMINISHING_ROOT;
3045 // Mass Entanglement -- 102359
3046 if (SpellFamilyFlags[2] & 0x4)
3047 return DIMINISHING_ROOT;
3048 break;
3049 }
3050 case SPELLFAMILY_ROGUE:
3051 {
3052 // Between the Eyes -- 199804
3053 if (SpellFamilyFlags[0] & 0x800000)
3054 return DIMINISHING_STUN;
3055 // Cheap Shot -- 1833
3056 if (SpellFamilyFlags[0] & 0x400)
3057 return DIMINISHING_STUN;
3058 // Kidney Shot -- 408
3059 if (SpellFamilyFlags[0] & 0x200000)
3060 return DIMINISHING_STUN;
3061
3062 // Gouge -- 1776
3063 if (SpellFamilyFlags[0] & 0x8)
3065 // Sap -- 6770
3066 if (SpellFamilyFlags[0] & 0x80)
3068
3069 // Blind -- 2094
3070 if (SpellFamilyFlags[0] & 0x1000000)
3071 return DIMINISHING_DISORIENT;
3072
3073 // Garrote -- 1330
3074 if (SpellFamilyFlags[1] & 0x20000000)
3075 return DIMINISHING_SILENCE;
3076 break;
3077 }
3078 case SPELLFAMILY_HUNTER:
3079 {
3080 // Charge (Tenacity pet) -- 53148, no flags
3081 if (Id == 53148)
3082 return DIMINISHING_ROOT;
3083 // Ranger's Net -- 200108
3084 // Tracker's Net -- 212638
3085 if (Id == 200108 || Id == 212638)
3086 return DIMINISHING_ROOT;
3087
3088 // Binding Shot -- 117526, no flags
3089 if (Id == 117526)
3090 return DIMINISHING_STUN;
3091
3092 // Freezing Trap -- 3355
3093 if (SpellFamilyFlags[0] & 0x8)
3095 // Wyvern Sting -- 19386
3096 if (SpellFamilyFlags[1] & 0x1000)
3098
3099 // Bursting Shot -- 224729
3100 if (SpellFamilyFlags[2] & 0x40)
3101 return DIMINISHING_DISORIENT;
3102 // Scatter Shot -- 213691
3103 if (SpellFamilyFlags[2] & 0x8000)
3104 return DIMINISHING_DISORIENT;
3105
3106 // Spider Sting -- 202933
3107 if (Id == 202933)
3108 return DIMINISHING_SILENCE;
3109 break;
3110 }
3112 {
3113 // Repentance -- 20066
3114 if (SpellFamilyFlags[0] & 0x4)
3116
3117 // Blinding Light -- 105421
3118 if (Id == 105421)
3119 return DIMINISHING_DISORIENT;
3120
3121 // Avenger's Shield -- 31935
3122 if (SpellFamilyFlags[0] & 0x4000)
3123 return DIMINISHING_SILENCE;
3124
3125 // Hammer of Justice -- 853
3126 if (SpellFamilyFlags[0] & 0x800)
3127 return DIMINISHING_STUN;
3128 break;
3129 }
3130 case SPELLFAMILY_SHAMAN:
3131 {
3132 // Hex -- 51514
3133 // Hex -- 196942 (Voodoo Totem)
3134 if (SpellFamilyFlags[1] & 0x8000)
3136
3137 // Thunderstorm -- 51490
3138 if (SpellFamilyFlags[1] & 0x2000)
3140
3141 // Earthgrab Totem -- 64695
3142 if (SpellFamilyFlags[2] & 0x4000)
3143 return DIMINISHING_ROOT;
3144
3145 // Lightning Lasso -- 204437
3146 if (SpellFamilyFlags[3] & 0x2000000)
3147 return DIMINISHING_STUN;
3148 break;
3149 }
3151 {
3152 // Chains of Ice -- 96294
3153 if (Id == 96294)
3154 return DIMINISHING_ROOT;
3155
3156 // Blinding Sleet -- 207167
3157 if (Id == 207167)
3158 return DIMINISHING_DISORIENT;
3159
3160 // Strangulate -- 47476
3161 if (SpellFamilyFlags[0] & 0x200)
3162 return DIMINISHING_SILENCE;
3163
3164 // Asphyxiate -- 108194
3165 if (SpellFamilyFlags[2] & 0x100000)
3166 return DIMINISHING_STUN;
3167 // Gnaw (Ghoul) -- 91800, no flags
3168 if (Id == 91800)
3169 return DIMINISHING_STUN;
3170 // Monstrous Blow (Ghoul w/ Dark Transformation active) -- 91797
3171 if (Id == 91797)
3172 return DIMINISHING_STUN;
3173 // Winter is Coming -- 207171
3174 if (Id == 207171)
3175 return DIMINISHING_STUN;
3176 break;
3177 }
3178 case SPELLFAMILY_PRIEST:
3179 {
3180 // Holy Word: Chastise -- 200200
3181 if (SpellFamilyFlags[2] & 0x20 && GetSpellVisual() == 52021)
3182 return DIMINISHING_STUN;
3183 // Mind Bomb -- 226943
3184 if (Id == 226943)
3185 return DIMINISHING_STUN;
3186
3187 // Mind Control -- 605
3188 if (SpellFamilyFlags[0] & 0x20000 && GetSpellVisual() == 39068)
3190 // Holy Word: Chastise -- 200196
3191 if (SpellFamilyFlags[2] & 0x20 && GetSpellVisual() == 52019)
3193
3194 // Psychic Scream -- 8122
3195 if (SpellFamilyFlags[0] & 0x10000)
3196 return DIMINISHING_DISORIENT;
3197
3198 // Silence -- 15487
3199 if (SpellFamilyFlags[1] & 0x200000 && GetSpellVisual() == 39025)
3200 return DIMINISHING_SILENCE;
3201
3202 // Shining Force -- 204263
3203 if (Id == 204263)
3205 break;
3206 }
3207 case SPELLFAMILY_MONK:
3208 {
3209 // Disable -- 116706, no flags
3210 if (Id == 116706)
3211 return DIMINISHING_ROOT;
3212
3213 // Fists of Fury -- 120086
3214 if (SpellFamilyFlags[1] & 0x800000 && !(SpellFamilyFlags[2] & 0x8))
3215 return DIMINISHING_STUN;
3216 // Leg Sweep -- 119381
3217 if (SpellFamilyFlags[1] & 0x200)
3218 return DIMINISHING_STUN;
3219
3220 // Incendiary Breath (honor talent) -- 202274, no flags
3221 if (Id == 202274)
3223 // Paralysis -- 115078
3224 if (SpellFamilyFlags[2] & 0x800000)
3226
3227 // Song of Chi-Ji -- 198909
3228 if (Id == 198909)
3229 return DIMINISHING_DISORIENT;
3230 break;
3231 }
3233 {
3234 switch (Id)
3235 {
3236 case 179057: // Chaos Nova
3237 case 211881: // Fel Eruption
3238 case 200166: // Metamorphosis
3239 case 205630: // Illidan's Grasp
3240 return DIMINISHING_STUN;
3241 case 217832: // Imprison
3242 case 221527: // Imprison
3244 default:
3245 break;
3246 }
3247 break;
3248 }
3249 default:
3250 break;
3251 }
3252
3253 return DIMINISHING_NONE;
3254 };
3255
3256 auto diminishingTypeCompute = [](DiminishingGroup group) -> DiminishingReturnsType
3257 {
3258 switch (group)
3259 {
3260 case DIMINISHING_TAUNT:
3261 case DIMINISHING_STUN:
3262 return DRTYPE_ALL;
3264 case DIMINISHING_NONE:
3265 return DRTYPE_NONE;
3266 default:
3267 return DRTYPE_PLAYER;
3268 }
3269 };
3270
3271 auto diminishingMaxLevelCompute = [](DiminishingGroup group) -> DiminishingLevels
3272 {
3273 switch (group)
3274 {
3275 case DIMINISHING_TAUNT:
3278 return DIMINISHING_LEVEL_2;
3279 default:
3281 }
3282 };
3283
3284 auto diminishingLimitDurationCompute = [this]() -> int32
3285 {
3286 // Explicit diminishing duration
3287 switch (SpellFamilyName)
3288 {
3289 case SPELLFAMILY_MAGE:
3290 {
3291 // Dragon's Breath - 3 seconds in PvP
3292 if (SpellFamilyFlags[0] & 0x800000)
3293 return 3 * IN_MILLISECONDS;
3294 break;
3295 }
3297 {
3298 // Cripple - 4 seconds in PvP
3299 if (Id == 170995)
3300 return 4 * IN_MILLISECONDS;
3301 break;
3302 }
3303 case SPELLFAMILY_HUNTER:
3304 {
3305 // Binding Shot - 3 seconds in PvP
3306 if (Id == 117526)
3307 return 3 * IN_MILLISECONDS;
3308
3309 // Wyvern Sting - 6 seconds in PvP
3310 if (SpellFamilyFlags[1] & 0x1000)
3311 return 6 * IN_MILLISECONDS;
3312 break;
3313 }
3314 case SPELLFAMILY_MONK:
3315 {
3316 // Paralysis - 4 seconds in PvP regardless of if they are facing you
3317 if (SpellFamilyFlags[2] & 0x800000)
3318 return 4 * IN_MILLISECONDS;
3319 break;
3320 }
3322 {
3323 switch (Id)
3324 {
3325 case 217832: // Imprison
3326 case 221527: // Imprison
3327 return 4 * IN_MILLISECONDS;
3328 default:
3329 break;
3330 }
3331 break;
3332 }
3333 default:
3334 break;
3335 }
3336
3337 return 8 * IN_MILLISECONDS;
3338 };
3339
3340 SpellDiminishInfo diminishInfo;
3341 diminishInfo.DiminishGroup = diminishingGroupCompute();
3342 diminishInfo.DiminishReturnType = diminishingTypeCompute(diminishInfo.DiminishGroup);
3343 diminishInfo.DiminishMaxLevel = diminishingMaxLevelCompute(diminishInfo.DiminishGroup);
3344 diminishInfo.DiminishDurationLimit = diminishingLimitDurationCompute();
3345
3346 _diminishInfo = diminishInfo;
3347}
3348
3350{
3352}
3353
3355{
3357}
3358
3360{
3362}
3363
3365{
3367}
3368
3370{
3371 std::unique_ptr<SpellEffectInfo::ImmunityInfo> workBuffer = std::make_unique<SpellEffectInfo::ImmunityInfo>();
3372
3373 for (SpellEffectInfo& effect : _effects)
3374 {
3375 uint32 schoolImmunityMask = 0;
3376 uint32 applyHarmfulAuraImmunityMask = 0;
3377 uint64 mechanicImmunityMask = 0;
3378 uint32 dispelImmunityMask = 0;
3379 uint32 damageImmunityMask = 0;
3380 uint8 otherImmunityMask = 0;
3381
3382 int32 miscVal = effect.MiscValue;
3383
3384 SpellEffectInfo::ImmunityInfo& immuneInfo = *workBuffer;
3385
3386 switch (effect.ApplyAuraName)
3387 {
3389 {
3390 if (CreatureImmunities const* creatureImmunities = SpellMgr::GetCreatureImmunities(miscVal))
3391 {
3392 schoolImmunityMask |= creatureImmunities->School.to_ulong();
3393 dispelImmunityMask |= creatureImmunities->DispelType.to_ulong();
3394 mechanicImmunityMask |= creatureImmunities->Mechanic.to_ullong();
3395 otherImmunityMask |= creatureImmunities->Other.AsUnderlyingType();
3396 for (SpellEffectName effectType : creatureImmunities->Effect)
3397 immuneInfo.SpellEffectImmune.insert(effectType);
3398 for (AuraType aura : creatureImmunities->Aura)
3399 immuneInfo.AuraTypeImmune.insert(aura);
3400 }
3401 break;
3402 }
3404 {
3405 switch (Id)
3406 {
3407 case 42292: // PvP trinket
3408 case 59752: // Every Man for Himself
3411 break;
3412 case 34471: // The Beast Within
3413 case 19574: // Bestial Wrath
3414 case 46227: // Medallion of Immunity
3415 case 53490: // Bullheaded
3416 case 65547: // PvP Trinket
3417 case 134946: // Supremacy of the Alliance
3418 case 134956: // Supremacy of the Horde
3419 case 195710: // Honorable Medallion
3420 case 208683: // Gladiator's Medallion
3422 break;
3423 case 54508: // Demonic Empowerment
3424 mechanicImmunityMask |= (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN);
3425 break;
3426 default:
3427 if (miscVal < 1)
3428 break;
3429
3430 mechanicImmunityMask |= UI64LIT(1) << miscVal;
3431 break;
3432 }
3433 break;
3434 }
3436 {
3437 immuneInfo.SpellEffectImmune.insert(static_cast<SpellEffectName>(miscVal));
3438 break;
3439 }
3441 {
3442 immuneInfo.AuraTypeImmune.insert(static_cast<AuraType>(miscVal));
3443 break;
3444 }
3446 {
3447 schoolImmunityMask |= uint32(miscVal);
3448 break;
3449 }
3451 {
3452 applyHarmfulAuraImmunityMask |= uint32(miscVal);
3453 break;
3454 }
3456 {
3457 damageImmunityMask |= uint32(miscVal);
3458 break;
3459 }
3461 {
3462 dispelImmunityMask = 1u << miscVal;
3463 break;
3464 }
3465 default:
3466 break;
3467 }
3468
3469 immuneInfo.SchoolImmuneMask = schoolImmunityMask;
3470 immuneInfo.ApplyHarmfulAuraImmuneMask = applyHarmfulAuraImmunityMask;
3471 immuneInfo.MechanicImmuneMask = mechanicImmunityMask;
3472 immuneInfo.DispelImmuneMask = dispelImmunityMask;
3473 immuneInfo.DamageSchoolMask = damageImmunityMask;
3474 immuneInfo.OtherImmuneMask = otherImmunityMask;
3475
3476 immuneInfo.AuraTypeImmune.shrink_to_fit();
3477 immuneInfo.SpellEffectImmune.shrink_to_fit();
3478
3479 if (immuneInfo.SchoolImmuneMask
3480 || immuneInfo.ApplyHarmfulAuraImmuneMask
3481 || immuneInfo.MechanicImmuneMask
3482 || immuneInfo.DispelImmuneMask
3483 || immuneInfo.DamageSchoolMask
3484 || immuneInfo.OtherImmuneMask
3485 || !immuneInfo.AuraTypeImmune.empty()
3486 || !immuneInfo.SpellEffectImmune.empty())
3487 {
3488 effect._immunityInfo = std::move(workBuffer);
3489 workBuffer = std::make_unique<SpellEffectInfo::ImmunityInfo>();
3490 }
3491
3493 }
3494
3496 {
3497 switch (Id)
3498 {
3499 case 22812: // Barkskin
3500 case 47585: // Dispersion
3502 (1 << MECHANIC_STUN) |
3503 (1 << MECHANIC_FREEZE) |
3504 (1 << MECHANIC_KNOCKOUT) |
3505 (1 << MECHANIC_SLEEP);
3506 break;
3507 case 49039: // Lichborne, don't allow normal stuns
3508 break;
3509 default:
3511 break;
3512 }
3513 }
3514
3517
3519 {
3520 switch (Id)
3521 {
3522 case 22812: // Barkskin
3523 case 47585: // Dispersion
3525 break;
3526 default:
3528 break;
3529 }
3530 }
3531}
3532
3533void SpellInfo::_LoadSqrtTargetLimit(int32 maxTargets, int32 numNonDiminishedTargets,
3534 Optional<uint32> maxTargetsValueHolderSpell, Optional<SpellEffIndex> maxTargetsValueHolderEffect,
3535 Optional<uint32> numNonDiminishedTargetsValueHolderSpell, Optional<SpellEffIndex> numNonDiminishedTargetsValueHolderEffect)
3536{
3537 SqrtDamageAndHealingDiminishing.MaxTargets = maxTargets;
3538 SqrtDamageAndHealingDiminishing.NumNonDiminishedTargets = numNonDiminishedTargets;
3539
3540 if (maxTargetsValueHolderEffect)
3541 {
3542 SpellInfo const* maxTargetValueHolder = this;
3543 if (maxTargetsValueHolderSpell)
3544 maxTargetValueHolder = sSpellMgr->GetSpellInfo(*maxTargetsValueHolderSpell, Difficulty);
3545
3546 if (!maxTargetValueHolder)
3547 TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {} does not exist", maxTargetsValueHolderSpell);
3548 else if (maxTargetsValueHolderEffect >= maxTargetValueHolder->GetEffects().size())
3549 TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {} does not have effect {}",
3550 maxTargetValueHolder->Id, AsUnderlyingType(*maxTargetsValueHolderEffect));
3551 else
3552 {
3553 SpellEffectInfo const& valueHolder = maxTargetValueHolder->GetEffect(*maxTargetsValueHolderEffect);
3554 int32 expectedValue = valueHolder.CalcBaseValue(nullptr, nullptr, 0, -1);
3555 if (maxTargets != expectedValue)
3556 TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {} has different value in effect {} than expected, recheck target caps (expected {}, got {})",
3557 maxTargetValueHolder->Id, AsUnderlyingType(*maxTargetsValueHolderEffect), maxTargets, expectedValue);
3558 }
3559 }
3560
3561 if (numNonDiminishedTargetsValueHolderEffect)
3562 {
3563 SpellInfo const* numNonDiminishedTargetsValueHolder = this;
3564 if (numNonDiminishedTargetsValueHolderSpell)
3565 numNonDiminishedTargetsValueHolder = sSpellMgr->GetSpellInfo(*numNonDiminishedTargetsValueHolderSpell, Difficulty);
3566
3567 if (!numNonDiminishedTargetsValueHolder)
3568 TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {} does not exist", maxTargetsValueHolderSpell);
3569 else if (numNonDiminishedTargetsValueHolderEffect >= numNonDiminishedTargetsValueHolder->GetEffects().size())
3570 TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {} does not have effect {}",
3571 numNonDiminishedTargetsValueHolder->Id, AsUnderlyingType(*maxTargetsValueHolderEffect));
3572 else
3573 {
3574 SpellEffectInfo const& valueHolder = numNonDiminishedTargetsValueHolder->GetEffect(*numNonDiminishedTargetsValueHolderEffect);
3575 int32 expectedValue = valueHolder.CalcBaseValue(nullptr, nullptr, 0, -1);
3576 if (numNonDiminishedTargets != expectedValue)
3577 TC_LOG_ERROR("spells", "SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {} has different value in effect {} than expected, recheck target caps (expected {}, got {})",
3578 numNonDiminishedTargetsValueHolder->Id, AsUnderlyingType(*numNonDiminishedTargetsValueHolderEffect), numNonDiminishedTargets, expectedValue);
3579 }
3580 }
3581}
3582
3583void SpellInfo::ApplyAllSpellImmunitiesTo(Unit* target, SpellEffectInfo const& spellEffectInfo, bool apply) const
3584{
3585 SpellEffectInfo::ImmunityInfo const* immuneInfo = spellEffectInfo.GetImmunityInfo();
3586 if (!immuneInfo)
3587 return;
3588
3589 if (uint32 schoolImmunity = immuneInfo->SchoolImmuneMask)
3590 {
3591 target->ApplySpellImmune(Id, IMMUNITY_SCHOOL, schoolImmunity, apply);
3592
3594 {
3595 target->RemoveAppliedAuras([this, target, schoolImmunity](AuraApplication const* aurApp) -> bool
3596 {
3597 SpellInfo const* auraSpellInfo = aurApp->GetBase()->GetSpellInfo();
3598 if (auraSpellInfo->Id == Id) // Don't remove self
3599 return false;
3600 if (auraSpellInfo->IsPassive()) // Don't remove passive auras
3601 return false;
3602 if (!(auraSpellInfo->GetSchoolMask() & schoolImmunity)) // Check for school mask
3603 return false;
3604 if (!CanDispelAura(auraSpellInfo))
3605 return false;
3607 {
3608 WorldObject const* existingAuraCaster = aurApp->GetBase()->GetWorldObjectCaster();
3609 if (existingAuraCaster && existingAuraCaster->IsFriendlyTo(target)) // Check spell vs aura possitivity
3610 return false;
3611 }
3612 return true;
3613 });
3614 }
3615
3616 if (apply && schoolImmunity & SPELL_SCHOOL_MASK_NORMAL)
3618 }
3619
3620 if (uint64 mechanicImmunity = immuneInfo->MechanicImmuneMask)
3621 {
3622 for (uint32 i = 0; i < MAX_MECHANIC; ++i)
3623 if (mechanicImmunity & (UI64LIT(1) << i))
3625
3627 {
3628 if (apply)
3629 target->RemoveAurasWithMechanic(mechanicImmunity, AURA_REMOVE_BY_DEFAULT, Id);
3630 else
3631 {
3632 std::vector<Aura*> aurasToUpdateTargets;
3633 target->RemoveAppliedAuras([mechanicImmunity, &aurasToUpdateTargets](AuraApplication const* aurApp)
3634 {
3635 Aura* aura = aurApp->GetBase();
3636 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanicImmunity)
3637 aurasToUpdateTargets.push_back(aura);
3638
3639 // only update targets, don't remove anything
3640 return false;
3641 });
3642
3643 for (Aura* aura : aurasToUpdateTargets)
3644 aura->UpdateTargetMap(aura->GetCaster());
3645 }
3646 }
3647 }
3648
3649 if (uint32 dispelImmunity = immuneInfo->DispelImmuneMask)
3650 {
3651 for (uint32 i = 0; i < DISPEL_MAX; ++i)
3652 if (dispelImmunity & (1 << i))
3654
3656 {
3657 target->RemoveAppliedAuras([dispelImmunity](AuraApplication const* aurApp) -> bool
3658 {
3659 SpellInfo const* spellInfo = aurApp->GetBase()->GetSpellInfo();
3660 uint32 dispelMask = spellInfo->GetDispelMask();
3661 if ((dispelMask & dispelImmunity) == dispelMask)
3662 return true;
3663
3664 return false;
3665 });
3666 }
3667 }
3668
3669 if (uint32 damageImmunity = immuneInfo->DamageSchoolMask)
3670 {
3671 target->ApplySpellImmune(Id, IMMUNITY_DAMAGE, damageImmunity, apply);
3672
3673 if (apply && damageImmunity & SPELL_SCHOOL_MASK_NORMAL)
3675 }
3676
3677 for (AuraType auraType : immuneInfo->AuraTypeImmune)
3678 {
3679 target->ApplySpellImmune(Id, IMMUNITY_STATE, auraType, apply);
3681 target->RemoveAurasByType(auraType, [this](AuraApplication const* aurApp) -> bool
3682 {
3683 return CanDispelAura(aurApp->GetBase()->GetSpellInfo());
3684 });
3685 }
3686
3687 for (SpellEffectName effectType : immuneInfo->SpellEffectImmune)
3688 target->ApplySpellImmune(Id, IMMUNITY_EFFECT, effectType, apply);
3689
3690 if (uint8 otherImmuneMask = immuneInfo->OtherImmuneMask)
3691 target->ApplySpellImmune(Id, IMMUNITY_OTHER, otherImmuneMask, apply);
3692}
3693
3695{
3696 if (!auraSpellInfo)
3697 return false;
3698
3699 for (SpellEffectInfo const& effectInfo : _effects)
3700 {
3701 if (!effectInfo.IsEffect())
3702 continue;
3703
3704 SpellEffectInfo::ImmunityInfo const* immuneInfo = effectInfo.GetImmunityInfo();
3705 if (!immuneInfo)
3706 continue;
3707
3709 if (uint32 schoolImmunity = immuneInfo->SchoolImmuneMask)
3710 if ((auraSpellInfo->SchoolMask & schoolImmunity) != 0)
3711 return true;
3712
3713 if (uint64 mechanicImmunity = immuneInfo->MechanicImmuneMask)
3714 if ((mechanicImmunity & (UI64LIT(1) << auraSpellInfo->Mechanic)) != 0)
3715 return true;
3716
3717 if (uint32 dispelImmunity = immuneInfo->DispelImmuneMask)
3718 if (auraSpellInfo->Dispel == dispelImmunity)
3719 return true;
3720
3721 bool immuneToAllEffects = true;
3722 for (SpellEffectInfo const& auraSpellEffectInfo : auraSpellInfo->GetEffects())
3723 {
3724 if (!auraSpellEffectInfo.IsAura())
3725 continue;
3726
3727 if (uint64 mechanicImmunity = immuneInfo->MechanicImmuneMask)
3728 if ((mechanicImmunity & (UI64LIT(1) << auraSpellEffectInfo.Mechanic)) != 0)
3729 continue;
3730
3731 if (AuraType auraName = auraSpellEffectInfo.ApplyAuraName)
3732 {
3733 if (immuneInfo->AuraTypeImmune.find(auraName) != immuneInfo->AuraTypeImmune.end())
3734 continue;
3735
3736 if (!auraSpellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES) && !auraSpellInfo->IsPositiveEffect(auraSpellEffectInfo.EffectIndex))
3737 if (uint32 applyHarmfulAuraImmunityMask = immuneInfo->ApplyHarmfulAuraImmuneMask)
3738 if ((auraSpellInfo->GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0)
3739 continue;
3740 }
3741
3742 immuneToAllEffects = false;
3743 }
3744
3745 if (immuneToAllEffects)
3746 return true;
3747 }
3748
3749 return false;
3750}
3751
3752bool SpellInfo::CanSpellEffectProvideImmunityAgainstAuraEffect(SpellEffectInfo const& immunityEffectInfo, SpellInfo const* auraSpellInfo, SpellEffectInfo const& auraEffectInfo) const
3753{
3754 SpellEffectInfo::ImmunityInfo const* immuneInfo = immunityEffectInfo.GetImmunityInfo();
3755 if (!immuneInfo)
3756 return false;
3757
3759 {
3760 if (uint32 schoolImmunity = immuneInfo->SchoolImmuneMask)
3761 if ((auraSpellInfo->SchoolMask & schoolImmunity) != 0)
3762 return true;
3763
3764 if (uint32 applyHarmfulAuraImmunityMask = immuneInfo->ApplyHarmfulAuraImmuneMask)
3765 if ((auraSpellInfo->GetSchoolMask() & applyHarmfulAuraImmunityMask) != 0)
3766 return true;
3767 }
3768
3769 if (uint64 mechanicImmunity = immuneInfo->MechanicImmuneMask)
3770 {
3771 if ((mechanicImmunity & (UI64LIT(1) << auraSpellInfo->Mechanic)) != 0)
3772 return true;
3773 if ((mechanicImmunity & (UI64LIT(1) << auraEffectInfo.Mechanic)) != 0)
3774 return true;
3775 }
3776
3777 if (uint32 dispelImmunity = immuneInfo->DispelImmuneMask)
3778 if (auraSpellInfo->Dispel == dispelImmunity)
3779 return true;
3780
3781 if (immuneInfo->AuraTypeImmune.find(auraEffectInfo.ApplyAuraName) != immuneInfo->AuraTypeImmune.end())
3782 return true;
3783
3784 return false;
3785}
3786
3787// based on client Spell_C::CancelsAuraEffect
3789{
3791 return false;
3792
3794 return false;
3795
3797 return false;
3798
3799 for (SpellEffectInfo const& effect : GetEffects())
3801 return true;
3802
3803 return false;
3804}
3805
3807{
3808 return _allowedMechanicMask;
3809}
3810
3812{
3813 uint64 casterMechanicImmunityMask = caster->GetMechanicImmunityMask();
3814 uint64 mechanicImmunityMask = 0;
3815
3816 if (CanBeInterrupted(nullptr, caster, true))
3817 {
3818 if (casterMechanicImmunityMask & (1 << MECHANIC_SILENCE))
3819 mechanicImmunityMask |= (1 << MECHANIC_SILENCE);
3820
3821 if (casterMechanicImmunityMask & (1 << MECHANIC_INTERRUPT))
3822 mechanicImmunityMask |= (1 << MECHANIC_INTERRUPT);
3823 }
3824
3825 return mechanicImmunityMask;
3826}
3827
3828float SpellInfo::GetMinRange(bool positive /*= false*/) const
3829{
3830 if (!RangeEntry)
3831 return 0.0f;
3832 return RangeEntry->RangeMin[positive ? 1 : 0];
3833}
3834
3835float SpellInfo::GetMaxRange(bool positive /*= false*/, WorldObject* caster /*= nullptr*/, Spell* spell /*= nullptr*/) const
3836{
3837 if (!RangeEntry)
3838 return 0.0f;
3839 float range = RangeEntry->RangeMax[positive ? 1 : 0];
3840 if (caster)
3841 if (Player* modOwner = caster->GetSpellModOwner())
3842 modOwner->ApplySpellMod(this, SpellModOp::Range, range, spell);
3843
3844 return range;
3845}
3846
3847int32 SpellInfo::CalcDuration(WorldObject const* caster /*= nullptr*/) const
3848{
3849 int32 duration = GetDuration();
3850
3851 if (caster)
3852 if (Player* modOwner = caster->GetSpellModOwner())
3853 modOwner->ApplySpellMod(this, SpellModOp::Duration, duration);
3854
3855 return duration;
3856}
3857
3859{
3860 if (!DurationEntry)
3861 return IsPassive() ? -1 : 0;
3862 return (DurationEntry->Duration == -1) ? -1 : abs(DurationEntry->Duration);
3863}
3864
3866{
3867 if (!DurationEntry)
3868 return IsPassive() ? -1 : 0;
3869 return (DurationEntry->MaxDuration == -1) ? -1 : abs(DurationEntry->MaxDuration);
3870}
3871
3872uint32 SpellInfo::CalcCastTime(Spell* spell /*= nullptr*/) const
3873{
3874 int32 castTime = 0;
3875 if (CastTimeEntry)
3876 castTime = std::max(CastTimeEntry->Base, CastTimeEntry->Minimum);
3877
3878 if (castTime <= 0)
3879 return 0;
3880
3881 if (spell)
3882 spell->GetCaster()->ModSpellCastTime(this, castTime, spell);
3883
3885 castTime += 500;
3886
3887 return (castTime > 0) ? uint32(castTime) : 0;
3888}
3889
3891{
3892 uint32 totalTicks = 0;
3893 int32 DotDuration = GetDuration();
3894
3895 for (SpellEffectInfo const& effect : GetEffects())
3896 {
3897 if (effect.IsEffect(SPELL_EFFECT_APPLY_AURA))
3898 {
3899 switch (effect.ApplyAuraName)
3900 {
3915 // skip infinite periodics
3916 if (effect.ApplyAuraPeriod > 0 && DotDuration > 0)
3917 {
3918 totalTicks = static_cast<uint32>(DotDuration) / effect.ApplyAuraPeriod;
3920 ++totalTicks;
3921 }
3922 break;
3923 default:
3924 break;
3925 }
3926 }
3927 }
3928
3929 return totalTicks;
3930}
3931
3933{
3935}
3936
3937Optional<SpellPowerCost> SpellInfo::CalcPowerCost(Powers powerType, bool optionalCost, WorldObject const* caster, SpellSchoolMask schoolMask, Spell* spell /*= nullptr*/) const
3938{
3939 // gameobject casts don't use power
3940 Unit const* unitCaster = caster->ToUnit();
3941 if (!unitCaster)
3942 return {};
3943
3944 auto itr = std::find_if(PowerCosts.cbegin(), PowerCosts.cend(), [powerType](SpellPowerEntry const* spellPowerEntry)
3945 {
3946 return spellPowerEntry && spellPowerEntry->PowerType == powerType;
3947 });
3948 if (itr == PowerCosts.cend())
3949 return {};
3950
3951 return CalcPowerCost(*itr, optionalCost, caster, schoolMask, spell);
3952}
3953
3954Optional<SpellPowerCost> SpellInfo::CalcPowerCost(SpellPowerEntry const* power, bool optionalCost, WorldObject const* caster, SpellSchoolMask schoolMask, Spell* spell /*= nullptr*/) const
3955{
3956 // gameobject casts don't use power
3957 Unit const* unitCaster = caster->ToUnit();
3958 if (!unitCaster)
3959 return {};
3960
3961 if (power->RequiredAuraSpellID && !unitCaster->HasAura(power->RequiredAuraSpellID))
3962 return {};
3963
3964 // Spell drain all exist power on cast (Only paladin lay of Hands)
3966 {
3967 if (optionalCost)
3968 return {};
3969
3970 // If power type - health drain all
3971 if (power->PowerType == POWER_HEALTH)
3972 return SpellPowerCost{ .Power = POWER_HEALTH, .Amount = int32(unitCaster->GetHealth()) };
3973
3974 // Else drain all power
3975 if (power->PowerType < MAX_POWERS)
3976 return SpellPowerCost{ .Power = Powers(power->PowerType), .Amount = unitCaster->GetPower(Powers(power->PowerType)) };
3977
3978 TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type '{}' in spell {}", power->PowerType, Id);
3979 return {};
3980 }
3981
3982 // Base powerCost
3983 int32 powerCost = 0;
3984 if (!optionalCost)
3985 {
3986 powerCost = power->ManaCost;
3987 // PCT cost from total amount
3988 if (power->PowerCostPct)
3989 {
3990 switch (power->PowerType)
3991 {
3992 // health as power used
3993 case POWER_HEALTH:
3994 if (G3D::fuzzyEq(power->PowerCostPct, 0.0f))
3995 powerCost += int32(CalculatePct(unitCaster->GetMaxHealth(), power->PowerCostMaxPct));
3996 else
3997 powerCost += int32(CalculatePct(unitCaster->GetMaxHealth(), power->PowerCostPct));
3998 break;
3999 case POWER_MANA:
4000 powerCost += int32(CalculatePct(unitCaster->GetCreateMana(), power->PowerCostPct));
4001 break;
4003 TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type POWER_ALTERNATE_POWER in spell {}", Id);
4004 return {};
4005 default:
4006 {
4007 if (PowerTypeEntry const* powerTypeEntry = sDB2Manager.GetPowerTypeEntry(Powers(power->PowerType)))
4008 {
4009 powerCost += int32(CalculatePct(powerTypeEntry->MaxBasePower, power->PowerCostPct));
4010 break;
4011 }
4012
4013 TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type '{}' in spell {}", power->PowerType, Id);
4014 return {};
4015 }
4016 }
4017 }
4018 }
4019 else
4020 {
4021 powerCost = int32(power->OptionalCost);
4022
4023 if (power->OptionalCostPct)
4024 {
4025 switch (power->PowerType)
4026 {
4027 // health as power used
4028 case POWER_HEALTH:
4029 powerCost += int32(CalculatePct(unitCaster->GetMaxHealth(), power->OptionalCostPct));
4030 break;
4031 case POWER_MANA:
4032 powerCost += int32(CalculatePct(unitCaster->GetCreateMana(), power->OptionalCostPct));
4033 break;
4035 TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unsupported power type POWER_ALTERNATE_POWER in spell {} for optional cost percent", Id);
4036 return {};
4037 default:
4038 {
4039 if (PowerTypeEntry const* powerTypeEntry = sDB2Manager.GetPowerTypeEntry(Powers(power->PowerType)))
4040 {
4041 powerCost += int32(CalculatePct(powerTypeEntry->MaxBasePower, power->OptionalCostPct));
4042 break;
4043 }
4044
4045 TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type '{}' in spell {} for optional cost percent", power->PowerType, Id);
4046 return {};
4047 }
4048 }
4049 }
4050
4051 powerCost += unitCaster->GetTotalAuraModifier(SPELL_AURA_MOD_ADDITIONAL_POWER_COST, [this, power](AuraEffect const* aurEff) -> bool
4052 {
4053 return aurEff->GetMiscValue() == power->PowerType
4054 && aurEff->IsAffectingSpell(this);
4055 });
4056 }
4057
4058 bool initiallyNegative = powerCost < 0;
4059
4060 // Shiv - costs 20 + weaponSpeed*10 energy (apply only to non-triggered spell with energy cost)
4062 {
4063 uint32 speed = 0;
4064 if (SpellShapeshiftFormEntry const* ss = sSpellShapeshiftFormStore.LookupEntry(unitCaster->GetShapeshiftForm()))
4065 speed = ss->CombatRoundTime;
4066 else
4067 {
4070 slot = OFF_ATTACK;
4071
4072 speed = unitCaster->GetBaseAttackTime(slot);
4073 }
4074
4075 powerCost += speed / 100;
4076 }
4077
4078 if (power->PowerType != POWER_HEALTH)
4079 {
4080 if (!optionalCost)
4081 {
4082 // Flat mod from caster auras by spell school and power type
4084 {
4085 if (!(aura->GetMiscValue() & schoolMask))
4086 continue;
4087
4088 if (!(aura->GetMiscValueB() & (1 << power->PowerType)))
4089 continue;
4090
4091 powerCost += aura->GetAmount();
4092 }
4093 }
4094
4095 // PCT mod from user auras by spell school and power type
4096 for (auto schoolCostPct : unitCaster->GetAuraEffectsByType(SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT))
4097 {
4098 if (!(schoolCostPct->GetMiscValue() & schoolMask))
4099 continue;
4100
4101 if (!(schoolCostPct->GetMiscValueB() & (1 << power->PowerType)))
4102 continue;
4103
4104 powerCost += CalculatePct(powerCost, schoolCostPct->GetAmount());
4105 }
4106 }
4107
4108 // Apply cost mod by spell
4109 if (Player* modOwner = unitCaster->GetSpellModOwner())
4110 {
4112 switch (power->OrderIndex)
4113 {
4114 case 0:
4116 break;
4117 case 1:
4119 break;
4120 case 2:
4122 break;
4123 default:
4124 break;
4125 }
4126
4127 if (mod)
4128 {
4129 if (!optionalCost)
4130 modOwner->ApplySpellMod(this, *mod, powerCost, spell);
4131 else
4132 {
4133 // optional cost ignores flat modifiers
4134 int32 flatMod = 0;
4135 float pctMod = 1.0f;
4136 modOwner->GetSpellModValues(this, *mod, spell, powerCost, &flatMod, &pctMod);
4137 powerCost = int32(powerCost * pctMod);
4138 }
4139 }
4140 }
4141
4142 if (!unitCaster->IsControlledByPlayer() && G3D::fuzzyEq(power->PowerCostPct, 0.0f) && SpellLevel && power->PowerType == POWER_MANA)
4143 {
4145 {
4147 GtNpcManaCostScalerEntry const* casterScaler = sNpcManaCostScalerGameTable.GetRow(unitCaster->GetLevel());
4148 if (spellScaler && casterScaler)
4149 powerCost *= casterScaler->Scaler / spellScaler->Scaler;
4150 }
4151 }
4152
4153 if (power->PowerType == POWER_MANA)
4154 powerCost = float(powerCost) * (1.0f + unitCaster->m_unitData->ManaCostMultiplier);
4155
4156 // power cost cannot become negative if initially positive
4157 if (initiallyNegative != (powerCost < 0))
4158 powerCost = 0;
4159
4160 return SpellPowerCost{ .Power = Powers(power->PowerType), .Amount = powerCost };
4161}
4162
4163std::vector<SpellPowerCost> SpellInfo::CalcPowerCost(WorldObject const* caster, SpellSchoolMask schoolMask, Spell* spell) const
4164{
4165 std::vector<SpellPowerCost> costs;
4166 if (caster->IsUnit())
4167 {
4168 costs.reserve(MAX_POWERS_PER_SPELL);
4169
4170 auto getOrCreatePowerCost = [&](Powers powerType) -> SpellPowerCost&
4171 {
4172 auto itr = std::find_if(costs.begin(), costs.end(), [powerType](SpellPowerCost const& cost)
4173 {
4174 return cost.Power == powerType;
4175 });
4176 if (itr != costs.end())
4177 return *itr;
4178
4179 return costs.emplace_back<SpellPowerCost>({ .Power = powerType, .Amount = 0 });
4180 };
4181
4182 for (SpellPowerEntry const* power : PowerCosts)
4183 {
4184 if (!power)
4185 continue;
4186
4187 if (Optional<SpellPowerCost> cost = CalcPowerCost(power, false, caster, schoolMask, spell))
4188 getOrCreatePowerCost(cost->Power).Amount += cost->Amount;
4189
4190 if (Optional<SpellPowerCost> optionalCost = CalcPowerCost(power, true, caster, schoolMask, spell))
4191 {
4192 SpellPowerCost& cost = getOrCreatePowerCost(optionalCost->Power);
4193 int32 remainingPower = caster->ToUnit()->GetPower(optionalCost->Power) - cost.Amount;
4194 if (remainingPower > 0)
4195 cost.Amount += std::min(optionalCost->Amount, remainingPower);
4196 }
4197 }
4198 }
4199
4200 return costs;
4201}
4202
4203inline float CalcPPMHasteMod(SpellProcsPerMinuteModEntry const* mod, Unit* caster)
4204{
4205 float haste = caster->m_unitData->ModHaste;
4206 float rangedHaste = caster->m_unitData->ModRangedHaste;
4207 float spellHaste = caster->m_unitData->ModSpellHaste;
4208 float regenHaste = caster->m_unitData->ModHasteRegen;
4209
4210 switch (mod->Param)
4211 {
4212 case 1:
4213 return (1.0f / haste - 1.0f) * mod->Coeff;
4214 case 2:
4215 return (1.0f / rangedHaste - 1.0f) * mod->Coeff;
4216 case 3:
4217 return (1.0f / spellHaste - 1.0f) * mod->Coeff;
4218 case 4:
4219 return (1.0f / regenHaste - 1.0f) * mod->Coeff;
4220 case 5:
4221 return (1.0f / std::min(std::min(std::min(haste, rangedHaste), spellHaste), regenHaste) - 1.0f) * mod->Coeff;
4222 default:
4223 break;
4224 }
4225
4226 return 0.0f;
4227}
4228
4229inline float CalcPPMCritMod(SpellProcsPerMinuteModEntry const* mod, Unit* caster)
4230{
4231 Player const* player = caster->ToPlayer();
4232 if (!player)
4233 return 0.0f;
4234
4235 float crit = player->m_activePlayerData->CritPercentage;
4236 float rangedCrit = player->m_activePlayerData->RangedCritPercentage;
4237 float spellCrit = player->m_activePlayerData->SpellCritPercentage;
4238
4239 switch (mod->Param)
4240 {
4241 case 1:
4242 return crit * mod->Coeff * 0.01f;
4243 case 2:
4244 return rangedCrit * mod->Coeff * 0.01f;
4245 case 3:
4246 return spellCrit * mod->Coeff * 0.01f;
4247 case 4:
4248 return std::min(std::min(crit, rangedCrit), spellCrit) * mod->Coeff * 0.01f;
4249 default:
4250 break;
4251 }
4252
4253 return 0.0f;
4254}
4255
4256inline float CalcPPMItemLevelMod(SpellProcsPerMinuteModEntry const* mod, int32 itemLevel)
4257{
4258 if (itemLevel == mod->Param)
4259 return 0.0f;
4260
4261 float itemLevelPoints = GetRandomPropertyPoints(itemLevel, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
4262 float basePoints = GetRandomPropertyPoints(mod->Param, ITEM_QUALITY_RARE, INVTYPE_CHEST, 0);
4263 if (itemLevelPoints == basePoints)
4264 return 0.0f;
4265
4266 return ((itemLevelPoints / basePoints) - 1.0f) * mod->Coeff;
4267}
4268
4269float SpellInfo::CalcProcPPM(Unit* caster, int32 itemLevel) const
4270{
4271 float ppm = ProcBasePPM;
4272 if (!caster)
4273 return ppm;
4274
4275 for (SpellProcsPerMinuteModEntry const* mod : ProcPPMMods)
4276 {
4277 switch (mod->Type)
4278 {
4280 {
4281 ppm *= 1.0f + CalcPPMHasteMod(mod, caster);
4282 break;
4283 }
4284 case SPELL_PPM_MOD_CRIT:
4285 {
4286 ppm *= 1.0f + CalcPPMCritMod(mod, caster);
4287 break;
4288 }
4290 {
4291 if (caster->GetClassMask() & mod->Param)
4292 ppm *= 1.0f + mod->Coeff;
4293 break;
4294 }
4295 case SPELL_PPM_MOD_SPEC:
4296 {
4297 if (Player* plrCaster = caster->ToPlayer())
4298 if (plrCaster->GetPrimarySpecialization() == ChrSpecialization(mod->Param))
4299 ppm *= 1.0f + mod->Coeff;
4300 break;
4301 }
4302 case SPELL_PPM_MOD_RACE:
4303 {
4304 if (caster->GetRaceMask() & mod->Param)
4305 ppm *= 1.0f + mod->Coeff;
4306 break;
4307 }
4309 {
4310 ppm *= 1.0f + CalcPPMItemLevelMod(mod, itemLevel);
4311 break;
4312 }
4314 {
4315 if (caster->GetMap()->IsBattlegroundOrArena())
4316 ppm *= 1.0f + mod->Coeff;
4317 break;
4318 }
4319 default:
4320 break;
4321 }
4322 }
4323
4324 return ppm;
4325}
4326
4328{
4329 return ChainEntry != nullptr;
4330}
4331
4333{
4334 if (!ChainEntry)
4335 return 1;
4336 return ChainEntry->rank;
4337}
4338
4340{
4341 if (!ChainEntry)
4342 return this;
4343 return ChainEntry->first;
4344}
4345
4347{
4348 if (!ChainEntry)
4349 return nullptr;
4350 return ChainEntry->last;
4351}
4352
4354{
4355 if (!ChainEntry)
4356 return nullptr;
4357 return ChainEntry->next;
4358}
4359
4361{
4362 if (!ChainEntry)
4363 return nullptr;
4364 return ChainEntry->prev;
4365}
4366
4368{
4369 // ignore passive spells
4370 if (IsPassive())
4371 return this;
4372
4373 // Client ignores spell with these attributes (sub_53D9D0)
4375 return this;
4376
4377 bool needRankSelection = false;
4378 for (SpellEffectInfo const& effect : GetEffects())
4379 {
4380 if (IsPositiveEffect(effect.EffectIndex) &&
4381 (effect.Effect == SPELL_EFFECT_APPLY_AURA ||
4382 effect.Effect == SPELL_EFFECT_APPLY_AREA_AURA_PARTY ||
4383 effect.Effect == SPELL_EFFECT_APPLY_AREA_AURA_RAID) &&
4384 !effect.Scaling.Coefficient)
4385 {
4386 needRankSelection = true;
4387 break;
4388 }
4389 }
4390
4391 // not required
4392 if (!needRankSelection)
4393 return this;
4394
4395 for (SpellInfo const* nextSpellInfo = this; nextSpellInfo != nullptr; nextSpellInfo = nextSpellInfo->GetPrevRankSpell())
4396 {
4397 // if found appropriate level
4398 if (uint32(level + 10) >= nextSpellInfo->SpellLevel)
4399 return nextSpellInfo;
4400
4401 // one rank less then
4402 }
4403
4404 // not found
4405 return nullptr;
4406}
4407
4408bool SpellInfo::IsRankOf(SpellInfo const* spellInfo) const
4409{
4410 return GetFirstRankSpell() == spellInfo->GetFirstRankSpell();
4411}
4412
4413bool SpellInfo::IsDifferentRankOf(SpellInfo const* spellInfo) const
4414{
4415 if (Id == spellInfo->Id)
4416 return false;
4417 return IsRankOf(spellInfo);
4418}
4419
4420bool SpellInfo::IsHighRankOf(SpellInfo const* spellInfo) const
4421{
4422 if (ChainEntry && spellInfo->ChainEntry)
4423 if (ChainEntry->first == spellInfo->ChainEntry->first)
4424 if (ChainEntry->rank > spellInfo->ChainEntry->rank)
4425 return true;
4426
4427 return false;
4428}
4429
4430uint32 SpellInfo::GetSpellXSpellVisualId(WorldObject const* caster /*= nullptr*/, WorldObject const* viewer /*= nullptr*/) const
4431{
4432 for (SpellXSpellVisualEntry const* visual : _visuals)
4433 {
4434 if (visual->CasterPlayerConditionID)
4435 if (!caster || !caster->IsPlayer() || !ConditionMgr::IsPlayerMeetingCondition(caster->ToPlayer(), visual->CasterPlayerConditionID))
4436 continue;
4437
4438 if (UnitConditionEntry const* unitCondition = sUnitConditionStore.LookupEntry(visual->CasterUnitConditionID))
4439 if (!caster || !caster->IsUnit() || !ConditionMgr::IsUnitMeetingCondition(caster->ToUnit(), Object::ToUnit(viewer), unitCondition))
4440 continue;
4441
4442 return visual->ID;
4443 }
4444
4445 return 0;
4446}
4447
4448uint32 SpellInfo::GetSpellVisual(WorldObject const* caster /*= nullptr*/, WorldObject const* viewer /*= nullptr*/) const
4449{
4450 if (SpellXSpellVisualEntry const* visual = sSpellXSpellVisualStore.LookupEntry(GetSpellXSpellVisualId(caster, viewer)))
4451 {
4452 //if (visual->LowViolenceSpellVisualID && forPlayer->GetViolenceLevel() operator 2)
4453 // return visual->LowViolenceSpellVisualID;
4454
4455 return visual->SpellVisualID;
4456 }
4457
4458 return 0;
4459}
4460
4462{
4463 bool srcSet = false;
4464 bool dstSet = false;
4465 // prepare target mask using effect target entries
4466 for (SpellEffectInfo const& effect : GetEffects())
4467 {
4468 if (!effect.IsEffect())
4469 continue;
4470
4471 uint32 targetMask = 0;
4472 targetMask |= effect.TargetA.GetExplicitTargetMask(srcSet, dstSet);
4473 targetMask |= effect.TargetB.GetExplicitTargetMask(srcSet, dstSet);
4474
4475 // add explicit target flags based on spell effects which have EFFECT_IMPLICIT_TARGET_EXPLICIT and no valid target provided
4476 if (effect.GetImplicitTargetType() == EFFECT_IMPLICIT_TARGET_EXPLICIT)
4477 {
4478
4479 // extend explicit target mask only if valid targets for effect could not be provided by target types
4480 uint32 effectTargetMask = effect.GetMissingTargetMask(srcSet, dstSet, targetMask);
4481
4482 // don't add explicit object/dest flags when spell has no max range
4483 if (GetMaxRange(true) == 0.0f && GetMaxRange(false) == 0.0f)
4485
4486 targetMask |= effectTargetMask;
4487 }
4488
4489 ExplicitTargetMask |= targetMask;
4490 if (!effect.EffectAttributes.HasFlag(SpellEffectAttributes::DontFailSpellOnTargetingFailure))
4491 RequiredExplicitTargetMask |= targetMask;
4492 }
4493
4497}
4498
4499inline bool _isPositiveTarget(SpellEffectInfo const& effect)
4500{
4501 if (!effect.IsEffect())
4502 return true;
4503
4504 return (effect.TargetA.GetCheckType() != TARGET_CHECK_ENEMY &&
4506}
4507
4508bool _isPositiveEffectImpl(SpellInfo const* spellInfo, SpellEffectInfo const& effect, std::unordered_set<std::pair<SpellInfo const*, SpellEffIndex>>& visited)
4509{
4510 if (!effect.IsEffect())
4511 return true;
4512
4513 // attribute may be already set in DB
4514 if (!spellInfo->IsPositiveEffect(effect.EffectIndex))
4515 return false;
4516
4517 // passive auras like talents are all positive
4518 if (spellInfo->IsPassive())
4519 return true;
4520
4521 // not found a single positive spell with this attribute
4523 return false;
4524
4525 if (spellInfo->HasAttribute(SPELL_ATTR4_AURA_IS_BUFF))
4526 return true;
4527
4529 return false;
4530
4531 visited.insert({ spellInfo, effect.EffectIndex });
4532
4533 //We need scaling level info for some auras that compute bp 0 or positive but should be debuffs
4534 float bpScalePerLevel = effect.RealPointsPerLevel;
4535 int32 bp = effect.CalcValue();
4536 switch (spellInfo->SpellFamilyName)
4537 {
4539 switch (spellInfo->Id)
4540 {
4541 case 40268: // Spiritual Vengeance, Teron Gorefiend, Black Temple
4542 case 61987: // Avenging Wrath Marker
4543 case 61988: // Divine Shield exclude aura
4544 case 64412: // Phase Punch, Algalon the Observer, Ulduar
4545 case 72410: // Rune of Blood, Saurfang, Icecrown Citadel
4546 case 71204: // Touch of Insignificance, Lady Deathwhisper, Icecrown Citadel
4547 return false;
4548 case 24732: // Bat Costume
4549 case 30877: // Tag Murloc
4550 case 61716: // Rabbit Costume
4551 case 61734: // Noblegarden Bunny
4552 case 62344: // Fists of Stone
4553 case 50344: // Dream Funnel
4554 case 61819: // Manabonked! (item)
4555 case 61834: // Manabonked! (minigob)
4556 case 73523: // Rigor Mortis
4557 return true;
4558 default:
4559 break;
4560 }
4561 break;
4562 case SPELLFAMILY_ROGUE:
4563 switch (spellInfo->Id)
4564 {
4565 // Envenom must be considered as a positive effect even though it deals damage
4566 case 32645: // Envenom
4567 return true;
4568 case 40251: // Shadow of Death, Teron Gorefiend, Black Temple
4569 return false;
4570 default:
4571 break;
4572 }
4573 break;
4575 // Slam, Execute
4576 if ((spellInfo->SpellFamilyFlags[0] & 0x20200000) != 0)
4577 return false;
4578 break;
4579 default:
4580 break;
4581 }
4582
4583 switch (spellInfo->Mechanic)
4584 {
4586 return true;
4587 default:
4588 break;
4589 }
4590
4591 // Special case: effects which determine positivity of whole spell
4592 if (spellInfo->HasAttribute(SPELL_ATTR1_AURA_UNIQUE))
4593 {
4594 // check for targets, there seems to be an assortment of dummy triggering spells that should be negative
4595 for (SpellEffectInfo const& otherEffect : spellInfo->GetEffects())
4596 if (!_isPositiveTarget(otherEffect))
4597 return false;
4598 }
4599
4600 for (SpellEffectInfo const& otherEffect : spellInfo->GetEffects())
4601 {
4602 switch (otherEffect.Effect)
4603 {
4604 case SPELL_EFFECT_HEAL:
4608 return true;
4610 if (otherEffect.EffectIndex != effect.EffectIndex && // for spells like 38044: instakill effect is negative but auras on target must count as buff
4611 otherEffect.TargetA.GetTarget() == effect.TargetA.GetTarget() &&
4612 otherEffect.TargetB.GetTarget() == effect.TargetB.GetTarget())
4613 return false;
4614 break;
4615 default:
4616 break;
4617 }
4618
4619 if (otherEffect.IsAura())
4620 {
4621 switch (otherEffect.ApplyAuraName)
4622 {
4625 return true;
4627 case SPELL_AURA_EMPATHY:
4630 return false;
4631 default:
4632 break;
4633 }
4634 }
4635 }
4636
4637 switch (effect.Effect)
4638 {
4657 return false;
4663 return true;
4669 // check targets
4670 if (!_isPositiveTarget(effect))
4671 return false;
4672 break;
4674 // non-positive dispel
4675 switch (effect.MiscValue)
4676 {
4677 case DISPEL_STEALTH:
4679 case DISPEL_ENRAGE:
4680 return false;
4681 default:
4682 break;
4683 }
4684
4685 // also check targets
4686 if (!_isPositiveTarget(effect))
4687 return false;
4688 break;
4690 if (!_isPositiveTarget(effect))
4691 {
4692 // non-positive mechanic dispel on negative target
4693 switch (effect.MiscValue)
4694 {
4695 case MECHANIC_BANDAGE:
4696 case MECHANIC_SHIELD:
4697 case MECHANIC_MOUNT:
4699 return false;
4700 default:
4701 break;
4702 }
4703 }
4704 break;
4707 // check targets AND basepoints
4708 if (!_isPositiveTarget(effect) && bp > 0)
4709 return false;
4710 break;
4711 default:
4712 break;
4713 }
4714
4715 if (effect.IsAura())
4716 {
4717 // non-positive aura use
4718 switch (effect.ApplyAuraName)
4719 {
4720 case SPELL_AURA_MOD_STAT: // dependent from basepoint sign (negative -> negative)
4744 if (bp < 0 || bpScalePerLevel < 0) //TODO: What if both are 0? Should it be a buff or debuff?
4745 return false;
4746 break;
4747 case SPELL_AURA_MOD_ATTACKSPEED: // some buffs have negative bp, check both target and bp
4761 if (!_isPositiveTarget(effect) || bp < 0)
4762 return false;
4763 break;
4764 case SPELL_AURA_MOD_DAMAGE_TAKEN: // dependent from basepoint sign (positive -> negative)
4770 if (bp > 0)
4771 return false;
4772 break;
4773 case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN: // check targets and basepoints (ex Recklessness)
4774 if (!_isPositiveTarget(effect) && bp > 0)
4775 return false;
4776 break;
4777 case SPELL_AURA_MOD_HEALTH_REGEN_PERCENT: // check targets and basepoints (target enemy and negative bp -> negative)
4778 if (!_isPositiveTarget(effect) && bp < 0)
4779 return false;
4780 break;
4782 return true;
4785 if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(effect.TriggerSpell, spellInfo->Difficulty))
4786 {
4787 // negative targets of main spell return early
4788 for (SpellEffectInfo const& spellTriggeredEffect : spellTriggeredProto->GetEffects())
4789 {
4790 // already seen this
4791 if (visited.count({ spellTriggeredProto, spellTriggeredEffect.EffectIndex }) > 0)
4792 continue;
4793
4794 if (!spellTriggeredEffect.IsEffect())
4795 continue;
4796
4797 // if non-positive trigger cast targeted to positive target this main cast is non-positive
4798 // this will place this spell auras as debuffs
4799 if (_isPositiveTarget(spellTriggeredEffect) && !_isPositiveEffectImpl(spellTriggeredProto, spellTriggeredEffect, visited))
4800 return false;
4801 }
4802 }
4803 break;
4810 // special auras: they may have non negative target but still need to be marked as debuff
4811 // checked again after all effects (SpellInfo::_InitializeSpellPositivity)
4828 case SPELL_AURA_DUMMY:
4844 // check target for positive and negative spells
4845 if (!_isPositiveTarget(effect))
4846 return false;
4847 break;
4854 case SPELL_AURA_GHOST:
4864 return false;
4866 {
4867 // non-positive immunities
4868 switch (effect.MiscValue)
4869 {
4870 case MECHANIC_BANDAGE:
4871 case MECHANIC_SHIELD:
4872 case MECHANIC_MOUNT:
4874 return false;
4875 default:
4876 break;
4877 }
4878 break;
4879 }
4880 case SPELL_AURA_ADD_FLAT_MODIFIER: // mods
4884 {
4885 switch (SpellModOp(effect.MiscValue))
4886 {
4887 case SpellModOp::ChangeCastTime: // dependent from basepoint sign (positive -> negative)
4888 case SpellModOp::Period:
4891 if (bp > 0)
4892 return false;
4893 break;
4898 if (!spellInfo->IsPositive() && bp > 0) // dependent on prev effects too (ex Arcane Power)
4899 return false;
4900 break;
4901 case SpellModOp::PointsIndex0: // always positive
4906 case SpellModOp::Points:
4907 case SpellModOp::Hate:
4910 return true;
4915 if (!spellInfo->IsPositive() && bp < 0) // dependent on prev effects too
4916 return false;
4917 break;
4918 default: // dependent from basepoint sign (negative -> negative)
4919 if (bp < 0)
4920 return false;
4921 break;
4922 }
4923 break;
4924 }
4925 default:
4926 break;
4927 }
4928 }
4929
4930 // negative spell if triggered spell is negative
4931 if (!effect.ApplyAuraName && effect.TriggerSpell)
4932 {
4933 if (SpellInfo const* spellTriggeredProto = sSpellMgr->GetSpellInfo(effect.TriggerSpell, spellInfo->Difficulty))
4934 {
4935 // spells with at least one negative effect are considered negative
4936 // some self-applied spells have negative effects but in self casting case negative check ignored.
4937 for (SpellEffectInfo const& spellTriggeredEffect : spellTriggeredProto->GetEffects())
4938 {
4939 // already seen this
4940 if (visited.count({ spellTriggeredProto, spellTriggeredEffect.EffectIndex }) > 0)
4941 continue;
4942
4943 if (!spellTriggeredEffect.IsEffect())
4944 continue;
4945
4946 if (!_isPositiveEffectImpl(spellTriggeredProto, spellTriggeredEffect, visited))
4947 return false;
4948 }
4949 }
4950 }
4951
4952 // ok, positive
4953 return true;
4954}
4955
4957{
4958 std::unordered_set<std::pair<SpellInfo const*, SpellEffIndex /*effIndex*/>> visited;
4959
4960 for (SpellEffectInfo const& effect : GetEffects())
4961 if (!_isPositiveEffectImpl(this, effect, visited))
4962 NegativeEffects[effect.EffectIndex] = true;
4963
4964 // additional checks after effects marked
4965 for (SpellEffectInfo const& effect : GetEffects())
4966 {
4967 if (!effect.IsEffect() || !IsPositiveEffect(effect.EffectIndex))
4968 continue;
4969
4970 switch (effect.ApplyAuraName)
4971 {
4972 // has other non positive effect?
4973 // then it should be marked negative if has same target as negative effect (ex 8510, 8511, 8893, 10267)
4974 case SPELL_AURA_DUMMY:
4981 {
4982 for (size_t j = effect.EffectIndex + 1; j < GetEffects().size(); ++j)
4983 if (!IsPositiveEffect(j)
4984 && effect.TargetA.GetTarget() == GetEffect(SpellEffIndex(j)).TargetA.GetTarget()
4985 && effect.TargetB.GetTarget() == GetEffect(SpellEffIndex(j)).TargetB.GetTarget())
4986 NegativeEffects[effect.EffectIndex] = true;
4987 break;
4988 }
4989 default:
4990 break;
4991 }
4992 }
4993}
4994
4996{
4997 // find the same instances of ConditionList and delete them.
4998 for (SpellEffectInfo& effect : _effects)
4999 effect.ImplicitTargetConditions = nullptr;
5000}
5001
5003{
5005 return false;
5006
5008}
5009
5010bool SpellInfo::HasLabel(uint32 labelId) const
5011{
5012 return Labels.find(labelId) != Labels.end();
5013}
@ STATUS_WAIT_JOIN
Definition: Battleground.h:166
@ IN_MILLISECONDS
Definition: Common.h:35
#define M_PI
Definition: Common.h:115
@ CORPSE_BONES
Definition: Corpse.h:31
DB2Storage< RandPropPointsEntry > sRandPropPointsStore("RandPropPoints.db2", &RandPropPointsLoadInfo::Instance)
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
DB2Storage< SpellXSpellVisualEntry > sSpellXSpellVisualStore("SpellXSpellVisual.db2", &SpellXSpellVisualLoadInfo::Instance)
DB2Storage< SpellRangeEntry > sSpellRangeStore("SpellRange.db2", &SpellRangeLoadInfo::Instance)
DB2Storage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", &SpellShapeshiftFormLoadInfo::Instance)
DB2Storage< SpellDurationEntry > sSpellDurationStore("SpellDuration.db2", &SpellDurationLoadInfo::Instance)
DB2Storage< UnitConditionEntry > sUnitConditionStore("UnitCondition.db2", &UnitConditionLoadInfo::Instance)
DB2Storage< SummonPropertiesEntry > sSummonPropertiesStore("SummonProperties.db2", &SummonPropertiesLoadInfo::Instance)
DB2Storage< SpellRadiusEntry > sSpellRadiusStore("SpellRadius.db2", &SpellRadiusLoadInfo::Instance)
DB2Storage< ContentTuningEntry > sContentTuningStore("ContentTuning.db2", &ContentTuningLoadInfo::Instance)
DB2Storage< ItemSparseEntry > sItemSparseStore("ItemSparse.db2", &ItemSparseLoadInfo::Instance)
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
DB2Storage< SpellProcsPerMinuteEntry > sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", &SpellProcsPerMinuteLoadInfo::Instance)
DB2Storage< SpellCastTimesEntry > sSpellCastTimesStore("SpellCastTimes.db2", &SpellCastTimesLoadInfo::Instance)
#define sDB2Manager
Definition: DB2Stores.h:554
@ VEHICLE_SEAT_FLAG_UNK2
Definition: DBCEnums.h:2620
@ VEHICLE_SEAT_FLAG_CAN_CAST_MOUNT_SPELL
Definition: DBCEnums.h:2602
@ VEHICLE_SEAT_FLAG_CAN_CONTROL
Definition: DBCEnums.h:2601
@ VEHICLE_SEAT_FLAG_UNCONTROLLED
Definition: DBCEnums.h:2603
@ VEHICLE_SEAT_FLAG_CAN_ATTACK
Definition: DBCEnums.h:2604
SpellEffectAttributes
Definition: DBCEnums.h:2092
AreaMountFlags
Definition: DBCEnums.h:169
Difficulty
Definition: DBCEnums.h:918
constexpr std::size_t MAX_POWERS_PER_SPELL
Definition: DBCEnums.h:2153
@ SPELL_CATEGORY_FLAG_COOLDOWN_STARTS_ON_EVENT
Definition: DBCEnums.h:2087
ChrSpecialization
Definition: DBCEnums.h:390
ExpectedStatType
Definition: DBCEnums.h:972
@ SPELL_PPM_MOD_CRIT
Definition: DBCEnums.h:2145
@ SPELL_PPM_MOD_ITEM_LEVEL
Definition: DBCEnums.h:2149
@ SPELL_PPM_MOD_CLASS
Definition: DBCEnums.h:2146
@ SPELL_PPM_MOD_SPEC
Definition: DBCEnums.h:2147
@ SPELL_PPM_MOD_RACE
Definition: DBCEnums.h:2148
@ SPELL_PPM_MOD_HASTE
Definition: DBCEnums.h:2144
@ SPELL_PPM_MOD_BATTLEGROUND
Definition: DBCEnums.h:2150
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
#define UI64LIT(N)
Definition: Define.h:127
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
#define ASSERT
Definition: Errors.h:68
GameTable< GtSpellScalingEntry > sSpellScalingGameTable
Definition: GameTables.cpp:38
GameTable< GtStaminaMultByILvl > sStaminaMultByILvlGameTable
Definition: GameTables.cpp:39
float GetIlvlStatMultiplier(T const *row, InventoryType invType)
Definition: GameTables.cpp:149
GameTable< GtNpcManaCostScalerEntry > sNpcManaCostScalerGameTable
Definition: GameTables.cpp:37
GameTable< GtCombatRatingsMultByILvl > sCombatRatingsMultByILvlGameTable
Definition: GameTables.cpp:34
float GetSpellScalingColumnForClass(GtSpellScalingEntry const *row, int32 class_)
Definition: GameTables.h:246
TC_GAME_API float GetRandomPropertyPoints(uint32 itemLevel, uint32 quality, uint32 inventoryType, uint32 subClass)
#define ITEM_SUBCLASS_MASK_WEAPON_RANGED
Definition: ItemTemplate.h:523
InventoryType
Definition: ItemTemplate.h:384
@ INVTYPE_CHEST
Definition: ItemTemplate.h:390
#define TC_LOG_ERROR(filterType__, message__,...)
Definition: Log.h:188
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
uint64 MAKE_PAIR64(uint32 l, uint32 h)
Definition: ObjectDefines.h:87
@ TYPEID_PLAYER
Definition: ObjectGuid.h:43
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
@ SPELLMOD_LABEL_PCT
Definition: Player.h:168
@ SPELLMOD_FLAT
Definition: Player.h:165
@ SPELLMOD_PCT
Definition: Player.h:166
@ SPELLMOD_LABEL_FLAT
Definition: Player.h:167
float frand(float min, float max)
Definition: Random.cpp:55
float rand_norm()
Definition: Random.cpp:75
if(posix_memalign(&__mallocedMemory, __align, __size)) return NULL
@ SPELL_ATTR11_SCALES_WITH_ITEM_LEVEL
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_1
Definition: SharedDefines.h:31
@ EFFECT_0
Definition: SharedDefines.h:30
@ SPELL_ATTR10_USE_SPELL_BASE_LEVEL_FOR_SCALING
@ SPELL_ATTR9_AUTOCAST_OFF_BY_DEFAULT
@ SPELL_ATTR9_TARGET_MUST_BE_GROUNDED
@ SPELL_ATTR9_COOLDOWN_IGNORES_RANGED_WEAPON
@ SPELL_ATTR9_NO_MOVEMENT_RADIUS_BONUS
@ SPELL_ATTR7_BYPASS_NO_RESURRECT_AURA
@ SPELL_ATTR7_NO_UI_NOT_INTERRUPTIBLE
#define DISPEL_ALL_MASK
@ CLASS_NONE
@ SPELL_PREVENTION_TYPE_SILENCE
@ SPELL_ATTR5_EXTRA_INITIAL_PERIOD
@ SPELL_ATTR5_ALLOW_WHILE_STUNNED
@ SPELL_ATTR5_NOT_ON_PLAYER_CONTROLLED_NPC
@ SPELL_ATTR5_ALLOW_WHILE_FLEEING
@ SPELL_ATTR5_NOT_ON_PLAYER
@ SPELL_ATTR5_LIMIT_N
@ SPELL_ATTR5_ALLOW_WHILE_CONFUSED
SpellTargetIndex
Definition: SharedDefines.h:65
Targets
@ TARGET_DEST_CASTER_RANDOM
@ TARGET_DEST_DEST_RANDOM
@ TARGET_DEST_TARGET_RANDOM
@ TARGET_DEST_TRAJ
@ TOTAL_SPELL_TARGETS
@ TARGET_DEST_CASTER
@ TARGET_UNIT_CASTER
SpellSchoolMask
@ SPELL_SCHOOL_MASK_NORMAL
@ SPELL_SCHOOL_MASK_FROST
@ SPELL_ATTR2_AUTO_REPEAT
@ SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED_CASTER_FORM
@ SPELL_ATTR2_NO_INITIAL_THREAT
@ SPELL_ATTR2_CANNOT_CAST_ON_TAPPED
@ SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
SpellAttr1
@ SPELL_ATTR1_NO_THREAT
@ SPELL_ATTR1_IS_SELF_CHANNELLED
@ SPELL_ATTR1_EXCLUDE_CASTER
@ SPELL_ATTR1_USE_ALL_MANA
@ SPELL_ATTR1_IS_CHANNELLED
@ SPELL_ATTR1_AURA_UNIQUE
@ SPELL_ATTR1_NO_AUTOCAST_AI
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
@ SPELL_ATTR1_ONLY_PEACEFUL_TARGETS
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
@ SPELL_ATTR3_ONLY_PROC_ON_CASTER
@ SPELL_ATTR3_ONLY_ON_GHOSTS
@ SPELL_ATTR3_NOT_ON_AOE_IMMUNE
@ SPELL_ATTR3_DOT_STACKING_RULE
@ SPELL_ATTR3_REQUIRES_MAIN_HAND_WEAPON
@ SPELL_ATTR3_REQUIRES_OFF_HAND_WEAPON
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
@ SPELL_ATTR3_ONLY_ON_PLAYER
@ ITEM_QUALITY_RARE
@ SPELL_DAMAGE_CLASS_RANGED
@ SPELL_DAMAGE_CLASS_MELEE
SpellEffectName
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_POWER_BURN
@ SPELL_EFFECT_ENERGIZE_PCT
@ SPELL_EFFECT_APPLY_AREA_AURA_PARTY
@ SPELL_EFFECT_APPLY_AREA_AURA_FRIEND
@ SPELL_EFFECT_SELF_RESURRECT
@ SPELL_EFFECT_APPLY_AREA_AURA_PARTY_NONRANDOM
@ SPELL_EFFECT_DISTRACT
@ SPELL_EFFECT_DURABILITY_DAMAGE
@ SPELL_EFFECT_CREATE_LOOT
@ SPELL_EFFECT_HEALTH_LEECH
@ SPELL_EFFECT_SKILL
@ SPELL_EFFECT_WEAPON_DAMAGE
@ SPELL_EFFECT_HEAL
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
@ SPELL_EFFECT_APPLY_AURA_ON_PET
@ SPELL_EFFECT_DAMAGE_FROM_MAX_HEALTH_PCT
@ SPELL_EFFECT_DISPEL_MECHANIC
@ SPELL_EFFECT_HEAL_MAX_HEALTH
@ SPELL_EFFECT_APPLY_AREA_AURA_PET
@ SPELL_EFFECT_DISPEL
@ SPELL_EFFECT_NONE
@ SPELL_EFFECT_TAMECREATURE
@ SPELL_EFFECT_ATTACK_ME
@ SPELL_EFFECT_PICKPOCKET
@ SPELL_EFFECT_HEAL_MECHANICAL
@ SPELL_EFFECT_WEAPON_PERCENT_DAMAGE
@ SPELL_EFFECT_MODIFY_THREAT_PERCENT
@ SPELL_EFFECT_DURABILITY_DAMAGE_PCT
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
@ SPELL_EFFECT_APPLY_AREA_AURA_RAID
@ SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
@ SPELL_EFFECT_SUMMON
@ SPELL_EFFECT_ENERGIZE
@ SPELL_EFFECT_POWER_DRAIN
@ SPELL_EFFECT_RESURRECT
@ SPELL_EFFECT_CHARGE
@ SPELL_EFFECT_KNOCK_BACK
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ SPELL_EFFECT_GAMEOBJECT_DAMAGE
@ SPELL_EFFECT_LEARN_SPELL
@ SPELL_EFFECT_CREATE_RANDOM_ITEM
@ SPELL_EFFECT_INSTAKILL
@ SPELL_EFFECT_APPLY_AREA_AURA_ENEMY
@ SPELL_EFFECT_HEAL_PCT
@ SPELL_EFFECT_INTERRUPT_CAST
@ SPELL_EFFECT_APPLY_AREA_AURA_SUMMONS
@ SPELL_EFFECT_THREAT
@ SPELL_EFFECT_SKILL_STEP
@ SPELL_EFFECT_STEAL_BENEFICIAL_BUFF
@ SPELL_EFFECT_APPLY_AURA
@ SPELL_EFFECT_APPLY_AREA_AURA_OWNER
WeaponAttackType
@ OFF_ATTACK
@ BASE_ATTACK
@ RANGED_ATTACK
Mechanics
@ MECHANIC_DISARM
@ MECHANIC_NONE
@ MECHANIC_MOUNT
@ MECHANIC_FEAR
@ MECHANIC_INVULNERABILITY
@ MECHANIC_DISORIENTED
@ MECHANIC_KNOCKOUT
@ MECHANIC_STUN
@ MECHANIC_FREEZE
@ MECHANIC_INTERRUPT
@ MECHANIC_ROOT
@ MECHANIC_BANDAGE
@ MECHANIC_SLEEP
@ MECHANIC_BLEED
@ MECHANIC_BANISH
@ MAX_MECHANIC
@ MECHANIC_IMMUNE_SHIELD
@ MECHANIC_SNARE
@ MECHANIC_SILENCE
@ MECHANIC_SHIELD
@ MECHANIC_HORROR
@ IMMUNITY_STATE
@ IMMUNITY_EFFECT
@ IMMUNITY_DAMAGE
@ IMMUNITY_MECHANIC
@ IMMUNITY_SCHOOL
@ IMMUNITY_OTHER
@ IMMUNITY_DISPEL
Powers
@ MAX_POWERS
@ POWER_ALTERNATE_POWER
@ POWER_HEALTH
@ POWER_COMBO_POINTS
@ POWER_MANA
SpellAttr0
@ SPELL_ATTR0_ON_NEXT_SWING
@ SPELL_ATTR0_NOT_SHAPESHIFTED
@ SPELL_ATTR0_AURA_IS_DEBUFF
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
@ SPELL_ATTR0_PASSIVE
@ SPELL_ATTR0_COOLDOWN_ON_EVENT
@ SPELL_ATTR0_NO_IMMUNITIES
@ SPELL_ATTR0_SCALES_WITH_CREATURE_LEVEL
@ SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL
@ SPELL_ATTR0_USES_RANGED_SLOT
@ SPELL_ATTR0_ON_NEXT_SWING_NO_DAMAGE
DiminishingLevels
@ DIMINISHING_LEVEL_IMMUNE
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
@ DIMINISHING_LEVEL_2
DiminishingGroup
@ DIMINISHING_AOE_KNOCKBACK
@ DIMINISHING_NONE
@ DIMINISHING_STUN
@ DIMINISHING_LIMITONLY
@ DIMINISHING_DISORIENT
@ DIMINISHING_ROOT
@ DIMINISHING_TAUNT
@ DIMINISHING_SILENCE
@ DIMINISHING_INCAPACITATE
TotemCategory
SpellCastResult
@ SPELL_FAILED_TARGET_NOT_PLAYER
@ SPELL_FAILED_NOT_HERE
@ SPELL_FAILED_TARGET_NO_POCKETS
@ SPELL_FAILED_INCORRECT_AREA
@ SPELL_FAILED_TARGET_IS_PLAYER
@ SPELL_FAILED_NOT_IN_BATTLEGROUND
@ SPELL_FAILED_TARGET_NOT_IN_INSTANCE
@ SPELL_FAILED_CANT_CAST_ON_TAPPED
@ SPELL_FAILED_TARGET_AURASTATE
@ SPELL_FAILED_NOT_IN_RAID_INSTANCE
@ SPELL_FAILED_TARGET_NOT_GROUNDED
@ SPELL_FAILED_BM_OR_INVISGOD
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
@ SPELL_FAILED_ONLY_SHAPESHIFT
@ SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED
@ SPELL_FAILED_TARGETS_DEAD
@ SPELL_FAILED_TARGET_NOT_GHOST
@ SPELL_FAILED_BAD_TARGETS
@ SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED
@ SPELL_FAILED_NOT_SHAPESHIFT
@ SPELL_FAILED_TARGET_NO_WEAPONS
@ SPELL_CAST_OK
@ SPELL_FAILED_REQUIRES_AREA
@ SPELL_FAILED_TARGET_AFFECTING_COMBAT
AuraStateType
@ AURA_STATE_NONE
@ AURA_STATE_BLEED
@ AURA_STATE_FROZEN
@ AURA_STATE_VICTORIOUS
@ AURA_STATE_FAERIE_FIRE
@ AURA_STATE_ENRAGED
@ AURA_STATE_DAZED
@ AURA_STATE_DRUID_PERIODIC_HEAL
@ AURA_STATE_RAID_ENCOUNTER
@ AURA_STATE_ROGUE_POISONED
@ AURA_STATE_BANISHED
DiminishingReturnsType
@ DRTYPE_NONE
@ DRTYPE_PLAYER
@ DRTYPE_ALL
@ SPELLFAMILY_PRIEST
@ SPELLFAMILY_WARLOCK_PET
@ SPELLFAMILY_WARLOCK
@ SPELLFAMILY_MAGE
@ SPELLFAMILY_GENERIC
@ SPELLFAMILY_WARRIOR
@ SPELLFAMILY_PALADIN
@ SPELLFAMILY_HUNTER
@ SPELLFAMILY_DEMON_HUNTER
@ SPELLFAMILY_ROGUE
@ SPELLFAMILY_SHAMAN
@ SPELLFAMILY_DRUID
@ SPELLFAMILY_DEATHKNIGHT
@ SPELLFAMILY_MONK
@ AREA_WINTERGRASP
@ SPELL_ATTR13_DO_NOT_FAIL_IF_NO_TARGET
DispelType
@ DISPEL_ALL
@ DISPEL_ENRAGE
@ DISPEL_MAX
@ DISPEL_POISON
@ DISPEL_INVISIBILITY
@ DISPEL_STEALTH
@ DISPEL_CURSE
@ SPELL_ATTR4_ONLY_FLYING_AREAS
@ SPELL_ATTR4_NO_HARMFUL_THREAT
@ SPELL_ATTR4_AURA_IS_BUFF
@ SPELL_ATTR4_WEAPON_SPEED_COST_SCALING
@ SUMMON_CATEGORY_WILD
@ SPELL_ATTR8_ENFORCE_IN_COMBAT_RESSURECTION_LIMIT
@ SPELL_ATTR8_USE_TARGETS_LEVEL_FOR_SPELL_SCALING
@ SPELL_ATTR8_ONLY_TARGET_IF_SAME_CREATOR
@ SPELL_ATTR8_ONLY_TARGET_OWN_SUMMONS
@ SPELL_ATTR8_NOT_IN_BATTLEGROUND
@ SPELL_ATTR8_REMOVE_OUTSIDE_DUNGEONS_AND_RAIDS
constexpr uint64 IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK((1<< MECHANIC_CHARM)|(1<< MECHANIC_DISORIENTED)|(1<< MECHANIC_FEAR)|(1<< MECHANIC_ROOT)|(1<< MECHANIC_SLEEP)|(1<< MECHANIC_SNARE)|(1<< MECHANIC_STUN)|(1<< MECHANIC_FREEZE)|(1<< MECHANIC_SILENCE)|(1<< MECHANIC_DISARM)|(1<< MECHANIC_KNOCKOUT)|(1<< MECHANIC_POLYMORPH)|(1<< MECHANIC_BANISH)|(1<< MECHANIC_SHACKLE)|(1<< MECHANIC_TURN)|(1<< MECHANIC_HORROR)|(1<< MECHANIC_DAZE)|(1<< MECHANIC_SAPPED))
@ SPELL_ATTR6_ALLOW_WHILE_RIDING_VEHICLE
@ SPELL_ATTR6_DO_NOT_CHAIN_TO_CROWD_CONTROLLED_TARGETS
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
@ SPELL_ATTR6_NOT_IN_RAID_INSTANCES
@ AURA_REMOVE_BY_DEFAULT
AuraType
@ SPELL_AURA_PREVENT_RESURRECTION
@ SPELL_AURA_MOD_RECOVERY_RATE_BY_SPELL_LABEL
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
@ SPELL_AURA_MANA_SHIELD
@ SPELL_AURA_MOD_MAX_HEALTH
@ SPELL_AURA_DISPEL_IMMUNITY
@ SPELL_AURA_MOD_TOTAL_STAT_PERCENTAGE
@ SPELL_AURA_MOD_ATTACKSPEED
@ SPELL_AURA_MOD_ATTACK_POWER
@ SPELL_AURA_CHANNEL_DEATH_ITEM
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
@ SPELL_AURA_MOD_DISARM_RANGED
@ SPELL_AURA_PERIODIC_WEAPON_PERCENT_DAMAGE
@ SPELL_AURA_MOD_SKILL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_TRACK_RESOURCES
@ SPELL_AURA_MOD_PARRY_PERCENT
@ SPELL_AURA_MOD_MAX_POWER
@ SPELL_AURA_MOD_SHAPESHIFT
@ SPELL_AURA_MOD_DISARM
@ SPELL_AURA_MOD_SPELL_HIT_CHANCE
@ SPELL_AURA_DAMAGE_SHIELD
@ SPELL_AURA_OBS_MOD_HEALTH
@ SPELL_AURA_MOD_THREAT
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
@ SPELL_AURA_MELEE_SLOW
@ SPELL_AURA_ADD_PCT_MODIFIER
@ SPELL_AURA_PERIODIC_MANA_LEECH
@ SPELL_AURA_MOD_POSSESS_PET
@ SPELL_AURA_MOD_INCREASE_SPEED
@ SPELL_AURA_MOD_RESISTANCE
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
@ SPELL_AURA_MOD_BONUS_ARMOR
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_HASTE_SPELLS
@ SPELL_AURA_MOD_INCREASE_HEALTH
@ SPELL_AURA_MOD_FEAR
@ SPELL_AURA_MOD_POWER_REGEN
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
@ SPELL_AURA_PREVENT_INTERRUPT
@ SPELL_AURA_PREVENTS_FLEEING
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
@ SPELL_AURA_OBS_MOD_POWER
@ SPELL_AURA_ADD_FLAT_MODIFIER
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
@ SPELL_AURA_TRACK_STEALTHED
@ SPELL_AURA_MOD_MELEE_HASTE
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
@ SPELL_AURA_EMPATHY
@ SPELL_AURA_MOD_INCREASE_ENERGY
@ SPELL_AURA_MOD_STALKED
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
@ SPELL_AURA_MOD_ROOT_2
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
@ SPELL_AURA_MOD_RATING
@ SPELL_AURA_MOD_HIT_CHANCE
@ SPELL_AURA_PERIODIC_HEAL
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
@ SPELL_AURA_MOD_INCREASE_HEALTH_2
@ SPELL_AURA_MOD_DODGE_PERCENT
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
@ SPELL_AURA_MOD_PACIFY
@ SPELL_AURA_MOD_SILENCE
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
@ SPELL_AURA_MOD_DISARM_OFFHAND
@ SPELL_AURA_ADD_TARGET_TRIGGER
@ SPELL_AURA_ALLOW_INTERRUPT_SPELL
@ SPELL_AURA_MOD_DETAUNT
@ SPELL_AURA_MOD_STAT
@ SPELL_AURA_MOD_HEALING_DONE
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER
@ SPELL_AURA_MOD_HEALING_PCT
@ SPELL_AURA_ADD_FLAT_MODIFIER_BY_SPELL_LABEL
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
@ SPELL_AURA_GHOST
@ SPELL_AURA_MOD_CHARM
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
@ SPELL_AURA_ALLOW_MOUNT_IN_COMBAT
@ SPELL_AURA_MOD_ROOT
@ SPELL_AURA_MOD_RANGED_HASTE
@ SPELL_AURA_SCHOOL_IMMUNITY
@ SPELL_AURA_MOUNTED
@ SPELL_AURA_MOUNT_RESTRICTIONS
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
@ SPELL_AURA_MECHANIC_IMMUNITY
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
@ SPELL_AURA_MOD_DAMAGE_TAKEN
@ SPELL_AURA_MOD_TAUNT
@ SPELL_AURA_MOD_CRIT_PCT
@ SPELL_AURA_MOD_SPELL_DAMAGE_FROM_CASTER
@ SPELL_AURA_MOD_CHARGE_COOLDOWN
@ SPELL_AURA_MOD_PACIFY_SILENCE
@ SPELL_AURA_MOD_COOLDOWN
@ SPELL_AURA_AOE_CHARM
@ SPELL_AURA_MOD_SPEED_SLOW_ALL
@ SPELL_AURA_MOD_TARGET_RESISTANCE
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
@ SPELL_AURA_MOD_SPEED_ALWAYS
@ SPELL_AURA_EFFECT_IMMUNITY
@ SPELL_AURA_MOD_DECREASE_SPEED
@ SPELL_AURA_TRANSFORM
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_MOD_RESISTANCE_PCT
@ SPELL_AURA_PERIODIC_ENERGIZE
@ SPELL_AURA_MOD_BASE_RESISTANCE
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
@ SPELL_AURA_MOD_ADDITIONAL_POWER_COST
@ SPELL_AURA_PERIODIC_LEECH
@ SPELL_AURA_MOD_SKILL_2
@ SPELL_AURA_MOD_LANGUAGE
@ SPELL_AURA_IGNORE_SPELL_CREATURE_TYPE_REQUIREMENTS
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
@ SPELL_AURA_DAMAGE_IMMUNITY
@ SPELL_AURA_POWER_BURN
@ SPELL_AURA_MOD_PERCENT_STAT
@ SPELL_AURA_MOD_HEALING
@ SPELL_AURA_MOD_DAMAGE_DONE
@ SPELL_AURA_MOD_CONFUSE
@ SPELL_AURA_TRACK_CREATURES
@ SPELL_AURA_MOD_POSSESS
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT
@ SPELL_AURA_STATE_IMMUNITY
@ SPELL_AURA_MOD_UNATTACKABLE
@ SPELL_AURA_ADD_PCT_MODIFIER_BY_SPELL_LABEL
@ SPELL_AURA_MOD_STEALTH
@ SPELL_AURA_MOD_DETECT_RANGE
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
@ SPELL_AURA_MOD_MELEE_RANGED_HASTE
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
@ SPELL_AURA_MOD_REGEN
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_MOD_ATTACK_POWER_PCT
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
@ SPELL_AURA_MOD_INCREASE_HEALTH_PERCENT
@ SPELL_AURA_MECHANIC_IMMUNITY_MASK
@ SPELL_AURA_SET_VEHICLE_ID
@ SPELL_AURA_MOD_STUN
SpellInterruptFlags
Definition: SpellDefines.h:60
SpellAuraInterruptFlags2
Definition: SpellDefines.h:119
SpellModOp
Definition: SpellDefines.h:152
@ TARGET_FLAG_GAMEOBJECT
Definition: SpellDefines.h:306
@ TARGET_FLAG_NONE
Definition: SpellDefines.h:294
@ TARGET_FLAG_UNIT_RAID
Definition: SpellDefines.h:297
@ TARGET_FLAG_UNIT_ENEMY
Definition: SpellDefines.h:302
@ TARGET_FLAG_CORPSE_ALLY
Definition: SpellDefines.h:310
@ TARGET_FLAG_ITEM
Definition: SpellDefines.h:299
@ TARGET_FLAG_UNIT_MINIPET
Definition: SpellDefines.h:311
@ TARGET_FLAG_UNIT_PASSENGER
Definition: SpellDefines.h:315
@ TARGET_FLAG_GAMEOBJECT_ITEM
Definition: SpellDefines.h:309
@ TARGET_FLAG_DEST_LOCATION
Definition: SpellDefines.h:301
@ TARGET_FLAG_UNIT_ALLY
Definition: SpellDefines.h:303
@ TARGET_FLAG_SOURCE_LOCATION
Definition: SpellDefines.h:300
@ TARGET_FLAG_UNIT
Definition: SpellDefines.h:296
@ TARGET_FLAG_UNIT_MASK
Definition: SpellDefines.h:322
@ TARGET_FLAG_UNIT_DEAD
Definition: SpellDefines.h:305
@ TARGET_FLAG_CORPSE_ENEMY
Definition: SpellDefines.h:304
@ TARGET_FLAG_CORPSE_MASK
Definition: SpellDefines.h:325
@ TARGET_FLAG_GAMEOBJECT_MASK
Definition: SpellDefines.h:324
@ TARGET_FLAG_UNIT_PARTY
Definition: SpellDefines.h:298
SpellAuraInterruptFlags
Definition: SpellDefines.h:78
bool _isPositiveTarget(SpellEffectInfo const &effect)
Definition: SpellInfo.cpp:4499
bool _isPositiveEffectImpl(SpellInfo const *spellInfo, SpellEffectInfo const &effect, std::unordered_set< std::pair< SpellInfo const *, SpellEffIndex > > &visited)
Definition: SpellInfo.cpp:4508
float CalcPPMHasteMod(SpellProcsPerMinuteModEntry const *mod, Unit *caster)
Definition: SpellInfo.cpp:4203
float CalcPPMCritMod(SpellProcsPerMinuteModEntry const *mod, Unit *caster)
Definition: SpellInfo.cpp:4229
uint32 GetTargetFlagMask(SpellTargetObjectTypes objType)
Definition: SpellInfo.cpp:41
float CalcPPMItemLevelMod(SpellProcsPerMinuteModEntry const *mod, int32 itemLevel)
Definition: SpellInfo.cpp:4256
SpellTargetCheckTypes
Definition: SpellInfo.h:80
@ TARGET_CHECK_PASSENGER
Definition: SpellInfo.h:88
@ TARGET_CHECK_PARTY
Definition: SpellInfo.h:85
@ TARGET_CHECK_ENEMY
Definition: SpellInfo.h:83
@ TARGET_CHECK_DEFAULT
Definition: SpellInfo.h:81
@ TARGET_CHECK_SUMMONED
Definition: SpellInfo.h:89
@ TARGET_CHECK_ENTRY
Definition: SpellInfo.h:82
@ TARGET_CHECK_RAID_CLASS
Definition: SpellInfo.h:87
@ TARGET_CHECK_ALLY
Definition: SpellInfo.h:84
@ TARGET_CHECK_RAID
Definition: SpellInfo.h:86
SpellEffectImplicitTargetTypes
Definition: SpellInfo.h:108
@ EFFECT_IMPLICIT_TARGET_CASTER
Definition: SpellInfo.h:111
@ EFFECT_IMPLICIT_TARGET_NONE
Definition: SpellInfo.h:109
@ EFFECT_IMPLICIT_TARGET_EXPLICIT
Definition: SpellInfo.h:110
SpellTargetSelectionCategories
Definition: SpellInfo.h:42
@ TARGET_SELECT_CATEGORY_CONE
Definition: SpellInfo.h:47
@ TARGET_SELECT_CATEGORY_AREA
Definition: SpellInfo.h:48
@ TARGET_SELECT_CATEGORY_DEFAULT
Definition: SpellInfo.h:44
@ TARGET_SELECT_CATEGORY_NEARBY
Definition: SpellInfo.h:46
@ TARGET_SELECT_CATEGORY_NYI
Definition: SpellInfo.h:43
@ TARGET_SELECT_CATEGORY_LINE
Definition: SpellInfo.h:50
@ TARGET_SELECT_CATEGORY_TRAJ
Definition: SpellInfo.h:49
@ TARGET_SELECT_CATEGORY_CHANNEL
Definition: SpellInfo.h:45
SpellTargetDirectionTypes
Definition: SpellInfo.h:93
@ TARGET_DIR_FRONT_RIGHT
Definition: SpellInfo.h:99
@ TARGET_DIR_NONE
Definition: SpellInfo.h:94
@ TARGET_DIR_BACK
Definition: SpellInfo.h:96
@ TARGET_DIR_BACK_RIGHT
Definition: SpellInfo.h:100
@ TARGET_DIR_RIGHT
Definition: SpellInfo.h:97
@ TARGET_DIR_FRONT_LEFT
Definition: SpellInfo.h:102
@ TARGET_DIR_FRONT
Definition: SpellInfo.h:95
@ TARGET_DIR_LEFT
Definition: SpellInfo.h:98
@ TARGET_DIR_BACK_LEFT
Definition: SpellInfo.h:101
@ TARGET_DIR_RANDOM
Definition: SpellInfo.h:103
SpellTargetObjectTypes
Definition: SpellInfo.h:64
@ TARGET_OBJECT_TYPE_UNIT
Definition: SpellInfo.h:68
@ TARGET_OBJECT_TYPE_ITEM
Definition: SpellInfo.h:72
@ TARGET_OBJECT_TYPE_CORPSE
Definition: SpellInfo.h:73
@ TARGET_OBJECT_TYPE_UNIT_AND_DEST
Definition: SpellInfo.h:69
@ TARGET_OBJECT_TYPE_NONE
Definition: SpellInfo.h:65
@ TARGET_OBJECT_TYPE_DEST
Definition: SpellInfo.h:67
@ TARGET_OBJECT_TYPE_GOBJ
Definition: SpellInfo.h:70
@ TARGET_OBJECT_TYPE_CORPSE_ALLY
Definition: SpellInfo.h:76
@ TARGET_OBJECT_TYPE_CORPSE_ENEMY
Definition: SpellInfo.h:75
@ TARGET_OBJECT_TYPE_GOBJ_ITEM
Definition: SpellInfo.h:71
@ TARGET_OBJECT_TYPE_SRC
Definition: SpellInfo.h:66
@ SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET
Definition: SpellInfo.h:162
@ SPELL_ATTR0_CU_PICKPOCKET
Definition: SpellInfo.h:154
SpellSpecificType
Definition: SpellInfo.h:116
@ SPELL_SPECIFIC_FOOD
Definition: SpellInfo.h:128
@ SPELL_SPECIFIC_MAGE_ARMOR
Definition: SpellInfo.h:125
@ SPELL_SPECIFIC_NORMAL
Definition: SpellInfo.h:117
@ SPELL_SPECIFIC_STING
Definition: SpellInfo.h:120
@ SPELL_SPECIFIC_MAGE_ARCANE_BRILLANCE
Definition: SpellInfo.h:134
@ SPELL_SPECIFIC_ASPECT
Definition: SpellInfo.h:122
@ SPELL_SPECIFIC_PRIEST_DIVINE_SPIRIT
Definition: SpellInfo.h:136
@ SPELL_SPECIFIC_ELEMENTAL_SHIELD
Definition: SpellInfo.h:126
@ SPELL_SPECIFIC_BANE
Definition: SpellInfo.h:139
@ SPELL_SPECIFIC_PRESENCE
Definition: SpellInfo.h:131
@ SPELL_SPECIFIC_CURSE
Definition: SpellInfo.h:121
@ SPELL_SPECIFIC_DRINK
Definition: SpellInfo.h:129
@ SPELL_SPECIFIC_HAND
Definition: SpellInfo.h:137
@ SPELL_SPECIFIC_AURA
Definition: SpellInfo.h:119
@ SPELL_SPECIFIC_WARRIOR_ENRAGE
Definition: SpellInfo.h:135
@ SPELL_SPECIFIC_WARLOCK_ARMOR
Definition: SpellInfo.h:124
@ SPELL_SPECIFIC_SCROLL
Definition: SpellInfo.h:133
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition: SpellInfo.h:127
@ SPELL_SPECIFIC_TRACKER
Definition: SpellInfo.h:123
@ SPELL_SPECIFIC_SEAL
Definition: SpellInfo.h:118
@ SPELL_SPECIFIC_FOOD_AND_DRINK
Definition: SpellInfo.h:130
@ SPELL_SPECIFIC_CHARM
Definition: SpellInfo.h:132
SpellTargetReferenceTypes
Definition: SpellInfo.h:54
@ TARGET_REFERENCE_TYPE_SRC
Definition: SpellInfo.h:59
@ TARGET_REFERENCE_TYPE_TARGET
Definition: SpellInfo.h:57
@ TARGET_REFERENCE_TYPE_LAST
Definition: SpellInfo.h:58
@ TARGET_REFERENCE_TYPE_NONE
Definition: SpellInfo.h:55
@ TARGET_REFERENCE_TYPE_CASTER
Definition: SpellInfo.h:56
@ TARGET_REFERENCE_TYPE_DEST
Definition: SpellInfo.h:60
bool IsPrimaryProfessionSkill(uint32 skill)
Definition: SpellMgr.cpp:106
bool IsProfessionSkill(uint32 skill)
Definition: SpellMgr.h:648
std::pair< SpellAreaMap::const_iterator, SpellAreaMap::const_iterator > SpellAreaMapBounds
Definition: SpellMgr.h:552
#define sSpellMgr
Definition: SpellMgr.h:855
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition: SpellMgr.h:622
ProcFlags
Definition: SpellMgr.h:135
@ MOVEMENTFLAG_FLYING
Definition: UnitDefines.h:410
@ MOVEMENTFLAG_FALLING
Definition: UnitDefines.h:397
@ MOVEMENTFLAG_SWIMMING
Definition: UnitDefines.h:406
@ MOVEMENTFLAG_HOVER
Definition: UnitDefines.h:414
@ MOVEMENTFLAG3_ADV_FLYING
Definition: UnitDefines.h:473
@ UNIT_FLAG_PET_IN_COMBAT
Definition: UnitDefines.h:178
@ UNIT_STATE_IN_FLIGHT
Definition: Unit.h:266
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:528
T CalculatePct(T base, U pct)
Definition: Util.h:72
Aura * GetBase() const
Definition: SpellAuras.h:80
SpellInfo const * GetSpellInfo() const
SpellEffectInfo const & GetSpellEffectInfo() const
bool IsAffectingSpell(SpellInfo const *spell) const
int32 GetMiscValue() const
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:137
BattlegroundStatus GetStatus() const
Definition: Battleground.h:274
static bool IsUnitMeetingCondition(Unit const *unit, Unit const *otherUnit, UnitConditionEntry const *condition)
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
Definition: Corpse.h:53
CreatureDifficulty const * GetCreatureDifficulty() const
Definition: Creature.h:268
bool CanHaveLoot() const
Definition: Creature.h:295
static bool IsInArea(uint32 objectAreaId, uint32 areaId)
Definition: DB2Stores.cpp:1980
constexpr bool HasFlag(T flag) const
Definition: EnumFlag.h:106
Definition: Item.h:170
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition: Item.cpp:1425
bool HaveLootFor(uint32 loot_id) const
Definition: LootMgr.h:94
Definition: Map.h:223
bool IsBattlegroundOrArena() const
Definition: Map.cpp:3318
InstanceMap * ToInstanceMap()
Definition: Map.h:488
bool IsEmpty() const
Definition: ObjectGuid.h:322
static Creature * ToCreature(Object *o)
Definition: Object.h:255
bool IsPlayer() const
Definition: Object.h:248
static Unit * ToUnit(Object *o)
Definition: Object.h:261
bool IsUnit() const
Definition: Object.h:260
TypeID GetTypeId() const
Definition: Object.h:209
static Corpse * ToCorpse(Object *o)
Definition: Object.h:273
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:195
static Player * ToPlayer(Object *o)
Definition: Object.h:249
Unit * ToUnit()
Definition: Object.h:263
UF::UpdateField< UF::ActivePlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_ACTIVE_PLAYER > m_activePlayerData
Definition: Player.h:2968
bool InBattleground() const
Definition: Player.h:2496
Battleground * GetBattleground() const
Definition: Player.cpp:25401
bool IsGameMaster() const
Definition: Player.h:1247
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition: Player.cpp:9694
bool IsUseEquipedWeapon(bool mainhand) const
Definition: Player.cpp:13246
float PositionFacing
Definition: SpellInfo.h:226
Mechanics Mechanic
Definition: SpellInfo.h:225
static std::array< StaticData, TOTAL_SPELL_EFFECTS > _data
Definition: SpellInfo.h:291
bool IsUnitOwnedAuraEffect() const
Definition: SpellInfo.cpp:490
float CalcDamageMultiplier(WorldObject *caster, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:652
bool HasRadius(SpellTargetIndex targetIndex) const
Definition: SpellInfo.cpp:660
AuraType ApplyAuraName
Definition: SpellInfo.h:215
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
Definition: SpellInfo.cpp:495
int32 MiscValueB
Definition: SpellInfo.h:224
float CalcValueMultiplier(WorldObject *caster, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:644
struct SpellEffectInfo::ScalingInfo Scaling
uint32 TriggerSpell
Definition: SpellInfo.h:233
ImmunityInfo const * GetImmunityInfo() const
Definition: SpellInfo.h:280
uint32 GetMissingTargetMask(bool srcSet=false, bool dstSet=false, uint32 mask=0) const
Definition: SpellInfo.cpp:756
std::unique_ptr< ImmunityInfo > _immunityInfo
Definition: SpellInfo.h:293
float CalcRadius(WorldObject *caster=nullptr, SpellTargetIndex targetIndex=SpellTargetIndex::TargetA, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:673
Optional< std::pair< float, float > > CalcRadiusBounds(WorldObject *caster, SpellTargetIndex targetIndex, Spell *spell) const
Definition: SpellInfo.cpp:718
bool IsAreaAuraEffect() const
Definition: SpellInfo.cpp:476
SpellInfo const * _spellInfo
Definition: SpellInfo.h:211
bool IsAura() const
Definition: SpellInfo.cpp:461
SpellEffectName Effect
Definition: SpellInfo.h:214
int32 CalcBaseValue(WorldObject const *caster, Unit const *target, uint32 itemId, int32 itemLevel) const
Definition: SpellInfo.cpp:554
SpellRadiusEntry const * TargetBRadiusEntry
Definition: SpellInfo.h:230
std::shared_ptr< std::vector< Condition > > ImplicitTargetConditions
Definition: SpellInfo.h:236
bool IsEffect() const
Definition: SpellInfo.cpp:451
flag128 SpellClassMask
Definition: SpellInfo.h:234
bool IsTargetingArea() const
Definition: SpellInfo.cpp:471
SpellRadiusEntry const * TargetARadiusEntry
Definition: SpellInfo.h:229
int32 ChainTargets
Definition: SpellInfo.h:231
SpellEffectImplicitTargetTypes GetImplicitTargetType() const
Definition: SpellInfo.cpp:780
float BonusCoefficientFromAP
Definition: SpellInfo.h:235
float BonusCoefficient
Definition: SpellInfo.h:222
ExpectedStatType GetScalingExpectedStat() const
Definition: SpellInfo.cpp:790
float ChainAmplitude
Definition: SpellInfo.h:221
uint32 ApplyAuraPeriod
Definition: SpellInfo.h:216
SpellTargetObjectTypes GetUsedTargetObjectType() const
Definition: SpellInfo.cpp:785
float RealPointsPerLevel
Definition: SpellInfo.h:218
uint32 ItemType
Definition: SpellInfo.h:232
EnumFlag< SpellEffectAttributes > EffectAttributes
Definition: SpellInfo.h:237
SpellEffIndex EffectIndex
Definition: SpellInfo.h:213
float BasePoints
Definition: SpellInfo.h:217
uint32 GetProvidedTargetMask() const
Definition: SpellInfo.cpp:751
SpellImplicitTargetInfo TargetA
Definition: SpellInfo.h:227
float PointsPerResource
Definition: SpellInfo.h:219
SpellImplicitTargetInfo TargetB
Definition: SpellInfo.h:228
SpellTargetDirectionTypes GetDirectionType() const
Definition: SpellInfo.cpp:100
SpellTargetCheckTypes GetCheckType() const
Definition: SpellInfo.cpp:95
static std::array< StaticData, TOTAL_SPELL_TARGETS > _data
Definition: SpellInfo.h:205
SpellTargetReferenceTypes GetReferenceType() const
Definition: SpellInfo.cpp:85
SpellTargetSelectionCategories GetSelectionCategory() const
Definition: SpellInfo.cpp:80
SpellTargetObjectTypes GetObjectType() const
Definition: SpellInfo.cpp:90
float CalcDirectionAngle() const
Definition: SpellInfo.cpp:105
uint32 GetExplicitTargetMask(bool &srcSet, bool &dstSet) const
Definition: SpellInfo.cpp:137
Targets GetTarget() const
Definition: SpellInfo.cpp:132
std::array< SpellPowerEntry const *, MAX_POWERS_PER_SPELL > PowerCosts
Definition: SpellInfo.h:384
bool IsExplicitDiscovery() const
Definition: SpellInfo.cpp:1537
DiminishingLevels GetDiminishingReturnsMaxLevel() const
Definition: SpellInfo.cpp:3359
uint32 RequiresSpellFocus
Definition: SpellInfo.h:349
uint32 BaseLevel
Definition: SpellInfo.h:381
void _LoadSpellDiminishInfo()
Definition: SpellInfo.cpp:2878
uint32 MaxLevel
Definition: SpellInfo.h:380
uint32 SpellLevel
Definition: SpellInfo.h:382
uint32 AttributesEx13
Definition: SpellInfo.h:340
uint32 ActiveIconFileDataId
Definition: SpellInfo.h:398
uint32 GetSpellXSpellVisualId(WorldObject const *caster=nullptr, WorldObject const *viewer=nullptr) const
Definition: SpellInfo.cpp:4430
uint32 TargetAuraState
Definition: SpellInfo.h:352
bool IsRankOf(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:4408
uint32 GetMaxTicks() const
Definition: SpellInfo.cpp:3890
std::array< int32, MAX_SPELL_REAGENTS > Reagent
Definition: SpellInfo.h:391
uint64 GetEffectMechanicMask(SpellEffIndex effIndex) const
Definition: SpellInfo.cpp:2545
uint32 ExcludeTargetAuraSpell
Definition: SpellInfo.h:358
bool CanDispelAura(SpellInfo const *auraSpellInfo) const
Definition: SpellInfo.cpp:1940
bool IsAffected(uint32 familyName, flag128 const &familyFlags) const
Definition: SpellInfo.cpp:1872
bool IsAutocastEnabledByDefault() const
Definition: SpellInfo.cpp:1673
uint32 PreventionType
Definition: SpellInfo.h:409
uint32 CasterAuraSpell
Definition: SpellInfo.h:355
bool MeetsFutureSpellPlayerCondition(Player const *player) const
Definition: SpellInfo.cpp:5002
float Width
Definition: SpellInfo.h:403
uint32 MaxTargetLevel
Definition: SpellInfo.h:404
Optional< SpellPowerCost > CalcPowerCost(Powers powerType, bool optionalCost, WorldObject const *caster, SpellSchoolMask schoolMask, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:3937
Mechanics GetEffectMechanic(SpellEffIndex effIndex) const
Definition: SpellInfo.cpp:2570
SpellInfo const * GetFirstRankSpell() const
Definition: SpellInfo.cpp:4339
bool IsAutocastable() const
Definition: SpellInfo.cpp:1664
float GetMaxRange(bool positive=false, WorldObject *caster=nullptr, Spell *spell=nullptr) const
Definition: SpellInfo.cpp:3835
bool HasEffect(SpellEffectName effect) const
Definition: SpellInfo.cpp:1458
std::unordered_set< uint32 > Labels
Definition: SpellInfo.h:413
uint32 GetCategory() const
Definition: SpellInfo.cpp:1453
SpellCastResult CheckShapeshift(uint32 form) const
Definition: SpellInfo.cpp:2008
float CalcProcPPM(Unit *caster, int32 itemLevel) const
Definition: SpellInfo.cpp:4269
uint64 GetAllEffectsMechanicMask() const
Definition: SpellInfo.cpp:2532
bool IsRequiringDeadTarget() const
Definition: SpellInfo.cpp:1735
uint32 const Id
Definition: SpellInfo.h:322
uint64 GetMechanicImmunityMask(Unit const *caster) const
Definition: SpellInfo.cpp:3811
uint32 RecoveryTime
Definition: SpellInfo.h:364
EnumFlag< SpellAuraInterruptFlags2 > AuraInterruptFlags2
Definition: SpellInfo.h:371
std::vector< Milliseconds > EmpowerStageThresholds
Definition: SpellInfo.h:414
uint32 AttributesEx8
Definition: SpellInfo.h:335
std::array< int16, MAX_SPELL_REAGENTS > ReagentCount
Definition: SpellInfo.h:392
bool IsAuraExclusiveBySpecificPerCasterWith(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:1990
SpellInfo const * GetPrevRankSpell() const
Definition: SpellInfo.cpp:4360
bool IsGroupBuff() const
Definition: SpellInfo.cpp:1757
bool IsDeathPersistent() const
Definition: SpellInfo.cpp:1730
SpellVisualVector _visuals
Definition: SpellInfo.h:621
bool IsCooldownStartedOnEvent() const
Definition: SpellInfo.cpp:1721
EnumFlag< SpellAuraInterruptFlags > ChannelInterruptFlags
Definition: SpellInfo.h:372
bool IsPassive() const
Definition: SpellInfo.cpp:1659
uint32 StackAmount
Definition: SpellInfo.h:388
::Difficulty const Difficulty
Definition: SpellInfo.h:323
uint32 Mechanic
Definition: SpellInfo.h:326
bool IsAuraExclusiveBySpecificWith(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:1958
uint8 GetRank() const
Definition: SpellInfo.cpp:4332
SpellRangeEntry const * RangeEntry
Definition: SpellInfo.h:385
uint32 ProcCharges
Definition: SpellInfo.h:376
bool HasAnyAuraInterruptFlag() const
Definition: SpellInfo.cpp:1532
bool IsLootCrafting() const
Definition: SpellInfo.cpp:1548
int32 RequiredAreasID
Definition: SpellInfo.h:410
bool IsUpdatingTemporaryAuraValuesBySpellMod() const
Definition: SpellInfo.cpp:1918
uint32 ShowFutureSpellPlayerConditionID
Definition: SpellInfo.h:400
bool IsStackableOnOneSlotWithDifferentCasters() const
Definition: SpellInfo.cpp:1715
bool IsRanked() const
Definition: SpellInfo.cpp:4327
uint32 AttributesEx14
Definition: SpellInfo.h:341
bool HasOnlyDamageEffects() const
Definition: SpellInfo.cpp:1485
uint32 GetDispelMask() const
Definition: SpellInfo.cpp:2581
bool IsHighRankOf(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:4420
uint32 CalcCastTime(Spell *spell=nullptr) const
Definition: SpellInfo.cpp:3872
SpellInfo const * GetAuraRankForLevel(uint8 level) const
Definition: SpellInfo.cpp:4367
bool NeedsToBeTriggeredByCaster(SpellInfo const *triggeringSpell) const
Definition: SpellInfo.cpp:1623
SpellCastResult CheckLocation(uint32 map_id, uint32 zone_id, uint32 area_id, Player const *player=nullptr) const
Definition: SpellInfo.cpp:2057
uint32 GetRecoveryTime() const
Definition: SpellInfo.cpp:3932
AuraStateType _auraState
Definition: SpellInfo.h:623
SpellSpecificType GetSpellSpecific() const
Definition: SpellInfo.cpp:2689
DiminishingReturnsType GetDiminishingReturnsGroupType() const
Definition: SpellInfo.cpp:3354
uint32 Dispel
Definition: SpellInfo.h:325
std::vector< SpellProcsPerMinuteModEntry const * > ProcPPMMods
Definition: SpellInfo.h:379
uint64 GetAllowedMechanicMask() const
Definition: SpellInfo.cpp:3806
bool HasTargetType(::Targets target) const
Definition: SpellInfo.cpp:1511
bool HasHitDelay() const
Definition: SpellInfo.cpp:1828
uint32 ExcludeCasterAuraState
Definition: SpellInfo.h:353
float Speed
Definition: SpellInfo.h:386
bool IsMultiSlotAura() const
Definition: SpellInfo.cpp:1710
void _UnloadImplicitTargetConditionLists()
Definition: SpellInfo.cpp:4995
float GetMinRange(bool positive=false) const
Definition: SpellInfo.cpp:3828
int32 GetMaxDuration() const
Definition: SpellInfo.cpp:3865
uint32 CooldownAuraSpellId
Definition: SpellInfo.h:368
int32 EquippedItemClass
Definition: SpellInfo.h:394
bool HasInitialAggro() const
Definition: SpellInfo.cpp:1823
std::vector< SpellEffectInfo > _effects
Definition: SpellInfo.h:620
int32 GetDiminishingReturnsLimitDuration() const
Definition: SpellInfo.cpp:3364
struct SpellInfo::ScalingInfo Scaling
DiminishingGroup GetDiminishingReturnsGroupForSpell() const
Definition: SpellInfo.cpp:3349
uint32 SchoolMask
Definition: SpellInfo.h:411
bool IsAbilityOfSkillType(uint32 skillType) const
Definition: SpellInfo.cpp:1588
uint32 CasterAuraState
Definition: SpellInfo.h:351
bool IsAffectedBySpellMod(SpellModifier const *mod) const
Definition: SpellInfo.cpp:1891
SpellCastResult CheckTarget(WorldObject const *caster, WorldObject const *target, bool implicit=true) const
Definition: SpellInfo.cpp:2226
bool CheckTargetCreatureType(Unit const *target) const
Definition: SpellInfo.cpp:2507
float ProcBasePPM
Definition: SpellInfo.h:378
bool IsStackableWithRanks() const
Definition: SpellInfo.cpp:1678
bool IsItemFitToSpellRequirements(Item const *item) const
Definition: SpellInfo.cpp:1859
uint32 CategoryRecoveryTime
Definition: SpellInfo.h:365
uint64 StancesNot
Definition: SpellInfo.h:346
AuraType TargetAuraType
Definition: SpellInfo.h:360
EnumFlag< SpellInterruptFlags > InterruptFlags
Definition: SpellInfo.h:369
flag128 SpellFamilyFlags
Definition: SpellInfo.h:407
uint32 ExplicitTargetMask
Definition: SpellInfo.h:424
bool IsAllowingDeadTarget() const
Definition: SpellInfo.cpp:1740
uint32 AttributesEx3
Definition: SpellInfo.h:330
float LaunchDelay
Definition: SpellInfo.h:387
void _InitializeSpellPositivity()
Definition: SpellInfo.cpp:4956
void _LoadImmunityInfo()
Definition: SpellInfo.cpp:3369
WeaponAttackType GetAttackType() const
Definition: SpellInfo.cpp:1833
SpellSchoolMask GetSchoolMask() const
Definition: SpellInfo.cpp:2527
bool CanSpellEffectProvideImmunityAgainstAuraEffect(SpellEffectInfo const &immunityEffectInfo, SpellInfo const *auraSpellInfo, SpellEffectInfo const &auraEffectInfo) const
Definition: SpellInfo.cpp:3752
bool IsPrimaryProfession() const
Definition: SpellInfo.cpp:1568
std::vector< SpellReagentsCurrencyEntry const * > ReagentsCurrency
Definition: SpellInfo.h:393
void ApplyAllSpellImmunitiesTo(Unit *target, SpellEffectInfo const &spellEffectInfo, bool apply) const
Definition: SpellInfo.cpp:3583
AuraStateType GetAuraState() const
Definition: SpellInfo.cpp:2600
bool IsChanneled() const
Definition: SpellInfo.cpp:1791
uint32 GetSpellVisual(WorldObject const *caster=nullptr, WorldObject const *viewer=nullptr) const
Definition: SpellInfo.cpp:4448
bool HasAttribute(SpellAttr0 attribute) const
Definition: SpellInfo.h:449
SpellDurationEntry const * DurationEntry
Definition: SpellInfo.h:383
bool IsNextMeleeSwingSpell() const
Definition: SpellInfo.cpp:1801
uint64 GetSpellMechanicMaskByEffectMask(uint32 effectMask) const
Definition: SpellInfo.cpp:2557
uint32 Attributes
Definition: SpellInfo.h:327
uint32 AttributesEx
Definition: SpellInfo.h:328
struct SpellInfo::@327 SqrtDamageAndHealingDiminishing
bool CanSpellProvideImmunityAgainstAura(SpellInfo const *auraSpellInfo) const
Definition: SpellInfo.cpp:3694
bool HasChannelInterruptFlag(SpellAuraInterruptFlags flag) const
Definition: SpellInfo.h:473
uint32 RequiredExplicitTargetMask
Definition: SpellInfo.h:425
uint32 ChargeCategoryId
Definition: SpellInfo.h:412
bool IsPassiveStackableWithRanks() const
Definition: SpellInfo.cpp:1705
bool SpellCancelsAuraEffect(AuraEffect const *aurEff) const
Definition: SpellInfo.cpp:3788
uint32 IconFileDataId
Definition: SpellInfo.h:397
uint32 AttributesEx15
Definition: SpellInfo.h:342
uint32 MaxAffectedTargets
Definition: SpellInfo.h:405
uint32 AttributesEx12
Definition: SpellInfo.h:339
int32 GetDuration() const
Definition: SpellInfo.cpp:3858
bool IsAffectedBySpellMods() const
Definition: SpellInfo.cpp:1886
SpellCastResult CheckVehicle(Unit const *caster) const
Definition: SpellInfo.cpp:2457
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:581
std::vector< SpellEffectInfo > const & GetEffects() const
Definition: SpellInfo.h:580
uint32 AttributesEx6
Definition: SpellInfo.h:333
uint32 AttributesEx7
Definition: SpellInfo.h:334
int32 EquippedItemSubClassMask
Definition: SpellInfo.h:395
bool IsEmpowerSpell() const
Definition: SpellInfo.cpp:1818
SpellDiminishInfo _diminishInfo
Definition: SpellInfo.h:625
SpellSpecificType _spellSpecific
Definition: SpellInfo.h:622
SpellInfo(SpellNameEntry const *spellName, ::Difficulty difficulty, SpellInfoLoadHelper const &data)
Definition: SpellInfo.cpp:1227
uint32 GetExplicitTargetMask() const
Definition: SpellInfo.cpp:2595
uint32 AttributesEx9
Definition: SpellInfo.h:336
uint32 FacingCasterFlags
Definition: SpellInfo.h:350
SpellCastResult CheckExplicitTarget(WorldObject const *caster, WorldObject const *target, Item const *itemTarget=nullptr) const
Definition: SpellInfo.cpp:2421
uint32 StartRecoveryTime
Definition: SpellInfo.h:367
uint32 ContentTuningId
Definition: SpellInfo.h:399
uint32 TargetAuraSpell
Definition: SpellInfo.h:356
bool HasAreaAuraEffect() const
Definition: SpellInfo.cpp:1476
bool CanPierceImmuneAura(SpellInfo const *auraSpellInfo) const
Definition: SpellInfo.cpp:1931
SpellChainNode const * ChainEntry
Definition: SpellInfo.h:426
AuraType ExcludeTargetAuraType
Definition: SpellInfo.h:362
uint32 AttributesEx10
Definition: SpellInfo.h:337
uint32 Targets
Definition: SpellInfo.h:347
void _InitializeExplicitTargetMask()
Definition: SpellInfo.cpp:4461
uint32 ProcCooldown
Definition: SpellInfo.h:377
bool IsDifferentRankOf(SpellInfo const *spellInfo) const
Definition: SpellInfo.cpp:4413
LocalizedString const * SpellName
Definition: SpellInfo.h:401
SpellInfo const * GetLastRankSpell() const
Definition: SpellInfo.cpp:4346
bool NeedsExplicitUnitTarget() const
Definition: SpellInfo.cpp:1618
SpellInfo const * GetNextRankSpell() const
Definition: SpellInfo.cpp:4353
SpellCastTimesEntry const * CastTimeEntry
Definition: SpellInfo.h:363
int32 EquippedItemInventoryTypeMask
Definition: SpellInfo.h:396
uint32 ExcludeTargetAuraState
Definition: SpellInfo.h:354
std::bitset< MAX_SPELL_EFFECTS > NegativeEffects
Definition: SpellInfo.h:344
EnumFlag< SpellAuraInterruptFlags2 > ChannelInterruptFlags2
Definition: SpellInfo.h:373
bool IsPrimaryProfessionFirstRank() const
Definition: SpellInfo.cpp:1583
void _LoadAuraState()
Definition: SpellInfo.cpp:2605
AuraType ExcludeCasterAuraType
Definition: SpellInfo.h:361
int32 CalcDuration(WorldObject const *caster=nullptr) const
Definition: SpellInfo.cpp:3847
bool IsAffectingArea() const
Definition: SpellInfo.cpp:1599
bool IsProfession() const
Definition: SpellInfo.cpp:1553
bool IsPositive() const
Definition: SpellInfo.cpp:1781
bool IsAutoRepeatRangedSpell() const
Definition: SpellInfo.cpp:1813
uint32 TargetCreatureType
Definition: SpellInfo.h:348
uint32 ProcChance
Definition: SpellInfo.h:375
uint32 AttributesEx2
Definition: SpellInfo.h:329
bool IsMoveAllowedChannel() const
Definition: SpellInfo.cpp:1796
uint32 DmgClass
Definition: SpellInfo.h:408
AuraType CasterAuraType
Definition: SpellInfo.h:359
uint32 AttributesEx5
Definition: SpellInfo.h:332
bool IsRangedWeaponSpell() const
Definition: SpellInfo.cpp:1806
uint32 AttributesEx4
Definition: SpellInfo.h:331
EnumFlag< SpellAuraInterruptFlags > AuraInterruptFlags
Definition: SpellInfo.h:370
uint32 ExcludeCasterAuraSpell
Definition: SpellInfo.h:357
bool HasAura(AuraType aura) const
Definition: SpellInfo.cpp:1467
bool IsTargetingArea() const
Definition: SpellInfo.cpp:1609
uint32 StartRecoveryCategory
Definition: SpellInfo.h:366
bool HasAuraInterruptFlag(SpellAuraInterruptFlags flag) const
Definition: SpellInfo.h:470
bool HasLabel(uint32 labelId) const
Definition: SpellInfo.cpp:5010
uint32 AttributesEx11
Definition: SpellInfo.h:338
uint32 CategoryId
Definition: SpellInfo.h:324
float ConeAngle
Definition: SpellInfo.h:402
uint32 SpellFamilyName
Definition: SpellInfo.h:406
bool CanBeInterrupted(WorldObject const *interruptCaster, Unit const *interruptTarget, bool ignoreImmunity=false) const
Definition: SpellInfo.cpp:1520
void _LoadSpellSpecific()
Definition: SpellInfo.cpp:2694
uint64 _allowedMechanicMask
Definition: SpellInfo.h:626
bool IsPositiveEffect(uint8 effIndex) const
Definition: SpellInfo.cpp:1786
bool IsSingleTarget() const
Definition: SpellInfo.cpp:1949
void _LoadSqrtTargetLimit(int32 maxTargets, int32 numNonDiminishedTargets, Optional< uint32 > maxTargetsValueHolderSpell, Optional< SpellEffIndex > maxTargetsValueHolderEffect, Optional< uint32 > numNonDiminishedTargetsValueHolderSpell, Optional< SpellEffIndex > numNonDiminishedTargetsValueHolderEffect)
Definition: SpellInfo.cpp:3533
bool CanBeUsedInCombat(Unit const *caster) const
Definition: SpellInfo.cpp:1775
static CreatureImmunities const * GetCreatureImmunities(int32 creatureImmunitiesId)
Definition: SpellMgr.cpp:686
Definition: Spell.h:262
static bool CanIncreaseRangeByMovement(Unit const *unit)
Definition: Spell.cpp:7403
WorldObject * GetCaster() const
Definition: Spell.h:667
ObjectGuid GetSummonerGUID() const
Definition: Totem.h:31
Totem(SummonPropertiesEntry const *properties, Unit *owner)
Definition: Totem.cpp:29
auto find(Key const &value) const
Definition: FlatSet.h:41
std::pair< iterator, bool > insert(Key const &key)
Definition: FlatSet.h:73
Definition: Unit.h:631
void ApplySpellImmune(uint32 spellId, SpellImmunity op, uint32 type, bool apply)
Definition: Unit.cpp:8029
Vehicle * GetVehicle() const
Definition: Unit.h:1756
void RemoveAurasByType(AuraType auraType, std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3878
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition: Unit.h:1333
bool HasAuraTypeWithMiscvalue(AuraType auraType, int32 miscValue) const
Definition: Unit.cpp:4756
uint32 GetClassMask() const
Definition: Unit.h:762
ShapeshiftForm GetShapeshiftForm() const
Definition: Unit.h:1494
uint64 GetMechanicImmunityMask() const
Definition: Unit.cpp:7623
uint64 GetRaceMask() const
Definition: Unit.h:759
bool HasUnitFlag(UnitFlags flags) const
Definition: Unit.h:841
uint32 GetBaseAttackTime(WeaponAttackType att) const
Definition: Unit.cpp:10687
bool CanFreeMove() const
Definition: Unit.cpp:9704
bool IsAlive() const
Definition: Unit.h:1176
TempSummon * ToTempSummon()
Definition: Unit.h:1800
uint32 GetVirtualItemId(uint32 slot) const
Definition: Unit.cpp:13996
EnumFlag< SpellOtherImmunity > GetSpellOtherImmunityMask() const
Definition: Unit.cpp:7633
uint64 GetMaxHealth() const
Definition: Unit.h:785
bool HasUnitMovementFlag(uint32 f) const
Definition: Unit.h:1706
uint64 GetHealth() const
Definition: Unit.h:784
bool IsSummon() const
Definition: Unit.h:745
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition: Unit.cpp:6052
bool IsVisible() const
Definition: Unit.cpp:8550
bool HasAuraType(AuraType auraType) const
Definition: Unit.cpp:4743
ObjectGuid GetCritterGUID() const
Definition: Unit.h:1190
int32 GetTotalAuraModifier(AuraType auraType) const
Definition: Unit.cpp:4998
void RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const *source=nullptr)
Definition: Unit.cpp:4170
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3824
UF::UpdateField< UF::UnitData, int32(WowCS::EntityFragment::CGObject), TYPEID_UNIT > m_unitData
Definition: Unit.h:1858
int32 GetPower(Powers power) const
Definition: Unit.cpp:9782
bool HasExtraUnitMovementFlag2(uint32 f) const
Definition: Unit.h:1718
bool HasUnitState(const uint32 f) const
Definition: Unit.h:739
bool IsMagnet() const
Definition: Unit.cpp:6479
bool IsInRaidWith(Unit const *unit) const
Definition: Unit.cpp:11930
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4733
void RemoveAurasWithMechanic(uint64 mechanicMaskToRemove, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, uint32 exceptSpellId=0, bool withEffectMechanics=false)
Definition: Unit.cpp:4231
bool IsControlledByPlayer() const
Definition: Unit.h:1205
uint32 GetCreatureTypeMask() const
Definition: Unit.cpp:9245
bool HasAuraTypeWithAffectMask(AuraType auraType, SpellInfo const *affectedSpell) const
Definition: Unit.cpp:4765
uint32 GetCreateMana() const
Definition: Unit.h:1408
MountCapabilityEntry const * GetMountCapability(uint32 mountType) const
Definition: Unit.cpp:8149
bool IsInPartyWith(Unit const *unit) const
Definition: Unit.cpp:11911
uint8 GetLevel() const
Definition: Unit.h:753
bool IsInCombat() const
Definition: Unit.h:1053
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger) const
Returns information on the seat of specified passenger, represented by the format in VehicleSeat....
Definition: Vehicle.cpp:650
Map * GetMap() const
Definition: Object.h:762
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition: Object.cpp:3105
bool CanSeeOrDetect(WorldObject const *obj, bool implicitDetect=false, bool distanceCheck=false, bool checkAlert=false) const
Definition: Object.cpp:1579
Player * GetSpellModOwner() const
Definition: Object.cpp:2367
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition: Object.cpp:3258
double ApplyEffectModifiers(SpellInfo const *spellInfo, uint8 effIndex, double value) const
Definition: Object.cpp:2428
void ModSpellCastTime(SpellInfo const *spellInfo, int32 &castTime, Spell *spell=nullptr) const
Definition: Object.cpp:2561
bool IsFriendlyTo(WorldObject const *target) const
Definition: Object.cpp:2962
Player * GetAffectingPlayer() const
Definition: Object.cpp:2356
void apply(T *val)
Definition: ByteConverter.h:41
TC_GAME_API Player * FindPlayer(ObjectGuid const &)
constexpr decltype(auto) EnsureWritableVectorIndex(std::vector< T > &vec, typename std::vector< T >::size_type i)
Definition: Containers.h:299
constexpr std::size_t size()
Definition: UpdateField.h:769
STL namespace.
bool IsBattleground() const
bool IsDungeon() const
bool IsRaid() const
bool IsBattleArena() const
SpellInfo const * last
Definition: SpellMgr.h:563
SpellInfo const * next
Definition: SpellMgr.h:561
SpellInfo const * first
Definition: SpellMgr.h:562
SpellInfo const * prev
Definition: SpellMgr.h:560
int32 DiminishDurationLimit
Definition: SpellInfo.h:308
DiminishingReturnsType DiminishReturnType
Definition: SpellInfo.h:306
DiminishingLevels DiminishMaxLevel
Definition: SpellInfo.h:307
DiminishingGroup DiminishGroup
Definition: SpellInfo.h:305
std::array< int32, 2 > EffectMiscValue
float EffectChainAmplitude
float EffectBonusCoefficient
std::array< int16, 2 > ImplicitTarget
float EffectRealPointsPerLevel
std::array< uint32, 2 > EffectRadiusIndex
flag128 EffectSpellClassMask
SpellEffectAttributes GetEffectAttributes() const
float BonusCoefficientFromAP
float EffectPointsPerResource
ImmunityInfo(ImmunityInfo &&) noexcept=delete
Trinity::Containers::FlatSet< AuraType > AuraTypeImmune
Definition: SpellInfo.cpp:238
ImmunityInfo(ImmunityInfo const &)=delete
Trinity::Containers::FlatSet< SpellEffectName > SpellEffectImmune
Definition: SpellInfo.cpp:239
SpellCastingRequirementsEntry const * CastingRequirements
Definition: SpellMgr.h:666
SpellReagentsEntry const * Reagents
Definition: SpellMgr.h:678
std::vector< SpellXSpellVisualEntry const * > Visuals
Definition: SpellMgr.h:684
SpellTargetRestrictionsEntry const * TargetRestrictions
Definition: SpellMgr.h:682
std::vector< SpellLabelEntry const * > Labels
Definition: SpellMgr.h:674
SpellTotemsEntry const * Totems
Definition: SpellMgr.h:683
SpellAuraRestrictionsEntry const * AuraRestrictions
Definition: SpellMgr.h:665
SpellScalingEntry const * Scaling
Definition: SpellMgr.h:680
std::vector< SpellEmpowerStageEntry const * > EmpowerStages
Definition: SpellMgr.h:671
SpellInterruptsEntry const * Interrupts
Definition: SpellMgr.h:673
SpellCategoriesEntry const * Categories
Definition: SpellMgr.h:667
SpellMiscEntry const * Misc
Definition: SpellMgr.h:676
std::array< SpellPowerEntry const *, MAX_POWERS_PER_SPELL > Powers
Definition: SpellMgr.h:677
SpellEquippedItemsEntry const * EquippedItems
Definition: SpellMgr.h:672
SpellShapeshiftEntry const * Shapeshift
Definition: SpellMgr.h:681
SpellAuraOptionsEntry const * AuraOptions
Definition: SpellMgr.h:664
std::array< SpellEffectEntry const *, MAX_SPELL_EFFECTS > Effects
Definition: SpellMgr.h:670
SpellClassOptionsEntry const * ClassOptions
Definition: SpellMgr.h:668
std::vector< SpellReagentsCurrencyEntry const * > ReagentsCurrency
Definition: SpellMgr.h:679
SpellCooldownsEntry const * Cooldowns
Definition: SpellMgr.h:669
SpellLevelsEntry const * Levels
Definition: SpellMgr.h:675
SpellModType type
Definition: Player.h:238
uint32 spellId
Definition: Player.h:240
LocalizedString Name
Powers Power
Definition: SpellInfo.h:313
int32 RequiredAuraSpellID
std::array< float, 2 > RangeMin
std::array< float, 2 > RangeMax
EnumFlag< SpellShapeshiftFormFlags > GetFlags() const