/// <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); }
/// <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); }
/// <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); }