diff options
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 48 |
2 files changed, 28 insertions, 22 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 5837894173c..258e6a930e8 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -430,7 +430,7 @@ enum SpellAttr2 enum SpellAttr3 { SPELL_ATTR3_UNK0 = 0x00000001, // 0 - SPELL_ATTR3_UNK1 = 0x00000002, // 1 + SPELL_ATTR3_IGNORE_PROC_SUBCLASS_MASK = 0x00000002, // 1 Ignores subclass mask check when checking proc SPELL_ATTR3_UNK2 = 0x00000004, // 2 SPELL_ATTR3_BLOCKABLE_SPELL = 0x00000008, // 3 Only dmg class melee in 3.1.3 SPELL_ATTR3_IGNORE_RESURRECTION_TIMER = 0x00000010, // 4 you don't have to wait to be resurrected with these spells diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 3c5ea6ab08e..53b3f778e5b 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1988,31 +1988,37 @@ uint8 Aura::GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, Unit* target = aurApp->GetTarget(); if (IsPassive() && target->GetTypeId() == TYPEID_PLAYER) { - if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_WEAPON) + if (!GetSpellInfo()->HasAttribute(SPELL_ATTR3_IGNORE_PROC_SUBCLASS_MASK)) { - if (target->ToPlayer()->IsInFeralForm()) - return 0; - - if (DamageInfo* damageInfo = eventInfo.GetDamageInfo()) + Item* item = nullptr; + if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_WEAPON) { - WeaponAttackType attType = damageInfo->GetAttackType(); - Item* item = nullptr; - if (attType == BASE_ATTACK) - item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); - else if (attType == OFF_ATTACK) - item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); - else - item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); - - if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & GetSpellInfo()->EquippedItemSubClassMask)) + if (target->ToPlayer()->IsInFeralForm()) return 0; + + if (DamageInfo const* damageInfo = eventInfo.GetDamageInfo()) + { + switch (damageInfo->GetAttackType()) + { + case BASE_ATTACK: + item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + break; + case OFF_ATTACK: + item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); + break; + default: + item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); + break; + } + } } - } - else if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_ARMOR) - { - // Check if player is wearing shield - Item* item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); - if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & GetSpellInfo()->EquippedItemSubClassMask)) + else if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_ARMOR) + { + // Check if player is wearing shield + item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); + } + + if (!item || item->IsBroken() || !item->IsFitToSpellRequirements(GetSpellInfo())) return 0; } } |