fix(Core/Spells): Don't remove item-dependent auras on disarm/weapon swap (#25170)
Co-authored-by: blinkysc <blinkysc@users.noreply.github.com> Co-authored-by: ariel- <ariel-@users.noreply.github.com>
This commit is contained in:
@@ -12499,18 +12499,49 @@ bool Player::HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item cons
|
|||||||
if (Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i))
|
if (Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||||
if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
|
if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Keep active non-passive auras (e.g. Bladestorm) when disarmed
|
||||||
|
if (!spellInfo->IsPassive())
|
||||||
|
{
|
||||||
|
bool hasWeaponInSlot = false;
|
||||||
|
for (uint8 i = EQUIPMENT_SLOT_MAINHAND; i < EQUIPMENT_SLOT_TABARD; ++i)
|
||||||
|
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||||
|
if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
|
||||||
|
{
|
||||||
|
hasWeaponInSlot = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasWeaponInSlot)
|
||||||
|
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
|
if (spellInfo->Effects[i].IsAura())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ITEM_CLASS_ARMOR:
|
case ITEM_CLASS_ARMOR:
|
||||||
{
|
{
|
||||||
// tabard not have dependent spells
|
// most used check: shield only
|
||||||
for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_MAINHAND; ++i)
|
if (spellInfo->EquippedItemSubClassMask & (1 << ITEM_SUBCLASS_ARMOR_SHIELD))
|
||||||
if (Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i))
|
{
|
||||||
|
if (Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
|
||||||
if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
|
if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// shields can be equipped to offhand slot
|
// Keep active non-passive auras (e.g. Shield Wall) when disarmed
|
||||||
if (Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND))
|
Item* offhand = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
|
||||||
|
if (!spellInfo->IsPassive() && offhand && offhand != ignoreItem)
|
||||||
|
{
|
||||||
|
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
|
if (spellInfo->Effects[i].IsAura())
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// tabard not have dependent spells
|
||||||
|
for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_MAINHAND; ++i)
|
||||||
|
if (Item* item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i))
|
||||||
if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
|
if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user