Crafting monitor sync fix
This commit is contained in:
@@ -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<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(), 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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<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
|
||||
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<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;
|
||||
|
||||
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<List<ClientNode>> CLIENT_NODE_SERIALIZER = new DataSerializer<List<ClientNode>>() {
|
||||
public static final DataSerializer<List<ClientNode>> CLIENT_NODE_SERIALIZER = new DataSerializer<List<ClientNode>>() {
|
||||
@Override
|
||||
public void write(PacketBuffer buf, List<ClientNode> nodes) {
|
||||
buf.writeInt(nodes.size());
|
||||
@@ -41,4 +44,47 @@ public final class RefinedStorageSerializers {
|
||||
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