Fix the crafting monitor filter stuffs

This commit is contained in:
raoulvdberge
2017-01-29 20:01:07 +01:00
parent a89e8b669e
commit fcf707ea2c
8 changed files with 96 additions and 49 deletions

View File

@@ -2,6 +2,8 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node;
import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.RSUtils; 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.ItemHandlerFilter;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.Filter;
@@ -16,13 +18,25 @@ import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public class NetworkNodeCraftingMonitor extends NetworkNode implements ICraftingMonitor { public class NetworkNodeCraftingMonitor extends NetworkNode implements ICraftingMonitor {
public static final String ID = "crafting_monitor"; public static final String ID = "crafting_monitor";
private List<Filter> filters = new ArrayList<>(); private List<Filter> 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) { public NetworkNodeCraftingMonitor(INetworkNodeHolder holder) {
super(holder); super(holder);
@@ -66,6 +80,11 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting
return network != null ? network.getPosition() : null; return network != null ? network.getPosition() : null;
} }
@Override
public List<ICraftingTask> getTasks() {
return network != null ? network.getCraftingManager().getTasks() : Collections.emptyList();
}
@Override @Override
public List<Filter> getFilters() { public List<Filter> getFilters() {
return filters; return filters;

View File

@@ -4,6 +4,8 @@ import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.WirelessCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.WirelessCraftingMonitor;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.SlotItemHandler; import net.minecraftforge.items.SlotItemHandler;
public class ContainerCraftingMonitor extends ContainerBase { public class ContainerCraftingMonitor extends ContainerBase {
@@ -14,17 +16,44 @@ public class ContainerCraftingMonitor extends ContainerBase {
this.craftingMonitor = craftingMonitor; this.craftingMonitor = craftingMonitor;
addPlayerInventory(8, 148);
for (int i = 0; i < 4; ++i) { for (int i = 0; i < 4; ++i) {
addSlotToContainer(new SlotItemHandler(craftingMonitor.getFilter(), i, 187, 6 + (18 * i))); addSlotToContainer(new SlotItemHandler(craftingMonitor.getFilter(), i, 187, 6 + (18 * i)));
} }
addPlayerInventory(8, 148);
} }
public ICraftingMonitor getCraftingMonitor() { public ICraftingMonitor getCraftingMonitor() {
return craftingMonitor; 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 @Override
protected boolean isHeldItemDisabled() { protected boolean isHeldItemDisabled() {
return craftingMonitor instanceof WirelessCraftingMonitor; return craftingMonitor instanceof WirelessCraftingMonitor;

View File

@@ -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.IElementDrawer;
import com.raoulvdberge.refinedstorage.api.render.IElementDrawers; import com.raoulvdberge.refinedstorage.api.render.IElementDrawers;
import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor; 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.gui.sidebutton.SideButtonRedstoneMode;
import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel; import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; 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.GlStateManager;
import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; 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_WIDTH = 143;
private static final int ITEM_HEIGHT = 18; private static final int ITEM_HEIGHT = 18;
private static boolean markedForSorting;
private GuiButton cancelButton; private GuiButton cancelButton;
private GuiButton cancelAllButton; private GuiButton cancelAllButton;
@@ -51,8 +45,6 @@ public class GuiCraftingMonitor extends GuiBase {
private IElementDrawers drawers = new CraftingMonitorElementDrawers(); private IElementDrawers drawers = new CraftingMonitorElementDrawers();
private List<ICraftingMonitorElement> elements = new ArrayList<>();
private int itemSelected = -1; private int itemSelected = -1;
private int itemSelectedX = -1; private int itemSelectedX = -1;
@@ -66,11 +58,7 @@ public class GuiCraftingMonitor extends GuiBase {
} }
private List<ICraftingMonitorElement> getElements() { private List<ICraftingMonitorElement> getElements() {
return craftingMonitor.isActive() ? elements : Collections.emptyList(); return craftingMonitor.isActive() ? ELEMENTS : Collections.emptyList();
}
public static void markForSorting() {
markedForSorting = true;
} }
@Override @Override
@@ -91,23 +79,6 @@ public class GuiCraftingMonitor extends GuiBase {
@Override @Override
public void update(int x, int y) { public void update(int x, int y) {
if (markedForSorting) {
markedForSorting = false;
List<ICraftingMonitorElement> 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.setEnabled(getRows() > VISIBLE_ROWS);
scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS); scrollbar.setMaxOffset(getRows() - VISIBLE_ROWS);

View File

@@ -1,7 +1,6 @@
package com.raoulvdberge.refinedstorage.inventory; package com.raoulvdberge.refinedstorage.inventory;
import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.RSItems;
import com.raoulvdberge.refinedstorage.gui.GuiCraftingMonitor;
import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid; import com.raoulvdberge.refinedstorage.gui.grid.GuiGrid;
import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.item.filter.FilterTab; import com.raoulvdberge.refinedstorage.item.filter.FilterTab;
@@ -62,7 +61,6 @@ public class ItemHandlerFilter extends ItemHandlerBasic {
if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { if (FMLCommonHandler.instance().getSide() == Side.CLIENT) {
GuiGrid.markForSorting(); GuiGrid.markForSorting();
GuiCraftingMonitor.markForSorting();
} }
} }
} }

View File

@@ -1,9 +1,14 @@
package com.raoulvdberge.refinedstorage.network; package com.raoulvdberge.refinedstorage.network;
import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; 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.apiimpl.API;
import com.raoulvdberge.refinedstorage.gui.GuiCraftingMonitor; 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 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.ByteBufUtils;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
@@ -14,13 +19,15 @@ import java.util.List;
import java.util.function.Function; import java.util.function.Function;
public class MessageCraftingMonitorElements implements IMessage, IMessageHandler<MessageCraftingMonitorElements, IMessage> { public class MessageCraftingMonitorElements implements IMessage, IMessageHandler<MessageCraftingMonitorElements, IMessage> {
private ICraftingMonitor craftingMonitor;
private List<ICraftingMonitorElement> elements = new ArrayList<>(); private List<ICraftingMonitorElement> elements = new ArrayList<>();
public MessageCraftingMonitorElements() { public MessageCraftingMonitorElements() {
} }
public MessageCraftingMonitorElements(List<ICraftingMonitorElement> elements) { public MessageCraftingMonitorElements(ICraftingMonitor craftingMonitor) {
this.elements = elements; this.craftingMonitor = craftingMonitor;
} }
@Override @Override
@@ -38,6 +45,16 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler
@Override @Override
public void toBytes(ByteBuf buf) { public void toBytes(ByteBuf buf) {
List<ICraftingMonitorElement> 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()); buf.writeInt(elements.size());
for (ICraftingMonitorElement task : elements) { for (ICraftingMonitorElement task : elements) {
@@ -50,7 +67,6 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler
@Override @Override
public IMessage onMessage(MessageCraftingMonitorElements message, MessageContext ctx) { public IMessage onMessage(MessageCraftingMonitorElements message, MessageContext ctx) {
GuiCraftingMonitor.ELEMENTS = message.elements; GuiCraftingMonitor.ELEMENTS = message.elements;
GuiCraftingMonitor.markForSorting();
return null; return null;
} }

View File

@@ -5,7 +5,6 @@ import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSBlocks;
import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; 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.INetworkMaster;
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph; import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph;
import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler;
@@ -69,7 +68,6 @@ import net.minecraftforge.items.ItemHandlerHelper;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
public class TileController extends TileBase implements INetworkMaster, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy<TileController> { public class TileController extends TileBase implements INetworkMaster, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy<TileController> {
public static final TileDataParameter<Integer> REDSTONE_MODE = RedstoneMode.createParameter(); public static final TileDataParameter<Integer> REDSTONE_MODE = RedstoneMode.createParameter();
@@ -373,20 +371,14 @@ public class TileController extends TileBase implements INetworkMaster, IRedston
@Override @Override
public void sendCraftingMonitorUpdate() { public void sendCraftingMonitorUpdate() {
List<EntityPlayerMP> watchers = getWorld().getMinecraftServer().getPlayerList().getPlayers().stream() getWorld().getMinecraftServer().getPlayerList().getPlayers().stream()
.filter(player -> player.openContainer instanceof ContainerCraftingMonitor && pos.equals(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor().getNetworkPosition())) .filter(player -> player.openContainer instanceof ContainerCraftingMonitor && pos.equals(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor().getNetworkPosition()))
.collect(Collectors.toList()); .forEach(player -> RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor()), player));
if (!watchers.isEmpty()) {
List<ICraftingMonitorElement> elements = craftingManager.getTasks().stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList());
watchers.forEach(player -> RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(elements), player));
}
} }
@Override @Override
public void sendCraftingMonitorUpdate(EntityPlayerMP player) { 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 @Nullable

View File

@@ -1,5 +1,6 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor; package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic;
import com.raoulvdberge.refinedstorage.item.filter.Filter; import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
@@ -19,6 +20,8 @@ public interface ICraftingMonitor {
@Nullable @Nullable
BlockPos getNetworkPosition(); BlockPos getNetworkPosition();
List<ICraftingTask> getTasks();
List<Filter> getFilters(); List<Filter> getFilters();
ItemHandlerBasic getFilter(); ItemHandlerBasic getFilter();

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor; package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.RSUtils;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic;
import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFilter;
import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor; import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor;
@@ -16,6 +17,7 @@ import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.DimensionManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public class WirelessCraftingMonitor implements ICraftingMonitor { public class WirelessCraftingMonitor implements ICraftingMonitor {
@@ -34,6 +36,12 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
} }
RSUtils.writeItems(this, slot, stack.getTagCompound()); 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; return controller;
} }
@Override
public List<ICraftingTask> getTasks() {
TileController controller = getController();
if (controller != null) {
return controller.getCraftingManager().getTasks();
}
return Collections.emptyList();
}
@Override @Override
public List<Filter> getFilters() { public List<Filter> getFilters() {
return filters; return filters;