diff --git a/src/main/java/li/cil/oc/common/block/Cable.scala b/src/main/java/li/cil/oc/common/block/Cable.scala index 0ffed70e9..a8ff234f6 100644 --- a/src/main/java/li/cil/oc/common/block/Cable.scala +++ b/src/main/java/li/cil/oc/common/block/Cable.scala @@ -1,6 +1,7 @@ package li.cil.oc.common.block -import codechicken.multipart.TileMultipart +import codechicken.lib.vec.Cuboid6 +import codechicken.multipart.{JNormalOcclusion, NormalOcclusionTest, TileMultipart} import cpw.mods.fml.common.Loader import cpw.mods.fml.relauncher.{SideOnly, Side} import java.util @@ -66,7 +67,7 @@ class Cable(val parent: SpecialDelegator) extends SpecialDelegate { } object Cable { - private val cachedBounds = { + val cachedBounds = { // 6 directions = 6 bits = 11111111b >> 2 = 0xFF >> 2 (0 to 0xFF >> 2).map(mask => { val bounds = AxisAlignedBB.getBoundingBox(-0.125, -0.125, -0.125, 0.125, 0.125, 0.125) @@ -125,7 +126,15 @@ object Cable { private def canConnectFromSide(tileEntity: TileEntity, side: ForgeDirection) = tileEntity match { - case host: TileMultipart => !host.isSolid(side.ordinal) + case host: TileMultipart => + !host.partList.exists { + case part: JNormalOcclusion if !part.isInstanceOf[CablePart] => + import scala.collection.convert.WrapAsScala._ + val ownBounds = Iterable(new Cuboid6(cachedBounds(side.flag))) + val otherBounds = part.getOcclusionBoxes + !NormalOcclusionTest(ownBounds, otherBounds) + case _ => false + } case _ => true } } \ No newline at end of file diff --git a/src/main/java/li/cil/oc/server/network/Network.scala b/src/main/java/li/cil/oc/server/network/Network.scala index 4343d62e2..82192bf48 100644 --- a/src/main/java/li/cil/oc/server/network/Network.scala +++ b/src/main/java/li/cil/oc/server/network/Network.scala @@ -1,9 +1,11 @@ package li.cil.oc.server.network -import codechicken.multipart.TileMultipart +import codechicken.lib.vec.Cuboid6 +import codechicken.multipart.{JNormalOcclusion, NormalOcclusionTest, TileMultipart} import cpw.mods.fml.common.{Loader, FMLCommonHandler} import cpw.mods.fml.relauncher.Side import li.cil.oc.api.network.{Node => ImmutableNode, SidedEnvironment, Environment, Visibility} +import li.cil.oc.common.block.Cable import li.cil.oc.common.multipart.CablePart import li.cil.oc.common.tileentity.PassiveNode import li.cil.oc.server.network.{Node => MutableNode} @@ -434,7 +436,15 @@ object Network extends api.detail.NetworkAPI { private def canConnectFromSide(tileEntity: TileEntity, side: ForgeDirection) = tileEntity match { - case host: TileMultipart => !host.isSolid(side.ordinal) + case host: TileMultipart => + !host.partList.exists { + case part: JNormalOcclusion if !part.isInstanceOf[CablePart] => + import scala.collection.convert.WrapAsScala._ + val ownBounds = Iterable(new Cuboid6(Cable.cachedBounds(side.flag))) + val otherBounds = part.getOcclusionBoxes + !NormalOcclusionTest(ownBounds, otherBounds) + case _ => false + } case _ => true }