Added filter for ignoring tasks created in an automated way, fixes #867
This commit is contained in:
@@ -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)
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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() {
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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");
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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());
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -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());
|
||||
|
||||
|
@@ -26,5 +26,9 @@ public interface ICraftingMonitor {
|
||||
|
||||
ItemHandlerBasic getFilter();
|
||||
|
||||
boolean canViewAutomated();
|
||||
|
||||
void onViewAutomatedChanged(boolean viewAutomated);
|
||||
|
||||
boolean isActive();
|
||||
}
|
||||
|
@@ -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() {
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user