From 998e228820b167dcfcf00d3f25363a1ef62de9a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 3 Oct 2014 13:11:41 +0200 Subject: [PATCH] Little experiment to try and make the inventory driver respect permissions on inventories (using a fake player an isUseableByPlayer). --- src/main/java/li/cil/occ/OpenComponents.java | 5 ++++ .../cil/occ/mods/vanilla/DriverInventory.java | 30 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/li/cil/occ/OpenComponents.java b/src/main/java/li/cil/occ/OpenComponents.java index 174e4ba5b..fb13eb7ef 100644 --- a/src/main/java/li/cil/occ/OpenComponents.java +++ b/src/main/java/li/cil/occ/OpenComponents.java @@ -51,6 +51,8 @@ public class OpenComponents { public static Boolean allowItemStackInspection = false; + public static String fakePlayerName = "[OpenComponents]"; + @Mod.EventHandler public void preInit(final FMLPreInitializationEvent e) { final Configuration config = new Configuration(e.getSuggestedConfigurationFile()); @@ -71,6 +73,9 @@ public class OpenComponents { allowItemStackInspection = config.get("vanilla", "allowItemStackInspection", false). getBoolean(false); + fakePlayerName = config.get("general", "fakePlayerName", fakePlayerName). + getString(); + config.save(); } diff --git a/src/main/java/li/cil/occ/mods/vanilla/DriverInventory.java b/src/main/java/li/cil/occ/mods/vanilla/DriverInventory.java index dd513e338..e3bb27c04 100644 --- a/src/main/java/li/cil/occ/mods/vanilla/DriverInventory.java +++ b/src/main/java/li/cil/occ/mods/vanilla/DriverInventory.java @@ -7,9 +7,13 @@ import li.cil.oc.api.network.ManagedEnvironment; import li.cil.oc.api.prefab.DriverTileEntity; import li.cil.occ.OpenComponents; import li.cil.occ.mods.ManagedTileEntityEnvironment; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; import net.minecraft.world.World; +import net.minecraftforge.common.FakePlayerFactory; public final class DriverInventory extends DriverTileEntity { @Override @@ -19,26 +23,34 @@ public final class DriverInventory extends DriverTileEntity { @Override public ManagedEnvironment createEnvironment(final World world, final int x, final int y, final int z) { - return new Environment((IInventory) world.getBlockTileEntity(x, y, z)); + return new Environment(world.getBlockTileEntity(x, y, z), world); } public static final class Environment extends ManagedTileEntityEnvironment { - public Environment(final IInventory tileEntity) { - super(tileEntity, "inventory"); + private final EntityPlayer fakePlayer; + private final Vec3 position; + + public Environment(final TileEntity tileEntity, final World world) { + super((IInventory) tileEntity, "inventory"); + fakePlayer = FakePlayerFactory.get(world, OpenComponents.fakePlayerName); + position = Vec3.createVectorHelper(tileEntity.xCoord + 0.5, tileEntity.yCoord + 0.5, tileEntity.zCoord + 0.5); } @Callback(doc = "function():string -- Get the name of this inventory.") public Object[] getInventoryName(final Context context, final Arguments args) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; return new Object[]{tileEntity.getInvName()}; } @Callback(doc = "function():number -- Get the number of slots in this inventory.") public Object[] getInventorySize(final Context context, final Arguments args) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; return new Object[]{tileEntity.getSizeInventory()}; } @Callback(doc = "function(slot:number):number -- Get the stack size of the item stack in the specified slot.") public Object[] getSlotStackSize(final Context context, final Arguments args) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; final int slot = checkSlot(args, 0); final ItemStack stack = tileEntity.getStackInSlot(slot); if (stack != null) { @@ -50,6 +62,7 @@ public final class DriverInventory extends DriverTileEntity { @Callback(doc = "function(slot:number):number -- Get the maximum stack size of the item stack in the specified slot.") public Object[] getSlotMaxStackSize(final Context context, final Arguments args) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; final int slot = checkSlot(args, 0); final ItemStack stack = tileEntity.getStackInSlot(slot); if (stack != null) { @@ -61,6 +74,7 @@ public final class DriverInventory extends DriverTileEntity { @Callback(doc = "function(slotA:number, slotB:number):boolean -- Compare the two item stacks in the specified slots for equality.") public Object[] compareStacks(final Context context, final Arguments args) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; final int slotA = checkSlot(args, 0); final int slotB = checkSlot(args, 1); if (slotA == slotB) { @@ -79,6 +93,7 @@ public final class DriverInventory extends DriverTileEntity { @Callback(doc = "function(slotA:number, slotB:number[, count:number=math.huge]):boolean -- Move up to the specified number of items from the first specified slot to the second.") public Object[] transferStack(final Context context, final Arguments args) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; final int slotA = checkSlot(args, 0); final int slotB = checkSlot(args, 1); final int count = Math.max(0, Math.min(args.count() > 2 && args.checkAny(2) != null ? args.checkInteger(2) : 64, tileEntity.getInventoryStackLimit())); @@ -121,6 +136,7 @@ public final class DriverInventory extends DriverTileEntity { @Callback(doc = "function(slot:number):table -- Get a description of the item stack in the specified slot.") public Object[] getStackInSlot(final Context context, final Arguments args) { if (OpenComponents.allowItemStackInspection) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; return new Object[]{tileEntity.getStackInSlot(checkSlot(args, 0))}; } else { return new Object[]{null, "not enabled in config"}; @@ -130,6 +146,7 @@ public final class DriverInventory extends DriverTileEntity { @Callback(doc = "function():table -- Get a list of descriptions for all item stacks in this inventory.") public Object[] getAllStacks(final Context context, final Arguments args) { if (OpenComponents.allowItemStackInspection) { + if (!checkPermission()) return new Object[]{null, "permission denied"}; ItemStack[] allStacks = new ItemStack[tileEntity.getSizeInventory()]; for (int i = 0; i < tileEntity.getSizeInventory(); i++) { allStacks[i] = tileEntity.getStackInSlot(i); @@ -151,5 +168,12 @@ public final class DriverInventory extends DriverTileEntity { private boolean itemEquals(final ItemStack stackA, final ItemStack stackB) { return stackA.itemID == stackB.itemID && !stackA.getHasSubtypes() || stackA.getItemDamage() == stackB.getItemDamage(); } + + private boolean checkPermission() { + synchronized (fakePlayer) { + fakePlayer.setPosition(position.xCoord, position.yCoord, position.zCoord); + return tileEntity.isUseableByPlayer(fakePlayer); + } + } } }