Fixed unintuitive behavior with stacked crafters and crafter redstone mode. Fixes #1992

This commit is contained in:
raoulvdberge
2018-09-20 20:26:34 +02:00
parent 02b6d03c8b
commit 511104c948
3 changed files with 34 additions and 2 deletions

View File

@@ -27,6 +27,7 @@ import net.minecraftforge.items.wrapper.CombinedInvWrapper;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternContainer { public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternContainer {
@@ -354,6 +355,16 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC
return facingContainer; return facingContainer;
} }
public Optional<ICraftingPatternContainer> getRootContainerNotSelf() {
ICraftingPatternContainer root = getRootContainer();
if (root != null && root != this) {
return Optional.of(root);
}
return Optional.empty();
}
@Override @Override
public UUID getUuid() { public UUID getUuid() {
if (this.uuid == null) { if (this.uuid == null) {
@@ -367,6 +378,11 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC
@Override @Override
public boolean isLocked() { public boolean isLocked() {
Optional<ICraftingPatternContainer> root = getRootContainerNotSelf();
if (root.isPresent()) {
return root.get().isLocked();
}
switch (mode) { switch (mode) {
case IGNORE: case IGNORE:
return false; return false;
@@ -383,6 +399,13 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC
@Override @Override
public void onUsedForProcessing() { public void onUsedForProcessing() {
Optional<ICraftingPatternContainer> root = getRootContainerNotSelf();
if (root.isPresent()) {
root.get().onUsedForProcessing();
return;
}
if (mode == CrafterMode.PULSE_INSERTS_NEXT_SET) { if (mode == CrafterMode.PULSE_INSERTS_NEXT_SET) {
this.locked = true; this.locked = true;

View File

@@ -1,7 +1,6 @@
package com.raoulvdberge.refinedstorage.gui; package com.raoulvdberge.refinedstorage.gui;
import com.raoulvdberge.refinedstorage.container.ContainerCrafter; import com.raoulvdberge.refinedstorage.container.ContainerCrafter;
import com.raoulvdberge.refinedstorage.gui.control.SideButtonCrafterMode;
import com.raoulvdberge.refinedstorage.tile.TileCrafter; import com.raoulvdberge.refinedstorage.tile.TileCrafter;
import com.raoulvdberge.refinedstorage.util.RenderUtils; import com.raoulvdberge.refinedstorage.util.RenderUtils;
@@ -12,7 +11,6 @@ public class GuiCrafter extends GuiBase {
@Override @Override
public void init(int x, int y) { public void init(int x, int y) {
addSideButton(new SideButtonCrafterMode(this));
} }
@Override @Override

View File

@@ -1,6 +1,9 @@
package com.raoulvdberge.refinedstorage.tile; package com.raoulvdberge.refinedstorage.tile;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeCrafter; 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 com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.network.datasync.DataSerializers; import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
@@ -15,10 +18,18 @@ import javax.annotation.Nullable;
public class TileCrafter extends TileNode<NetworkNodeCrafter> { public class TileCrafter extends TileNode<NetworkNodeCrafter> {
public static final TileDataParameter<String, TileCrafter> NAME = new TileDataParameter<>(DataSerializers.STRING, NetworkNodeCrafter.DEFAULT_NAME, t -> t.getNode().getName()); public static final TileDataParameter<String, TileCrafter> NAME = new TileDataParameter<>(DataSerializers.STRING, NetworkNodeCrafter.DEFAULT_NAME, t -> t.getNode().getName());
public static final TileDataParameter<Integer, TileCrafter> 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<Integer, TileCrafter> 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<Boolean, TileCrafter> 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() { public TileCrafter() {
dataManager.addWatchedParameter(NAME); dataManager.addWatchedParameter(NAME);
dataManager.addWatchedParameter(MODE); dataManager.addWatchedParameter(MODE);
dataManager.addParameter(HAS_ROOT);
} }
@Override @Override