Crafting monitor sync fix

This commit is contained in:
Raoul Van den Berge
2016-08-08 02:17:01 +02:00
parent a341cc4319
commit c80a6bf2a3
5 changed files with 145 additions and 78 deletions

View File

@@ -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();
}
}

View 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;
}
}

View File

@@ -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();
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
};
}