Crafting monitor sync fix
This commit is contained in:
@@ -8,12 +8,13 @@ import refinedstorage.RefinedStorage;
|
|||||||
import refinedstorage.container.ContainerCraftingMonitor;
|
import refinedstorage.container.ContainerCraftingMonitor;
|
||||||
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
|
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
|
||||||
import refinedstorage.network.MessageCraftingMonitorCancel;
|
import refinedstorage.network.MessageCraftingMonitorCancel;
|
||||||
|
import refinedstorage.tile.ClientCraftingTask;
|
||||||
import refinedstorage.tile.TileCraftingMonitor;
|
import refinedstorage.tile.TileCraftingMonitor;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
// @TODO: Make it work
|
|
||||||
public class GuiCraftingMonitor extends GuiBase {
|
public class GuiCraftingMonitor extends GuiBase {
|
||||||
private static final int VISIBLE_ROWS = 3;
|
private static final int VISIBLE_ROWS = 3;
|
||||||
|
|
||||||
@@ -58,12 +59,12 @@ public class GuiCraftingMonitor extends GuiBase {
|
|||||||
getScrollbar().setCanScroll(getRows() > VISIBLE_ROWS);
|
getScrollbar().setCanScroll(getRows() > VISIBLE_ROWS);
|
||||||
getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows());
|
getScrollbar().setScrollDelta((float) getScrollbar().getScrollbarHeight() / (float) getRows());
|
||||||
|
|
||||||
if (itemSelected >= craftingMonitor.getTasks().size()) {
|
if (itemSelected >= getTasks().size()) {
|
||||||
itemSelected = -1;
|
itemSelected = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
cancelButton.enabled = itemSelected != -1;
|
cancelButton.enabled = itemSelected != -1;
|
||||||
cancelAllButton.enabled = craftingMonitor.getTasks().size() > 0;
|
cancelAllButton.enabled = getTasks().size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -94,28 +95,28 @@ public class GuiCraftingMonitor extends GuiBase {
|
|||||||
renderItemSelection = false;
|
renderItemSelection = false;
|
||||||
|
|
||||||
for (int i = 0; i < 6; ++i) {
|
for (int i = 0; i < 6; ++i) {
|
||||||
if (item < craftingMonitor.getTasks().size()) {
|
if (item < getTasks().size()) {
|
||||||
if (item == itemSelected) {
|
if (item == itemSelected) {
|
||||||
renderItemSelection = true;
|
renderItemSelection = true;
|
||||||
renderItemSelectionX = x;
|
renderItemSelectionX = x;
|
||||||
renderItemSelectionY = y;
|
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;
|
float scale = 0.5f;
|
||||||
|
|
||||||
GlStateManager.pushMatrix();
|
GlStateManager.pushMatrix();
|
||||||
GlStateManager.scale(scale, scale, 1);
|
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();
|
GlStateManager.popMatrix();
|
||||||
|
|
||||||
if (inBounds(x + 5, y + 10, 16, 16, mouseX, mouseY) && !task.info.trim().equals("")) {
|
if (inBounds(x + 5, y + 10, 16, 16, mouseX, mouseY) && !task.getInfo().trim().equals("")) {
|
||||||
lines = task.info.split("\n");
|
lines = task.getInfo().split("\n");
|
||||||
|
|
||||||
for (int j = 0; j < lines.length; ++j) {
|
for (int j = 0; j < lines.length; ++j) {
|
||||||
String line = lines[j];
|
String line = lines[j];
|
||||||
@@ -151,7 +152,7 @@ public class GuiCraftingMonitor extends GuiBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private int getRows() {
|
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;
|
return max < 0 ? 0 : max;
|
||||||
}
|
}
|
||||||
@@ -161,8 +162,8 @@ public class GuiCraftingMonitor extends GuiBase {
|
|||||||
super.actionPerformed(button);
|
super.actionPerformed(button);
|
||||||
|
|
||||||
if (button == cancelButton && itemSelected != -1) {
|
if (button == cancelButton && itemSelected != -1) {
|
||||||
RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, craftingMonitor.getTasks().get(itemSelected).id));
|
RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, getTasks().get(itemSelected).getId()));
|
||||||
} else if (button == cancelAllButton && craftingMonitor.getTasks().size() > 0) {
|
} else if (button == cancelAllButton && getTasks().size() > 0) {
|
||||||
RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1));
|
RefinedStorage.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(craftingMonitor, -1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,7 +182,7 @@ public class GuiCraftingMonitor extends GuiBase {
|
|||||||
int ix = 8 + (x * ITEM_WIDTH);
|
int ix = 8 + (x * ITEM_WIDTH);
|
||||||
int iy = 20 + (y * ITEM_HEIGHT);
|
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;
|
itemSelected = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,4 +191,8 @@ public class GuiCraftingMonitor extends GuiBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<ClientCraftingTask> getTasks() {
|
||||||
|
return TileCraftingMonitor.TASKS.getValue();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
39
src/main/java/refinedstorage/tile/ClientCraftingTask.java
Executable file
39
src/main/java/refinedstorage/tile/ClientCraftingTask.java
Executable file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
@@ -206,6 +206,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
|
|||||||
Collections.sort(storage.getStorages(), SIZE_COMPARATOR);
|
Collections.sort(storage.getStorages(), SIZE_COMPARATOR);
|
||||||
Collections.sort(storage.getStorages(), PRIORITY_COMPARATOR);
|
Collections.sort(storage.getStorages(), PRIORITY_COMPARATOR);
|
||||||
|
|
||||||
|
boolean craftingTasksChanged = !craftingTasksToAdd.isEmpty() || !craftingTasksToAddAsLast.isEmpty() || !craftingTasksToCancel.isEmpty();
|
||||||
|
|
||||||
for (ICraftingTask taskToCancel : craftingTasksToCancel) {
|
for (ICraftingTask taskToCancel : craftingTasksToCancel) {
|
||||||
taskToCancel.onCancelled(this);
|
taskToCancel.onCancelled(this);
|
||||||
}
|
}
|
||||||
@@ -226,6 +228,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
|
|||||||
craftingTasksToAddAsLast.clear();
|
craftingTasksToAddAsLast.clear();
|
||||||
|
|
||||||
updateTopCraftingTask(true);
|
updateTopCraftingTask(true);
|
||||||
|
|
||||||
|
if (craftingTasksChanged) {
|
||||||
|
updateCraftingTasks();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wirelessGridHandler.update();
|
wirelessGridHandler.update();
|
||||||
@@ -264,6 +270,14 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
|
|||||||
super.update();
|
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) {
|
private void updateTopCraftingTask(boolean withSpeed) {
|
||||||
if (!craftingTasks.empty()) {
|
if (!craftingTasks.empty()) {
|
||||||
markDirty();
|
markDirty();
|
||||||
@@ -276,6 +290,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
|
|||||||
top.onDone(this);
|
top.onDone(this);
|
||||||
|
|
||||||
craftingTasks.pop();
|
craftingTasks.pop();
|
||||||
|
|
||||||
|
updateCraftingTasks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,14 +1,35 @@
|
|||||||
package refinedstorage.tile;
|
package refinedstorage.tile;
|
||||||
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import refinedstorage.RefinedStorage;
|
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.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
// @TODO: Make this work!
|
|
||||||
public class TileCraftingMonitor extends TileNode {
|
public class TileCraftingMonitor extends TileNode {
|
||||||
private List<ClientSideCraftingTask> tasks = new ArrayList<>();
|
public static final TileDataParameter<List<ClientCraftingTask>> TASKS = TileDataManager.createParameter(RefinedStorageSerializers.CLIENT_CRAFTING_TASK_SERIALIZER, new ITileDataProducer<List<ClientCraftingTask>, TileCraftingMonitor>() {
|
||||||
|
@Override
|
||||||
|
public List<ClientCraftingTask> getValue(TileCraftingMonitor tile) {
|
||||||
|
if (tile.connected) {
|
||||||
|
List<ClientCraftingTask> 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
|
@Override
|
||||||
public int getEnergyUsage() {
|
public int getEnergyUsage() {
|
||||||
@@ -18,64 +39,4 @@ public class TileCraftingMonitor extends TileNode {
|
|||||||
@Override
|
@Override
|
||||||
public void updateNode() {
|
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<ClientSideCraftingTask> newTasks = new ArrayList<ClientSideCraftingTask>();
|
|
||||||
|
|
||||||
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<ClientSideCraftingTask> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -1,17 +1,20 @@
|
|||||||
package refinedstorage.tile.data;
|
package refinedstorage.tile.data;
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.network.PacketBuffer;
|
import net.minecraft.network.PacketBuffer;
|
||||||
import net.minecraft.network.datasync.DataParameter;
|
import net.minecraft.network.datasync.DataParameter;
|
||||||
import net.minecraft.network.datasync.DataSerializer;
|
import net.minecraft.network.datasync.DataSerializer;
|
||||||
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
import net.minecraftforge.fml.common.network.ByteBufUtils;
|
||||||
|
import refinedstorage.tile.ClientCraftingTask;
|
||||||
import refinedstorage.tile.ClientNode;
|
import refinedstorage.tile.ClientNode;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public final class RefinedStorageSerializers {
|
public final class RefinedStorageSerializers {
|
||||||
public static DataSerializer<List<ClientNode>> CLIENT_NODE_SERIALIZER = new DataSerializer<List<ClientNode>>() {
|
public static final DataSerializer<List<ClientNode>> CLIENT_NODE_SERIALIZER = new DataSerializer<List<ClientNode>>() {
|
||||||
@Override
|
@Override
|
||||||
public void write(PacketBuffer buf, List<ClientNode> nodes) {
|
public void write(PacketBuffer buf, List<ClientNode> nodes) {
|
||||||
buf.writeInt(nodes.size());
|
buf.writeInt(nodes.size());
|
||||||
@@ -41,4 +44,47 @@ public final class RefinedStorageSerializers {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static final DataSerializer<List<ClientCraftingTask>> CLIENT_CRAFTING_TASK_SERIALIZER = new DataSerializer<List<ClientCraftingTask>>() {
|
||||||
|
@Override
|
||||||
|
public void write(PacketBuffer buf, List<ClientCraftingTask> 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<ClientCraftingTask> read(PacketBuffer buf) throws IOException {
|
||||||
|
int size = buf.readInt();
|
||||||
|
|
||||||
|
List<ClientCraftingTask> 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<List<ClientCraftingTask>> createKey(int id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user