Add permission system

This commit is contained in:
Raoul Van den Berge
2016-12-16 21:07:12 +01:00
parent 97ed4dd326
commit 482cefffa6
41 changed files with 226 additions and 65 deletions

View File

@@ -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";

View File

@@ -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
*/

View File

@@ -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
}

View File

@@ -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.

View File

@@ -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

View File

@@ -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;
}
}
}
}
}

View File

@@ -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<ItemStack> 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) {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -50,6 +50,7 @@ public class GuiGrid extends GuiBase implements IGridDisplay {
public static final ListMultimap<Fluid, GridStackFluid> FLUIDS = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
public static List<IGridStack> 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;

View File

@@ -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<Messa
TileGrid grid = (TileGrid) tile;
if (grid.hasNetwork()) {
if (grid.getType() == EnumGridType.CRAFTING) {
if (grid.getType() == EnumGridType.CRAFTING && grid.getNetwork().hasPermission(Permission.INSERT, player)) {
for (int i = 0; i < grid.getMatrix().getSizeInventory(); ++i) {
ItemStack slot = grid.getMatrix().getStackInSlot(i);

View File

@@ -41,7 +41,7 @@ public class MessageGridCraftingStart extends MessageHandlerPlayerToServer<Messa
IItemGridHandler handler = ((ContainerGrid) container).getGrid().getItemHandler();
if (handler != null) {
handler.onCraftingRequested(message.stack, message.quantity);
handler.onCraftingRequested(player, message.stack, message.quantity);
}
}
}

View File

@@ -15,17 +15,21 @@ import java.util.List;
public class MessageGridFluidUpdate implements IMessage, IMessageHandler<MessageGridFluidUpdate, IMessage> {
private INetworkMaster network;
private boolean canCraft;
private List<GridStackFluid> 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<Message
@Override
public void toBytes(ByteBuf buf) {
buf.writeBoolean(canCraft);
buf.writeInt(network.getFluidStorageCache().getList().getStacks().size());
for (FluidStack stack : network.getFluidStorageCache().getList().getStacks()) {
@@ -44,6 +50,8 @@ public class MessageGridFluidUpdate implements IMessage, IMessageHandler<Message
@Override
public IMessage onMessage(MessageGridFluidUpdate message, MessageContext ctx) {
GuiGrid.CAN_CRAFT = message.canCraft;
GuiGrid.FLUIDS.clear();
for (GridStackFluid item : message.stacks) {

View File

@@ -17,17 +17,21 @@ import java.util.List;
public class MessageGridItemUpdate implements IMessage, IMessageHandler<MessageGridItemUpdate, IMessage> {
private INetworkMaster network;
private boolean canCraft;
private List<GridStackItem> 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<MessageG
@Override
public void toBytes(ByteBuf buf) {
buf.writeBoolean(canCraft);
int size = network.getItemStorageCache().getList().getStacks().size();
for (ICraftingPattern pattern : network.getPatterns()) {
@@ -60,6 +66,8 @@ public class MessageGridItemUpdate implements IMessage, IMessageHandler<MessageG
@Override
public IMessage onMessage(MessageGridItemUpdate message, MessageContext ctx) {
GuiGrid.CAN_CRAFT = message.canCraft;
GuiGrid.ITEMS.clear();
for (GridStackItem item : message.stacks) {

View File

@@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.*;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory;
import com.raoulvdberge.refinedstorage.apiimpl.network.NetworkListener;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerFluids;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerItems;
import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRedstone;
@@ -123,6 +124,7 @@ public class ProxyCommon {
NetworkRegistry.INSTANCE.registerGuiHandler(RS.INSTANCE, new GuiHandler());
MinecraftForge.EVENT_BUS.register(new ContainerListener());
MinecraftForge.EVENT_BUS.register(new NetworkListener());
registerTile(TileController.class, "controller");
registerTile(TileGrid.class, "grid");

View File

@@ -14,6 +14,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.network.INetworkMaster;
import com.raoulvdberge.refinedstorage.api.network.INetworkNode;
import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph;
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.api.network.item.INetworkItemHandler;
@@ -212,6 +213,11 @@ public class TileController extends TileBase implements INetworkMaster, IRedston
return energy.getEnergyStored() > 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

View File

@@ -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);

View File

@@ -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