Added filter for ignoring tasks created in an automated way, fixes #867

This commit is contained in:
raoulvdberge
2017-02-02 13:00:36 +01:00
parent c7a2e9a908
commit fcfd1ba819
17 changed files with 194 additions and 10 deletions

View File

@@ -34,6 +34,8 @@
- Handle breaking and placing blocks better for Constructor and Destructor (way2muchnoise)
- Updated Forge to 2226 (raoulvdberge)
- Updated Chinese translation (TartaricAcid)
- Added filtering slots for the Crafting Monitor (raoulvdberge)
- Added way to hide tasks created in an automated way in the Crafting Monitor (raoulvdberge)
### 1.3.5
- Fixed TPS lag on very large crafting tasks (way2muchnoise)

View File

@@ -21,6 +21,7 @@ public interface ICraftingTask {
String NBT_PATTERN_STACK = "PatternStack";
String NBT_PATTERN_CONTAINER = "PatternContainer";
String NBT_REQUESTED = "Requested";
String NBT_AUTOMATED = "Automated";
/**
* Calculates what this task will do, but doesn't run the task yet.
@@ -76,6 +77,7 @@ public interface ICraftingTask {
tag.setString(NBT_PATTERN_ID, getPattern().getId());
tag.setTag(NBT_PATTERN_STACK, getPattern().getStack().serializeNBT());
tag.setLong(NBT_PATTERN_CONTAINER, getPattern().getContainer().getPosition().toLong());
tag.setBoolean(NBT_AUTOMATED, isAutomated());
if (getRequested() != null) {
tag.setTag(NBT_REQUESTED, getRequested().serializeNBT());
@@ -129,7 +131,7 @@ public interface ICraftingTask {
List<ICraftingPreviewElement> getPreviewStacks();
/**
* @return whether this crafting task is created in an automated way
* @return whether this crafting task is created in an automated way (through a Crafting Upgrade or the "Trigger task with redstone signal" option in the Crafter) for example
*/
boolean isAutomated();
}

View File

@@ -38,7 +38,6 @@ public class CraftingTask implements ICraftingTask {
public static final String NBT_TO_TAKE_FLUIDS = "ToTakeFluids";
public static final String NBT_TO_INSERT_ITEMS = "ToInsertItems";
public static final String NBT_TO_INSERT_FLUIDS = "ToInsertFluids";
public static final String NBT_AUTOMATED = "Automated";
private INetworkMaster network;
@Nullable
@@ -492,8 +491,6 @@ public class CraftingTask implements ICraftingTask {
tag.setTag(NBT_TO_INSERT_FLUIDS, toInsertFluidsList);
tag.setBoolean(NBT_AUTOMATED, automated);
return tag;
}

View File

@@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode;
import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.data.TileDataManager;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
@@ -24,6 +25,9 @@ import java.util.List;
public class NetworkNodeCraftingMonitor extends NetworkNode implements ICraftingMonitor {
public static final String ID = "crafting_monitor";
private static final String NBT_VIEW_AUTOMATED = "ViewAutomated";
private boolean viewAutomated = true;
private List<Filter> filters = new ArrayList<>();
private ItemHandlerFilter filter = new ItemHandlerFilter(filters, new ArrayList<>(), new IItemHandlerListener() {
private ItemHandlerListenerNetworkNode base = new ItemHandlerListenerNetworkNode(NetworkNodeCraftingMonitor.this);
@@ -102,6 +106,8 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting
RSUtils.writeItems(filter, 0, tag);
tag.setBoolean(NBT_VIEW_AUTOMATED, viewAutomated);
return tag;
}
@@ -110,6 +116,24 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting
super.read(tag);
RSUtils.readItems(filter, 0, tag);
if (tag.hasKey(NBT_VIEW_AUTOMATED)) {
viewAutomated = tag.getBoolean(NBT_VIEW_AUTOMATED);
}
}
@Override
public boolean canViewAutomated() {
return holder.world().isRemote ? TileCraftingMonitor.VIEW_AUTOMATED.getValue() : viewAutomated;
}
@Override
public void onViewAutomatedChanged(boolean viewAutomated) {
TileDataManager.setParameter(TileCraftingMonitor.VIEW_AUTOMATED, viewAutomated);
}
public void setViewAutomated(boolean viewAutomated) {
this.viewAutomated = viewAutomated;
}
public ItemHandlerFilter getFilter() {

View File

@@ -8,11 +8,13 @@ import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.SlotItemHandler;
import javax.annotation.Nullable;
public class ContainerCraftingMonitor extends ContainerBase {
private ICraftingMonitor craftingMonitor;
public ContainerCraftingMonitor(ICraftingMonitor craftingMonitor, EntityPlayer player) {
super(craftingMonitor instanceof TileCraftingMonitor ? (TileCraftingMonitor) craftingMonitor : null, player);
public ContainerCraftingMonitor(ICraftingMonitor craftingMonitor, @Nullable TileCraftingMonitor craftingMonitorTile, EntityPlayer player) {
super(craftingMonitorTile, player);
this.craftingMonitor = craftingMonitor;

View File

@@ -17,6 +17,8 @@ import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.SlotItemHandler;
import javax.annotation.Nullable;
public class ContainerGrid extends ContainerBase {
public static final int TAB_WIDTH = 28;
public static final int TAB_HEIGHT = 31;
@@ -27,7 +29,7 @@ public class ContainerGrid extends ContainerBase {
private SlotGridCraftingResult craftingResultSlot;
private SlotDisabled patternResultSlot;
public ContainerGrid(IGrid grid, IGridDisplay display, TileGrid gridTile, EntityPlayer player) {
public ContainerGrid(IGrid grid, IGridDisplay display, @Nullable TileGrid gridTile, EntityPlayer player) {
super(gridTile, player);
this.grid = grid;

View File

@@ -5,6 +5,7 @@ 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.sidebutton.SideButtonCraftingMonitorViewAutomated;
import com.raoulvdberge.refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
@@ -67,6 +68,8 @@ public class GuiCraftingMonitor extends GuiBase {
addSideButton(new SideButtonRedstoneMode(this, craftingMonitor.getRedstoneModeParameter()));
}
addSideButton(new SideButtonCraftingMonitorViewAutomated(this, craftingMonitor));
String cancel = t("gui.cancel");
String cancelAll = t("misc.refinedstorage:cancel_all");

View File

@@ -52,7 +52,7 @@ public class GuiHandler implements IGuiHandler {
case RSGui.INTERFACE:
return new ContainerInterface((TileInterface) tile, player);
case RSGui.CRAFTING_MONITOR:
return new ContainerCraftingMonitor(((TileCraftingMonitor) tile).getNode(), player);
return new ContainerCraftingMonitor(((TileCraftingMonitor) tile).getNode(), (TileCraftingMonitor) tile, player);
case RSGui.WIRELESS_TRANSMITTER:
return new ContainerWirelessTransmitter((TileWirelessTransmitter) tile, player);
case RSGui.CRAFTER:
@@ -186,11 +186,11 @@ public class GuiHandler implements IGuiHandler {
private GuiCraftingMonitor getWirelessCraftingMonitorGui(EntityPlayer player, int hand, int controllerDimension) {
WirelessCraftingMonitor craftingMonitor = getWirelessCraftingMonitor(player, hand, controllerDimension);
return new GuiCraftingMonitor(new ContainerCraftingMonitor(craftingMonitor, player), craftingMonitor);
return new GuiCraftingMonitor(new ContainerCraftingMonitor(craftingMonitor, null, player), craftingMonitor);
}
private ContainerCraftingMonitor getWirelessCraftingMonitorContainer(EntityPlayer player, int hand, int controllerDimension) {
return new ContainerCraftingMonitor(getWirelessCraftingMonitor(player, hand, controllerDimension), player);
return new ContainerCraftingMonitor(getWirelessCraftingMonitor(player, hand, controllerDimension), null, player);
}
private ContainerFilter getFilterContainer(EntityPlayer player, int hand) {

View File

@@ -0,0 +1,30 @@
package com.raoulvdberge.refinedstorage.gui.sidebutton;
import com.raoulvdberge.refinedstorage.gui.GuiBase;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import net.minecraft.util.text.TextFormatting;
public class SideButtonCraftingMonitorViewAutomated extends SideButton {
private ICraftingMonitor craftingMonitor;
public SideButtonCraftingMonitorViewAutomated(GuiBase gui, ICraftingMonitor craftingMonitor) {
super(gui);
this.craftingMonitor = craftingMonitor;
}
@Override
public String getTooltip() {
return TextFormatting.GREEN + GuiBase.t("sidebutton.refinedstorage:crafting_monitor.view_automated") + TextFormatting.RESET + "\n" + GuiBase.t("gui." + (craftingMonitor.canViewAutomated() ? "yes" : "no"));
}
@Override
protected void drawButtonIcon(int x, int y) {
gui.drawTexture(x, y, craftingMonitor.canViewAutomated() ? 0 : 16, 144, 16, 16);
}
@Override
public void actionPerformed() {
craftingMonitor.onViewAutomatedChanged(!craftingMonitor.canViewAutomated());
}
}

View File

@@ -5,14 +5,36 @@ import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler;
import com.raoulvdberge.refinedstorage.apiimpl.network.item.NetworkItemWirelessCraftingMonitor;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
public class ItemWirelessCraftingMonitor extends ItemNetworkItem {
private static final String NBT_VIEW_AUTOMATED = "ViewAutomated";
public ItemWirelessCraftingMonitor() {
super("wireless_crafting_monitor");
}
@Override
public void initializeDefaults(NBTTagCompound tag) {
super.initializeDefaults(tag);
tag.setBoolean(NBT_VIEW_AUTOMATED, true);
}
@Override
public INetworkItem provide(INetworkItemHandler handler, EntityPlayer player, ItemStack stack) {
return new NetworkItemWirelessCraftingMonitor(handler, player, stack);
}
public static void setViewAutomated(ItemStack stack, boolean viewAutomated) {
if (!stack.hasTagCompound()) {
stack.setTagCompound(new NBTTagCompound());
}
stack.getTagCompound().setBoolean(NBT_VIEW_AUTOMATED, viewAutomated);
}
public static boolean canViewAutomated(ItemStack stack) {
return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_VIEW_AUTOMATED) && stack.getTagCompound().getBoolean(NBT_VIEW_AUTOMATED);
}
}

View File

@@ -50,6 +50,10 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler
for (ICraftingTask task : craftingMonitor.getTasks()) {
ItemStack stack = task.getRequested();
if (!craftingMonitor.canViewAutomated() && task.isAutomated()) {
continue;
}
if (stack == null || GridFilterFilter.accepts(craftingMonitor.getFilters(), stack, Item.REGISTRY.getNameForObject(stack.getItem()).getResourceDomain())) {
elements.addAll(task.getCraftingMonitorElements());
}

View File

@@ -0,0 +1,44 @@
package com.raoulvdberge.refinedstorage.network;
import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor;
import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.WirelessCraftingMonitor;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
public class MessageWirelessCraftingMonitorViewAutomated extends MessageHandlerPlayerToServer<MessageWirelessCraftingMonitorViewAutomated> implements IMessage {
private boolean viewAutomated;
public MessageWirelessCraftingMonitorViewAutomated() {
}
public MessageWirelessCraftingMonitorViewAutomated(boolean viewAutomated) {
this.viewAutomated = viewAutomated;
}
@Override
public void fromBytes(ByteBuf buf) {
viewAutomated = buf.readBoolean();
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeBoolean(viewAutomated);
}
@Override
public void handle(MessageWirelessCraftingMonitorViewAutomated message, EntityPlayerMP player) {
if (player.openContainer instanceof ContainerCraftingMonitor) {
ICraftingMonitor craftingMonitor = ((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor();
if (craftingMonitor instanceof WirelessCraftingMonitor) {
ItemStack stack = ((WirelessCraftingMonitor) craftingMonitor).getStack();
ItemWirelessCraftingMonitor.setViewAutomated(stack, message.viewAutomated);
}
}
}
}

View File

@@ -123,6 +123,7 @@ public class ProxyCommon {
RS.INSTANCE.network.registerMessage(MessageSecurityManagerUpdate.class, MessageSecurityManagerUpdate.class, id++, Side.SERVER);
RS.INSTANCE.network.registerMessage(MessageWirelessFluidGridSettingsUpdate.class, MessageWirelessFluidGridSettingsUpdate.class, id++, Side.SERVER);
RS.INSTANCE.network.registerMessage(MessageNodeRemove.class, MessageNodeRemove.class, id++, Side.CLIENT);
RS.INSTANCE.network.registerMessage(MessageWirelessCraftingMonitorViewAutomated.class, MessageWirelessCraftingMonitorViewAutomated.class, id++, Side.SERVER);
NetworkRegistry.INSTANCE.registerGuiHandler(RS.INSTANCE, new GuiHandler());

View File

@@ -26,5 +26,9 @@ public interface ICraftingMonitor {
ItemHandlerBasic getFilter();
boolean canViewAutomated();
void onViewAutomatedChanged(boolean viewAutomated);
boolean isActive();
}

View File

@@ -2,10 +2,35 @@ package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeCraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.TileNode;
import com.raoulvdberge.refinedstorage.tile.data.ITileDataConsumer;
import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.network.datasync.DataSerializers;
import javax.annotation.Nonnull;
public class TileCraftingMonitor extends TileNode<NetworkNodeCraftingMonitor> {
public static final TileDataParameter<Boolean> VIEW_AUTOMATED = new TileDataParameter<>(DataSerializers.BOOLEAN, true, new ITileDataProducer<Boolean, TileCraftingMonitor>() {
@Override
public Boolean getValue(TileCraftingMonitor tile) {
return tile.getNode().canViewAutomated();
}
}, new ITileDataConsumer<Boolean, TileCraftingMonitor>() {
@Override
public void setValue(TileCraftingMonitor tile, Boolean value) {
tile.getNode().setViewAutomated(value);
tile.getNode().markDirty();
if (tile.getNode().getNetwork() != null) {
tile.getNode().getNetwork().sendCraftingMonitorUpdate();
}
}
});
public TileCraftingMonitor() {
dataManager.addWatchedParameter(VIEW_AUTOMATED);
}
@Override
@Nonnull
public NetworkNodeCraftingMonitor createNode() {

View File

@@ -1,11 +1,13 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.RS;
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;
import com.raoulvdberge.refinedstorage.item.filter.Filter;
import com.raoulvdberge.refinedstorage.network.MessageWirelessCraftingMonitorViewAutomated;
import com.raoulvdberge.refinedstorage.tile.TileController;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.entity.player.EntityPlayerMP;
@@ -24,6 +26,7 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
private ItemStack stack;
private int controllerDimension;
private BlockPos controller;
private boolean viewAutomated;
private List<Filter> filters = new ArrayList<>();
private ItemHandlerFilter filter = new ItemHandlerFilter(filters, new ArrayList<>(), null) {
@@ -49,6 +52,7 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
this.stack = stack;
this.controllerDimension = controllerDimension;
this.controller = new BlockPos(ItemWirelessCraftingMonitor.getX(stack), ItemWirelessCraftingMonitor.getY(stack), ItemWirelessCraftingMonitor.getZ(stack));
this.viewAutomated = ItemWirelessCraftingMonitor.canViewAutomated(stack);
if (stack.hasTagCompound()) {
for (int i = 0; i < 4; ++i) {
@@ -102,6 +106,18 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
return filter;
}
@Override
public boolean canViewAutomated() {
return viewAutomated;
}
@Override
public void onViewAutomatedChanged(boolean viewAutomated) {
RS.INSTANCE.network.sendToServer(new MessageWirelessCraftingMonitorViewAutomated(viewAutomated));
this.viewAutomated = viewAutomated;
}
private TileController getController() {
World world = DimensionManager.getWorld(controllerDimension);
@@ -114,6 +130,10 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
return null;
}
public ItemStack getStack() {
return stack;
}
@Override
public boolean isActive() {
return true;

View File

@@ -134,6 +134,8 @@ sidebutton.refinedstorage:grid.size.1=Small
sidebutton.refinedstorage:grid.size.2=Medium
sidebutton.refinedstorage:grid.size.3=Large
sidebutton.refinedstorage:crafting_monitor.view_automated=View tasks started in an automated way
sidebutton.refinedstorage:mode=Mode
sidebutton.refinedstorage:mode.whitelist=Whitelist
sidebutton.refinedstorage:mode.blacklist=Blacklist