diff --git a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java index 1c4e2c3ef..839c74b73 100755 --- a/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java +++ b/src/main/java/refinedstorage/api/autocrafting/task/ICraftingTask.java @@ -5,6 +5,8 @@ import net.minecraft.world.World; import refinedstorage.api.autocrafting.ICraftingPattern; import refinedstorage.api.network.INetworkMaster; +import javax.annotation.Nullable; + /** * Represents a crafting task. */ @@ -17,12 +19,13 @@ public interface ICraftingTask { /** * @return The child task */ + @Nullable ICraftingTask getChild(); /** * @param child The child task */ - void setChild(ICraftingTask child); + void setChild(@Nullable ICraftingTask child); /** * @param world The world diff --git a/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java b/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java index c9a5db79d..447f18b3f 100755 --- a/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java +++ b/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java @@ -51,7 +51,8 @@ public interface IItemGridHandler { /** * Called when a player wants to cancel a crafting task. * - * @param id The task ID, or -1 for all tasks + * @param id The task ID, or -1 for all tasks + * @param child Whether to only cancel the child of this crafting task */ - void onCraftingCancelRequested(int id); + void onCraftingCancelRequested(int id, boolean child); } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index d3fb3838c..afc77b2c4 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -3,16 +3,19 @@ package refinedstorage.apiimpl.autocrafting.task; import refinedstorage.api.autocrafting.task.ICraftingTask; import refinedstorage.api.network.INetworkMaster; +import javax.annotation.Nullable; + public abstract class CraftingTask implements ICraftingTask { protected ICraftingTask child; @Override + @Nullable public ICraftingTask getChild() { return child; } @Override - public void setChild(ICraftingTask child) { + public void setChild(@Nullable ICraftingTask child) { this.child = child; } diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index 3a9834c13..30937e554 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -142,9 +142,16 @@ public class ItemGridHandler implements IItemGridHandler { } @Override - public void onCraftingCancelRequested(int id) { + public void onCraftingCancelRequested(int id, boolean child) { if (id >= 0 && id < network.getCraftingTasks().size()) { - network.cancelCraftingTask(network.getCraftingTasks().get(id)); + ICraftingTask task = network.getCraftingTasks().get(id); + + if (child) { + task.getChild().onCancelled(network); + task.setChild(null); + } else { + network.cancelCraftingTask(task); + } } else if (id == -1) { for (ICraftingTask task : network.getCraftingTasks()) { network.cancelCraftingTask(task); diff --git a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java index 244bd0ce1..84025509c 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java @@ -156,9 +156,11 @@ public class GuiCraftingMonitor extends GuiBase { super.actionPerformed(button); if (button == cancelButton && itemSelected != -1) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, getTasks().get(itemSelected).getId())); + ClientCraftingTask task = getTasks().get(itemSelected); + + RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, task.getId(), task.isChild())); } else if (button == cancelAllButton && getTasks().size() > 0) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1)); + RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1, false)); } } diff --git a/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java b/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java index 48852412b..952a44e6d 100755 --- a/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java +++ b/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java @@ -12,15 +12,17 @@ public class MessageCraftingMonitorCancel extends MessageHandlerPlayerToServer tasks = tile.network.getCraftingTasks().stream().map(t -> new ClientCraftingTask( t.getStatus(), - t.getPattern().getOutputs() + t.getPattern().getOutputs(), + t.getChild() )).collect(Collectors.toList()); return tasks; diff --git a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java index 541325d9e..02a6c94b7 100755 --- a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java +++ b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java @@ -53,13 +53,23 @@ public final class RefinedStorageSerializers { buf.writeInt(tasks.size()); for (ClientCraftingTask task : tasks) { - ByteBufUtils.writeUTF8String(buf, task.getStatus()); + writeTask(buf, task); + } + } - buf.writeInt(task.getOutputs().length); + private void writeTask(PacketBuffer buf, ClientCraftingTask task) { + ByteBufUtils.writeUTF8String(buf, task.getStatus()); - for (ItemStack output : task.getOutputs()) { - ByteBufUtils.writeItemStack(buf, output); - } + buf.writeInt(task.getOutputs().length); + + for (ItemStack output : task.getOutputs()) { + ByteBufUtils.writeItemStack(buf, output); + } + + buf.writeBoolean(task.getChild() != null); + + if (task.getChild() != null) { + writeTask(buf, task.getChild()); } } @@ -70,13 +80,7 @@ public final class RefinedStorageSerializers { List tasks = new ArrayList<>(); for (int i = 0; i < size; ++i) { - String info = ByteBufUtils.readUTF8String(buf); - - int outputs = buf.readInt(); - - for (int j = 0; j < outputs; ++j) { - tasks.add(new ClientCraftingTask(ByteBufUtils.readItemStack(buf), i, info)); - } + readTask(buf, i, false, tasks); } Collections.reverse(tasks); @@ -84,6 +88,20 @@ public final class RefinedStorageSerializers { return tasks; } + private void readTask(PacketBuffer buf, int i, boolean isChild, List tasks) { + String status = ByteBufUtils.readUTF8String(buf); + + int outputs = buf.readInt(); + + for (int j = 0; j < outputs; ++j) { + tasks.add(new ClientCraftingTask(ByteBufUtils.readItemStack(buf), i, status, isChild)); + } + + if (buf.readBoolean()) { + readTask(buf, i, true, tasks); + } + } + @Override public DataParameter> createKey(int id) { return null;