diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index f807c3ac3..b66e73471 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -27,6 +27,7 @@ import net.minecraft.tileentity.TileEntity import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.util.FakePlayer import net.minecraftforge.common.util.ForgeDirection +import net.minecraftforge.event.world.BlockEvent import net.minecraftforge.event.world.WorldEvent import scala.collection.mutable @@ -145,6 +146,22 @@ object EventHandler { } } + @SubscribeEvent + def onBlockBreak(e: BlockEvent.BreakEvent): Unit = { + e.world.getTileEntity(e.x, e.y, e.z) match { + case c: tileentity.Case => + if (c.isCreative && (!e.getPlayer.capabilities.isCreativeMode || !c.canInteract(e.getPlayer.getCommandSenderName))) { + e.setCanceled(true) + } + case r: tileentity.RobotProxy => + val robot = r.robot + if (robot.isCreative && (!e.getPlayer.capabilities.isCreativeMode || !robot.canInteract(e.getPlayer.getCommandSenderName))) { + e.setCanceled(true) + } + case _ => + } + } + lazy val drone = api.Items.get("drone") lazy val eeprom = api.Items.get("eeprom") lazy val mcu = api.Items.get("microcontroller") diff --git a/src/main/scala/li/cil/oc/common/block/Case.scala b/src/main/scala/li/cil/oc/common/block/Case.scala index e3d1dc6a1..d0e5276bf 100644 --- a/src/main/scala/li/cil/oc/common/block/Case.scala +++ b/src/main/scala/li/cil/oc/common/block/Case.scala @@ -88,9 +88,11 @@ class Case(val tier: Int) extends RedstoneAware with traits.PowerAcceptor with t else super.onBlockActivated(world, x, y, z, player, side, hitX, hitY, hitZ) } - override def removedByPlayer(world: World, player: EntityPlayer, x: Int, y: Int, z: Int, willHarvest: Boolean) = + override def removedByPlayer(world: World, player: EntityPlayer, x: Int, y: Int, z: Int, willHarvest: Boolean): Boolean = world.getTileEntity(x, y, z) match { - case c: tileentity.Case => c.canInteract(player.getCommandSenderName) && super.removedByPlayer(world, player, x, y, z, willHarvest) + case c: tileentity.Case => + if (c.isCreative && (!player.capabilities.isCreativeMode || !c.canInteract(player.getCommandSenderName))) false + else c.canInteract(player.getCommandSenderName) && super.removedByPlayer(world, player, x, y, z, willHarvest) case _ => super.removedByPlayer(world, player, x, y, z, willHarvest) } } diff --git a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala index b825a14d7..9656669b7 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotProxy.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotProxy.scala @@ -244,6 +244,11 @@ class RobotProxy extends RedstoneAware with traits.SpecialBlock with traits.Stat world.getTileEntity(x, y, z) match { case proxy: tileentity.RobotProxy => val robot = proxy.robot + // Only allow breaking creative tier robots by allowed users. + // Unlike normal robots, griefing isn't really a valid concern + // here, because to get a creative robot you need creative + // mode in the first place. + if (robot.isCreative && (!player.capabilities.isCreativeMode || !robot.canInteract(player.getCommandSenderName))) return false if (!world.isRemote) { if (robot.player == player) return false robot.node.remove() diff --git a/src/main/scala/li/cil/oc/common/tileentity/Case.scala b/src/main/scala/li/cil/oc/common/tileentity/Case.scala index 0b386a467..2a8e2d11b 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Case.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Case.scala @@ -38,7 +38,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with var maxComponents = 0 - private def isCreativeCase = tier == Tier.Four + def isCreative = tier == Tier.Four // ----------------------------------------------------------------------- // @@ -77,7 +77,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with override def canUpdate = isServer override def updateEntity() { - if (isServer && isCreativeCase && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { + if (isServer && isCreative && world.getTotalWorldTime % Settings.get.tickFrequency == 0) { // Creative case, make it generate power. node.asInstanceOf[Connector].changeBuffer(Double.PositiveInfinity) } @@ -139,7 +139,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with override def getSizeInventory = if (tier < 0 || tier >= InventorySlots.computer.length) 0 else InventorySlots.computer(tier).length override def isUseableByPlayer(player: EntityPlayer) = - super.isUseableByPlayer(player) && (!isCreativeCase || player.capabilities.isCreativeMode) + super.isUseableByPlayer(player) && (!isCreative || player.capabilities.isCreativeMode) override def isItemValidForSlot(slot: Int, stack: ItemStack) = Option(Driver.driverFor(stack, getClass)).fold(false)(driver => { diff --git a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala index c0a5cd84b..1384351a6 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -68,6 +68,8 @@ class Robot extends traits.Computer with traits.PowerInformation with IFluidHand override def tier = info.tier + def isCreative = tier == Tier.Four + // Wrapper for the part of the inventory that is mutable. val dynamicInventory = new IInventory { override def getSizeInventory = Robot.this.inventorySize @@ -715,6 +717,9 @@ class Robot extends traits.Computer with traits.PowerInformation with IFluidHand else if (stack != null && stack.stackSize > 0) spawnStackInWorld(stack, Option(ForgeDirection.UP)) } + override def isUseableByPlayer(player: EntityPlayer) = + super.isUseableByPlayer(player) && (!isCreative || player.capabilities.isCreativeMode) + override def isItemValidForSlot(slot: Int, stack: ItemStack) = (slot, Option(Driver.driverFor(stack, getClass))) match { case (0, _) => true // Allow anything in the tool slot. case (i, Some(driver)) if isContainerSlot(i) =>