aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/Spell.cpp
diff options
context:
space:
mode:
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 53be3ce0f1b..4251ccc3e17 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -6889,9 +6889,19 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 /
if (!targetItem)
return SPELL_FAILED_ITEM_NOT_FOUND;
- // required level has to be checked also! Exploit fix
- if (targetItem->GetTemplate()->ItemLevel < m_spellInfo->BaseLevel || (targetItem->GetTemplate()->RequiredLevel && targetItem->GetTemplate()->RequiredLevel < m_spellInfo->BaseLevel))
- return SPELL_FAILED_LOWLEVEL;
+ // Apply item level restriction
+ if (!m_spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF))
+ {
+ uint32 requiredLevel = targetItem->GetTemplate()->RequiredLevel;
+ if (!requiredLevel)
+ requiredLevel = targetItem->GetTemplate()->ItemLevel;
+
+ if (requiredLevel < m_spellInfo->BaseLevel)
+ return SPELL_FAILED_LOWLEVEL;
+ }
+ if (m_CastItem
+ && m_spellInfo->MaxLevel > 0 && targetItem->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel)
+ return SPELL_FAILED_HIGHLEVEL;
bool isItemUsable = false;
for (uint8 e = 0; e < MAX_ITEM_PROTO_SPELLS; ++e)
@@ -6959,14 +6969,18 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* 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()->ItemLevel < m_CastItem->GetTemplate()->RequiredLevel)
+ uint32 requiredLevel = item->GetTemplate()->RequiredLevel;
+ if (!requiredLevel)
+ requiredLevel = item->GetTemplate()->ItemLevel;
+
+ if (requiredLevel < m_spellInfo->BaseLevel)
return SPELL_FAILED_LOWLEVEL;
- if (item->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel)
- return SPELL_FAILED_HIGHLEVEL;
}
+ if (m_CastItem && m_spellInfo->MaxLevel > 0 && item->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel)
+ return SPELL_FAILED_HIGHLEVEL;
break;
}
case SPELL_EFFECT_ENCHANT_HELD_ITEM: