Core/Spells: don't allow spells with SPELL_EFFECT_CREATE_LOOT to be cast if there isn't enough space in inventory

Port From (https://github.com/TrinityCore/TrinityCore/commit/59da957165ef7d7529db30f90a30dc401d682052)
This commit is contained in:
hondacrx
2021-12-17 19:26:43 -05:00
parent 112803c149
commit b349f922b2
3 changed files with 99 additions and 71 deletions
+33 -17
View File
@@ -6094,33 +6094,49 @@ namespace Game.Spells
case SpellEffectName.CreateLoot:
{
// m_targets.GetUnitTarget() means explicit cast, otherwise we dont check for possible equip error
Unit target = m_targets.GetUnitTarget() ? m_targets.GetUnitTarget() : player;
if (target.IsPlayer() && !IsTriggered() && spellEffectInfo.ItemType != 0)
Unit target = m_targets.GetUnitTarget() ?? player;
if (target.IsPlayer() && !IsTriggered())
{
List<ItemPosCount> dest = new();
InventoryResult msg = target.ToPlayer().CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, spellEffectInfo.ItemType, 1);
if (msg != InventoryResult.Ok)
// SPELL_EFFECT_CREATE_ITEM_2 differs from SPELL_EFFECT_CREATE_ITEM in that it picks the random item to create from a pool of potential items,
// so we need to make sure there is at least one free space in the player's inventory
if (spellEffectInfo.Effect == SpellEffectName.CreateLoot)
{
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(spellEffectInfo.ItemType);
// @todo Needs review
if (itemTemplate != null && itemTemplate.GetItemLimitCategory() == 0)
if (target.ToPlayer().GetFreeInventorySpace() == 0)
{
player.SendEquipError(msg, null, null, spellEffectInfo.ItemType);
player.SendEquipError(InventoryResult.InvFull, null, null, spellEffectInfo.ItemType);
return SpellCastResult.DontReport;
}
else
}
if (spellEffectInfo.ItemType != 0)
{
List<ItemPosCount> dest = new();
InventoryResult msg = target.ToPlayer().CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, spellEffectInfo.ItemType, 1);
if (msg != InventoryResult.Ok)
{
// Conjure Food/Water/Refreshment spells
if (!(m_spellInfo.SpellFamilyName == SpellFamilyNames.Mage && m_spellInfo.SpellFamilyFlags[0].HasAnyFlag(0x40000000u)))
return SpellCastResult.TooManyOfItem;
else if (!target.ToPlayer().HasItemCount(spellEffectInfo.ItemType))
ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(spellEffectInfo.ItemType);
/// @todo Needs review
if (itemTemplate != null && itemTemplate.GetItemLimitCategory() == 0)
{
player.SendEquipError(msg, null, null, spellEffectInfo.ItemType);
return SpellCastResult.DontReport;
}
else if (m_spellInfo.GetEffects().Count > 1)
player.CastSpell(m_caster, (uint)m_spellInfo.GetEffect(1).CalcValue(), new CastSpellExtraArgs().SetOriginalCastId(m_castId)); // move this to anywhere
return SpellCastResult.DontReport;
else
{
// Conjure Food/Water/Refreshment spells
if (m_spellInfo.SpellFamilyName != SpellFamilyNames.Mage || (!m_spellInfo.SpellFamilyFlags[0].HasAnyFlag(0x40000000u)))
return SpellCastResult.TooManyOfItem;
else if (!(target.ToPlayer().HasItemCount(spellEffectInfo.ItemType)))
{
player.SendEquipError(msg, null, null, spellEffectInfo.ItemType);
return SpellCastResult.DontReport;
}
else if (m_spellInfo.GetEffects().Count > 1)
player.CastSpell(player, (uint)m_spellInfo.GetEffect(1).CalcValue(), new CastSpellExtraArgs()
.SetOriginalCastId(m_castId)); // move this to anywhere
return SpellCastResult.DontReport;
}
}
}
}
+9 -20
View File
@@ -1098,32 +1098,21 @@ namespace Game.Spells
Player player = unitTarget.ToPlayer();
uint item_id = effectInfo.ItemType;
ItemContext context = m_spellInfo.HasAttribute(SpellAttr0.Tradespell) ? ItemContext.TradeSkill : ItemContext.None;
if (item_id != 0)
DoCreateItem(item_id, context);
// special case: fake item replaced by generate using spell_loot_template
// Pick a random item from spell_loot_template
if (m_spellInfo.IsLootCrafting())
{
if (item_id != 0)
{
if (!player.HasItemCount(item_id))
return;
// remove reagent
uint count = 1;
player.DestroyItemCount(item_id, count, true);
// create some random items
player.AutoStoreLoot(m_spellInfo.Id, LootStorage.Spell, context);
}
else
player.AutoStoreLoot(m_spellInfo.Id, LootStorage.Spell, context); // create some random items
player.AutoStoreLoot(m_spellInfo.Id, LootStorage.Spell, context, false, true);
player.UpdateCraftSkill(m_spellInfo.Id);
}
else // If there's no random loot entries for this spell, pick the item associated with this spell
{
uint itemId = effectInfo.ItemType;
if (itemId != 0)
DoCreateItem(itemId, context);
}
// @todo ExecuteLogEffectCreateItem(i, GetEffect(i].ItemType);
}