From 511104c94831acd002d1924cccce84085e1819e2 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Thu, 20 Sep 2018 20:26:34 +0200 Subject: [PATCH] Fixed unintuitive behavior with stacked crafters and crafter redstone mode. Fixes #1992 --- .../network/node/NetworkNodeCrafter.java | 23 +++++++++++++++++++ .../refinedstorage/gui/GuiCrafter.java | 2 -- .../refinedstorage/tile/TileCrafter.java | 11 +++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java index 6245413ba..28d4296d5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCrafter.java @@ -27,6 +27,7 @@ import net.minecraftforge.items.wrapper.CombinedInvWrapper; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.UUID; public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternContainer { @@ -354,6 +355,16 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC return facingContainer; } + public Optional getRootContainerNotSelf() { + ICraftingPatternContainer root = getRootContainer(); + + if (root != null && root != this) { + return Optional.of(root); + } + + return Optional.empty(); + } + @Override public UUID getUuid() { if (this.uuid == null) { @@ -367,6 +378,11 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC @Override public boolean isLocked() { + Optional root = getRootContainerNotSelf(); + if (root.isPresent()) { + return root.get().isLocked(); + } + switch (mode) { case IGNORE: return false; @@ -383,6 +399,13 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC @Override public void onUsedForProcessing() { + Optional root = getRootContainerNotSelf(); + if (root.isPresent()) { + root.get().onUsedForProcessing(); + + return; + } + if (mode == CrafterMode.PULSE_INSERTS_NEXT_SET) { this.locked = true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java index 21e41c181..b52e18e10 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCrafter.java @@ -1,7 +1,6 @@ package com.raoulvdberge.refinedstorage.gui; import com.raoulvdberge.refinedstorage.container.ContainerCrafter; -import com.raoulvdberge.refinedstorage.gui.control.SideButtonCrafterMode; import com.raoulvdberge.refinedstorage.tile.TileCrafter; import com.raoulvdberge.refinedstorage.util.RenderUtils; @@ -12,7 +11,6 @@ public class GuiCrafter extends GuiBase { @Override public void init(int x, int y) { - addSideButton(new SideButtonCrafterMode(this)); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileCrafter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileCrafter.java index 1b0526f79..7a9e0e7a0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileCrafter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileCrafter.java @@ -1,6 +1,9 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeCrafter; +import com.raoulvdberge.refinedstorage.gui.GuiBase; +import com.raoulvdberge.refinedstorage.gui.GuiCrafter; +import com.raoulvdberge.refinedstorage.gui.control.SideButtonCrafterMode; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.util.EnumFacing; @@ -15,10 +18,18 @@ import javax.annotation.Nullable; public class TileCrafter extends TileNode { public static final TileDataParameter NAME = new TileDataParameter<>(DataSerializers.STRING, NetworkNodeCrafter.DEFAULT_NAME, t -> t.getNode().getName()); public static final TileDataParameter MODE = new TileDataParameter<>(DataSerializers.VARINT, NetworkNodeCrafter.CrafterMode.IGNORE.ordinal(), t -> t.getNode().getMode().ordinal(), (t, v) -> t.getNode().setMode(NetworkNodeCrafter.CrafterMode.getById(v))); + public static final TileDataParameter HAS_ROOT = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().getRootContainerNotSelf().isPresent(), null, (t, hasRoot) -> { + if (!hasRoot) { + GuiBase.executeLater(GuiCrafter.class, gui -> { + gui.addSideButton(new SideButtonCrafterMode(gui)); + }); + } + }); public TileCrafter() { dataManager.addWatchedParameter(NAME); dataManager.addWatchedParameter(MODE); + dataManager.addParameter(HAS_ROOT); } @Override