diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidIO.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidIO.java index d753fe7a..da2b88d6 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidIO.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidIO.java @@ -3,11 +3,13 @@ package com.glodblock.github.client.gui; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; +import appeng.api.config.Upgrades; import appeng.api.storage.data.IAEFluidStack; import appeng.client.gui.implementations.GuiUpgradeable; import appeng.core.localization.GuiText; import com.glodblock.github.client.gui.container.ContainerFluidIO; +import com.glodblock.github.common.parts.PartFluidExportBus; import com.glodblock.github.common.parts.PartFluidImportBus; import com.glodblock.github.common.parts.base.FCSharedFluidBus; import com.glodblock.github.util.NameConst; @@ -58,4 +60,13 @@ public class GuiFluidIO extends GuiUpgradeable { this.schedulingMode.set(this.cvb.getSchedulingMode()); } } + + @Override + protected void handleButtonVisibility() { + super.handleButtonVisibility(); + if (this.schedulingMode != null) { + this.schedulingMode.setVisibility( + this.bc.getInstalledUpgrades(Upgrades.CAPACITY) > 0 && this.bc instanceof PartFluidExportBus); + } + } } diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidIO.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidIO.java index 0efe9383..3c07d56f 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidIO.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidIO.java @@ -2,6 +2,7 @@ package com.glodblock.github.client.gui.container; import net.minecraft.entity.player.InventoryPlayer; +import appeng.api.config.SchedulingMode; import appeng.api.config.Settings; import appeng.api.config.YesNo; import appeng.api.util.IConfigManager; @@ -35,6 +36,11 @@ public class ContainerFluidIO extends FCContainerFluidConfigurable { super.loadSettingsFromHost(cm); if (Ae2Reflect.getUpgradeableHost(this) instanceof PartFluidExportBus) { this.setCraftingMode((YesNo) cm.getSetting(Settings.CRAFT_ONLY)); + this.setSchedulingMode((SchedulingMode) cm.getSetting(Settings.SCHEDULING_MODE)); } } + + public void setSchedulingMode(final SchedulingMode schedulingMode) { + this.schedulingMode = schedulingMode; + } } diff --git a/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java b/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java index b7f7d478..67518f1b 100644 --- a/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java +++ b/src/main/java/com/glodblock/github/common/parts/PartFluidExportBus.java @@ -1,6 +1,7 @@ package com.glodblock.github.common.parts; import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; @@ -26,6 +27,7 @@ import appeng.core.AELog; import appeng.helpers.MultiCraftingTracker; import appeng.me.GridAccessException; import appeng.util.InventoryAdaptor; +import appeng.util.Platform; import appeng.util.item.AEFluidStack; import appeng.util.item.AEItemStack; @@ -43,6 +45,9 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq private final BaseActionSource source; private final MultiCraftingTracker craftingTracker = new MultiCraftingTracker(this, 9); + private int nextSlot = 0; + private long fluidToSend = 1000; + private boolean didSomething; public PartFluidExportBus(ItemStack is) { super(is); @@ -73,12 +78,33 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq return this.getProxy().isActive(); } + private int getStartingSlot(final SchedulingMode schedulingMode, final int x) { + if (schedulingMode == SchedulingMode.RANDOM) { + return Platform.getRandom().nextInt(this.availableSlots()); + } + + if (schedulingMode == SchedulingMode.ROUNDROBIN) { + return (this.nextSlot + x) % this.availableSlots(); + } + + return x; + } + + private int availableSlots() { + return Math.min(1 + this.getInstalledUpgrades(Upgrades.CAPACITY) * 4, this.getInv().getSizeInventory()); + } + + private IInventory getInv() { + return this.getInventoryByName("config"); + } + @Override protected TickRateModulation doBusWork() { if (!this.canDoBusWork()) { return TickRateModulation.IDLE; } - + this.didSomething = false; + this.fluidToSend = this.calculateAmountToSend(); final TileEntity te = this.getConnectedTE(); if (te instanceof IFluidHandler) { @@ -87,10 +113,11 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq final ICraftingGrid cg = this.getProxy().getCrafting(); final IFluidHandler fh = (IFluidHandler) te; final IMEMonitor inv = this.getProxy().getStorage().getFluidInventory(); - - for (int i = 0; i < this.getInventoryByName("config").getSizeInventory(); i++) { + int i; + for (i = 0; i < this.availableSlots() && this.fluidToSend > 0; i++) { + final int slotToExport = this.getStartingSlot(this.getSchedulingMode(), i); IAEFluidStack fluid = AEFluidStack - .create(ItemFluidPacket.getFluidStack(this.getInventoryByName("config").getStackInSlot(i))); + .create(ItemFluidPacket.getFluidStack(getInv().getStackInSlot(slotToExport))); if (fluid != null) { boolean isAllowed = true; @@ -118,10 +145,9 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq toExtract.setStackSize(real.getStackSize() - realInserted); inv.injectItems(toExtract, Actionable.MODULATE, this.source); } - return TickRateModulation.FASTER; - } - - if (this.isCraftingEnabled()) { + this.fluidToSend -= realInserted; + didSomething = true; + } else if (this.isCraftingEnabled()) { this.craftingTracker.handleCrafting( i, toExtract.getStackSize(), @@ -134,8 +160,8 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq } } } - - return TickRateModulation.SLOWER; + this.updateSchedulingMode(this.getSchedulingMode(), i); + return didSomething ? TickRateModulation.FASTER : TickRateModulation.SLOWER; } catch (GridAccessException e) { // Ignore } @@ -144,6 +170,12 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq return TickRateModulation.SLEEP; } + private void updateSchedulingMode(final SchedulingMode schedulingMode, final int x) { + if (schedulingMode == SchedulingMode.ROUNDROBIN) { + this.nextSlot = (this.nextSlot + x) % this.availableSlots(); + } + } + @Override public void getBoxes(final IPartCollisionHelper bch) { bch.addBox(4, 4, 12, 12, 12, 14); @@ -214,6 +246,10 @@ public class PartFluidExportBus extends FCSharedFluidBus implements ICraftingReq return (RedstoneMode) this.getConfigManager().getSetting(Settings.REDSTONE_CONTROLLED); } + public SchedulingMode getSchedulingMode() { + return (SchedulingMode) this.getConfigManager().getSetting(Settings.SCHEDULING_MODE); + } + private boolean craftOnly() { return this.getConfigManager().getSetting(Settings.CRAFT_ONLY) == YesNo.YES; }