fix(Core/Spells): Implement SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF (#21470)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
This commit is contained in:
@@ -7461,9 +7461,19 @@ SpellCastResult Spell::CheckItems()
|
|||||||
if (!targetItem)
|
if (!targetItem)
|
||||||
return SPELL_FAILED_ITEM_NOT_FOUND;
|
return SPELL_FAILED_ITEM_NOT_FOUND;
|
||||||
|
|
||||||
// xinef: required level has to be checked also! Exploit fix
|
// Apply item level restriction
|
||||||
if (targetItem->GetTemplate()->ItemLevel < m_spellInfo->BaseLevel || (targetItem->GetTemplate()->RequiredLevel && targetItem->GetTemplate()->RequiredLevel < m_spellInfo->BaseLevel))
|
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;
|
return SPELL_FAILED_LOWLEVEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_CastItem && m_spellInfo->MaxLevel > 0 && targetItem->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel)
|
||||||
|
return SPELL_FAILED_HIGHLEVEL;
|
||||||
|
|
||||||
bool isItemUsable = false;
|
bool isItemUsable = false;
|
||||||
for (uint8 e = 0; e < MAX_ITEM_PROTO_SPELLS; ++e)
|
for (uint8 e = 0; e < MAX_ITEM_PROTO_SPELLS; ++e)
|
||||||
@@ -7531,15 +7541,20 @@ SpellCastResult Spell::CheckItems()
|
|||||||
return SPELL_FAILED_NOT_TRADEABLE;
|
return SPELL_FAILED_NOT_TRADEABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Xinef: Apply item level restriction if the enchanting spell has max level restrition set
|
// Apply item level restriction
|
||||||
if (m_CastItem && m_spellInfo->MaxLevel > 0)
|
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;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case SPELL_EFFECT_ENCHANT_HELD_ITEM:
|
case SPELL_EFFECT_ENCHANT_HELD_ITEM:
|
||||||
|
|||||||
@@ -2529,6 +2529,10 @@ SpellInfo const* SpellInfo::GetAuraRankForLevel(uint8 level) const
|
|||||||
//if (IsPassive())
|
//if (IsPassive())
|
||||||
// return this;
|
// return this;
|
||||||
|
|
||||||
|
// Client ignores spell with these attributes (sub_53D9D0)
|
||||||
|
if (HasAttribute(SPELL_ATTR0_COOLDOWN_ON_EVENT) || HasAttribute(SPELL_ATTR2_ALLOW_LOW_LEVEL_BUFF) || HasAttribute(SPELL_ATTR3_ONLY_PROC_ON_CASTER))
|
||||||
|
return this;
|
||||||
|
|
||||||
bool needRankSelection = false;
|
bool needRankSelection = false;
|
||||||
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user