From ab7b88d1a041083fe201fc9143dfd6bf03492e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 3 Aug 2014 15:07:49 +0200 Subject: [PATCH] Made robot afterimages declare themselves as air blocks and made robots ignore afterimages when moving, to avoid potential issues when for some reason they were not properly cleaned up (e.g. on chunk borders after world loads). Might help with #440. --- src/main/scala/li/cil/oc/common/block/Delegate.scala | 2 ++ src/main/scala/li/cil/oc/common/block/Delegator.scala | 6 ++++++ src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala | 2 ++ src/main/scala/li/cil/oc/common/tileentity/Robot.scala | 2 +- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/block/Delegate.scala b/src/main/scala/li/cil/oc/common/block/Delegate.scala index 3f4899259..f31d973cd 100644 --- a/src/main/scala/li/cil/oc/common/block/Delegate.scala +++ b/src/main/scala/li/cil/oc/common/block/Delegate.scala @@ -50,6 +50,8 @@ trait Delegate { def explosionResistance(entity: Entity): Float = parent.getExplosionResistance(entity) + def isAir(world: World, x: Int, y: Int, z: Int) = false + def isNormalCube(world: World, x: Int, y: Int, z: Int) = true def validRotations(world: World, x: Int, y: Int, z: Int) = validRotations_ diff --git a/src/main/scala/li/cil/oc/common/block/Delegator.scala b/src/main/scala/li/cil/oc/common/block/Delegator.scala index 5a2d3971d..bf96b59d4 100644 --- a/src/main/scala/li/cil/oc/common/block/Delegator.scala +++ b/src/main/scala/li/cil/oc/common/block/Delegator.scala @@ -146,6 +146,12 @@ class Delegator[Child <: Delegate](id: Int) extends Block(id, Material.iron) { case _ => super.getExplosionResistance(entity, world, x, y, z, explosionX, explosionY, explosionZ) } + override def isAirBlock(world: World, x: Int, y: Int, z: Int) = + subBlock(world, x, y, z) match { + case Some(subBlock) => subBlock.isAir(world, x, y, z) + case _ => super.isAirBlock(world, x, y, z) + } + override def isBlockNormalCube(world: World, x: Int, y: Int, z: Int) = subBlock(world.getBlockMetadata(x, y, z)) match { case Some(subBlock) => subBlock.isNormalCube(world, x, y, z) diff --git a/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala b/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala index 3aa35897d..d955f7595 100644 --- a/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala +++ b/src/main/scala/li/cil/oc/common/block/RobotAfterimage.scala @@ -39,6 +39,8 @@ class RobotAfterimage(val parent: SpecialDelegator) extends SpecialDelegate { override def opacity(world: World, x: Int, y: Int, z: Int) = 0 + override def isAir(world: World, x: Int, y: Int, z: Int) = true + override def isNormalCube(world: World, x: Int, y: Int, z: Int) = false override def isSolid(world: IBlockAccess, x: Int, y: Int, z: Int, side: ForgeDirection) = false 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 455e036a5..18f635721 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Robot.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Robot.scala @@ -171,7 +171,7 @@ class Robot extends traits.Computer with traits.PowerInformation with api.machin // If we broke some replaceable block (like grass) play its break sound. if (blockId > 0) { val block = Block.blocksList(blockId) - if (block != null) { + if (block != null && !Delegator.subBlock(block, metadata).exists(_ == Blocks.robotAfterimage)) { if (FluidRegistry.lookupFluidForBlock(block) == null && !block.isInstanceOf[BlockFluidBase] && !block.isInstanceOf[BlockFlowing]) {