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 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<ICraftingPatternContainer> 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<ICraftingPatternContainer> 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<ICraftingPatternContainer> root = getRootContainerNotSelf();
if (root.isPresent()) {
root.get().onUsedForProcessing();
return;
}
if (mode == CrafterMode.PULSE_INSERTS_NEXT_SET) {
this.locked = true;

View File

@@ -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

View File

@@ -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<NetworkNodeCrafter> {
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<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() {
dataManager.addWatchedParameter(NAME);
dataManager.addWatchedParameter(MODE);
dataManager.addParameter(HAS_ROOT);
}
@Override