Disallow breaking creative tier robots by non-creative, non-authorized players. Closes #868.

Also fixed visual desync when "breaking" a creative case.
This commit is contained in:
Florian Nücke 2015-02-02 18:48:45 +01:00
parent b136e2ab7f
commit e5d8f3ab5d
5 changed files with 34 additions and 5 deletions

View File

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

View File

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

View File

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

View File

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

View File

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