5629{
5630
5633
5634
5636 {
5639 }
5640
5641
5643 {
5645 {
5646
5648 {
5649
5656
5658 {
5660 {
5671 }
5672 }
5673 }
5674
5675
5678 }
5679
5681 {
5683 {
5686 else
5688 }
5689
5692 }
5693 }
5694
5696 {
5699 }
5700
5703
5704
5707
5708
5713
5715 {
5719
5723 }
5724
5726 {
5729
5730
5731
5733 {
5734 bool checkForm = true;
5735
5738 {
5740 continue;
5741
5742 checkForm = false;
5743 break;
5744 }
5745
5746 if (checkForm)
5747 {
5748
5751 return shapeError;
5752
5755 }
5756 }
5757
5758
5759
5761 {
5766
5767
5772
5777
5780 }
5781
5782
5784 {
5787 return vehicleCheck;
5788 }
5789 }
5790
5791
5792 {
5795 {
5796
5798 {
5802 }
5803
5807 }
5808 }
5809
5810
5811
5812
5813
5815 {
5816
5818
5819
5822
5825 return castResult;
5826 }
5827
5829 {
5832 return castResult;
5833
5834
5836 {
5838 {
5840 if (!unitCaster->IsFriendlyTo(auraEff->GetCaster()) && !target->HasAura(auraEff->GetId(), auraEff->GetCasterGUID()))
5842
5844 if (!unitCaster->IsFriendlyTo(auraEff->GetCaster()) && (!target->HasAura(auraEff->GetId(), auraEff->GetCasterGUID()) || !unitCaster->HasAura(auraEff->GetId(), auraEff->GetCasterGUID())))
5846 }
5847 }
5848
5850 {
5851
5854
5855
5858
5859
5861 {
5865 losTarget = dynObj;
5866
5869 }
5870 }
5871 }
5872
5873
5877
5878
5880 {
5882 if (!unitCaster->GetPetGUID().IsEmpty())
5884
5886 {
5888 {
5889 if (!unitCaster->GetGuardianPet())
5890 {
5893 else
5895 }
5896 break;
5897 }
5898 }
5899 }
5900
5901
5905
5906
5908 if (player->InArena())
5909 {
5912 return castResult;
5913 }
5914
5915
5917 {
5920
5923 return locRes;
5924 }
5925
5926
5928 {
5930 {
5933 else
5935 }
5936 }
5937
5938
5940 {
5942 {
5946 }
5947 }
5948
5950
5951
5953 {
5956 return castResult;
5957 }
5958
5959
5963 return castResult;
5964
5966 {
5969 return castResult;
5970 }
5971
5973 {
5976 return castResult;
5977 }
5978
5979
5982 return castResult;
5983
5984 uint32 approximateAuraEffectMask = 0;
5985 uint32 nonAuraEffectMask = 0;
5987 {
5988
5989 switch (spellEffectInfo.Effect)
5990 {
5992 {
5994 {
5996 if (!unit || !unit->
HasAura(17743))
5998 }
6000 {
6003
6007
6008 }
6009 break;
6010 }
6012 {
6014 break;
6015
6017 if (!pet)
6019
6021 if (!learn_spellproto)
6023
6026
6027 break;
6028 }
6030 {
6036 break;
6037 }
6039 {
6040
6042 {
6045
6049
6051
6052 if (!learn_spellproto)
6054
6057 }
6058 break;
6059 }
6061 {
6064
6068
6069 if (
uint32 glyphId = spellEffectInfo.MiscValue)
6070 {
6072 if (!glyphProperties)
6074
6075 std::vector<uint32>
const* glyphBindableSpells =
sDB2Manager.GetGlyphBindableSpells(glyphId);
6076 if (!glyphBindableSpells)
6078
6079 if (std::find(glyphBindableSpells->begin(), glyphBindableSpells->end(),
m_misc.SpellId) == glyphBindableSpells->end())
6081
6082 if (std::vector<ChrSpecialization>
const* glyphRequiredSpecs =
sDB2Manager.GetGlyphRequiredSpecs(glyphId))
6083 {
6086
6087 if (std::find(glyphRequiredSpecs->begin(), glyphRequiredSpecs->end(), caster->
GetPrimarySpecialization()) == glyphRequiredSpecs->end())
6089 }
6090
6091 uint32 replacedGlyph = 0;
6093 {
6094 if (std::vector<uint32>
const* activeGlyphBindableSpells =
sDB2Manager.GetGlyphBindableSpells(activeGlyphId))
6095 {
6096 if (std::find(activeGlyphBindableSpells->begin(), activeGlyphBindableSpells->end(),
m_misc.SpellId) != activeGlyphBindableSpells->end())
6097 {
6098 replacedGlyph = activeGlyphId;
6099 break;
6100 }
6101 }
6102 }
6103
6105 {
6106 if (activeGlyphId == replacedGlyph)
6107 continue;
6108
6109 if (activeGlyphId == glyphId)
6111
6114 }
6115 }
6116 break;
6117 }
6119 {
6122
6124 if (!foodItem)
6126
6128 if (!pet)
6130
6133
6136
6139
6140 break;
6141 }
6143 {
6145 if (!unitCaster)
6147
6150
6152 {
6154 if (!target)
6156
6157
6160
6163
6166
6167
6175
6177 }
6178 break;
6179 }
6181 {
6184
6187
6192
6193 break;
6194 }
6196 {
6199 break;
6200
6202
6205
6206 Item* pTempItem =
nullptr;
6208 {
6211 }
6214
6215
6220
6226
6227
6230 {
6231 lockId = go->GetGOInfo()->GetLockId();
6232 if (!lockId)
6234
6237 }
6239 lockId = itm->GetTemplate()->GetLockID();
6240
6242 int32 reqSkillValue = 0;
6243 int32 skillValue = 0;
6244
6245
6248 return res;
6249 break;
6250 }
6252 {
6256
6260
6263 {
6264 return petInfo && !petInfo->Health;
6265 });
6266
6267 if (deadPetItr == petStable->
ActivePets.end())
6269
6270 break;
6271 }
6272
6274 {
6276 if (!unitCaster)
6277 break;
6278
6280 if (!SummonProperties)
6281 break;
6282
6283 switch (SummonProperties->
Control)
6284 {
6288 [[fallthrough]];
6292 break;
6293 }
6294 break;
6295 }
6297 {
6299 {
6304 }
6305 break;
6306 }
6308 {
6310 if (!unitCaster)
6312
6314 {
6316 {
6317 if (strict)
6320 .SetOriginalCaster(pet->
GetGUID())
6322 }
6325 }
6326
6329
6332 {
6334 if (!spellEffectInfo.MiscValue)
6335 {
6336 petSlot =
PetSaveMode(spellEffectInfo.CalcValue());
6337
6338
6340 {
6341 if (activePet && !activePet->Health)
6342 {
6345 }
6346 }
6347 }
6348
6350 if (info.first)
6351 {
6353 {
6357 {
6358
6359 if (creatureInfo && creatureInfo->
IsTameable(
true, creatureDifficulty))
6361 else
6363
6365 }
6366 }
6367 }
6368 else if (!spellEffectInfo.MiscValue)
6369 {
6372 }
6373 }
6374
6375 break;
6376 }
6378 {
6380 if (!playerCaster)
6382
6384 if (!pet)
6386
6389
6390 break;
6391 }
6393 {
6396
6399
6403
6406
6407
6409 {
6410 uint32 mapId = map->GetId();
6411 Difficulty difficulty = map->GetDifficultyID();
6412 if (
InstanceLock const* mapLock = map->GetInstanceLock())
6415
6416 if (!target->
Satisfy(
sObjectMgr->GetAccessRequirement(mapId, difficulty), mapId))
6418 }
6419 break;
6420 }
6421
6423 {
6426
6430
6432 if (!target ||
6435 break;
6436 }
6439 {
6440
6445 break;
6446 }
6448 {
6451 break;
6452 }
6454 {
6456 if (!unitCaster)
6458
6460 {
6463 else
6465 }
6466 break;
6467 }
6470 {
6472 if (!unitCaster)
6474
6477 break;
6478 }
6480 {
6483 if (!player)
6485
6488
6490 {
6494 }
6495
6496
6500 break;
6501 }
6503 {
6505 if (!playerCaster)
6507
6509 if (!talent)
6511
6513 {
6514 if (param1)
6517 }
6518 break;
6519 }
6521 {
6524
6527
6528 break;
6529 }
6532 {
6534 if (!playerCaster)
6536
6538 if (!artifactAura)
6540
6542 if (!artifact)
6544
6546 {
6548 if (!artifactEntry || artifactEntry->
ArtifactCategoryID != spellEffectInfo.MiscValue)
6550 }
6551 break;
6552 }
6556 {
6560
6564
6566 {
6569
6572
6574 {
6576 {
6577 if (
uint32 battlePetType = spellEffectInfo.MiscValue)
6578 if (!(battlePetType & (1 << battlePetSpecies->PetTypeEnum)))
6580
6582 {
6584 {
6585 return a1->MaxQualityRoll < selector;
6586 });
6587
6591
6594 }
6595
6599
6600 if (battlePetSpecies->GetFlags().HasFlag(BattlePetSpeciesFlags::CantBattle))
6602 }
6603 }
6604 }
6605 break;
6606 }
6607 default:
6608 break;
6609 }
6610
6611 if (spellEffectInfo.IsAura())
6612 approximateAuraEffectMask |= 1 << spellEffectInfo.EffectIndex;
6613 else if (spellEffectInfo.IsEffect())
6614 nonAuraEffectMask |= 1 << spellEffectInfo.EffectIndex;
6615 }
6616
6618 {
6619 switch (spellEffectInfo.ApplyAuraName)
6620 {
6622 {
6625
6627 if (!pet)
6629
6632 break;
6633 }
6637 {
6639 if (!unitCaster)
6641
6644
6647 {
6650
6653 }
6654
6656 {
6659
6662
6665
6668
6672 }
6673
6674 break;
6675 }
6677 {
6679 if (!unitCaster)
6681
6684
6686 {
6689 }
6690 break;
6691 }
6693 {
6696
6697
6700 break;
6701 }
6704 {
6705
6706
6708 {
6712 }
6713 break;
6714 }
6716 {
6717 if (spellEffectInfo.IsTargetingArea())
6718 break;
6719
6722
6724 break;
6725
6728 break;
6729 }
6730 default:
6731 break;
6732 }
6733
6734
6737 && (approximateAuraEffectMask & (1 << spellEffectInfo.EffectIndex))
6742 approximateAuraEffectMask, false))
6744 }
6745
6746
6748 {
6751
6754
6757
6759 if (!my_trade)
6761
6764
6768 }
6769
6770
6772}
@ CONDITION_SOURCE_TYPE_SPELL
DB2Storage< BattlePetBreedQualityEntry > sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", &BattlePetBreedQualityLoadInfo::Instance)
DB2Storage< ArtifactEntry > sArtifactStore("Artifact.db2", &ArtifactLoadInfo::Instance)
DB2Storage< ChrClassesEntry > sChrClassesStore("ChrClasses.db2", &ChrClassesLoadInfo::Instance)
DB2Storage< ChrSpecializationEntry > sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance)
DB2Storage< BattlePetSpeciesEntry > sBattlePetSpeciesStore("BattlePetSpecies.db2", &BattlePetSpeciesLoadInfo::Instance)
DB2Storage< SummonPropertiesEntry > sSummonPropertiesStore("SummonProperties.db2", &SummonPropertiesLoadInfo::Instance)
DB2Storage< GlyphPropertiesEntry > sGlyphPropertiesStore("GlyphProperties.db2", &GlyphPropertiesLoadInfo::Instance)
DB2Storage< TalentEntry > sTalentStore("Talent.db2", &TalentLoadInfo::Instance)
std::optional< T > Optional
Optional helper class to wrap optional values within.
constexpr uint32 PET_SUMMONING_DISORIENTATION
@ SPELL_ATTR7_DEBUG_SPELL
@ SPELL_ATTR5_NOT_AVAILABLE_WHILE_CHARMED
@ TARGET_GAMEOBJECT_TARGET
@ SPELL_ATTR2_ENCHANT_OWN_ITEM_ONLY
@ SPELL_ATTR2_INITIATE_COMBAT_POST_CAST_ENABLES_AUTO_ATTACK
@ SPELL_ATTR2_NO_ACTIVE_PETS
@ SPELL_ATTR1_INITIATES_COMBAT_ENABLES_AUTO_ATTACK
@ SPELL_ATTR3_ONLY_BATTLEGROUNDS
@ SPELL_DAMAGE_CLASS_MELEE
@ SPELL_EFFECT_CREATE_HEIRLOOM_ITEM
@ SPELL_EFFECT_SUMMON_PET
@ SPELL_EFFECT_GIVE_ARTIFACT_POWER_NO_BONUS
@ SPELL_EFFECT_SUMMON_RAF_FRIEND
@ SPELL_EFFECT_WEAPON_DAMAGE
@ SPELL_EFFECT_APPLY_GLYPH
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
@ SPELL_EFFECT_SUMMON_PLAYER
@ SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER
@ SPELL_EFFECT_RESURRECT_PET
@ SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY
@ SPELL_EFFECT_WEAPON_PERCENT_DAMAGE
@ SPELL_EFFECT_GRANT_BATTLEPET_LEVEL
@ SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL
@ SPELL_EFFECT_UNLOCK_GUILD_VAULT_TAB
@ SPELL_EFFECT_DISMISS_PET
@ SPELL_EFFECT_TALENT_SPEC_SELECT
@ SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE
@ SPELL_EFFECT_LEARN_SPELL
@ SPELL_EFFECT_GIVE_ARTIFACT_POWER
@ SPELL_EFFECT_REMOVE_TALENT
@ SPELL_EFFECT_CREATE_TAMED_PET
@ SPELL_EFFECT_STEAL_BENEFICIAL_BUFF
@ SPELL_EFFECT_LEARN_PET_SPELL
@ SPELL_CUSTOM_ERROR_GM_ONLY
@ SPELL_ATTR0_ONLY_INDOORS
@ SPELL_ATTR0_ONLY_OUTDOORS
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
@ SPELL_ATTR0_COOLDOWN_ON_EVENT
@ SPELL_ATTR0_USES_RANGED_SLOT
@ SPELL_ATTR0_ALLOW_CAST_WHILE_DEAD
@ SPELL_ATTR0_ONLY_STEALTHED
@ SPELL_ATTR12_IGNORE_CASTING_DISABLED
@ SPELL_FAILED_TARGET_NOT_LOOTED
@ SPELL_FAILED_NOT_INFRONT
@ SPELL_FAILED_NOT_MOUNTED
@ SPELL_FAILED_AFFECTING_COMBAT
@ SPELL_FAILED_CASTER_AURASTATE
@ SPELL_FAILED_WRONG_ARTIFACT_EQUIPPED
@ SPELL_FAILED_TARGET_NOT_PLAYER
@ SPELL_FAILED_CANT_UNTALENT
@ SPELL_FAILED_FOOD_LOWLEVEL
@ SPELL_FAILED_GLYPH_INVALID_SPEC
@ SPELL_FAILED_ALREADY_HAVE_PET
@ SPELL_FAILED_WRONG_PET_FOOD
@ SPELL_FAILED_CUSTOM_ERROR
@ SPELL_FAILED_SUMMON_PENDING
@ SPELL_FAILED_BAD_IMPLICIT_TARGETS
@ SPELL_FAILED_CANT_UPGRADE_BATTLE_PET
@ SPELL_FAILED_ALREADY_HAVE_SUMMON
@ SPELL_FAILED_NOT_TRADING
@ SPELL_FAILED_NOT_IN_BATTLEGROUND
@ SPELL_FAILED_NOT_BEHIND
@ SPELL_FAILED_ALREADY_HAVE_CHARM
@ SPELL_FAILED_WRONG_BATTLE_PET_TYPE
@ SPELL_FAILED_ONLY_BATTLEGROUNDS
@ SPELL_FAILED_ITEM_ALREADY_ENCHANTED
@ SPELL_FAILED_ONLY_STEALTHED
@ SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW
@ SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED
@ SPELL_FAILED_NO_ARTIFACT_EQUIPPED
@ SPELL_FAILED_ONLY_ABOVEWATER
@ SPELL_FAILED_TARGETS_DEAD
@ SPELL_FAILED_GLYPH_NO_SPEC
@ SPELL_FAILED_CANT_BE_CHARMED
@ SPELL_FAILED_CASTER_DEAD
@ SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW
@ SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY
@ SPELL_FAILED_TARGET_UNSKINNABLE
@ SPELL_FAILED_UNIQUE_GLYPH
@ SPELL_FAILED_ONLY_OUTDOORS
@ SPELL_FAILED_INVALID_GLYPH
@ SPELL_FAILED_LINE_OF_SIGHT
@ SPELL_FAILED_VISION_OBSCURED
@ SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE
@ SPELL_FAILED_REQUIRES_SPELL_FOCUS
@ SPELL_FAILED_ONLY_INDOORS
@ SPELL_FAILED_NOT_ON_TAXI
@ SPELL_FAILED_TARGET_FRIENDLY
@ SPELL_ATTR4_AURA_NEVER_BOUNCES
@ SPELL_ATTR4_AURA_BOUNCE_FAILS_SPELL
@ SPELL_ATTR8_ONLY_PLAYERS_CAN_CAST_THIS_SPELL
@ SPELL_AURA_DISABLE_CASTING_EXCEPT_ABILITIES
@ SPELL_AURA_DISABLE_ATTACKING_EXCEPT_ABILITIES
@ SPELL_AURA_MOD_IGNORE_SHAPESHIFT
@ SPELL_AURA_PERIODIC_MANA_LEECH
@ SPELL_AURA_MOD_POSSESS_PET
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
@ SPELL_AURA_PROVIDE_SPELL_FOCUS
@ SPELL_AURA_INTERFERE_TARGETTING
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore caster aura states including combat requirements and death state.
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore mounted/on vehicle restrictions.
@ TRIGGERED_IGNORE_SHAPESHIFT
Will ignore shapeshift checks.
@ TRIGGERED_IGNORE_GCD
Will ignore GCD.
@ TRIGGERED_IGNORE_CASTER_AURAS
Will ignore caster aura restrictions or requirements.
@ SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
#define ARTIFACTS_ALL_WEAPONS_GENERAL_WEAPON_EQUIPPED_PASSIVE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
ObjectGuid GetCastItemGUID() const
BattlePet * GetPet(ObjectGuid guid)
bool HasJournalLock() const
bool CanFlyIn()
Return if we can use mount in battlefield.
bool HasHeirloom(uint32 itemId) const
Loot * GetLootForPlayer(Player const *player) const override
GameObjectTemplate const * GetGOInfo() const