diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPattern.java index 952601616..bf028f39b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPattern.java @@ -35,6 +35,11 @@ public interface ICraftingPattern { */ boolean isOredict(); + /** + * @return true if the crafting pattern may block crafting step + */ + boolean isBlocking(); + /** * @return the inputs, can contain nulls */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java index 99d0e7f50..bbcf0414e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingPatternContainer.java @@ -34,4 +34,8 @@ public interface ICraftingPatternContainer { * @return the position of this container */ BlockPos getPosition(); + + boolean isBlocked(); + + void setBlocked(boolean value); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index cbbedd7a5..f6074e9ba 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -168,6 +168,11 @@ public class CraftingPattern implements ICraftingPattern { return ItemPattern.isOredict(stack); } + @Override + public boolean isBlocking() { + return ItemPattern.isBlocking(stack); + } + @Override public List getInputs() { return inputs; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java index 3bc58d1d2..b34721322 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java @@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternProvider; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingStep; +import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IStackList; @@ -109,6 +110,10 @@ public abstract class CraftingStep implements ICraftingStep { @Override public void setStartedProcessing() { + if (getPattern().isBlocking()) { + getPattern().getContainer().setBlocked(true); + } + startedProcessing = true; } @@ -126,6 +131,10 @@ public abstract class CraftingStep implements ICraftingStep { } } + if (getPattern().isBlocking()) { + getPattern().getContainer().setBlocked(false); + } + return true; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index a64cae916..5826107b4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -294,6 +294,12 @@ public class CraftingTask implements ICraftingTask { network.insertItemTracked(stack, stack.getCount()); } + for (ICraftingStep step : getSteps()) { + if (step.getPattern().isBlocking()) { + step.getPattern().getContainer().setBlocked(false); + } + } + network.markCraftingMonitorForUpdate(); } @@ -348,11 +354,13 @@ public class CraftingTask implements ICraftingTask { } if (timesUsed++ <= container.getSpeedUpdateCount()) { - if (!step.hasStartedProcessing() && step.canStartProcessing(oreDictPrepped, networkFluids)) { - step.setStartedProcessing(); - step.execute(toInsertItems, toInsertFluids); - usedContainers.put(container, timesUsed); - network.markCraftingMonitorForUpdate(); + if (!step.getPattern().isProcessing() || !container.isBlocked()) { + if (!step.hasStartedProcessing() && step.canStartProcessing(oreDictPrepped, networkFluids)) { + step.setStartedProcessing(); + step.execute(toInsertItems, toInsertFluids); + usedContainers.put(container, timesUsed); + network.markCraftingMonitorForUpdate(); + } } } } @@ -535,6 +543,8 @@ public class CraftingTask implements ICraftingTask { element = new CraftingMonitorElementError(element, "gui.refinedstorage:crafting_monitor.machine_none"); } else if (!step.hasStartedProcessing() && !step.canStartProcessing()) { element = new CraftingMonitorElementError(element, "gui.refinedstorage:crafting_monitor.machine_in_use"); + } else if (!step.hasStartedProcessing() && step.getPattern().getContainer().isBlocked()) { + element = new CraftingMonitorElementError(element, "gui.refinedstorage:crafting_monitor.blocked"); } elements.add(element); 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 8e44ebad0..134dd5b9d 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 @@ -25,6 +25,7 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC public static final String ID = "crafter"; private static final String NBT_TRIGGERED_AUTOCRAFTING = "TriggeredAutocrafting"; + private static final String NBT_BLOCKED = "Blocked"; private ItemHandlerBasic patterns = new ItemHandlerBasic(9, new ItemHandlerListenerNetworkNode(this), s -> { // We can only validate the crafting pattern if the world exists. @@ -54,6 +55,7 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC private ItemHandlerUpgrade upgrades = new ItemHandlerUpgrade(4, new ItemHandlerListenerNetworkNode(this), ItemUpgrade.TYPE_SPEED); private boolean triggeredAutocrafting = false; + private boolean blocked = false; public NetworkNodeCrafter(INetworkNodeHolder holder) { super(holder); @@ -124,6 +126,10 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC RSUtils.readItems(patterns, 0, tag); RSUtils.readItems(upgrades, 1, tag); + + if (tag.hasKey(NBT_BLOCKED)) { + blocked = tag.getBoolean(NBT_BLOCKED); + } } @Override @@ -138,6 +144,8 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC RSUtils.writeItems(patterns, 0, tag); RSUtils.writeItems(upgrades, 1, tag); + tag.setBoolean(NBT_BLOCKED, blocked); + return tag; } @@ -204,4 +212,16 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC public boolean hasConnectivityState() { return true; } + + @Override + public boolean isBlocked() { + return blocked; + } + + @Override + public void setBlocked(boolean value) { + blocked = value; + + markDirty(); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiProcessingPatternEncoder.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiProcessingPatternEncoder.java index 4506fa783..7a9afdb21 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiProcessingPatternEncoder.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiProcessingPatternEncoder.java @@ -18,6 +18,7 @@ public class GuiProcessingPatternEncoder extends GuiBase { private TileProcessingPatternEncoder encoder; private GuiCheckBox oredictPattern; + private GuiCheckBox blockingPattern; public GuiProcessingPatternEncoder(ContainerProcessingPatternEncoder container, TileProcessingPatternEncoder encoder) { super(container, 176, 183); @@ -28,6 +29,7 @@ public class GuiProcessingPatternEncoder extends GuiBase { @Override public void init(int x, int y) { oredictPattern = addCheckBox(x + 7, y + 76, I18n.format("misc.refinedstorage:oredict"), TileProcessingPatternEncoder.OREDICT_PATTERN.getValue()); + blockingPattern = addCheckBox(x + 60, y + 76, I18n.format("misc.refinedstorage:blocking"), TileProcessingPatternEncoder.BLOCKING_TASK_PATTERN.getValue()); } @Override @@ -81,6 +83,8 @@ public class GuiProcessingPatternEncoder extends GuiBase { if (button == oredictPattern) { TileDataManager.setParameter(TileProcessingPatternEncoder.OREDICT_PATTERN, oredictPattern.isChecked()); + } else if (button == blockingPattern) { + TileDataManager.setParameter(TileProcessingPatternEncoder.BLOCKING_TASK_PATTERN, blockingPattern.isChecked()); } } @@ -104,4 +108,10 @@ public class GuiProcessingPatternEncoder extends GuiBase { oredictPattern.setIsChecked(checked); } } + + public void updateBlockingPattern(boolean checked) { + if (blockingPattern != null) { + blockingPattern.setIsChecked(checked); + } + } } \ No newline at end of file diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java index 5490c0eaa..13005c543 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemPattern.java @@ -35,6 +35,7 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider { private static final String NBT_SLOT = "Slot_%d"; private static final String NBT_OUTPUTS = "Outputs"; private static final String NBT_OREDICT = "Oredict"; + private static final String NBT_BLOCKING = "Blocking"; public ItemPattern() { super("pattern"); @@ -70,6 +71,10 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider { if (isOredict(stack)) { tooltip.add(TextFormatting.BLUE + I18n.format("misc.refinedstorage:pattern.oredict") + TextFormatting.RESET); } + + if (isBlocking(stack)) { + tooltip.add(TextFormatting.BLUE + I18n.format("misc.refinedstorage:blocking") + TextFormatting.RESET); + } } else { tooltip.add(TextFormatting.RED + I18n.format("misc.refinedstorage:pattern.invalid") + TextFormatting.RESET); @@ -159,6 +164,10 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider { return pattern.hasTagCompound() && pattern.getTagCompound().hasKey(NBT_OREDICT) && pattern.getTagCompound().getBoolean(NBT_OREDICT); } + public static boolean isBlocking(ItemStack pattern) { + return pattern.hasTagCompound() && pattern.getTagCompound().hasKey(NBT_BLOCKING) && pattern.getTagCompound().getBoolean(NBT_BLOCKING); + } + public static void setOredict(ItemStack pattern, boolean oredict) { if (!pattern.hasTagCompound()) { pattern.setTagCompound(new NBTTagCompound()); @@ -167,6 +176,14 @@ public class ItemPattern extends ItemBase implements ICraftingPatternProvider { pattern.getTagCompound().setBoolean(NBT_OREDICT, oredict); } + public static void setBlocking(ItemStack pattern, boolean blockingTask) { + if (!pattern.hasTagCompound()) { + pattern.setTagCompound(new NBTTagCompound()); + } + + pattern.getTagCompound().setBoolean(NBT_BLOCKING, blockingTask); + } + public static void combineItems(List tooltip, boolean displayAmount, NonNullList stacks) { Set combinedIndices = new HashSet<>(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileProcessingPatternEncoder.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileProcessingPatternEncoder.java index e0fa1672c..8079c4a35 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileProcessingPatternEncoder.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileProcessingPatternEncoder.java @@ -23,6 +23,7 @@ import javax.annotation.Nullable; public class TileProcessingPatternEncoder extends TileBase { private static final String NBT_OREDICT_PATTERN = "OredictPattern"; + private static final String NBT_BLOCKING_PATTERN = "BlockingPattern"; public static final TileDataParameter OREDICT_PATTERN = new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer() { @Override @@ -42,13 +43,33 @@ public class TileProcessingPatternEncoder extends TileBase { } }); + public static final TileDataParameter BLOCKING_TASK_PATTERN = new TileDataParameter<>(DataSerializers.BOOLEAN, false, new ITileDataProducer() { + @Override + public Boolean getValue(TileProcessingPatternEncoder tile) { + return tile.blockingTask; + } + }, new ITileDataConsumer() { + @Override + public void setValue(TileProcessingPatternEncoder tile, Boolean value) { + tile.blockingTask = value; + + tile.markDirty(); + } + }, parameter -> { + if (Minecraft.getMinecraft().currentScreen instanceof GuiProcessingPatternEncoder) { + ((GuiProcessingPatternEncoder) Minecraft.getMinecraft().currentScreen).updateBlockingPattern(parameter.getValue()); + } + }); + private ItemHandlerBasic patterns = new ItemHandlerBasic(2, new ItemHandlerListenerTile(this), new ItemValidatorBasic(RSItems.PATTERN)); private ItemHandlerBasic configuration = new ItemHandlerBasic(9 * 2, new ItemHandlerListenerTile(this)); private boolean oredictPattern; + private boolean blockingTask = false; public TileProcessingPatternEncoder() { dataManager.addWatchedParameter(OREDICT_PATTERN); + dataManager.addWatchedParameter(BLOCKING_TASK_PATTERN); } @Override @@ -59,6 +80,7 @@ public class TileProcessingPatternEncoder extends TileBase { RSUtils.writeItems(configuration, 1, tag); tag.setBoolean(NBT_OREDICT_PATTERN, oredictPattern); + tag.setBoolean(NBT_BLOCKING_PATTERN, blockingTask); return tag; } @@ -73,6 +95,10 @@ public class TileProcessingPatternEncoder extends TileBase { if (tag.hasKey(NBT_OREDICT_PATTERN)) { oredictPattern = tag.getBoolean(NBT_OREDICT_PATTERN); } + + if (tag.hasKey(NBT_BLOCKING_PATTERN)) { + blockingTask = tag.getBoolean(NBT_BLOCKING_PATTERN); + } } public void onCreatePattern() { @@ -80,6 +106,7 @@ public class TileProcessingPatternEncoder extends TileBase { ItemStack pattern = new ItemStack(RSItems.PATTERN); ItemPattern.setOredict(pattern, oredictPattern); + ItemPattern.setBlocking(pattern, blockingTask); for (int i = 0; i < 18; ++i) { if (!configuration.getStackInSlot(i).isEmpty()) { diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 8a035df83..54be74381 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -29,6 +29,7 @@ gui.refinedstorage:crafting_monitor.items_missing=Items missing gui.refinedstorage:crafting_monitor.machine_in_use=Machine is in use gui.refinedstorage:crafting_monitor.machine_none=No machine found gui.refinedstorage:crafting_monitor.waiting_for_items=Waiting for items +gui.refinedstorage:crafting_monitor.blocked=Blocked, waiting on other task gui.refinedstorage:wireless_transmitter=Wireless Transmitter gui.refinedstorage:wireless_transmitter.distance=%d blocks gui.refinedstorage:crafter=Crafter @@ -101,6 +102,7 @@ misc.refinedstorage:set=Set misc.refinedstorage:cancel_all=Cancel All misc.refinedstorage:priority=Priority misc.refinedstorage:oredict=Oredict +misc.refinedstorage:blocking=Blocking sidebutton.refinedstorage:compare.1=Compare damage sidebutton.refinedstorage:compare.2=Compare NBT