Core/Spells: Fixed some enchantments checks and fixed serious logic flaw in create item effect check (#19123)
This commit is contained in:
1 parent
a7b45aa44e
commit
cddcf9f11e
1 file changed
+23
-7
@@ -6328,25 +6328,31 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 /
|
||||
case SPELL_EFFECT_CREATE_ITEM:
|
||||
case SPELL_EFFECT_CREATE_ITEM_2:
|
||||
{
|
||||
if (!IsTriggered() && m_spellInfo->Effects[i].ItemType)
|
||||
// m_targets.GetUnitTarget() means explicit cast, otherwise we dont check for possible equip error
|
||||
Unit* target = m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : m_caster;
|
||||
if (target && target->GetTypeId() == TYPEID_PLAYER && !IsTriggered() && m_spellInfo->Effects[i].ItemType)
|
||||
{
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1);
|
||||
|
||||
InventoryResult msg = target->ToPlayer()->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(m_spellInfo->Effects[i].ItemType);
|
||||
/// @todo Needs review
|
||||
if (pProto && !(pProto->ItemLimitCategory))
|
||||
{
|
||||
player->SendEquipError(msg, NULL, NULL, m_spellInfo->Effects[i].ItemType);
|
||||
player->SendEquipError(msg, nullptr, nullptr, m_spellInfo->Effects[i].ItemType);
|
||||
return SPELL_FAILED_DONT_REPORT;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(m_spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (m_spellInfo->SpellFamilyFlags[0] & 0x40000000)))
|
||||
return SPELL_FAILED_TOO_MANY_OF_ITEM;
|
||||
else if (!(player->HasItemCount(m_spellInfo->Effects[i].ItemType)))
|
||||
return SPELL_FAILED_TOO_MANY_OF_ITEM;
|
||||
else if (!(target->ToPlayer()->HasItemCount(m_spellInfo->Effects[i].ItemType)))
|
||||
{
|
||||
player->SendEquipError(msg, nullptr, nullptr, m_spellInfo->Effects[i].ItemType);
|
||||
return SPELL_FAILED_DONT_REPORT;
|
||||
}
|
||||
else
|
||||
player->CastSpell(m_caster, m_spellInfo->Effects[EFFECT_1].CalcValue(), false); // move this to anywhere
|
||||
return SPELL_FAILED_DONT_REPORT;
|
||||
@@ -6369,7 +6375,7 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 /
|
||||
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, m_spellInfo->Effects[i].ItemType, 1);
|
||||
if (msg != EQUIP_ERR_OK)
|
||||
{
|
||||
player->SendEquipError(msg, NULL, NULL, m_spellInfo->Effects[i].ItemType);
|
||||
player->SendEquipError(msg, nullptr, nullptr, m_spellInfo->Effects[i].ItemType);
|
||||
return SPELL_FAILED_DONT_REPORT;
|
||||
}
|
||||
}
|
||||
@@ -6380,7 +6386,8 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 /
|
||||
if (!targetItem)
|
||||
return SPELL_FAILED_ITEM_NOT_FOUND;
|
||||
|
||||
if (targetItem->GetTemplate()->ItemLevel < m_spellInfo->BaseLevel)
|
||||
// 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;
|
||||
|
||||
bool isItemUsable = false;
|
||||
@@ -6448,6 +6455,15 @@ SpellCastResult Spell::CheckItems(uint32* param1 /*= nullptr*/, uint32* param2 /
|
||||
if (pEnchant->slot & ENCHANTMENT_CAN_SOULBOUND)
|
||||
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)
|
||||
{
|
||||
if (item->GetTemplate()->ItemLevel < m_CastItem->GetTemplate()->RequiredLevel)
|
||||
return SPELL_FAILED_LOWLEVEL;
|
||||
if (item->GetTemplate()->ItemLevel > m_spellInfo->MaxLevel)
|
||||
return SPELL_FAILED_HIGHLEVEL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPELL_EFFECT_ENCHANT_HELD_ITEM:
|
||||
|
||||
Reference in new issue
Block a user