diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java
index 496bd93dd..8d3ed68a0 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java
@@ -167,30 +167,7 @@ public interface INetworkMaster {
* @param toSchedule the amount of tasks to schedule
* @param compare the compare value to find patterns
*/
- default void scheduleCraftingTask(ItemStack stack, int toSchedule, int compare) {
- int alreadyScheduled = 0;
-
- for (ICraftingTask task : getCraftingTasks()) {
- for (ItemStack output : task.getPattern().getOutputs()) {
- if (API.instance().getComparer().isEqual(output, stack, compare)) {
- alreadyScheduled++;
- }
- }
- }
-
- for (int i = 0; i < toSchedule - alreadyScheduled; ++i) {
- ICraftingPattern pattern = getPattern(stack, compare);
-
- if (pattern != null) {
- ICraftingTask task = createCraftingTask(stack, pattern, 1);
-
- task.calculate();
- task.getMissing().clear();
-
- addCraftingTask(task);
- }
- }
- }
+ void scheduleCraftingTask(ItemStack stack, int toSchedule, int compare);
/**
* Sends a grid update packet with all the items to all clients that are watching a grid connected to this network.
@@ -228,11 +205,26 @@ public interface INetworkMaster {
*/
void sendFluidStorageDeltaToClient(FluidStack stack, int delta);
+ /**
+ * Makes the network send a crafting monitor update to all players as soon as it can.
+ */
+ void markCraftingMonitorForUpdate();
+
/**
* Sends a crafting monitor update to all players that are watching a crafting monitor.
+ *
+ * WARNING: In most cases, you should just use {@link INetworkMaster#markCraftingMonitorForUpdate()}, if not,
+ * you can get high bandwidth usage.
*/
void sendCraftingMonitorUpdate();
+ /**
+ * Sends a crafting monitor update to a specific player.
+ *
+ * @param player the player
+ */
+ void sendCraftingMonitorUpdate(EntityPlayerMP player);
+
/**
* Inserts an item in this network.
*
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java
index cbf363c2a..320d63bda 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingStep.java
@@ -132,7 +132,7 @@ public abstract class CraftingStep implements ICraftingStep {
satisfied.put(hashcode, received + toReceive);
stack.stackSize -= toReceive;
- network.sendCraftingMonitorUpdate();
+ network.markCraftingMonitorForUpdate();
if (stack.stackSize == 0) {
return true;
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java
index 27a4771f9..6520639fd 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java
@@ -270,7 +270,7 @@ public class CraftingTask implements ICraftingTask {
network.insertFluid(stack, stack.amount, false);
}
- network.sendCraftingMonitorUpdate();
+ network.markCraftingMonitorForUpdate();
}
@Override
@@ -307,7 +307,7 @@ public class CraftingTask implements ICraftingTask {
if (stackExtracted != null) {
toTakeFluids.remove(stack, stack.amount, false);
tookFluids.add(stackExtracted);
- network.sendCraftingMonitorUpdate();
+ network.markCraftingMonitorForUpdate();
}
}
@@ -326,7 +326,7 @@ public class CraftingTask implements ICraftingTask {
step.setStartedProcessing();
step.execute(toInsertItems, toInsertFluids);
usedContainers.put(container, timesUsed);
- network.sendCraftingMonitorUpdate();
+ network.markCraftingMonitorForUpdate();
}
}
}
@@ -370,7 +370,7 @@ public class CraftingTask implements ICraftingTask {
if (quantity > 0) {
calculate();
}
- network.sendCraftingMonitorUpdate();
+ network.markCraftingMonitorForUpdate();
}
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java
index 21eb2c03a..add4bb6da 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java
@@ -26,6 +26,8 @@ public class BlockCraftingMonitor extends BlockNode {
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) {
if (!world.isRemote) {
player.openGui(RS.INSTANCE, RSGui.CRAFTING_MONITOR, world, pos.getX(), pos.getY(), pos.getZ());
+
+ ((TileCraftingMonitor) world.getTileEntity(pos)).onOpened(player);
}
return true;
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockGrid.java
index eb7c3f76c..637cf23a3 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockGrid.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockGrid.java
@@ -60,7 +60,7 @@ public class BlockGrid extends BlockNode {
if (!world.isRemote) {
player.openGui(RS.INSTANCE, RSGui.GRID, world, pos.getX(), pos.getY(), pos.getZ());
- ((TileGrid) world.getTileEntity(pos)).onGridOpened(player);
+ ((TileGrid) world.getTileEntity(pos)).onOpened(player);
}
return true;
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java
index 8cd5b0967..b95cdd25b 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java
@@ -1,12 +1,20 @@
package com.raoulvdberge.refinedstorage.container;
-import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
+import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import net.minecraft.entity.player.EntityPlayer;
public class ContainerCraftingMonitor extends ContainerBase {
- public ContainerCraftingMonitor(TileCraftingMonitor craftingMonitor, EntityPlayer player) {
- super(craftingMonitor, player);
+ private ICraftingMonitor craftingMonitor;
+
+ public ContainerCraftingMonitor(ICraftingMonitor craftingMonitor, EntityPlayer player) {
+ super(null, player);
+
+ this.craftingMonitor = craftingMonitor;
addPlayerInventory(8, 148);
}
+
+ public ICraftingMonitor getCraftingMonitor() {
+ return craftingMonitor;
+ }
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java
index 94937d85a..08b64e9d2 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java
@@ -1,11 +1,12 @@
package com.raoulvdberge.refinedstorage.gui;
+import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawer;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor;
import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
-import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
+import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.renderer.GlStateManager;
@@ -13,8 +14,12 @@ import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.I18n;
import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
public class GuiCraftingMonitor extends GuiBase {
+ public static List ELEMENTS = Collections.emptyList();
+
public class CraftingMonitorElementDrawers extends ElementDrawers {
private IElementDrawer overlayDrawer = (x, y, colour) -> {
GlStateManager.color(1, 1, 1, 1);
@@ -33,8 +38,6 @@ public class GuiCraftingMonitor extends GuiBase {
private static final int ITEM_WIDTH = 143;
private static final int ITEM_HEIGHT = 18;
- private ICraftingMonitor craftingMonitor;
-
private GuiButton cancelButton;
private GuiButton cancelAllButton;
@@ -45,11 +48,9 @@ public class GuiCraftingMonitor extends GuiBase {
private int itemSelectedX = -1;
private int itemSelectedY = -1;
- public GuiCraftingMonitor(ContainerCraftingMonitor container, ICraftingMonitor craftingMonitor) {
+ public GuiCraftingMonitor(ContainerCraftingMonitor container) {
super(container, 176, 230);
- this.craftingMonitor = craftingMonitor;
-
this.scrollbar = new Scrollbar(157, 20, 12, 89);
}
@@ -72,12 +73,12 @@ public class GuiCraftingMonitor extends GuiBase {
scrollbar.setEnabled(getRows() > VISIBLE_ROWS);
scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS);
- if (itemSelected >= craftingMonitor.getElements().size()) {
+ if (itemSelected >= ELEMENTS.size()) {
itemSelected = -1;
}
- cancelButton.enabled = itemSelected != -1 && craftingMonitor.getElements().get(itemSelected).getTaskId() != -1;
- cancelAllButton.enabled = craftingMonitor.getElements().size() > 0;
+ cancelButton.enabled = itemSelected != -1 && ELEMENTS.get(itemSelected).getTaskId() != -1;
+ cancelAllButton.enabled = ELEMENTS.size() > 0;
}
@Override
@@ -89,8 +90,8 @@ public class GuiCraftingMonitor extends GuiBase {
if (itemSelectedX != -1 &&
itemSelectedY != -1 &&
itemSelected >= 0 &&
- itemSelected < craftingMonitor.getElements().size() &&
- craftingMonitor.getElements().get(itemSelected).canDrawSelection()) {
+ itemSelected < ELEMENTS.size() &&
+ ELEMENTS.get(itemSelected).canDrawSelection()) {
drawTexture(x + itemSelectedX, y + itemSelectedY, 0, 232, ITEM_WIDTH, ITEM_HEIGHT);
}
}
@@ -113,8 +114,8 @@ public class GuiCraftingMonitor extends GuiBase {
String itemSelectedTooltip = null;
for (int i = 0; i < VISIBLE_ROWS; ++i) {
- if (item < craftingMonitor.getElements().size()) {
- ICraftingMonitorElement element = craftingMonitor.getElements().get(item);
+ if (item < ELEMENTS.size()) {
+ ICraftingMonitorElement element = ELEMENTS.get(item);
if (item == itemSelected) {
itemSelectedX = x;
@@ -140,7 +141,7 @@ public class GuiCraftingMonitor extends GuiBase {
}
private int getRows() {
- return craftingMonitor.getElements().size();
+ return ELEMENTS.size();
}
@Override
@@ -148,13 +149,13 @@ public class GuiCraftingMonitor extends GuiBase {
super.actionPerformed(button);
if (button == cancelButton && itemSelected != -1) {
- ICraftingMonitorElement element = craftingMonitor.getElements().get(itemSelected);
+ ICraftingMonitorElement element = ELEMENTS.get(itemSelected);
if (element.getTaskId() != -1) {
- craftingMonitor.onCancelled(element);
+ RS.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(element.getTaskId()));
}
- } else if (button == cancelAllButton && craftingMonitor.getElements().size() > 0) {
- craftingMonitor.onCancelledAll();
+ } else if (button == cancelAllButton && ELEMENTS.size() > 0) {
+ RS.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(-1));
}
}
@@ -171,7 +172,7 @@ public class GuiCraftingMonitor extends GuiBase {
int ix = 8;
int iy = 20 + (i * ITEM_HEIGHT);
- if (inBounds(ix, iy, ITEM_WIDTH, ITEM_HEIGHT, mouseX - guiLeft, mouseY - guiTop) && (item + i) < craftingMonitor.getElements().size()) {
+ if (inBounds(ix, iy, ITEM_WIDTH, ITEM_HEIGHT, mouseX - guiLeft, mouseY - guiTop) && (item + i) < ELEMENTS.size()) {
itemSelected = item + i;
}
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiHandler.java
index 8e8383ba2..4d85729a0 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiHandler.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiHandler.java
@@ -111,7 +111,7 @@ public class GuiHandler implements IGuiHandler {
case RSGui.INTERFACE:
return new GuiInterface((ContainerInterface) getContainer(ID, player, tile));
case RSGui.CRAFTING_MONITOR:
- return new GuiCraftingMonitor((ContainerCraftingMonitor) getContainer(ID, player, tile), (TileCraftingMonitor) tile);
+ return new GuiCraftingMonitor((ContainerCraftingMonitor) getContainer(ID, player, tile));
case RSGui.WIRELESS_TRANSMITTER:
return new GuiWirelessTransmitter((ContainerWirelessTransmitter) getContainer(ID, player, tile));
case RSGui.CRAFTER:
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorCancel.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorCancel.java
index cd3a53169..b0f30b83a 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorCancel.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorCancel.java
@@ -1,55 +1,34 @@
package com.raoulvdberge.refinedstorage.network;
-import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
+import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.tileentity.TileEntity;
-import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
public class MessageCraftingMonitorCancel extends MessageHandlerPlayerToServer implements IMessage {
- private int x;
- private int y;
- private int z;
private int id;
- private int depth;
public MessageCraftingMonitorCancel() {
}
- public MessageCraftingMonitorCancel(TileCraftingMonitor craftingMonitor, int id) {
- this.x = craftingMonitor.getPos().getX();
- this.y = craftingMonitor.getPos().getY();
- this.z = craftingMonitor.getPos().getZ();
+ public MessageCraftingMonitorCancel(int id) {
this.id = id;
}
@Override
public void fromBytes(ByteBuf buf) {
- x = buf.readInt();
- y = buf.readInt();
- z = buf.readInt();
id = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
- buf.writeInt(x);
- buf.writeInt(y);
- buf.writeInt(z);
buf.writeInt(id);
}
@Override
public void handle(MessageCraftingMonitorCancel message, EntityPlayerMP player) {
- TileEntity tile = player.worldObj.getTileEntity(new BlockPos(message.x, message.y, message.z));
-
- if (tile instanceof TileCraftingMonitor) {
- TileCraftingMonitor monitor = (TileCraftingMonitor) tile;
-
- if (monitor.isConnected()) {
- monitor.getNetwork().getItemGridHandler().onCraftingCancelRequested(message.id);
- }
+ if (player.openContainer instanceof ContainerCraftingMonitor) {
+ ((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor().onCancelled(message.id);
}
}
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java
new file mode 100755
index 000000000..82b5b8bc0
--- /dev/null
+++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java
@@ -0,0 +1,56 @@
+package com.raoulvdberge.refinedstorage.network;
+
+import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
+import com.raoulvdberge.refinedstorage.apiimpl.API;
+import com.raoulvdberge.refinedstorage.gui.GuiCraftingMonitor;
+import io.netty.buffer.ByteBuf;
+import net.minecraftforge.fml.common.network.ByteBufUtils;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
+import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
+import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Function;
+
+public class MessageCraftingMonitorElements implements IMessage, IMessageHandler {
+ private List elements = new ArrayList<>();
+
+ public MessageCraftingMonitorElements() {
+ }
+
+ public MessageCraftingMonitorElements(List elements) {
+ this.elements = elements;
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf) {
+ int size = buf.readInt();
+
+ for (int i = 0; i < size; ++i) {
+ Function factory = API.instance().getCraftingMonitorElementRegistry().getFactory(ByteBufUtils.readUTF8String(buf));
+
+ if (factory != null) {
+ elements.add(factory.apply(buf));
+ }
+ }
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(elements.size());
+
+ for (ICraftingMonitorElement task : elements) {
+ ByteBufUtils.writeUTF8String(buf, task.getId());
+
+ task.write(buf);
+ }
+ }
+
+ @Override
+ public IMessage onMessage(MessageCraftingMonitorElements message, MessageContext ctx) {
+ GuiCraftingMonitor.ELEMENTS = message.elements;
+
+ return null;
+ }
+}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java
index 66157747a..0576c1e7e 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java
@@ -85,6 +85,7 @@ public class ProxyCommon {
RS.INSTANCE.network.registerMessage(MessageGridCraftingStart.class, MessageGridCraftingStart.class, id++, Side.SERVER);
RS.INSTANCE.network.registerMessage(MessageGridPatternCreate.class, MessageGridPatternCreate.class, id++, Side.SERVER);
RS.INSTANCE.network.registerMessage(MessageCraftingMonitorCancel.class, MessageCraftingMonitorCancel.class, id++, Side.SERVER);
+ RS.INSTANCE.network.registerMessage(MessageCraftingMonitorElements.class, MessageCraftingMonitorElements.class, id++, Side.CLIENT);
RS.INSTANCE.network.registerMessage(MessageGridItemUpdate.class, MessageGridItemUpdate.class, id++, Side.CLIENT);
RS.INSTANCE.network.registerMessage(MessageGridItemDelta.class, MessageGridItemDelta.class, id++, Side.CLIENT);
RS.INSTANCE.network.registerMessage(MessageGridFluidUpdate.class, MessageGridFluidUpdate.class, id++, Side.CLIENT);
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java
index 374fd1fcf..896eeffce 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java
@@ -35,6 +35,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.storage.item.ItemStorageCache;
import com.raoulvdberge.refinedstorage.block.BlockController;
import com.raoulvdberge.refinedstorage.block.EnumControllerType;
import com.raoulvdberge.refinedstorage.block.EnumGridType;
+import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor;
import com.raoulvdberge.refinedstorage.container.ContainerGrid;
import com.raoulvdberge.refinedstorage.integration.forgeenergy.ControllerEnergyForge;
import com.raoulvdberge.refinedstorage.integration.ic2.ControllerEnergyIC2;
@@ -43,13 +44,9 @@ import com.raoulvdberge.refinedstorage.integration.ic2.IControllerEnergyIC2;
import com.raoulvdberge.refinedstorage.integration.ic2.IntegrationIC2;
import com.raoulvdberge.refinedstorage.integration.tesla.ControllerEnergyTesla;
import com.raoulvdberge.refinedstorage.integration.tesla.IntegrationTesla;
-import com.raoulvdberge.refinedstorage.network.MessageGridFluidDelta;
-import com.raoulvdberge.refinedstorage.network.MessageGridFluidUpdate;
-import com.raoulvdberge.refinedstorage.network.MessageGridItemDelta;
-import com.raoulvdberge.refinedstorage.network.MessageGridItemUpdate;
+import com.raoulvdberge.refinedstorage.network.*;
import com.raoulvdberge.refinedstorage.tile.config.IRedstoneConfigurable;
import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode;
-import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer;
import com.raoulvdberge.refinedstorage.tile.data.RSSerializers;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
@@ -77,6 +74,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
+import java.util.stream.Collectors;
public class TileController extends TileBase implements INetworkMaster, IEnergyReceiver, IRedstoneConfigurable {
public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter();
@@ -288,11 +286,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (craftingMonitorUpdateRequested) {
craftingMonitorUpdateRequested = false;
- for (INetworkNode node : nodeGraph.all()) {
- if (node instanceof TileCraftingMonitor) {
- ((TileCraftingMonitor) node).dataManager.sendParameterToWatchers(TileCraftingMonitor.ELEMENTS);
- }
- }
+ sendCraftingMonitorUpdate();
}
}
@@ -328,10 +322,24 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
}
@Override
- public void sendCraftingMonitorUpdate() {
+ public void markCraftingMonitorForUpdate() {
craftingMonitorUpdateRequested = true;
}
+ @Override
+ public void sendCraftingMonitorUpdate() {
+ worldObj.getMinecraftServer().getPlayerList().getPlayerList().stream()
+ .filter(player -> player.openContainer instanceof ContainerCraftingMonitor)
+ .forEach(this::sendCraftingMonitorUpdate);
+ }
+
+ @Override
+ public void sendCraftingMonitorUpdate(EntityPlayerMP player) {
+ RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(
+ craftingTasks.stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList())
+ ), player);
+ }
+
@Override
public void invalidate() {
super.invalidate();
@@ -448,6 +456,40 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
return patterns.get(highestPattern);
}
+ @Override
+ public void scheduleCraftingTask(ItemStack stack, int toSchedule, int compare) {
+ int alreadyScheduled = 0;
+
+ for (ICraftingTask task : getCraftingTasks()) {
+ for (ItemStack output : task.getPattern().getOutputs()) {
+ if (API.instance().getComparer().isEqual(output, stack, compare)) {
+ alreadyScheduled++;
+ }
+ }
+ }
+
+ boolean scheduled = false;
+
+ for (int i = 0; i < toSchedule - alreadyScheduled; ++i) {
+ ICraftingPattern pattern = getPattern(stack, compare);
+
+ if (pattern != null) {
+ ICraftingTask task = createCraftingTask(stack, pattern, 1);
+
+ task.calculate();
+ task.getMissing().clear();
+
+ addCraftingTask(task);
+
+ scheduled = true;
+ }
+ }
+
+ if (scheduled) {
+ markCraftingMonitorForUpdate();
+ }
+ }
+
@Override
public void rebuildPatterns() {
patterns.clear();
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java
index 62bafdb8f..5a8dd8e63 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java
@@ -1,13 +1,5 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
-import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
-
-import java.util.List;
-
public interface ICraftingMonitor {
- void onCancelled(ICraftingMonitorElement element);
-
- void onCancelledAll();
-
- List getElements();
+ void onCancelled(int id);
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/TileCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/TileCraftingMonitor.java
index 21818d8ac..4a565440c 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/TileCraftingMonitor.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/TileCraftingMonitor.java
@@ -1,33 +1,11 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.RS;
-import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
-import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel;
import com.raoulvdberge.refinedstorage.tile.TileNode;
-import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer;
-import com.raoulvdberge.refinedstorage.tile.data.RSSerializers;
-import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
public class TileCraftingMonitor extends TileNode implements ICraftingMonitor {
- public static final TileDataParameter> ELEMENTS = new TileDataParameter<>(RSSerializers.CRAFTING_MONITOR_ELEMENT_SERIALIZER, Collections.emptyList(), new ITileDataProducer, TileCraftingMonitor>() {
- @Override
- public List getValue(TileCraftingMonitor tile) {
- if (tile.connected) {
- return tile.network.getCraftingTasks().stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList());
- } else {
- return Collections.emptyList();
- }
- }
- });
-
- public TileCraftingMonitor() {
- dataManager.addParameter(ELEMENTS);
- }
-
@Override
public int getEnergyUsage() {
return RS.INSTANCE.config.craftingMonitorUsage;
@@ -43,17 +21,15 @@ public class TileCraftingMonitor extends TileNode implements ICraftingMonitor {
}
@Override
- public void onCancelled(ICraftingMonitorElement element) {
- RS.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(this, element.getTaskId()));
+ public void onCancelled(int id) {
+ if (isConnected()) {
+ network.getItemGridHandler().onCraftingCancelRequested(id);
+ }
}
- @Override
- public void onCancelledAll() {
- RS.INSTANCE.network.sendToServer(new MessageCraftingMonitorCancel(this, -1));
- }
-
- @Override
- public List getElements() {
- return ELEMENTS.getValue();
+ public void onOpened(EntityPlayer player) {
+ if (isConnected()) {
+ network.sendCraftingMonitorUpdate((EntityPlayerMP) player);
+ }
}
}
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/RSSerializers.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/RSSerializers.java
index 877060cb6..912a4b459 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/tile/data/RSSerializers.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/data/RSSerializers.java
@@ -1,11 +1,8 @@
package com.raoulvdberge.refinedstorage.tile.data;
import com.raoulvdberge.refinedstorage.RSUtils;
-import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement;
import com.raoulvdberge.refinedstorage.api.storage.AccessType;
-import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.tile.ClientNode;
-import io.netty.buffer.ByteBuf;
import net.minecraft.network.PacketBuffer;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializer;
@@ -16,7 +13,6 @@ import net.minecraftforge.fml.common.network.ByteBufUtils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Function;
public final class RSSerializers {
public static final DataSerializer> CLIENT_NODE_SERIALIZER = new DataSerializer>() {
@@ -50,41 +46,6 @@ public final class RSSerializers {
}
};
- public static final DataSerializer> CRAFTING_MONITOR_ELEMENT_SERIALIZER = new DataSerializer>() {
- @Override
- public void write(PacketBuffer buf, List elements) {
- buf.writeInt(elements.size());
-
- for (ICraftingMonitorElement task : elements) {
- ByteBufUtils.writeUTF8String(buf, task.getId());
-
- task.write(buf);
- }
- }
-
- @Override
- public List read(PacketBuffer buf) {
- List elements = new ArrayList<>();
-
- int size = buf.readInt();
-
- for (int i = 0; i < size; ++i) {
- Function factory = API.instance().getCraftingMonitorElementRegistry().getFactory(ByteBufUtils.readUTF8String(buf));
-
- if (factory != null) {
- elements.add(factory.apply(buf));
- }
- }
-
- return elements;
- }
-
- @Override
- public DataParameter> createKey(int id) {
- return null;
- }
- };
-
public static final DataSerializer FLUID_STACK_SERIALIZER = new DataSerializer() {
@Override
public void write(PacketBuffer buf, FluidStack value) {
diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java
index 4ae7d064b..bf27ffee4 100755
--- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java
+++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java
@@ -214,7 +214,7 @@ public class TileGrid extends TileNode implements IGrid {
return network != null ? network.getPosition() : null;
}
- public void onGridOpened(EntityPlayer player) {
+ public void onOpened(EntityPlayer player) {
if (isConnected()) {
if (getType() == EnumGridType.FLUID) {
network.sendFluidStorageToClient((EntityPlayerMP) player);