aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-12-05 14:13:07 +0100
committerShauren <shauren.trinity@gmail.com>2024-12-05 14:13:07 +0100
commit2e4ada2d3d2a719d650ed90b4f7e7428496717a7 (patch)
tree5badb640fff16d49e18a5fde12cf9368b4988933 /src/server/game/Spells/Spell.cpp
parent806bb664905e4560103715c90b02fb954e24c6c4 (diff)
Core/Spells: Fixed item level requirements for enchanting spells
Closes #30482 (cherry picked from commit 243314806ff10d9cd4a7595cb48a7bb5878058d6) # Conflicts: # src/server/game/Spells/Spell.cpp # src/server/game/Spells/SpellInfo.cpp # src/server/shared/SharedDefines.h # src/server/shared/enuminfo_SharedDefines.cpp
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
-rw-r--r--src/server/game/Spells/Spell.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index c6bf17beb35..f4f0cc25ac4 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -7789,9 +7789,19 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*=
if (!targetItem)
return SPELL_FAILED_ITEM_NOT_FOUND;
- // required level has to be checked also! Exploit fix
- if (targetItem->GetItemLevel(targetItem->GetOwner()) < m_spellInfo->BaseLevel || (targetItem->GetRequiredLevel() && uint32(targetItem->GetRequiredLevel()) < m_spellInfo->BaseLevel))
- return SPELL_FAILED_LOWLEVEL;
+ // Apply item level restriction
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF))
+ {
+ uint32 requiredLevel = targetItem->GetRequiredLevel();
+ if (!requiredLevel)
+ requiredLevel = targetItem->GetItemLevel(targetItem->GetOwner());
+
+ if (requiredLevel < m_spellInfo->BaseLevel)
+ return SPELL_FAILED_LOWLEVEL;
+ }
+ if ((m_CastItem || effectInfo->IsEffect(SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC))
+ && m_spellInfo->MaxLevel > 0 && targetItem->GetItemLevel(targetItem->GetOwner()) > m_spellInfo->MaxLevel)
+ return SPELL_FAILED_HIGHLEVEL;
bool isItemUsable = false;
for (ItemEffectEntry const* itemEffect : targetItem->GetEffects())
@@ -7856,14 +7866,18 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*=
return SPELL_FAILED_NOT_TRADEABLE;
}
- // Apply item level restriction if the enchanting spell has max level restrition set
- if (m_CastItem && m_spellInfo->MaxLevel > 0)
+ // Apply item level restriction
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF))
{
- if (item->GetTemplate()->GetBaseItemLevel() < (uint32)m_CastItem->GetTemplate()->GetBaseRequiredLevel())
+ uint32 requiredLevel = item->GetRequiredLevel();
+ if (!requiredLevel)
+ requiredLevel = item->GetItemLevel(item->GetOwner());
+
+ if (requiredLevel < m_spellInfo->BaseLevel)
return SPELL_FAILED_LOWLEVEL;
- if (item->GetTemplate()->GetBaseItemLevel() > m_spellInfo->MaxLevel)
- return SPELL_FAILED_HIGHLEVEL;
}
+ if (m_CastItem && m_spellInfo->MaxLevel > 0 && item->GetItemLevel(item->GetOwner()) > m_spellInfo->MaxLevel)
+ return SPELL_FAILED_HIGHLEVEL;
break;
}
case SPELL_EFFECT_ENCHANT_HELD_ITEM: