From c80a6bf2a346d35d80bf6c2ec83e26beca0f7ce6 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Mon, 8 Aug 2016 02:17:01 +0200 Subject: [PATCH] Crafting monitor sync fix --- .../gui/GuiCraftingMonitor.java | 31 ++++--- .../tile/ClientCraftingTask.java | 39 ++++++++ .../refinedstorage/tile/TileController.java | 16 ++++ .../tile/TileCraftingMonitor.java | 89 ++++++------------- .../tile/data/RefinedStorageSerializers.java | 48 +++++++++- 5 files changed, 145 insertions(+), 78 deletions(-) create mode 100755 src/main/java/refinedstorage/tile/ClientCraftingTask.java diff --git a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java index 1ee5c86a0..921ad6309 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java @@ -8,12 +8,13 @@ import refinedstorage.RefinedStorage; import refinedstorage.container.ContainerCraftingMonitor; import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import refinedstorage.network.MessageCraftingMonitorCancel; +import refinedstorage.tile.ClientCraftingTask; import refinedstorage.tile.TileCraftingMonitor; import java.io.IOException; import java.util.Arrays; +import java.util.List; -// @TODO: Make it work public class GuiCraftingMonitor extends GuiBase { private static final int VISIBLE_ROWS = 3; @@ -58,12 +59,12 @@ public class GuiCraftingMonitor extends GuiBase { getScrollbar().setCanScroll(getRows() > VISIBLE_ROWS); getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows()); - if (itemSelected >= craftingMonitor.getTasks().size()) { + if (itemSelected >= getTasks().size()) { itemSelected = -1; } cancelButton.enabled = itemSelected != -1; - cancelAllButton.enabled = craftingMonitor.getTasks().size() > 0; + cancelAllButton.enabled = getTasks().size() > 0; } @Override @@ -94,28 +95,28 @@ public class GuiCraftingMonitor extends GuiBase { renderItemSelection = false; for (int i = 0; i < 6; ++i) { - if (item < craftingMonitor.getTasks().size()) { + if (item < getTasks().size()) { if (item == itemSelected) { renderItemSelection = true; renderItemSelectionX = x; renderItemSelectionY = y; } - TileCraftingMonitor.ClientSideCraftingTask task = craftingMonitor.getTasks().get(i); + ClientCraftingTask task = getTasks().get(i); - drawItem(x + 4, y + 11, task.output); + drawItem(x + 4, y + 11, task.getOutput()); float scale = 0.5f; GlStateManager.pushMatrix(); GlStateManager.scale(scale, scale, 1); - drawString(calculateOffsetOnScale(x + 5, scale), calculateOffsetOnScale(y + 4, scale), task.output.getDisplayName()); + drawString(calculateOffsetOnScale(x + 5, scale), calculateOffsetOnScale(y + 4, scale), task.getOutput().getDisplayName()); GlStateManager.popMatrix(); - if (inBounds(x + 5, y + 10, 16, 16, mouseX, mouseY) && !task.info.trim().equals("")) { - lines = task.info.split("\n"); + if (inBounds(x + 5, y + 10, 16, 16, mouseX, mouseY) && !task.getInfo().trim().equals("")) { + lines = task.getInfo().split("\n"); for (int j = 0; j < lines.length; ++j) { String line = lines[j]; @@ -151,7 +152,7 @@ public class GuiCraftingMonitor extends GuiBase { } private int getRows() { - int max = (int) Math.ceil((float) craftingMonitor.getTasks().size() / (float) 2); + int max = (int) Math.ceil((float) getTasks().size() / (float) 2); return max < 0 ? 0 : max; } @@ -161,8 +162,8 @@ public class GuiCraftingMonitor extends GuiBase { super.actionPerformed(button); if (button == cancelButton && itemSelected != -1) { - RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, craftingMonitor.getTasks().get(itemSelected).id)); - } else if (button == cancelAllButton && craftingMonitor.getTasks().size() > 0) { + RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, getTasks().get(itemSelected).getId())); + } else if (button == cancelAllButton && getTasks().size() > 0) { RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1)); } } @@ -181,7 +182,7 @@ public class GuiCraftingMonitor extends GuiBase { int ix = 8 + (x * ITEM_WIDTH); int iy = 20 + (y * ITEM_HEIGHT); - if (inBounds(ix, iy, ITEM_WIDTH, ITEM_HEIGHT, mouseX - guiLeft, mouseY - guiTop) && item < craftingMonitor.getTasks().size()) { + if (inBounds(ix, iy, ITEM_WIDTH, ITEM_HEIGHT, mouseX - guiLeft, mouseY - guiTop) && item < getTasks().size()) { itemSelected = item; } @@ -190,4 +191,8 @@ public class GuiCraftingMonitor extends GuiBase { } } } + + private List getTasks() { + return TileCraftingMonitor.TASKS.getValue(); + } } diff --git a/src/main/java/refinedstorage/tile/ClientCraftingTask.java b/src/main/java/refinedstorage/tile/ClientCraftingTask.java new file mode 100755 index 000000000..d99f99055 --- /dev/null +++ b/src/main/java/refinedstorage/tile/ClientCraftingTask.java @@ -0,0 +1,39 @@ +package refinedstorage.tile; + +import net.minecraft.item.ItemStack; + +public class ClientCraftingTask { + private ItemStack output; + private int id; + private String info; + + // Used server-side while sending + private ItemStack[] outputs; + + public ClientCraftingTask(ItemStack output, int id, String info) { + this.output = output; + this.id = id; + this.info = info; + } + + public ClientCraftingTask(String info, ItemStack[] outputs) { + this.info = info; + this.outputs = outputs; + } + + public ItemStack getOutput() { + return output; + } + + public ItemStack[] getOutputs() { + return outputs; + } + + public int getId() { + return id; + } + + public String getInfo() { + return info; + } +} diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index 427a92c8f..3d2170e04 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -206,6 +206,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR Collections.sort(storage.getStorages(), SIZE_COMPARATOR); Collections.sort(storage.getStorages(), PRIORITY_COMPARATOR); + boolean craftingTasksChanged = !craftingTasksToAdd.isEmpty() || !craftingTasksToAddAsLast.isEmpty() || !craftingTasksToCancel.isEmpty(); + for (ICraftingTask taskToCancel : craftingTasksToCancel) { taskToCancel.onCancelled(this); } @@ -226,6 +228,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR craftingTasksToAddAsLast.clear(); updateTopCraftingTask(true); + + if (craftingTasksChanged) { + updateCraftingTasks(); + } } wirelessGridHandler.update(); @@ -264,6 +270,14 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR super.update(); } + private void updateCraftingTasks() { + for (INetworkNode node : nodeGraph.all()) { + if (node instanceof TileCraftingMonitor) { + ((TileCraftingMonitor) node).dataManager.sendParameterToWatchers(TileCraftingMonitor.TASKS); + } + } + } + private void updateTopCraftingTask(boolean withSpeed) { if (!craftingTasks.empty()) { markDirty(); @@ -276,6 +290,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR top.onDone(this); craftingTasks.pop(); + + updateCraftingTasks(); } } } diff --git a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java index ed5ee141a..422e39d61 100755 --- a/src/main/java/refinedstorage/tile/TileCraftingMonitor.java +++ b/src/main/java/refinedstorage/tile/TileCraftingMonitor.java @@ -1,14 +1,35 @@ package refinedstorage.tile; -import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorage; +import refinedstorage.tile.data.ITileDataProducer; +import refinedstorage.tile.data.RefinedStorageSerializers; +import refinedstorage.tile.data.TileDataManager; +import refinedstorage.tile.data.TileDataParameter; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; -// @TODO: Make this work! public class TileCraftingMonitor extends TileNode { - private List tasks = new ArrayList<>(); + public static final TileDataParameter> TASKS = TileDataManager.createParameter(RefinedStorageSerializers.CLIENT_CRAFTING_TASK_SERIALIZER, new ITileDataProducer, TileCraftingMonitor>() { + @Override + public List getValue(TileCraftingMonitor tile) { + if (tile.connected) { + List tasks = tile.network.getCraftingTasks().stream().map(t -> new ClientCraftingTask( + t.getInfo(), + t.getPattern().getOutputs() + )).collect(Collectors.toList()); + + return tasks; + } else { + return Collections.emptyList(); + } + } + }); + + public TileCraftingMonitor() { + dataManager.addParameter(TASKS); + } @Override public int getEnergyUsage() { @@ -18,64 +39,4 @@ public class TileCraftingMonitor extends TileNode { @Override public void updateNode() { } - - /*@Override - public void writeContainerData(ByteBuf buf) { - super.writeContainerData(buf); - - if (connected) { - buf.writeInt(network.getCraftingTasks().size()); - - for (ICraftingTask task : network.getCraftingTasks()) { - ByteBufUtils.writeUTF8String(buf, task.getInfo()); - - buf.writeInt(task.getPattern().getOutputs().length); - - for (ItemStack output : task.getPattern().getOutputs()) { - ByteBufUtils.writeItemStack(buf, output); - } - } - } else { - buf.writeInt(0); - } - } - - @Override - public void readContainerData(ByteBuf buf) { - super.readContainerData(buf); - - int size = buf.readInt(); - - List newTasks = 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) { - newTasks.add(new ClientSideCraftingTask(ByteBufUtils.readItemStack(buf), i, info)); - } - } - - Collections.reverse(newTasks); - - tasks = newTasks; - }*/ - - public List getTasks() { - return tasks; - } - - public class ClientSideCraftingTask { - public ItemStack output; - public int id; - public String info; - - public ClientSideCraftingTask(ItemStack output, int id, String info) { - this.output = output; - this.id = id; - this.info = info; - } - } } diff --git a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java index f027ba319..83ba9ae34 100755 --- a/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java +++ b/src/main/java/refinedstorage/tile/data/RefinedStorageSerializers.java @@ -1,17 +1,20 @@ package refinedstorage.tile.data; +import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataSerializer; import net.minecraftforge.fml.common.network.ByteBufUtils; +import refinedstorage.tile.ClientCraftingTask; import refinedstorage.tile.ClientNode; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public final class RefinedStorageSerializers { - public static DataSerializer> CLIENT_NODE_SERIALIZER = new DataSerializer>() { + public static final DataSerializer> CLIENT_NODE_SERIALIZER = new DataSerializer>() { @Override public void write(PacketBuffer buf, List nodes) { buf.writeInt(nodes.size()); @@ -41,4 +44,47 @@ public final class RefinedStorageSerializers { return null; } }; + + public static final DataSerializer> CLIENT_CRAFTING_TASK_SERIALIZER = new DataSerializer>() { + @Override + public void write(PacketBuffer buf, List tasks) { + buf.writeInt(tasks.size()); + + for (ClientCraftingTask task : tasks) { + ByteBufUtils.writeUTF8String(buf, task.getInfo()); + + buf.writeInt(task.getOutputs().length); + + for (ItemStack output : task.getOutputs()) { + ByteBufUtils.writeItemStack(buf, output); + } + } + } + + @Override + public List read(PacketBuffer buf) throws IOException { + int size = buf.readInt(); + + 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)); + } + } + + Collections.reverse(tasks); + + return tasks; + } + + @Override + public DataParameter> createKey(int id) { + return null; + } + }; }