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.
This commit is contained in:
Florian Nücke 2015-05-10 15:16:50 +02:00
parent 5413a2a320
commit eee133dfed
4 changed files with 57 additions and 7 deletions

View File

@ -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()
}
}

View File

@ -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: _*)
}

View File

@ -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)

View File

@ -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 =>