diff --git a/src/main/java/refinedstorage/api/network/INetworkMaster.java b/src/main/java/refinedstorage/api/network/INetworkMaster.java index 1d9e5698c..1e49a90b4 100755 --- a/src/main/java/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/refinedstorage/api/network/INetworkMaster.java @@ -98,6 +98,11 @@ public interface INetworkMaster { */ void cancelCraftingTask(@Nonnull ICraftingTask task); + /** + * Sends a sync packet to all crafting monitors with the crafting task status. + */ + void updateCraftingTasks(); + /** * @return A list of crafting patterns in this network, do NOT modify this list */ diff --git a/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java b/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java index 447f18b3f..eb87bd811 100755 --- a/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java +++ b/src/main/java/refinedstorage/api/network/grid/IItemGridHandler.java @@ -52,7 +52,7 @@ public interface IItemGridHandler { * Called when a player wants to cancel a crafting task. * * @param id The task ID, or -1 for all tasks - * @param child Whether to only cancel the child of this crafting task + * @param depth The child depth of this task to cancel */ - void onCraftingCancelRequested(int id, boolean child); + void onCraftingCancelRequested(int id, int depth); } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java index cc0cdb1ba..441dafaf5 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskNormal.java @@ -57,6 +57,8 @@ public class CraftingTaskNormal extends CraftingTask { satisfied[i] = true; took.add(received); + + network.updateCraftingTasks(); } else if (!childrenCreated[i]) { ICraftingPattern pattern = NetworkUtils.getPattern(network, input); @@ -65,6 +67,8 @@ public class CraftingTaskNormal extends CraftingTask { childrenCreated[i] = true; + network.updateCraftingTasks(); + break; } } diff --git a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index 30937e554..449bc2b77 100755 --- a/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -142,15 +142,26 @@ public class ItemGridHandler implements IItemGridHandler { } @Override - public void onCraftingCancelRequested(int id, boolean child) { + public void onCraftingCancelRequested(int id, int depth) { if (id >= 0 && id < network.getCraftingTasks().size()) { ICraftingTask task = network.getCraftingTasks().get(id); - if (child) { - task.getChild().onCancelled(network); - task.setChild(null); - } else { + if (depth == 0) { network.cancelCraftingTask(task); + } else { + for (int i = 0; i < depth; ++i) { + if (task == null) { + break; + } + + task = task.getChild(); + } + + if (task != null) { + cancelCraftingTask(task); + } + + network.updateCraftingTasks(); } } else if (id == -1) { for (ICraftingTask task : network.getCraftingTasks()) { @@ -158,4 +169,15 @@ public class ItemGridHandler implements IItemGridHandler { } } } + + // @TODO: Broken! + private void cancelCraftingTask(ICraftingTask task) { + task.onCancelled(network); + + if (task.getChild() != null) { + cancelCraftingTask(task.getChild()); + + task.setChild(null); + } + } } diff --git a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java index 84025509c..550daf914 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java @@ -158,9 +158,9 @@ public class GuiCraftingMonitor extends GuiBase { if (button == cancelButton && itemSelected != -1) { ClientCraftingTask task = getTasks().get(itemSelected); - RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, task.getId(), task.isChild())); + RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, task.getId(), task.getDepth())); } else if (button == cancelAllButton && getTasks().size() > 0) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1, false)); + RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1, 0)); } } diff --git a/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java b/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java index 952a44e6d..37ff31b9d 100755 --- a/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java +++ b/src/main/java/refinedstorage/network/MessageCraftingMonitorCancel.java @@ -12,17 +12,17 @@ public class MessageCraftingMonitorCancel extends MessageHandlerPlayerToServer craftingTaskIterator = craftingTasks.iterator(); while (craftingTaskIterator.hasNext()) { - craftingTasksChanged = true; - ICraftingTask task = craftingTaskIterator.next(); if (task.getChild() != null) { if (updateCraftingTask(task.getChild())) { task.setChild(null); + + craftingTasksChanged = true; } } else { if (updateCraftingTask(task)) { craftingTaskIterator.remove(); + + craftingTasksChanged = true; } } } @@ -323,7 +325,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR return container != null && ticks % container.getSpeed() == 0 && task.update(worldObj, this); } - private void updateCraftingTasks() { + @Override + public void updateCraftingTasks() { markDirty(); for (INetworkNode node : nodeGraph.all()) { diff --git a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java index 02a6c94b7..7fca94743 100755 --- a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java +++ b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java @@ -80,7 +80,7 @@ public final class RefinedStorageSerializers { List tasks = new ArrayList<>(); for (int i = 0; i < size; ++i) { - readTask(buf, i, false, tasks); + readTask(buf, i, 0, tasks); } Collections.reverse(tasks); @@ -88,17 +88,17 @@ public final class RefinedStorageSerializers { return tasks; } - private void readTask(PacketBuffer buf, int i, boolean isChild, List tasks) { + private void readTask(PacketBuffer buf, int i, int depth, 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)); + tasks.add(new ClientCraftingTask(ByteBufUtils.readItemStack(buf), i, status, depth)); } if (buf.readBoolean()) { - readTask(buf, i, true, tasks); + readTask(buf, i, depth + 1, tasks); } }