fix(Core/Spell): make use of SPELL_ATTR3_IGNORE_PROC_SUBCLASS_MASK (#5005)

This commit is contained in:
Kitzunu
2021-04-07 23:10:12 +02:00
committed by GitHub
parent 88ddc24464
commit 91dfedd080

View File

@@ -2131,34 +2131,42 @@ bool Aura::IsProcTriggeredOnEvent(AuraApplication* aurApp, ProcEventInfo& eventI
// do that only for passive spells // do that only for passive spells
// TODO: this needs to be unified for all kinds of auras // TODO: this needs to be unified for all kinds of auras
Unit* target = aurApp->GetTarget(); Unit* target = aurApp->GetTarget();
if (IsPassive() && target->GetTypeId() == TYPEID_PLAYER) if (IsPassive() && target->GetTypeId() == TYPEID_PLAYER && GetSpellInfo()->EquippedItemClass != -1)
{ {
if (!GetSpellInfo()->HasAttribute(SPELL_ATTR3_IGNORE_PROC_SUBCLASS_MASK))
{
Item* item = nullptr;
if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_WEAPON) if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_WEAPON)
{ {
if (target->ToPlayer()->IsInFeralForm()) if (target->ToPlayer()->IsInFeralForm())
return false; return false;
if (eventInfo.GetDamageInfo()) if (DamageInfo const* damageInfo = eventInfo.GetDamageInfo())
{ {
WeaponAttackType attType = eventInfo.GetDamageInfo()->GetAttackType(); switch (damageInfo->GetAttackType())
Item* item = nullptr; {
if (attType == BASE_ATTACK) case BASE_ATTACK:
item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND);
else if (attType == OFF_ATTACK) break;
case OFF_ATTACK:
item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
else break;
default:
item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED);
break;
if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & GetSpellInfo()->EquippedItemSubClassMask)) }
return false;
} }
} }
else if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_ARMOR) else if (GetSpellInfo()->EquippedItemClass == ITEM_CLASS_ARMOR)
{ {
// Check if player is wearing shield // Check if player is wearing shield
Item* item = target->ToPlayer()->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); 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)) }
return false;
if (!item || item->IsBroken() || !item->IsFitToSpellRequirements(GetSpellInfo()))
{
return 0;
}
} }
} }