From fd4a73210be58f66b75cafbb48769dff67372d74 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Tue, 13 Dec 2016 22:27:50 +0100 Subject: [PATCH] Added regulator mode to Exporter, fixes #684 --- CHANGELOG.md | 1 + .../container/ContainerExporter.java | 13 ++++- .../refinedstorage/tile/TileExporter.java | 56 +++++++++++++++---- 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b58ebf8..fd8a21d08 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### 1.3.5 - Fixed Controller not using energy (raoulvdberge) +- Added regulator mode to Exporter (InusualZ) ### 1.3.4 - Added option to check for oredict in the Grid Filter (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java index 5e9d9f26c..5bbe1f23a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java @@ -9,15 +9,26 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerExporter extends ContainerBase { + private TileExporter exporter; + public ContainerExporter(TileExporter exporter, EntityPlayer player) { super(exporter, player); + this.exporter = exporter; + + initSlots(); + } + + public void initSlots() { + this.inventorySlots.clear(); + this.inventoryItemStacks.clear(); + for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(exporter.getUpgrades(), i, 187, 6 + (i * 18))); } for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotFilterType(exporter, i, 8 + (18 * i), 20, TileExporter.REGULATOR.getValue() ? SlotFilter.FILTER_ALLOW_SIZE : 0)); + addSlotToContainer(new SlotFilterType(exporter, i, 8 + (18 * i), 20, exporter.isRegulator() ? SlotFilter.FILTER_ALLOW_SIZE : 0)); } addPlayerInventory(8, 55); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java index 70e47fc3e..c3fcd3d06 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileExporter.java @@ -4,6 +4,8 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.container.ContainerExporter; +import com.raoulvdberge.refinedstorage.gui.GuiExporter; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerUpgrade; @@ -11,8 +13,10 @@ import com.raoulvdberge.refinedstorage.item.ItemUpgrade; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.tile.data.ITileDataConsumer; +import com.raoulvdberge.refinedstorage.tile.data.ITileDataListener; import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; +import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.datasync.DataSerializers; @@ -39,9 +43,34 @@ public class TileExporter extends TileNode implements IComparable, IType { }, new ITileDataConsumer() { @Override public void setValue(TileExporter tile, Boolean value) { + if (!value && tile.regulator) { + for (int i = 0; i < tile.itemFilters.getSlots() + tile.fluidFilters.getSlots(); ++i) { + ItemStack slot = i >= tile.itemFilters.getSlots() ? tile.fluidFilters.getStackInSlot(i - tile.itemFilters.getSlots()) : tile.itemFilters.getStackInSlot(i); + + if (!slot.isEmpty()) { + slot.setCount(1); + } + } + } + tile.regulator = value; tile.markDirty(); + + tile.getWorld().getMinecraftServer().getPlayerList().getPlayers().stream() + .filter(player -> player.openContainer instanceof ContainerExporter && ((ContainerExporter) player.openContainer).getTile().getPos().equals(tile.getPos())) + .forEach(player -> { + ((ContainerExporter) player.openContainer).initSlots(); + + player.openContainer.detectAndSendChanges(); + }); + } + }, new ITileDataListener() { + @Override + public void onChanged(TileDataParameter parameter) { + if (Minecraft.getMinecraft().currentScreen instanceof GuiExporter) { + ((ContainerExporter) ((GuiExporter) Minecraft.getMinecraft().currentScreen).inventorySlots).initSlots(); + } } }); @@ -81,15 +110,18 @@ public class TileExporter extends TileNode implements IComparable, IType { if (!slot.isEmpty()) { int stackSize = upgrades.getItemInteractCount(); + boolean skipSlot = false; + if (regulator) { for (int index = 0; i < handler.getSlots() && !skipSlot; i++) { - ItemStack handlerStack = handler.getStackInSlot(index); - if (API.instance().getComparer().isEqual(slot, handlerStack, compare)) { - if (handlerStack.getCount() >= slot.getCount()) { + ItemStack exporterStack = handler.getStackInSlot(index); + + if (API.instance().getComparer().isEqual(slot, exporterStack, compare)) { + if (exporterStack.getCount() >= slot.getCount()) { skipSlot = true; } else { - stackSize = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? slot.getCount() - handlerStack.getCount() : 1; + stackSize = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? slot.getCount() - exporterStack.getCount() : 1; } } } @@ -123,16 +155,20 @@ public class TileExporter extends TileNode implements IComparable, IType { if (stackInStorage != null) { int toExtract = Math.min(Fluid.BUCKET_VOLUME * upgrades.getItemInteractCount(), stackInStorage.amount); + boolean skipSlot = false; + if (regulator) { for (IFluidTankProperties tankProperty : handler.getTankProperties()) { - FluidStack fluidStack = tankProperty.getContents(); - if (API.instance().getComparer().isEqual(stackInStorage, fluidStack, compare)) { - if (fluidStack.amount >= stack.amount * Fluid.BUCKET_VOLUME) { + FluidStack exporterStack = tankProperty.getContents(); + + if (API.instance().getComparer().isEqual(stackInStorage, exporterStack, compare)) { + if (exporterStack.amount >= stack.amount * Fluid.BUCKET_VOLUME) { skipSlot = true; + break; } else { - toExtract = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? stack.amount * Fluid.BUCKET_VOLUME - fluidStack.amount : Fluid.BUCKET_VOLUME; + toExtract = upgrades.hasUpgrade(ItemUpgrade.TYPE_STACK) ? stack.amount * Fluid.BUCKET_VOLUME - exporterStack.amount : Fluid.BUCKET_VOLUME; toExtract = Math.min(toExtract, stackInStorage.amount); } } @@ -247,8 +283,8 @@ public class TileExporter extends TileNode implements IComparable, IType { markDirty(); } - public boolean isRegulated() { - return this.regulator; + public boolean isRegulator() { + return !getWorld().isRemote ? regulator : REGULATOR.getValue(); } @Override