From a0fbf8e172c6d50e672d4050c110f5c0977e2772 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 3 Sep 2019 15:55:56 -0400 Subject: [PATCH] Core/Spells: Fixed some enchantments checks and fixed serious logic flaw in create item effect check Port From (https://github.com/TrinityCore/TrinityCore/commit/a0a6b155e2699b9772fc16e749e2ba4fa4f43737) --- Source/Game/Spells/Spell.cs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 3ce2a3ce6..54beacc62 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -5957,10 +5957,12 @@ namespace Game.Spells case SpellEffectName.CreateItem: case SpellEffectName.CreateLoot: { - if (!IsTriggered() && effect.ItemType != 0) + // 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 != null && target.GetTypeId() == TypeId.Player && !IsTriggered() && effect.ItemType != 0) { List dest = new List(); - InventoryResult msg = player.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, effect.ItemType, 1); + InventoryResult msg = target.ToPlayer().CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, effect.ItemType, 1); if (msg != InventoryResult.Ok) { ItemTemplate pProto = Global.ObjectMgr.GetItemTemplate(effect.ItemType); @@ -5975,8 +5977,11 @@ namespace Game.Spells SpellEffectInfo efi; if (!(m_spellInfo.SpellFamilyName == SpellFamilyNames.Mage && m_spellInfo.SpellFamilyFlags[0].HasAnyFlag(0x40000000u))) return SpellCastResult.TooManyOfItem; - else if (!player.HasItemCount(effect.ItemType)) - return SpellCastResult.TooManyOfItem; + else if (!target.ToPlayer().HasItemCount(effect.ItemType)) + { + player.SendEquipError(msg, null, null, effect.ItemType); + return SpellCastResult.DontReport; + } else if ((efi = GetEffect(1)) != null) player.CastSpell(m_caster, (uint)efi.CalcValue(), false); // move this to anywhere return SpellCastResult.DontReport; @@ -6009,7 +6014,8 @@ namespace Game.Spells if (targetItem == null) return SpellCastResult.ItemNotFound; - if (targetItem.GetTemplate().GetBaseItemLevel() < m_spellInfo.BaseLevel) + // required level has to be checked also! Exploit fix + if (targetItem.GetTemplate().GetBaseItemLevel() < m_spellInfo.BaseLevel || (targetItem.GetTemplate().GetBaseRequiredLevel() != 0 && (uint)targetItem.GetTemplate().GetBaseRequiredLevel() < m_spellInfo.BaseLevel)) return SpellCastResult.Lowlevel; bool isItemUsable = false; @@ -6075,6 +6081,15 @@ namespace Game.Spells if (pEnchant.Flags.HasAnyFlag(EnchantmentSlotMask.CanSouldBound)) return SpellCastResult.NotTradeable; } + + // Apply item level restriction if the enchanting spell has max level restrition set + if (m_CastItem != null && m_spellInfo.MaxLevel > 0) + { + if (item.GetTemplate().GetBaseItemLevel() < m_CastItem.GetTemplate().GetBaseRequiredLevel()) + return SpellCastResult.Lowlevel; + if (item.GetTemplate().GetBaseItemLevel() > m_spellInfo.MaxLevel) + return SpellCastResult.Highlevel; + } break; } case SpellEffectName.EnchantHeldItem: