Example #1
0
        public void AddItemsInternal(MyFixedPoint amount, MyObjectBuilder_PhysicalObject objectBuilder, int index = -1, uint? itemId = null, bool stack = true)
        {
            Debug.Assert(amount > 0, "Adding 0 amount of item.");

            var newItem = new MyPhysicalInventoryItem() { Amount = amount, Content = objectBuilder };

            MyFixedPoint maxStack = MyFixedPoint.MaxValue;
            MyComponentDefinition compDef = null;
            if (MyDefinitionManager.Static.TryGetComponentDefinition(objectBuilder.GetId(), out compDef))
                maxStack = compDef.MaxStackAmount;

            if (index >= 0 && index < m_items.Count)
            {
                if (m_items[index].Content.CanStack(objectBuilder))
                {
                    var newStackVal = m_items[index].Amount + newItem.Amount - maxStack;
                    if (newStackVal > 0)
                    {
                        newItem.Amount = maxStack;
                        newItem.ItemId = m_items[index].ItemId;
                        m_items[index] = newItem;

                        newItem.Amount = newStackVal;
                        newItem.ItemId = GetNextItemID();
                        newItem.Content = objectBuilder.Clone() as MyObjectBuilder_PhysicalObject;
                        m_items.Add(newItem);
                    }
                    else
                    {
                        newItem.Amount += m_items[index].Amount;
                        newItem.ItemId = m_items[index].ItemId;
                        m_items[index] = newItem;
                    }
                }
                else
                {
                    newItem.ItemId = GetNextItemID();
                    m_items.Insert(index, newItem);
                }
            }
            else
            {
                bool add = true;
                bool canStackWithItself = newItem.Content.CanStack(newItem.Content);
                if (index < 0 && canStackWithItself && stack)
                {
                    int? itemPos = FindFirstStackablePosition(objectBuilder, maxStack - amount);
                    if (itemPos.HasValue)
                    {
                        newItem.ItemId = m_items[itemPos.Value].ItemId;
                        newItem.Amount += m_items[itemPos.Value].Amount;
                        m_items[itemPos.Value] = newItem;
                        add = false;
                    }
                }
                if (add)
                {
                    MyFixedPoint stackSize = canStackWithItself ? MyFixedPoint.Min(maxStack, amount) : 1;
                    var targetAmount = newItem.Amount;
                    MyFixedPoint addAmount = stackSize;
                    while (targetAmount > 0)
                    {
                        targetAmount -= stackSize;
                        if (targetAmount < 0)
                            addAmount = targetAmount + stackSize;
                        newItem.Amount = addAmount;
                        newItem.ItemId = itemId.HasValue ? itemId.Value : GetNextItemID();
                        itemId = null; // so we use NextItemID next time
                        m_items.Add(newItem);
                        newItem.Content = newItem.Content.Clone() as MyObjectBuilder_PhysicalObject;
                        Debug.Assert(newItem.Content != null);
                    }
                }
            }

            RefreshVolumeAndMass();

            VerifyIntegrity();

            OnContentsChanged();
        }
 public bool RemoveItems(int count, MyObjectBuilder_PhysicalObject physicalObject)
 {
     return RemoveItems(count, physicalObject.GetId(), physicalObject.Flags);
 }
 public bool AddItems(MyInventory inventory, MyObjectBuilder_PhysicalObject obj, bool overrideCheck, MyFixedPoint amount)
 {
     if (overrideCheck || !inventory.ContainItems(amount, obj))
     {
         if (inventory.CanItemsBeAdded(amount, obj.GetId()))
         {
             inventory.AddItems(amount, obj);
             return true;
         }
         else
         {
             return false;
         }
     }
     else
     {
         return false;
     }
 }