/// <summary>
/// Add an ItemAmount in an organized way.
/// </summary>
/// <param name="itemInfo">The item info being added to the item collection.</param>
/// <param name="targetStack">The item stack where the item should be added to (Can be null).</param>
protected override ItemInfo AddInternal(ItemInfo itemInfo, ItemStack targetStack, bool notifyAdd = tru
{
var amountToAdd = itemInfo.Amount;
var maxStackSize = GetMaxStackSize(itemInfo.Item);
ItemStack addedItemStack = null;
if (m_ItemStacks.Contains(targetStack)) {
addedItemStack = targetStack;
var amountAdded = IncreaseStackAmount(targetStack, maxStackSize, ref amountToAdd);
if (amountAdded > 0 && notifyAdd) {
NotifyAdd((amountAdded, itemInfo), addedItemStack);
}
}
for (int i = 0; i < m_ItemStacks.Count; i++) {
var itemStack = m_ItemStacks[i];
if (CanItemStack(itemInfo, itemStack) == false) { continue; }
addedItemStack = itemStack;
var amountAdded = IncreaseStackAmount(itemStack, maxStackSize, ref amountToAdd);
if (amountAdded > 0 && notifyAdd) {
NotifyAdd((amountAdded, itemInfo), addedItemStack);
}
}
itemInfo.Item.AddItemCollection(this);
var stacksToAdd = amountToAdd / maxStackSize;
var remainderStack = amountToAdd % maxStackSize;
for (int i = 0; i < stacksToAdd; i++) {
var newItemStack = GenericObjectPool.Get<ItemStack>();
newItemStack.Initialize((itemInfo.Item, maxStackSize), this);
addedItemStack = newItemStack;
m_ItemStacks.Add(newItemStack);
if (notifyAdd) {
NotifyAdd((addedItemStack.Amount, itemInfo), addedItemStack);
}
}
if (remainderStack != 0) {
var newItemStack = GenericObjectPool.Get<ItemStack>();
newItemStack.Initialize((itemInfo.Item, remainderStack), this);
addedItemStack = newItemStack;
m_ItemStacks.Add(newItemStack);
if (notifyAdd) {
NotifyAdd((addedItemStack.Amount, itemInfo), addedItemStack);
}
}
return (itemInfo.Item, itemInfo.Amount, this, addedItemStack);
}
/// <summary>
/// Increase the stack amount.
/// </summary>
/// <param name="targetItemStack">The item stack to increase the amount from.</param>
/// <param name="maxStackSize">The max stack size.</param>
/// <param name="amountToAdd">The amount to add.</param>
/// <returns>The amount added to the stack.</returns>
private int IncreaseStackAmount(ItemStack targetItemStack, int maxStackSize, ref int amountToAdd)
{
if (targetItemStack.Amount == maxStackSize) { return 0; }
var originalAmountToAdd = amountToAdd;
var totalToSet = targetItemStack.Amount + amountToAdd;
var sizeDifference = totalToSet - maxStackSize;
if (sizeDifference <= 0) {
targetItemStack.SetAmount(totalToSet);
amountToAdd = 0;
} else {
targetItemStack.SetAmount(maxStackSize);
amountToAdd = sizeDifference;
}
var amountAdded = originalAmountToAdd - amountToAdd;
return amountAdded;
}