diff --git a/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java index 294878730..a5b59e527 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/RSUtils.java @@ -31,6 +31,9 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; @@ -299,6 +302,10 @@ public final class RSUtils { return stack == null ? null : stack.copy(); } + public static void sendNoPermissionMessage(EntityPlayer player) { + player.sendMessage(new TextComponentTranslation("misc.refinedstorage:security.no_permission").setStyle(new Style().setColor(TextFormatting.RED))); + } + public static String formatQuantity(int qty) { if (qty >= 1000000) { return QUANTITY_FORMATTER.format((float) qty / 1000000F) + "M"; 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 fe9e9b783..7fe7009ac 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java @@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterCha import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; @@ -38,6 +39,13 @@ public interface INetworkMaster { */ boolean canRun(); + /** + * @param permission the permission to check for + * @param player the player to check that permission for + * @return whether the player has the given permission + */ + boolean hasPermission(Permission permission, EntityPlayer player); + /** * @return a graph of connected nodes to this network */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/Permission.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/Permission.java new file mode 100755 index 000000000..3fe7dbf01 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/Permission.java @@ -0,0 +1,27 @@ +package com.raoulvdberge.refinedstorage.api.network; + +/** + * The various permissions a player can have in a network. + */ +public enum Permission { + /** + * Whether the player can insert items in a network. + */ + INSERT, + /** + * Whether the player can extract items from a network. + */ + EXTRACT, + /** + * Whether the player can start, cancel or view an autocrafting task. + */ + AUTOCRAFT, + /** + * Whether the player can open network GUIs and can place or break network blocks. + */ + MODIFY, + /** + * Whether the player can manage the security options for a network. + */ + SECURITY +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IItemGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IItemGridHandler.java index 4a838d9ad..834b093a9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IItemGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IItemGridHandler.java @@ -52,10 +52,11 @@ public interface IItemGridHandler { /** * Called when a player requested crafting for an item. * + * @param player the player that is requesting the crafting * @param stack the {@link ItemStack} to request a craft for * @param quantity the amount of that item that has to be crafted */ - void onCraftingRequested(ItemStack stack, int quantity); + void onCraftingRequested(EntityPlayerMP player, ItemStack stack, int quantity); /** * Called when a player wants to cancel a crafting task. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/item/INetworkItemProvider.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/item/INetworkItemProvider.java index e39a6b548..7c87a7b5f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/item/INetworkItemProvider.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/item/INetworkItemProvider.java @@ -10,7 +10,7 @@ public interface INetworkItemProvider { /** * Creates a network item for the given item stack. * - * @param handler the network item handlelr + * @param handler the network item handler * @param player the player * @param stack the stack * @return the network item diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkListener.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkListener.java new file mode 100755 index 000000000..c94e871bd --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/NetworkListener.java @@ -0,0 +1,53 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network; + +import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.network.INetworkNode; +import com.raoulvdberge.refinedstorage.api.network.Permission; +import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNode; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.event.world.BlockEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +public class NetworkListener { + @SubscribeEvent + public void onBlockPlace(BlockEvent.PlaceEvent e) { + if (!e.getWorld().isRemote) { + for (EnumFacing facing : EnumFacing.VALUES) { + TileEntity tile = e.getWorld().getTileEntity(e.getBlockSnapshot().getPos().offset(facing)); + + if (tile != null && tile.hasCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, facing.getOpposite())) { + INetworkNode node = tile.getCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, facing.getOpposite()); + + if (node.getNetwork() != null && !node.getNetwork().hasPermission(Permission.MODIFY, e.getPlayer())) { + RSUtils.sendNoPermissionMessage(e.getPlayer()); + + e.setCanceled(true); + + return; + } + } + } + } + } + + @SubscribeEvent + public void onBlockBreak(BlockEvent.BreakEvent e) { + if (!e.getWorld().isRemote) { + TileEntity tile = e.getWorld().getTileEntity(e.getPos()); + + if (tile != null && tile.hasCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, null)) { + + INetworkNode node = tile.getCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, null); + + if (node.getNetwork() != null && !node.getNetwork().hasPermission(Permission.MODIFY, e.getPlayer())) { + RSUtils.sendNoPermissionMessage(e.getPlayer()); + + e.setCanceled(true); + + return; + } + } + } + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java index 80dc31ece..a9a1e6eaf 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/ItemGridHandler.java @@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem; import com.raoulvdberge.refinedstorage.api.util.IStackList; @@ -31,7 +32,7 @@ public class ItemGridHandler implements IItemGridHandler { public void onExtract(int hash, int flags, EntityPlayerMP player) { ItemStack item = network.getItemStorageCache().getList().get(hash); - if (item == null) { + if (item == null || !network.hasPermission(Permission.EXTRACT, player)) { return; } @@ -99,6 +100,10 @@ public class ItemGridHandler implements IItemGridHandler { @Override public ItemStack onInsert(EntityPlayerMP player, ItemStack stack) { + if (!network.hasPermission(Permission.INSERT, player)) { + return stack; + } + ItemStack remainder = network.insertItem(stack, stack.getCount(), false); INetworkItem networkItem = network.getNetworkItemHandler().getItem(player); @@ -112,7 +117,7 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onInsertHeldItem(EntityPlayerMP player, boolean single) { - if (player.inventory.getItemStack().isEmpty()) { + if (player.inventory.getItemStack().isEmpty() || !network.hasPermission(Permission.INSERT, player)) { return; } @@ -144,6 +149,10 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onCraftingPreviewRequested(EntityPlayerMP player, int hash, int quantity) { + if (!network.hasPermission(Permission.AUTOCRAFT, player)) { + return; + } + IStackList cache = API.instance().createItemStackList(); for (ICraftingPattern pattern : network.getPatterns()) { @@ -170,8 +179,8 @@ public class ItemGridHandler implements IItemGridHandler { } @Override - public void onCraftingRequested(ItemStack stack, int quantity) { - if (quantity <= 0) { + public void onCraftingRequested(EntityPlayerMP player, ItemStack stack, int quantity) { + if (quantity <= 0 || !network.hasPermission(Permission.AUTOCRAFT, player)) { return; } @@ -188,6 +197,10 @@ public class ItemGridHandler implements IItemGridHandler { @Override public void onCraftingCancelRequested(EntityPlayerMP player, int id) { + if (!network.hasPermission(Permission.AUTOCRAFT, player)) { + return; + } + if (id >= 0 && id < network.getCraftingTasks().size()) { network.cancelCraftingTask(network.getCraftingTasks().get(id)); } else if (id == -1) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java index 5759db6f9..5e83662e7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java @@ -2,7 +2,9 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.item; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; +import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor; @@ -36,6 +38,12 @@ public class NetworkItemWirelessCraftingMonitor implements INetworkItem { return false; } + if (!network.hasPermission(Permission.AUTOCRAFT, player)) { + RSUtils.sendNoPermissionMessage(player); + + return false; + } + player.openGui(RS.INSTANCE, RSGui.WIRELESS_CRAFTING_MONITOR, player.getEntityWorld(), hand.ordinal(), controllerWorld.provider.getDimension(), 0); network.sendCraftingMonitorUpdate((EntityPlayerMP) player); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java index 66656fadf..a8049f7ad 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessGrid.java @@ -2,7 +2,9 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.item; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; +import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItem; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; import com.raoulvdberge.refinedstorage.item.ItemWirelessGrid; @@ -36,6 +38,12 @@ public class NetworkItemWirelessGrid implements INetworkItem { return false; } + if (!network.hasPermission(Permission.MODIFY, player)) { + RSUtils.sendNoPermissionMessage(player); + + return false; + } + player.openGui(RS.INSTANCE, RSGui.WIRELESS_GRID, player.getEntityWorld(), hand.ordinal(), controllerWorld.provider.getDimension(), 0); network.sendItemStorageToClient((EntityPlayerMP) player); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java index 10836d35d..a0a0e5445 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockBase.java @@ -1,7 +1,11 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.network.INetworkNode; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.item.ItemBlockBase; +import com.raoulvdberge.refinedstorage.proxy.CapabilityNetworkNode; import com.raoulvdberge.refinedstorage.tile.TileBase; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -128,6 +132,32 @@ public abstract class BlockBase extends Block { world.setBlockToAir(pos); } + protected boolean tryOpenNetworkGui(int guiId, EntityPlayer player, World world, BlockPos pos, EnumFacing facing) { + return tryOpenNetworkGui(guiId, player, world, pos, facing, Permission.MODIFY); + } + + protected boolean tryOpenNetworkGui(int guiId, EntityPlayer player, World world, BlockPos pos, EnumFacing facing, Permission... permissions) { + TileEntity tile = world.getTileEntity(pos); + + if (tile != null && tile.hasCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, facing)) { + INetworkNode node = CapabilityNetworkNode.NETWORK_NODE_CAPABILITY.cast(tile.getCapability(CapabilityNetworkNode.NETWORK_NODE_CAPABILITY, facing)); + + if (node.getNetwork() != null) { + for (Permission permission : permissions) { + if (!node.getNetwork().hasPermission(permission, player)) { + RSUtils.sendNoPermissionMessage(player); + + return false; + } + } + } + } + + player.openGui(RS.INSTANCE, guiId, world, pos.getX(), pos.getY(), pos.getZ()); + + return true; + } + public EnumPlacementType getPlacementType() { return EnumPlacementType.HORIZONTAL; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockConstructor.java index 772fe7414..f6e930911 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockConstructor.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileConstructor; import net.minecraft.block.state.IBlockState; @@ -80,7 +79,7 @@ public class BlockConstructor extends BlockCable { } if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.CONSTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.CONSTRUCTOR, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java index 8cc54f56a..2e6dcbd79 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockController.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.item.ItemBlockController; @@ -79,7 +78,7 @@ public class BlockController extends BlockBase { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.CONTROLLER, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.CONTROLLER, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafter.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafter.java index 6c2a799d3..fc4a0077b 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCrafter.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileCrafter; import net.minecraft.block.state.IBlockState; @@ -24,7 +23,7 @@ public class BlockCrafter extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.CRAFTER, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.CRAFTER, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java index 4876e7595..ee39bac93 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -23,9 +23,7 @@ public class BlockCraftingMonitor extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, 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()); - + if (!world.isRemote && tryOpenNetworkGui(RSGui.CRAFTING_MONITOR, player, world, pos, side, Permission.MODIFY, Permission.AUTOCRAFT)) { ((TileCraftingMonitor) world.getTileEntity(pos)).onOpened(player); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java index 782dbcdf2..a443f4f7a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDestructor.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileDestructor; @@ -37,7 +36,7 @@ public class BlockDestructor extends BlockCable { } if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.DESTRUCTOR, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.DESTRUCTOR, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDetector.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDetector.java index 91f522f40..078ada55d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDetector.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDetector.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileDetector; import net.minecraft.block.properties.PropertyBool; @@ -70,7 +69,7 @@ public class BlockDetector extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.DETECTOR, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.DETECTOR, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java index afccff2ba..b33216c5d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskDrive.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.render.PropertyObject; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; @@ -30,7 +29,7 @@ public class BlockDiskDrive extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.DISK_DRIVE, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.DISK_DRIVE, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskManipulator.java index 15980437d..d763475d5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockDiskManipulator.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.render.PropertyObject; import com.raoulvdberge.refinedstorage.tile.TileDiskManipulator; @@ -30,7 +29,7 @@ public class BlockDiskManipulator extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.DISK_MANIPULATOR, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.DISK_MANIPULATOR, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExporter.java index b53a65b7c..00e9e4110 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExporter.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileExporter; import net.minecraft.block.state.IBlockState; @@ -91,7 +90,7 @@ public class BlockExporter extends BlockCable { } if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.EXPORTER, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.EXPORTER, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExternalStorage.java index 1dec26d85..b7ff7b8c0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockExternalStorage.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.externalstorage.TileExternalStorage; import net.minecraft.block.Block; @@ -74,7 +73,7 @@ public class BlockExternalStorage extends BlockCable { } if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.EXTERNAL_STORAGE, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.EXTERNAL_STORAGE, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java index e3b6e2a0a..102b98bc0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidInterface.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.tile.TileFluidInterface; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -24,7 +24,7 @@ public class BlockFluidInterface extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.FLUID_INTERFACE, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.FLUID_INTERFACE, player, world, pos, side, Permission.MODIFY, Permission.INSERT, Permission.EXTRACT); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidStorage.java index ae02e494a..62bd9d178 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockFluidStorage.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.item.ItemBlockFluidStorage; @@ -66,7 +65,7 @@ public class BlockFluidStorage extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.FLUID_STORAGE, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.FLUID_STORAGE, player, world, pos, side); } 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 4eaf36412..e1f1171c6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockGrid.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.item.ItemBlockBase; import com.raoulvdberge.refinedstorage.tile.grid.TileGrid; @@ -56,9 +55,7 @@ public class BlockGrid extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.GRID, world, pos.getX(), pos.getY(), pos.getZ()); - + if (!world.isRemote && tryOpenNetworkGui(RSGui.GRID, player, world, pos, side)) { ((TileGrid) world.getTileEntity(pos)).onOpened(player); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockImporter.java index 2998dac53..eb4b871a0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockImporter.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileImporter; import net.minecraft.block.state.IBlockState; @@ -91,7 +90,7 @@ public class BlockImporter extends BlockCable { } if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.IMPORTER, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.IMPORTER, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java index 0375c0624..5388a9af0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockInterface.java @@ -1,7 +1,7 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.tile.TileInterface; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -24,7 +24,7 @@ public class BlockInterface extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.INTERFACE, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.INTERFACE, player, world, pos, side, Permission.MODIFY, Permission.INSERT, Permission.EXTRACT); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNetworkTransmitter.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNetworkTransmitter.java index 2c9cbe8d6..05d93d13d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNetworkTransmitter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockNetworkTransmitter.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileNetworkTransmitter; import net.minecraft.block.state.IBlockState; @@ -19,7 +18,7 @@ public class BlockNetworkTransmitter extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.NETWORK_TRANSMITTER, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.NETWORK_TRANSMITTER, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockReader.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockReader.java index 2fdf7144e..4e3c24bb5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockReader.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockReader.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileReader; @@ -32,9 +31,7 @@ public class BlockReader extends BlockCable { return false; } - if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.READER_WRITER, world, pos.getX(), pos.getY(), pos.getZ()); - + if (!world.isRemote && tryOpenNetworkGui(RSGui.READER_WRITER, player, world, pos, side)) { ((TileReader) world.getTileEntity(pos)).onOpened(player); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockRelay.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockRelay.java index 1c822edf2..6d96e8ed3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockRelay.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockRelay.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileRelay; import net.minecraft.block.state.IBlockState; @@ -24,7 +23,7 @@ public class BlockRelay extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.RELAY, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.RELAY, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSolderer.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSolderer.java index 562c97a19..d5aac7908 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSolderer.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockSolderer.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileSolderer; import net.minecraft.block.state.IBlockState; @@ -46,7 +45,7 @@ public class BlockSolderer extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.SOLDERER, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.SOLDERER, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorage.java index d0fc92fa5..a64ea7b83 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorage.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.item.ItemBlockStorage; @@ -66,7 +65,7 @@ public class BlockStorage extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.STORAGE, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.STORAGE, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWirelessTransmitter.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWirelessTransmitter.java index e63fd89bd..46b27034f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWirelessTransmitter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWirelessTransmitter.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileWirelessTransmitter; import net.minecraft.block.Block; @@ -36,7 +35,7 @@ public class BlockWirelessTransmitter extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.WIRELESS_TRANSMITTER, world, pos.getX(), pos.getY(), pos.getZ()); + tryOpenNetworkGui(RSGui.WIRELESS_TRANSMITTER, player, world, pos, side); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWriter.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWriter.java index d4f6b0f9f..9a70d7b5f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWriter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockWriter.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.block; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSGui; import com.raoulvdberge.refinedstorage.tile.TileWriter; @@ -32,9 +31,7 @@ public class BlockWriter extends BlockCable { return false; } - if (!world.isRemote) { - player.openGui(RS.INSTANCE, RSGui.READER_WRITER, world, pos.getX(), pos.getY(), pos.getZ()); - + if (!world.isRemote && tryOpenNetworkGui(RSGui.READER_WRITER, player, world, pos, side)) { ((TileWriter) world.getTileEntity(pos)).onOpened(player); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java index 432e3d365..3a469763e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java @@ -50,6 +50,7 @@ public class GuiGrid extends GuiBase implements IGridDisplay { public static final ListMultimap FLUIDS = Multimaps.synchronizedListMultimap(ArrayListMultimap.create()); public static List STACKS = new ArrayList<>(); + public static boolean CAN_CRAFT; private static boolean markedForSorting; @@ -515,7 +516,7 @@ public class GuiGrid extends GuiBase implements IGridDisplay { if (grid.getType() != EnumGridType.FLUID && (held.isEmpty() || (!held.isEmpty() && clickedButton == 2))) { GridStackItem stack = (GridStackItem) STACKS.get(slotNumber); - if (stack.isCraftable() && (stack.doesDisplayCraftText() || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown()))) { + if (stack.isCraftable() && (stack.doesDisplayCraftText() || (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown())) && CAN_CRAFT) { FMLCommonHandler.instance().showGuiScreen(new GuiCraftingStart(this, ((ContainerGrid) this.inventorySlots).getPlayer(), stack)); } else { int flags = 0; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java index 3035f9c06..c06145a49 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageGridCraftingClear.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.network; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.block.EnumGridType; import com.raoulvdberge.refinedstorage.tile.grid.TileGrid; import io.netty.buffer.ByteBuf; @@ -46,7 +47,7 @@ public class MessageGridCraftingClear extends MessageHandlerPlayerToServer { private INetworkMaster network; + private boolean canCraft; private List stacks = new ArrayList<>(); public MessageGridFluidUpdate() { } - public MessageGridFluidUpdate(INetworkMaster network) { + public MessageGridFluidUpdate(INetworkMaster network, boolean canCraft) { this.network = network; + this.canCraft = canCraft; } @Override public void fromBytes(ByteBuf buf) { + canCraft = buf.readBoolean(); + int items = buf.readInt(); for (int i = 0; i < items; ++i) { @@ -35,6 +39,8 @@ public class MessageGridFluidUpdate implements IMessage, IMessageHandler { private INetworkMaster network; + private boolean canCraft; private List stacks = new ArrayList<>(); public MessageGridItemUpdate() { } - public MessageGridItemUpdate(INetworkMaster network) { + public MessageGridItemUpdate(INetworkMaster network, boolean canCraft) { this.network = network; + this.canCraft = canCraft; } @Override public void fromBytes(ByteBuf buf) { + canCraft = buf.readBoolean(); + int items = buf.readInt(); for (int i = 0; i < items; ++i) { @@ -37,6 +41,8 @@ public class MessageGridItemUpdate implements IMessage, IMessageHandler 0 && redstoneMode.isEnabled(getWorld(), pos); } + @Override + public boolean hasPermission(Permission permission, EntityPlayer player) { + return true; + } + @Override public INetworkNodeGraph getNodeGraph() { return nodeGraph; @@ -466,7 +472,7 @@ public class TileController extends TileBase implements INetworkMaster, IRedston @Override public void sendItemStorageToClient(EntityPlayerMP player) { - RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(this), player); + RS.INSTANCE.network.sendTo(new MessageGridItemUpdate(this, hasPermission(Permission.AUTOCRAFT, player)), player); } @Override @@ -485,7 +491,7 @@ public class TileController extends TileBase implements INetworkMaster, IRedston @Override public void sendFluidStorageToClient(EntityPlayerMP player) { - RS.INSTANCE.network.sendTo(new MessageGridFluidUpdate(this), player); + RS.INSTANCE.network.sendTo(new MessageGridFluidUpdate(this, hasPermission(Permission.AUTOCRAFT, player)), player); } @Override 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 f32674a4a..cdde00f5f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/grid/TileGrid.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.network.Permission; import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.apiimpl.API; @@ -387,6 +388,10 @@ public class TileGrid extends TileNode implements IGrid { } public void onRecipeTransfer(EntityPlayer player, ItemStack[][] recipe) { + if (hasNetwork() && getType() == EnumGridType.CRAFTING && !network.hasPermission(Permission.EXTRACT, player)) { + return; + } + // First try to empty the crafting matrix for (int i = 0; i < matrix.getSizeInventory(); ++i) { ItemStack slot = matrix.getStackInSlot(i); diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 7116a9f5f..a9aef614d 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -78,6 +78,8 @@ misc.refinedstorage:pattern.outputs=Outputs misc.refinedstorage:pattern.invalid=Invalid pattern misc.refinedstorage:pattern.oredict=Uses ore dictionary +misc.refinedstorage:security.no_permission=You have no permission to perform that action. + misc.refinedstorage:start=Start misc.refinedstorage:clear=Clear misc.refinedstorage:set=Set