コード例 #1
0
        /// <summary>
        /// Push all components into destinations
        /// </summary>
        public static bool PushComponents(this IMyInventory srcInventory, List <IMyInventory> destinations, ExcludeInventory exclude)
        {
            var moved = false;

            lock (destinations)
            {
                var srcItems = new List <MyInventoryItem>();
                srcInventory.GetItems(srcItems);
                for (int srcItemIndex = srcItems.Count - 1; srcItemIndex >= 0; srcItemIndex--)
                {
                    var srcItem = srcItems[srcItemIndex];
                    moved = TryTransferItemTo(srcInventory, destinations, srcItemIndex, srcItem, true, exclude) || moved;
                }

                if (!moved)
                {
                    srcItems.Clear();
                    srcInventory.GetItems(srcItems);
                    for (int srcItemIndex = srcItems.Count - 1; srcItemIndex >= 0; srcItemIndex--)
                    {
                        var srcItem = srcItems[srcItemIndex];
                        moved = TryTransferItemTo(srcInventory, destinations, srcItemIndex, srcItem, false, exclude) || moved;
                    }
                }
            }
            return(moved);
        }
コード例 #2
0
        /// <summary>
        /// Push given items into destinations
        /// </summary>
        public static bool PushComponents(this IMyInventory srcInventory, List <IMyInventory> destinations, ExcludeInventory exclude, int srcItemIndex, MyInventoryItem srcItem)
        {
            var moved = false;

            lock (destinations)
            {
                moved = TryTransferItemTo(srcInventory, destinations, srcItemIndex, srcItem, true, exclude);
                if (!moved)
                {
                    moved = TryTransferItemTo(srcInventory, destinations, srcItemIndex, srcItem, false, exclude);
                }
            }
            return(moved);
        }
コード例 #3
0
        /// <summary>
        /// Moves as many as possible from srcInventory to destinations
        /// </summary>
        private static bool TryTransferItemTo(IMyInventory srcInventory, List <IMyInventory> destinations, int srcItemIndex, MyInventoryItem srcItem, bool all, ExcludeInventory exclude)
        {
            var moved = false;

            if (all)
            {
                foreach (var destInventory in destinations)
                {
                    if (exclude != null && exclude(destInventory, srcInventory, ref srcItem))
                    {
                        continue;
                    }
                    if (destInventory.CanItemsBeAdded(srcItem.Amount, srcItem.Type) && srcInventory.CanTransferItemTo(destInventory, srcItem.Type))
                    {
                        moved = srcInventory.TransferItemTo(destInventory, srcItemIndex, null, true, srcItem.Amount, false);
                        if (moved)
                        {
                            break;
                        }
                    }
                }
                return(moved);
            }

            foreach (var destInventory in destinations)
            {
                if (exclude != null && exclude(destInventory, srcInventory, ref srcItem))
                {
                    continue;
                }
                if (srcInventory.CanTransferItemTo(destInventory, srcItem.Type))
                {
                    var amount = destInventory.MaxItemsAddable(srcItem.Amount, srcItem.Type);
                    if (amount > 0)
                    {
                        moved = srcInventory.TransferItemTo(destInventory, srcItemIndex, null, true, amount, true) || moved;
                        if (srcItem.Amount <= 0)
                        {
                            break;
                        }
                    }
                }
            }
            return(moved);
        }