diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-01-26 12:58:06 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-01-26 12:59:30 +0100 |
commit | 3eb4ccc9a0b3d315d53c566455a748c7cf795ac2 (patch) | |
tree | 1c2fd22fde7bf967a35cebe6cb6ff78672a1856d /src/server/game/Spells/Spell.cpp | |
parent | b61960c1a952b929c95a80b1269800ef30878e3d (diff) |
Core/Items: Fixed item spell charge slot indexing
Closes #30585
(cherry picked from commit c85d12fc3f0576163d4ffa91bb38f66894305349)
# Conflicts:
# src/server/game/Entities/Item/Item.h
# src/server/game/Globals/ObjectMgr.cpp
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index ed72a1d3366..c830fedee22 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5346,23 +5346,24 @@ void Spell::TakeCastItem() for (ItemEffectEntry const* itemEffect : m_CastItem->GetEffects()) { - if (itemEffect->LegacySlotIndex >= m_CastItem->m_itemData->SpellCharges.size()) - continue; - // item has limited charges if (itemEffect->Charges) { if (itemEffect->Charges < 0) expendable = true; - int32 charges = m_CastItem->GetSpellCharges(itemEffect->LegacySlotIndex); + int32 charges = m_CastItem->GetSpellCharges(itemEffect); // item has charges left for this slot if (charges && itemEffect->SpellID == int32(m_spellInfo->Id)) { - (charges > 0) ? --charges : ++charges; // abs(charges) less at 1 after use + if (charges > 0) + --charges; + else + ++charges; + if (proto->GetMaxStackSize() == 1) - m_CastItem->SetSpellCharges(itemEffect->LegacySlotIndex, charges); + m_CastItem->SetSpellCharges(itemEffect, charges); m_CastItem->SetState(ITEM_CHANGED, player); } @@ -5607,11 +5608,8 @@ void Spell::TakeReagents() { for (ItemEffectEntry const* itemEffect : m_CastItem->GetEffects()) { - if (itemEffect->LegacySlotIndex >= m_CastItem->m_itemData->SpellCharges.size()) - continue; - // CastItem will be used up and does not count as reagent - int32 charges = m_CastItem->GetSpellCharges(itemEffect->LegacySlotIndex); + int32 charges = m_CastItem->GetSpellCharges(itemEffect); if (itemEffect->Charges < 0 && abs(charges) < 2) { ++itemcount; @@ -7310,9 +7308,8 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*= return SPELL_FAILED_ITEM_NOT_READY; for (ItemEffectEntry const* itemEffect : m_CastItem->GetEffects()) - if (itemEffect->LegacySlotIndex < m_CastItem->m_itemData->SpellCharges.size() && itemEffect->Charges) - if (m_CastItem->GetSpellCharges(itemEffect->LegacySlotIndex) == 0) - return SPELL_FAILED_NO_CHARGES_REMAIN; + if (itemEffect->Charges && m_CastItem->GetSpellCharges(itemEffect) == 0) + return SPELL_FAILED_NO_CHARGES_REMAIN; // consumable cast item checks if (proto->GetClass() == ITEM_CLASS_CONSUMABLE && m_targets.GetUnitTarget()) @@ -7414,11 +7411,8 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*= for (ItemEffectEntry const* itemEffect : m_CastItem->GetEffects()) { - if (itemEffect->LegacySlotIndex >= m_CastItem->m_itemData->SpellCharges.size()) - continue; - // CastItem will be used up and does not count as reagent - int32 charges = m_CastItem->GetSpellCharges(itemEffect->LegacySlotIndex); + int32 charges = m_CastItem->GetSpellCharges(itemEffect); if (itemEffect->Charges < 0 && abs(charges) < 2) { ++itemcount; @@ -7757,9 +7751,7 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*= if (Item* item = player->GetItemByEntry(itemId)) for (ItemEffectEntry const* itemEffect : item->GetEffects()) - if (itemEffect->LegacySlotIndex <= item->m_itemData->SpellCharges.size() - && itemEffect->Charges != 0 - && item->GetSpellCharges(itemEffect->LegacySlotIndex) == itemEffect->Charges) + if (itemEffect->Charges != 0 && item->GetSpellCharges(itemEffect) == itemEffect->Charges) return SPELL_FAILED_ITEM_AT_MAX_CHARGES; break; } |