mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-15 10:21:45 -04:00
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:
parent
b136e2ab7f
commit
e5d8f3ab5d
@ -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")
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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 => {
|
||||
|
@ -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) =>
|
||||
|
Loading…
x
Reference in New Issue
Block a user