mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-16 10:51:55 -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.MinecraftForge
|
||||||
import net.minecraftforge.common.util.FakePlayer
|
import net.minecraftforge.common.util.FakePlayer
|
||||||
import net.minecraftforge.common.util.ForgeDirection
|
import net.minecraftforge.common.util.ForgeDirection
|
||||||
|
import net.minecraftforge.event.world.BlockEvent
|
||||||
import net.minecraftforge.event.world.WorldEvent
|
import net.minecraftforge.event.world.WorldEvent
|
||||||
|
|
||||||
import scala.collection.mutable
|
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 drone = api.Items.get("drone")
|
||||||
lazy val eeprom = api.Items.get("eeprom")
|
lazy val eeprom = api.Items.get("eeprom")
|
||||||
lazy val mcu = api.Items.get("microcontroller")
|
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)
|
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 {
|
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)
|
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 {
|
world.getTileEntity(x, y, z) match {
|
||||||
case proxy: tileentity.RobotProxy =>
|
case proxy: tileentity.RobotProxy =>
|
||||||
val robot = proxy.robot
|
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 (!world.isRemote) {
|
||||||
if (robot.player == player) return false
|
if (robot.player == player) return false
|
||||||
robot.node.remove()
|
robot.node.remove()
|
||||||
|
@ -38,7 +38,7 @@ class Case(var tier: Int) extends traits.PowerAcceptor with traits.Computer with
|
|||||||
|
|
||||||
var maxComponents = 0
|
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 canUpdate = isServer
|
||||||
|
|
||||||
override def updateEntity() {
|
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.
|
// Creative case, make it generate power.
|
||||||
node.asInstanceOf[Connector].changeBuffer(Double.PositiveInfinity)
|
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 getSizeInventory = if (tier < 0 || tier >= InventorySlots.computer.length) 0 else InventorySlots.computer(tier).length
|
||||||
|
|
||||||
override def isUseableByPlayer(player: EntityPlayer) =
|
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) =
|
override def isItemValidForSlot(slot: Int, stack: ItemStack) =
|
||||||
Option(Driver.driverFor(stack, getClass)).fold(false)(driver => {
|
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
|
override def tier = info.tier
|
||||||
|
|
||||||
|
def isCreative = tier == Tier.Four
|
||||||
|
|
||||||
// Wrapper for the part of the inventory that is mutable.
|
// Wrapper for the part of the inventory that is mutable.
|
||||||
val dynamicInventory = new IInventory {
|
val dynamicInventory = new IInventory {
|
||||||
override def getSizeInventory = Robot.this.inventorySize
|
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))
|
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 {
|
override def isItemValidForSlot(slot: Int, stack: ItemStack) = (slot, Option(Driver.driverFor(stack, getClass))) match {
|
||||||
case (0, _) => true // Allow anything in the tool slot.
|
case (0, _) => true // Allow anything in the tool slot.
|
||||||
case (i, Some(driver)) if isContainerSlot(i) =>
|
case (i, Some(driver)) if isContainerSlot(i) =>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user