diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java index cd267da28..19d2cd95c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java @@ -2,6 +2,8 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; +import com.raoulvdberge.refinedstorage.inventory.IItemHandlerListener; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.item.filter.Filter; @@ -16,13 +18,25 @@ import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class NetworkNodeCraftingMonitor extends NetworkNode implements ICraftingMonitor { public static final String ID = "crafting_monitor"; private List filters = new ArrayList<>(); - private ItemHandlerFilter filter = new ItemHandlerFilter(filters, new ArrayList<>(), new ItemHandlerListenerNetworkNode(this)); + private ItemHandlerFilter filter = new ItemHandlerFilter(filters, new ArrayList<>(), new IItemHandlerListener() { + private ItemHandlerListenerNetworkNode base = new ItemHandlerListenerNetworkNode(NetworkNodeCraftingMonitor.this); + + @Override + public void onChanged(int slot) { + base.onChanged(slot); + + if (network != null) { + network.sendCraftingMonitorUpdate(); + } + } + }); public NetworkNodeCraftingMonitor(INetworkNodeHolder holder) { super(holder); @@ -66,6 +80,11 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting return network != null ? network.getPosition() : null; } + @Override + public List getTasks() { + return network != null ? network.getCraftingManager().getTasks() : Collections.emptyList(); + } + @Override public List getFilters() { return filters; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java index 6c2408164..d9cb56f8c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java @@ -4,6 +4,8 @@ import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.WirelessCraftingMonitor; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerCraftingMonitor extends ContainerBase { @@ -14,17 +16,44 @@ public class ContainerCraftingMonitor extends ContainerBase { this.craftingMonitor = craftingMonitor; - addPlayerInventory(8, 148); - for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(craftingMonitor.getFilter(), i, 187, 6 + (18 * i))); } + + addPlayerInventory(8, 148); } public ICraftingMonitor getCraftingMonitor() { return craftingMonitor; } + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = ItemStack.EMPTY; + + Slot slot = getSlot(index); + + if (slot.getHasStack()) { + stack = slot.getStack(); + + if (index < 4) { + if (!mergeItemStack(stack, 4, inventorySlots.size(), false)) { + return ItemStack.EMPTY; + } + } else if (!mergeItemStack(stack, 0, 4, false)) { + return ItemStack.EMPTY; + } + + if (stack.getCount() == 0) { + slot.putStack(ItemStack.EMPTY); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } + @Override protected boolean isHeldItemDisabled() { return craftingMonitor instanceof WirelessCraftingMonitor; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java index 1c6e03104..9e07a8675 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java @@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftin 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.grid.filtering.GridFilterFilter; import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; @@ -13,11 +12,8 @@ import net.minecraft.client.gui.GuiButton; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.resources.I18n; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -42,8 +38,6 @@ public class GuiCraftingMonitor extends GuiBase { private static final int ITEM_WIDTH = 143; private static final int ITEM_HEIGHT = 18; - private static boolean markedForSorting; - private GuiButton cancelButton; private GuiButton cancelAllButton; @@ -51,8 +45,6 @@ public class GuiCraftingMonitor extends GuiBase { private IElementDrawers drawers = new CraftingMonitorElementDrawers(); - private List elements = new ArrayList<>(); - private int itemSelected = -1; private int itemSelectedX = -1; @@ -66,11 +58,7 @@ public class GuiCraftingMonitor extends GuiBase { } private List getElements() { - return craftingMonitor.isActive() ? elements : Collections.emptyList(); - } - - public static void markForSorting() { - markedForSorting = true; + return craftingMonitor.isActive() ? ELEMENTS : Collections.emptyList(); } @Override @@ -91,23 +79,6 @@ public class GuiCraftingMonitor extends GuiBase { @Override public void update(int x, int y) { - if (markedForSorting) { - markedForSorting = false; - - List newElements = new ArrayList<>(); - - for (ICraftingMonitorElement element : ELEMENTS) { - // @TODO: We need the top level element here! - ItemStack stack = null; - - if (stack == null || GridFilterFilter.accepts(craftingMonitor.getFilters(), stack, Item.REGISTRY.getNameForObject(stack.getItem()).getResourceDomain())) { - newElements.add(element); - } - } - - this.elements = newElements; - } - scrollbar.setEnabled(getRows() > VISIBLE_ROWS); scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java index 8bc511c37..eb88e1688 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/inventory/ItemHandlerFilter.java @@ -1,7 +1,6 @@ package com.raoulvdberge.refinedstorage.inventory; import com.raoulvdberge.refinedstorage.RSItems; -import com.raoulvdberge.refinedstorage.gui.GuiCraftingMonitor; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.FilterTab; @@ -62,7 +61,6 @@ public class ItemHandlerFilter extends ItemHandlerBasic { if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { GuiGrid.markForSorting(); - GuiCraftingMonitor.markForSorting(); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java index ebfcac29c..4baee6c43 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java @@ -1,9 +1,14 @@ package com.raoulvdberge.refinedstorage.network; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; +import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.gui.GuiCraftingMonitor; +import com.raoulvdberge.refinedstorage.gui.grid.filtering.GridFilterFilter; +import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import io.netty.buffer.ByteBuf; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; @@ -14,13 +19,15 @@ import java.util.List; import java.util.function.Function; public class MessageCraftingMonitorElements implements IMessage, IMessageHandler { + private ICraftingMonitor craftingMonitor; + private List elements = new ArrayList<>(); public MessageCraftingMonitorElements() { } - public MessageCraftingMonitorElements(List elements) { - this.elements = elements; + public MessageCraftingMonitorElements(ICraftingMonitor craftingMonitor) { + this.craftingMonitor = craftingMonitor; } @Override @@ -38,6 +45,16 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler @Override public void toBytes(ByteBuf buf) { + List elements = new ArrayList<>(); + + for (ICraftingTask task : craftingMonitor.getTasks()) { + ItemStack stack = task.getRequested(); + + if (stack == null || GridFilterFilter.accepts(craftingMonitor.getFilters(), stack, Item.REGISTRY.getNameForObject(stack.getItem()).getResourceDomain())) { + elements.addAll(task.getCraftingMonitorElements()); + } + } + buf.writeInt(elements.size()); for (ICraftingMonitorElement task : elements) { @@ -50,7 +67,6 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler @Override public IMessage onMessage(MessageCraftingMonitorElements message, MessageContext ctx) { GuiCraftingMonitor.ELEMENTS = message.elements; - GuiCraftingMonitor.markForSorting(); return null; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 4709b2107..a92a3a344 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; -import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph; import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; @@ -69,7 +68,6 @@ 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, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy { public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); @@ -373,20 +371,14 @@ public class TileController extends TileBase implements INetworkMaster, IRedston @Override public void sendCraftingMonitorUpdate() { - List watchers = getWorld().getMinecraftServer().getPlayerList().getPlayers().stream() + getWorld().getMinecraftServer().getPlayerList().getPlayers().stream() .filter(player -> player.openContainer instanceof ContainerCraftingMonitor && pos.equals(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor().getNetworkPosition())) - .collect(Collectors.toList()); - - if (!watchers.isEmpty()) { - List elements = craftingManager.getTasks().stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList()); - - watchers.forEach(player -> RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(elements), player)); - } + .forEach(player -> RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor()), player)); } @Override public void sendCraftingMonitorUpdate(EntityPlayerMP player) { - RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(craftingManager.getTasks().stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList())), player); + RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor()), player); } @Nullable 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 91becb6ea..63196591e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java @@ -1,5 +1,6 @@ package com.raoulvdberge.refinedstorage.tile.craftingmonitor; +import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; @@ -19,6 +20,8 @@ public interface ICraftingMonitor { @Nullable BlockPos getNetworkPosition(); + List getTasks(); + List getFilters(); ItemHandlerBasic getFilter(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java index bd765f9e3..4d0844001 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.tile.craftingmonitor; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter; import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor; @@ -16,6 +17,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class WirelessCraftingMonitor implements ICraftingMonitor { @@ -34,6 +36,12 @@ public class WirelessCraftingMonitor implements ICraftingMonitor { } RSUtils.writeItems(this, slot, stack.getTagCompound()); + + TileController controller = getController(); + + if (controller != null) { + controller.sendCraftingMonitorUpdate(); + } } }; @@ -73,6 +81,17 @@ public class WirelessCraftingMonitor implements ICraftingMonitor { return controller; } + @Override + public List getTasks() { + TileController controller = getController(); + + if (controller != null) { + return controller.getCraftingManager().getTasks(); + } + + return Collections.emptyList(); + } + @Override public List getFilters() { return filters;