diff --git a/src/main/java/li/cil/oc/common/Proxy.scala b/src/main/java/li/cil/oc/common/Proxy.scala index 432d1147b..89868baf2 100644 --- a/src/main/java/li/cil/oc/common/Proxy.scala +++ b/src/main/java/li/cil/oc/common/Proxy.scala @@ -1,5 +1,6 @@ package li.cil.oc.common +import cpw.mods.fml.common.Loader import cpw.mods.fml.common.event._ import cpw.mods.fml.common.network.NetworkRegistry import cpw.mods.fml.common.registry.{TickRegistry, GameRegistry} @@ -19,7 +20,9 @@ class Proxy { Blocks.init() Items.init() - MultiPart.init() + if (Loader.isModLoaded("ForgeMultipart")) { + MultiPart.init() + } api.Driver.instance = driver.Registry api.FileSystem.instance = fs.FileSystem 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 0013c1139..0ffed70e9 100644 --- a/src/main/java/li/cil/oc/common/block/Cable.scala +++ b/src/main/java/li/cil/oc/common/block/Cable.scala @@ -1,19 +1,21 @@ package li.cil.oc.common.block +import codechicken.multipart.TileMultipart +import cpw.mods.fml.common.Loader import cpw.mods.fml.relauncher.{SideOnly, Side} import java.util +import li.cil.oc.Settings import li.cil.oc.api.network.{SidedEnvironment, Environment} +import li.cil.oc.common.multipart.CablePart import li.cil.oc.common.tileentity import li.cil.oc.util.Tooltip -import li.cil.oc.{Settings, api} import net.minecraft.client.renderer.texture.IconRegister import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack +import net.minecraft.tileentity.TileEntity import net.minecraft.util.{Icon, AxisAlignedBB} import net.minecraft.world.{IBlockAccess, World} import net.minecraftforge.common.ForgeDirection -import codechicken.multipart.{TileMultipart, TMultiPart} -import li.cil.oc.common.multipart.CablePart class Cable(val parent: SpecialDelegator) extends SpecialDelegate { val unlocalizedName = "Cable" @@ -86,29 +88,16 @@ object Cable { def neighbors(world: IBlockAccess, x: Int, y: Int, z: Int) = { var result = 0 - val tileEntity = world.getBlockTileEntity(x, y, z) match { - case multi: TileMultipart => Some(multi) - case _ => None - } + val tileEntity = world.getBlockTileEntity(x, y, z) for (side <- ForgeDirection.VALID_DIRECTIONS) { - if (tileEntity match { - case Some(multi) => !multi.isSolid(side.ordinal) - case _ => true - }) { - val (tx, ty, tz) = (x + side.offsetX, y + side.offsetY, z + side.offsetZ) - if (!world.isAirBlock(tx, ty, tz)) world.getBlockTileEntity(tx, ty, tz) match { - case robot: tileentity.RobotProxy => - case host: SidedEnvironment => - val connects = if (host.getWorldObj.isRemote) host.canConnect(side.getOpposite) else host.sidedNode(side.getOpposite) != null - if (connects) { - result |= side.flag - } - case host: Environment => result |= side.flag - case multi: TileMultipart => - if (multi.partList.exists(_.isInstanceOf[CablePart]) && - !multi.isSolid(side.getOpposite.ordinal)) - result |= side.flag - case _ => + val (tx, ty, tz) = (x + side.offsetX, y + side.offsetY, z + side.offsetZ) + if (!world.isAirBlock(tx, ty, tz)) { + val neighborTileEntity = world.getBlockTileEntity(tx, ty, tz) + val neighborHasNode = hasNetworkNode(neighborTileEntity, side.getOpposite) + val canConnect = !Loader.isModLoaded("ForgeMultipart") || + (canConnectFromSide(tileEntity, side) && canConnectFromSide(neighborTileEntity, side.getOpposite)) + if (neighborHasNode && canConnect) { + result |= side.flag } } } @@ -116,4 +105,27 @@ object Cable { } def bounds(world: IBlockAccess, x: Int, y: Int, z: Int) = Cable.cachedBounds(Cable.neighbors(world, x, y, z)).copy() + + private def hasNetworkNode(tileEntity: TileEntity, side: ForgeDirection) = + tileEntity match { + case robot: tileentity.RobotProxy => false + case host: SidedEnvironment => + if (host.getWorldObj.isRemote) host.canConnect(side) + else host.sidedNode(side) != null + case host: Environment => true + case host if Loader.isModLoaded("ForgeMultipart") => hasMultiPartNode(tileEntity) + case _ => false + } + + private def hasMultiPartNode(tileEntity: TileEntity) = + tileEntity match { + case host: TileMultipart => host.partList.exists(_.isInstanceOf[CablePart]) + case _ => false + } + + private def canConnectFromSide(tileEntity: TileEntity, side: ForgeDirection) = + tileEntity match { + case host: TileMultipart => !host.isSolid(side.ordinal) + 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 e39c2081f..f7d7880a4 100644 --- a/src/main/java/li/cil/oc/server/network/Network.scala +++ b/src/main/java/li/cil/oc/server/network/Network.scala @@ -1,7 +1,7 @@ package li.cil.oc.server.network import codechicken.multipart.TileMultipart -import cpw.mods.fml.common.FMLCommonHandler +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.multipart.CablePart @@ -395,7 +395,9 @@ object Network extends api.detail.NetworkAPI { case Some(node: MutableNode) => neighborNode match { case Some(neighbor: MutableNode) if neighbor != node && neighbor.network != null => - if (canConnectFromSide(tileEntity, side) && canConnectFromSide(neighborTileEntity, side.getOpposite)) neighbor.connect(node) + val canConnect = !Loader.isModLoaded("ForgeMultipart") || + (canConnectFromSide(tileEntity, side) && canConnectFromSide(neighborTileEntity, side.getOpposite)) + if (canConnect) neighbor.connect(node) else node.disconnect(neighbor) case _ => } @@ -417,6 +419,12 @@ object Network extends api.detail.NetworkAPI { tileEntity match { case host: SidedEnvironment => Option(host.sidedNode(side)) case host: Environment => Some(host.node) + case host if Loader.isModLoaded("ForgeMultipart") => getMultiPartNode(host) + case _ => None + } + + private def getMultiPartNode(tileEntity: TileEntity) = + tileEntity match { case host: TileMultipart => host.partList.find(_.isInstanceOf[CablePart]) match { case Some(part: CablePart) => Some(part.node) case _ => None diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index a331ce4ff..d9fd14e04 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -14,6 +14,7 @@ "dependencies": [ "BuildCraft|Energy", "ComputerCraft", + "ForgeMultipart", "IC2", "MineFactoryReloaded", "ProjRed|Transmission",