From eee133dfede762cee5a7fe7f4a58d5c5cf4646bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sun, 10 May 2015 15:16:50 +0200 Subject: [PATCH] Added support for AE2's spatial I/O (i.e. moving computers etc. into spatial storage cells). Somewhat hacky, to avoid computers resetting, but seems to work. --- .../common/tileentity/traits/Computer.scala | 2 +- .../tileentity/traits/Environment.scala | 56 +++++++++++++++++-- .../cil/oc/integration/appeng/ModAppEng.scala | 4 ++ .../li/cil/oc/server/network/Network.scala | 2 +- 4 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala index 968cc5c86..58e8bdf4e 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Computer.scala @@ -128,7 +128,7 @@ trait Computer extends Environment with ComponentInventory with Rotatable with B override def dispose(): Unit = { super.dispose() - if (machine != null && !this.isInstanceOf[RobotProxy]) { + if (machine != null && !this.isInstanceOf[RobotProxy] && !moving) { machine.stop() } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala b/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala index 697c92673..05fc8fabb 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/traits/Environment.scala @@ -1,15 +1,22 @@ package li.cil.oc.common.tileentity.traits +import cpw.mods.fml.common.Optional import li.cil.oc.Settings import li.cil.oc.api.driver import li.cil.oc.api.network import li.cil.oc.api.network.Connector +import li.cil.oc.api.network.Node import li.cil.oc.api.network.SidedEnvironment import li.cil.oc.common.EventHandler +import li.cil.oc.common.asm.Injectable +import li.cil.oc.integration.Mods +import li.cil.oc.server.network.Network import li.cil.oc.util.ExtendedNBT._ +import li.cil.oc.util.ExtendedWorld._ import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.ForgeDirection +@Injectable.Interface(value = "appeng.api.movable.IMovableTile", modid = Mods.IDs.AppliedEnergistics2) trait Environment extends TileEntity with network.Environment with driver.EnvironmentHost { protected var isChangeScheduled = false @@ -43,12 +50,34 @@ trait Environment extends TileEntity with network.Environment with driver.Enviro override def dispose() { super.dispose() if (isServer) { - Option(node).foreach(_.remove) - this match { - case sidedEnvironment: SidedEnvironment => for (side <- ForgeDirection.VALID_DIRECTIONS) { - Option(sidedEnvironment.sidedNode(side)).foreach(_.remove()) + if (moving && this.isInstanceOf[Computer]) { + this match { + case env: SidedEnvironment => + for (side <- ForgeDirection.VALID_DIRECTIONS) { + val npos = position.offset(side) + Network.getNetworkNode(world.getTileEntity(npos), side.getOpposite) match { + case neighbor: Node if env.sidedNode(side) != null => env.sidedNode(side).disconnect(neighbor) + case _ => // No neighbor node. + } + } + case env => + for (side <- ForgeDirection.VALID_DIRECTIONS) { + val npos = position.offset(side) + Network.getNetworkNode(world.getTileEntity(npos), side.getOpposite) match { + case neighbor: Node if env.node != null => env.node.disconnect(neighbor) + case _ => // No neighbor node. + } + } + } + } + else { + Option(node).foreach(_.remove) + this match { + case sidedEnvironment: SidedEnvironment => for (side <- ForgeDirection.VALID_DIRECTIONS) { + Option(sidedEnvironment.sidedNode(side)).foreach(_.remove()) + } + case _ => } - case _ => } } } @@ -84,5 +113,22 @@ trait Environment extends TileEntity with network.Environment with driver.Enviro // ----------------------------------------------------------------------- // + protected var moving = false + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + def prepareToMove(): Boolean = { + moving = true + true + } + + @Optional.Method(modid = Mods.IDs.AppliedEnergistics2) + def doneMoving(): Unit = { + moving = false + Network.joinOrCreateNetwork(this) + world.markBlockForUpdate(x, y, z) + } + + // ----------------------------------------------------------------------- // + protected def result(args: Any*) = li.cil.oc.util.ResultWrapper.result(args: _*) } diff --git a/src/main/scala/li/cil/oc/integration/appeng/ModAppEng.scala b/src/main/scala/li/cil/oc/integration/appeng/ModAppEng.scala index af675b0d2..4b91ad935 100644 --- a/src/main/scala/li/cil/oc/integration/appeng/ModAppEng.scala +++ b/src/main/scala/li/cil/oc/integration/appeng/ModAppEng.scala @@ -1,6 +1,8 @@ package li.cil.oc.integration.appeng +import appeng.api.AEApi import li.cil.oc.api.Driver +import li.cil.oc.common.tileentity.Print import li.cil.oc.integration.ModProxy import li.cil.oc.integration.Mods @@ -8,6 +10,8 @@ object ModAppEng extends ModProxy { override def getMod = Mods.AppliedEnergistics2 override def initialize() { + AEApi.instance.registries.movable.whiteListTileEntity(classOf[Print]) + Driver.add(DriverController) Driver.add(DriverExportBus) Driver.add(DriverImportBus) diff --git a/src/main/scala/li/cil/oc/server/network/Network.scala b/src/main/scala/li/cil/oc/server/network/Network.scala index 34b14f91c..d0437a8d6 100644 --- a/src/main/scala/li/cil/oc/server/network/Network.scala +++ b/src/main/scala/li/cil/oc/server/network/Network.scala @@ -452,7 +452,7 @@ object Network extends api.detail.NetworkAPI { case _ => } - private def getNetworkNode(tileEntity: TileEntity, side: ForgeDirection) = + def getNetworkNode(tileEntity: TileEntity, side: ForgeDirection) = tileEntity match { case host: SidedEnvironment => Option(host.sidedNode(side)) case host: Environment with SidedComponent =>