public int AvailableVolume <E>(E enumerator, VoxelPlacementDefinition definition) where E : IEnumerator <MyInventoryBase>
        {
            var placements = AvailablePlacements(enumerator, definition);
            var result     = placements * (long)definition.Volume + _buffered;

            enumerator.Reset();
            return(result > int.MaxValue ? int.MaxValue : (int)result);
        }
        public bool ConsumeVolume <E>(E enumerator, VoxelPlacementDefinition definition, int volume) where E : IEnumerator <MyInventoryBase>
        {
            if (_buffered > volume)
            {
                _buffered -= volume;
                return(true);
            }

            var placements = (int)Math.Ceiling((volume - _buffered) / (double)definition.Volume);

            placements = Math.Min(placements, AvailablePlacements(enumerator, definition));
            var success = true;

            foreach (var item in definition.Items)
            {
                var required = item.Value * placements;
                enumerator.Reset();
                while (enumerator.MoveNext())
                {
                    var inv            = enumerator.Current;
                    var amountToRemove = Math.Min(required, inv.GetItemAmountFuzzy(item.Key));
                    if (amountToRemove <= 0)
                    {
                        continue;
                    }
                    if (inv.RemoveItemsFuzzy(item.Key, amountToRemove))
                    {
                        required -= amountToRemove;
                    }
                    if (required <= 0)
                    {
                        break;
                    }
                }

                success &= required <= 0;
            }

            var totalAvailable = placements * (long)definition.Volume + _buffered;

            totalAvailable -= volume;
            _buffered       = totalAvailable > int.MaxValue ? int.MaxValue : (int)totalAvailable;
            return(success && _buffered < 0);
        }
        private int AvailablePlacements <E>(E enumerator, VoxelPlacementDefinition definition) where E : IEnumerator <MyInventoryBase>
        {
            var placements = int.MaxValue;

            foreach (var item in definition.Items)
            {
                var count = 0;
                enumerator.Reset();
                while (enumerator.MoveNext())
                {
                    var inv = enumerator.Current;
                    count += inv.GetItemAmountFuzzy(item.Key);
                }

                placements = Math.Min(count / item.Value, placements);
                if (placements == 0)
                {
                    break;
                }
            }

            return(placements);
        }
 public bool ConsumeVolume(MyInventoryBase inv, VoxelPlacementDefinition definition, int amount) =>
 ConsumeVolume(new SingletonEnumerator <MyInventoryBase>(inv), definition, amount);
 public int AvailableVolume(MyInventoryBase inv, VoxelPlacementDefinition definition) =>
 AvailableVolume(new SingletonEnumerator <MyInventoryBase>(inv), definition);