blob: 981199ffbe400e2829e81fbc38af945e265fb12f [file] [log] [blame] [raw]
package li.cil.oc.common.block
import java.util.Random
import cpw.mods.fml.relauncher.Side
import cpw.mods.fml.relauncher.SideOnly
import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.common.item.data.RobotData
import li.cil.oc.common.tileentity
import li.cil.oc.integration.util.NEI
import li.cil.oc.util.Rarity
import net.minecraft.client.renderer.texture.IIconRegister
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.util.IIcon
import net.minecraft.util.MovingObjectPosition
import net.minecraft.world.IBlockAccess
import net.minecraft.world.World
import net.minecraftforge.common.util.ForgeDirection
class RobotAfterimage extends SimpleBlock with traits.SpecialBlock {
setLightOpacity(0)
setCreativeTab(null)
NEI.hide(this)
private var icon: IIcon = _
// ----------------------------------------------------------------------- //
@SideOnly(Side.CLIENT)
override def getIcon(side: ForgeDirection, metadata: Int) = icon
@SideOnly(Side.CLIENT)
override def registerBlockIcons(iconRegister: IIconRegister) {
super.registerBlockIcons(iconRegister)
icon = iconRegister.registerIcon(Settings.resourceDomain + ":GenericTop")
}
override def shouldSideBeRendered(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = false
override def isBlockSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = false
override def isSideSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = false
override def getPickBlock(target: MovingObjectPosition, world: World, x: Int, y: Int, z: Int) =
findMovingRobot(world, x, y, z) match {
case Some(robot) => robot.info.createItemStack()
case _ => null
}
// ----------------------------------------------------------------------- //
override def rarity(stack: ItemStack) = {
val data = new RobotData(stack)
Rarity.byTier(data.tier)
}
// ----------------------------------------------------------------------- //
override def isAir(world: IBlockAccess, x: Int, y: Int, z: Int) = true
// ----------------------------------------------------------------------- //
override def onBlockAdded(world: World, x: Int, y: Int, z: Int) {
world.scheduleBlockUpdate(x, y, z, this, math.max((Settings.get.moveDelay * 20).toInt, 1) - 1)
}
override def updateTick(world: World, x: Int, y: Int, z: Int, rng: Random) {
world.setBlockToAir(x, y, z)
}
override def removedByPlayer(world: World, player: EntityPlayer, x: Int, y: Int, z: Int, willHarvest: Boolean) = {
findMovingRobot(world, x, y, z) match {
case Some(robot) if robot.isAnimatingMove &&
robot.moveFromX == x &&
robot.moveFromY == y &&
robot.moveFromZ == z =>
robot.proxy.getBlockType.removedByPlayer(world, player, robot.x, robot.y, robot.z, false)
case _ => super.removedByPlayer(world, player, x, y, z, willHarvest) // Probably broken by the robot we represent.
}
}
override protected def doSetBlockBoundsBasedOnState(world: IBlockAccess, x: Int, y: Int, z: Int) {
findMovingRobot(world, x, y, z) match {
case Some(robot) =>
val block = robot.getBlockType
block.setBlockBoundsBasedOnState(world, robot.x, robot.y, robot.z)
val dx = robot.x - robot.moveFromX
val dy = robot.y - robot.moveFromY
val dz = robot.z - robot.moveFromZ
setBlockBounds(
block.getBlockBoundsMinX.toFloat + dx,
block.getBlockBoundsMinY.toFloat + dy,
block.getBlockBoundsMinZ.toFloat + dz,
block.getBlockBoundsMaxX.toFloat + dx,
block.getBlockBoundsMaxY.toFloat + dy,
block.getBlockBoundsMaxZ.toFloat + dz)
case _ => // throw new Exception("Robot afterimage without a robot found. This is a bug!")
}
}
override def onBlockActivated(world: World, x: Int, y: Int, z: Int, player: EntityPlayer, side: ForgeDirection, hitX: Float, hitY: Float, hitZ: Float) = {
findMovingRobot(world, x, y, z) match {
case Some(robot) => api.Items.get("robot").block.onBlockActivated(world, robot.x, robot.y, robot.z, player, side.ordinal, hitX, hitY, hitZ)
case _ => world.setBlockToAir(x, y, z)
}
}
def findMovingRobot(world: IBlockAccess, x: Int, y: Int, z: Int): Option[tileentity.Robot] = {
for (side <- ForgeDirection.VALID_DIRECTIONS) {
val (tx, ty, tz) = (x + side.offsetX, y + side.offsetY, z + side.offsetZ)
if (world match {
case world: World => world.blockExists(tx, ty, tz)
case _ => !world.isAirBlock(tx, ty, tz)
}) world.getTileEntity(tx, ty, tz) match {
case proxy: tileentity.RobotProxy if proxy.robot.moveFromX == x && proxy.robot.moveFromY == y && proxy.robot.moveFromZ == z => return Some(proxy.robot)
case _ =>
}
}
None
}
}