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 = { override def dispose(): Unit = {
super.dispose() super.dispose()
if (machine != null && !this.isInstanceOf[RobotProxy]) { if (machine != null && !this.isInstanceOf[RobotProxy] && !moving) {
machine.stop() machine.stop()
} }
} }

View File

@ -1,15 +1,22 @@
package li.cil.oc.common.tileentity.traits package li.cil.oc.common.tileentity.traits
import cpw.mods.fml.common.Optional
import li.cil.oc.Settings import li.cil.oc.Settings
import li.cil.oc.api.driver import li.cil.oc.api.driver
import li.cil.oc.api.network import li.cil.oc.api.network
import li.cil.oc.api.network.Connector 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.api.network.SidedEnvironment
import li.cil.oc.common.EventHandler 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.ExtendedNBT._
import li.cil.oc.util.ExtendedWorld._
import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection 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 { trait Environment extends TileEntity with network.Environment with driver.EnvironmentHost {
protected var isChangeScheduled = false protected var isChangeScheduled = false
@ -43,12 +50,34 @@ trait Environment extends TileEntity with network.Environment with driver.Enviro
override def dispose() { override def dispose() {
super.dispose() super.dispose()
if (isServer) { if (isServer) {
Option(node).foreach(_.remove) if (moving && this.isInstanceOf[Computer]) {
this match { this match {
case sidedEnvironment: SidedEnvironment => for (side <- ForgeDirection.VALID_DIRECTIONS) { case env: SidedEnvironment =>
Option(sidedEnvironment.sidedNode(side)).foreach(_.remove()) 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: _*) protected def result(args: Any*) = li.cil.oc.util.ResultWrapper.result(args: _*)
} }

View File

@ -1,6 +1,8 @@
package li.cil.oc.integration.appeng package li.cil.oc.integration.appeng
import appeng.api.AEApi
import li.cil.oc.api.Driver import li.cil.oc.api.Driver
import li.cil.oc.common.tileentity.Print
import li.cil.oc.integration.ModProxy import li.cil.oc.integration.ModProxy
import li.cil.oc.integration.Mods import li.cil.oc.integration.Mods
@ -8,6 +10,8 @@ object ModAppEng extends ModProxy {
override def getMod = Mods.AppliedEnergistics2 override def getMod = Mods.AppliedEnergistics2
override def initialize() { override def initialize() {
AEApi.instance.registries.movable.whiteListTileEntity(classOf[Print])
Driver.add(DriverController) Driver.add(DriverController)
Driver.add(DriverExportBus) Driver.add(DriverExportBus)
Driver.add(DriverImportBus) Driver.add(DriverImportBus)

View File

@ -452,7 +452,7 @@ object Network extends api.detail.NetworkAPI {
case _ => case _ =>
} }
private def getNetworkNode(tileEntity: TileEntity, side: ForgeDirection) = def getNetworkNode(tileEntity: TileEntity, side: ForgeDirection) =
tileEntity match { tileEntity match {
case host: SidedEnvironment => Option(host.sidedNode(side)) case host: SidedEnvironment => Option(host.sidedNode(side))
case host: Environment with SidedComponent => case host: Environment with SidedComponent =>