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