More AE2 integration! Added part that acts as OC P2P tunnel via ME networks.

Fixed issue when AE2 was the only power providing mod.
This commit is contained in:
Florian Nücke 2014-12-05 23:57:24 +01:00
parent da98ffea88
commit d7da489ba3
13 changed files with 168 additions and 9 deletions

View File

@ -37,6 +37,7 @@ item.oc.AbstractBusCard.name=Abstract Bus Card
item.oc.Acid.name=Grog item.oc.Acid.name=Grog
item.oc.ALU.name=Arithmetic Logic Unit (ALU) item.oc.ALU.name=Arithmetic Logic Unit (ALU)
item.oc.Analyzer.name=Analyzer item.oc.Analyzer.name=Analyzer
item.oc.AppengTunnel.name=P2P Tunnel - OpenComputers
item.oc.ArrowKeys.name=Arrow Keys item.oc.ArrowKeys.name=Arrow Keys
item.oc.ButtonGroup.name=Button Group item.oc.ButtonGroup.name=Button Group
item.oc.CardBase.name=Card Base item.oc.CardBase.name=Card Base

View File

@ -496,3 +496,8 @@ screen3 {
[yellowDust, "oc:circuitChip3", glass] [yellowDust, "oc:circuitChip3", glass]
[obsidian, yellowDust, obsidian]] [obsidian, yellowDust, obsidian]]
} }
appengTunnel {
type: shapeless
input: [{item="appliedenergistics2:item.ItemMultiPart", subID=460}, "oc:adapter"]
}

View File

@ -1,5 +1,6 @@
package li.cil.oc.client package li.cil.oc.client
import appeng.client.render.BusRenderer
import cpw.mods.fml.client.registry.ClientRegistry import cpw.mods.fml.client.registry.ClientRegistry
import cpw.mods.fml.client.registry.RenderingRegistry import cpw.mods.fml.client.registry.RenderingRegistry
import cpw.mods.fml.common.FMLCommonHandler import cpw.mods.fml.common.FMLCommonHandler
@ -9,6 +10,7 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent
import cpw.mods.fml.common.network.NetworkRegistry import cpw.mods.fml.common.network.NetworkRegistry
import li.cil.oc.OpenComputers import li.cil.oc.OpenComputers
import li.cil.oc.Settings import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.client import li.cil.oc.client
import li.cil.oc.client.renderer.PetRenderer import li.cil.oc.client.renderer.PetRenderer
import li.cil.oc.client.renderer.TextBufferRenderCache import li.cil.oc.client.renderer.TextBufferRenderCache
@ -21,6 +23,7 @@ import li.cil.oc.common.init.Items
import li.cil.oc.common.tileentity import li.cil.oc.common.tileentity
import li.cil.oc.common.tileentity.ServerRack import li.cil.oc.common.tileentity.ServerRack
import li.cil.oc.common.{Proxy => CommonProxy} import li.cil.oc.common.{Proxy => CommonProxy}
import li.cil.oc.integration.Mods
import li.cil.oc.util.Audio import li.cil.oc.util.Audio
import net.minecraftforge.client.MinecraftForgeClient import net.minecraftforge.client.MinecraftForgeClient
import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.MinecraftForge
@ -61,6 +64,9 @@ private[oc] class Proxy extends CommonProxy {
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer) ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer)
MinecraftForgeClient.registerItemRenderer(Items.multi, ItemRenderer) MinecraftForgeClient.registerItemRenderer(Items.multi, ItemRenderer)
if (Mods.AppliedEnergistics2.isAvailable) {
MinecraftForgeClient.registerItemRenderer(api.Items.get("appengTunnel").item(), BusRenderer.instance)
}
ClientRegistry.registerKeyBinding(KeyBindings.extendedTooltip) ClientRegistry.registerKeyBinding(KeyBindings.extendedTooltip)
ClientRegistry.registerKeyBinding(KeyBindings.materialCosts) ClientRegistry.registerKeyBinding(KeyBindings.materialCosts)

View File

@ -2,12 +2,12 @@ package li.cil.oc.common.block
import java.util import java.util
import li.cil.oc.Settings
import li.cil.oc.api
import li.cil.oc.client.KeyBindings import li.cil.oc.client.KeyBindings
import li.cil.oc.common.tileentity import li.cil.oc.common.tileentity
import li.cil.oc.util.ItemCosts import li.cil.oc.util.ItemCosts
import li.cil.oc.util.ItemUtils import li.cil.oc.util.ItemUtils
import li.cil.oc.Settings
import li.cil.oc.api
import net.minecraft.block.Block import net.minecraft.block.Block
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.EnumRarity import net.minecraft.item.EnumRarity

View File

@ -35,8 +35,10 @@ object Items extends ItemAPI {
} }
def registerBlock[T <: Block](instance: T, id: String) = { def registerBlock[T <: Block](instance: T, id: String) = {
if (instance.getClass.getName.startsWith("li.cil.oc.")) {
instance.setBlockName("oc." + id) instance.setBlockName("oc." + id)
GameRegistry.registerBlock(instance, classOf[common.block.Item], id) GameRegistry.registerBlock(instance, classOf[common.block.Item], id)
}
descriptors += id -> new ItemInfo { descriptors += id -> new ItemInfo {
override def name = id override def name = id
@ -65,6 +67,10 @@ object Items extends ItemAPI {
} }
def registerItem(instance: Item, id: String) = { def registerItem(instance: Item, id: String) = {
if (instance.getClass.getName.startsWith("li.cil.oc.")) {
instance.setUnlocalizedName("oc." + id.capitalize)
GameRegistry.registerItem(instance, id)
}
descriptors += id -> new ItemInfo { descriptors += id -> new ItemInfo {
override def name = id override def name = id
@ -256,5 +262,10 @@ object Items extends ItemAPI {
Recipes.addItem(new item.UpgradeDatabase(multi, Tier.Two), "databaseUpgrade2", "oc:databaseUpgrade2") Recipes.addItem(new item.UpgradeDatabase(multi, Tier.Two), "databaseUpgrade2", "oc:databaseUpgrade2")
Recipes.addItem(new item.UpgradeDatabase(multi, Tier.Three), "databaseUpgrade3", "oc:databaseUpgrade3") Recipes.addItem(new item.UpgradeDatabase(multi, Tier.Three), "databaseUpgrade3", "oc:databaseUpgrade3")
registerItem(new item.Debugger(multi), "debugger") registerItem(new item.Debugger(multi), "debugger")
// 1.4.2
if (Mods.AppliedEnergistics2.isAvailable) {
Recipes.addItem(new item.AppliedEnergisticsP2PTunnel(), "appengTunnel")
}
} }
} }

View File

@ -0,0 +1,30 @@
package li.cil.oc.common.item
import appeng.api.AEApi
import appeng.api.parts.IPartItem
import appeng.core.CreativeTab
import cpw.mods.fml.relauncher.Side
import cpw.mods.fml.relauncher.SideOnly
import li.cil.oc.api
import li.cil.oc.integration.appeng.PartP2POCNode
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.Item
import net.minecraft.item.ItemStack
import net.minecraft.world.World
class AppliedEnergisticsP2PTunnel extends Item with IPartItem {
override def createPartFromItemStack(stack: ItemStack) = new PartP2POCNode(stack)
override def onItemUse(stack: ItemStack, player: EntityPlayer, world: World, x: Int, y: Int, z: Int, side: Int, hitX: Float, hitY: Float, hitZ: Float) =
AEApi.instance().partHelper().placeBus(stack, x, y, z, side, player, world) || super.onItemUse(stack, player, world, x, y, z, side, hitX, hitY, hitZ)
@SideOnly(Side.CLIENT)
override def getSpriteNumber = 0
@SideOnly(Side.CLIENT)
override def getIconFromDamage(damage: Int) = api.Items.get("adapter").block().getIcon(2, 0)
// Override instead of setting manually to be independent of load order.
@SideOnly(Side.CLIENT)
override def getCreativeTab = CreativeTab.instance
}

View File

@ -19,7 +19,7 @@ object Mods {
def All = knownMods.clone() def All = knownMods.clone()
val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2, version = "@[rv1,)") val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2, version = "@[rv1,)", providesPower = true)
val BattleGear2 = new SimpleMod(IDs.BattleGear2) val BattleGear2 = new SimpleMod(IDs.BattleGear2)
val BuildCraft = new SimpleMod(IDs.BuildCraft) val BuildCraft = new SimpleMod(IDs.BuildCraft)
val BuildCraftTiles = new SimpleMod(IDs.BuildCraftTiles) val BuildCraftTiles = new SimpleMod(IDs.BuildCraftTiles)

View File

@ -0,0 +1,17 @@
package li.cil.oc.integration.appeng
import appeng.api.parts.LayerBase
import li.cil.oc.api.network._
import net.minecraftforge.common.util.ForgeDirection
class LayerSidedEnvironment extends LayerBase with SidedEnvironment {
override def sidedNode(side: ForgeDirection) = getPart(side) match {
case env: SidedEnvironment => env.sidedNode(side)
case _ => null
}
override def canConnect(side: ForgeDirection) = getPart(side) match {
case env: SidedEnvironment => env.canConnect(side)
case _ => false
}
}

View File

@ -1,5 +1,6 @@
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.integration.ModProxy import li.cil.oc.integration.ModProxy
import li.cil.oc.integration.Mods import li.cil.oc.integration.Mods
@ -8,6 +9,8 @@ object ModAppEng extends ModProxy {
override def getMod = Mods.AppliedEnergistics2 override def getMod = Mods.AppliedEnergistics2
override def initialize() { override def initialize() {
AEApi.instance().partHelper().registerNewLayer("li.cil.oc.integration.appeng.LayerSidedEnvironment", "li.cil.oc.api.network.SidedEnvironment")
Driver.add(DriverController) Driver.add(DriverController)
Driver.add(DriverExportBus) Driver.add(DriverExportBus)

View File

@ -0,0 +1,80 @@
package li.cil.oc.integration.appeng
import appeng.api.config.TunnelType
import appeng.parts.p2p.PartP2PTunnel
import cpw.mods.fml.relauncher.Side
import cpw.mods.fml.relauncher.SideOnly
import li.cil.oc.api
import li.cil.oc.api.network._
import li.cil.oc.common.EventHandler
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection
class PartP2POCNode(stack: ItemStack) extends PartP2PTunnel[PartP2POCNode](stack) with Environment with SidedEnvironment {
val node = api.Network.newNode(this, Visibility.None).create()
api.Network.joinNewNetwork(node)
var input: Option[Node] = None
// ----------------------------------------------------------------------- //
override def onConnect(node: Node) {}
override def onMessage(message: Message) {}
override def onDisconnect(node: Node) {}
override def sidedNode(side: ForgeDirection) = if (proxy.isActive) node else null
@SideOnly(Side.CLIENT)
override def canConnect(side: ForgeDirection) = true
// ----------------------------------------------------------------------- //
// TODO Never called, might as well return null. May have to, if enum gets removed.
override def getTunnelType = TunnelType.COMPUTER_MESSAGE
@SideOnly(Side.CLIENT)
override def getTypeTexture = api.Items.get("adapter").block().getIcon(2, 0)
// ----------------------------------------------------------------------- //
override def onTunnelNetworkChange() {
super.onTunnelNetworkChange()
if (node != null) {
input.foreach(in => if (in != node) node.disconnect(in))
input = None
if (output) {
Option(getInput) match {
case Some(part) =>
input = Option(part.node)
input.foreach(node.connect)
case _ =>
}
}
}
}
override def addToWorld() {
super.addToWorld()
EventHandler.schedule(() => api.Network.joinOrCreateNetwork(getHost.getTile))
}
override def removeFromWorld() {
super.removeFromWorld()
if (node != null) node.remove()
}
// ----------------------------------------------------------------------- //
override def readFromNBT(data: NBTTagCompound) {
super.readFromNBT(data)
node.load(data)
}
override def writeToNBT(data: NBTTagCompound) {
super.writeToNBT(data)
node.save(data)
}
}

View File

@ -129,4 +129,6 @@ trait Component extends network.Component with Node {
super.save(nbt) super.save(nbt)
nbt.setInteger("visibility", _visibility.ordinal()) nbt.setInteger("visibility", _visibility.ordinal())
} }
override def toString = super.toString + s"@$name"
} }

View File

@ -10,10 +10,10 @@ import li.cil.oc.Settings
import li.cil.oc.api import li.cil.oc.api
import li.cil.oc.api.network import li.cil.oc.api.network
import li.cil.oc.api.network.Environment import li.cil.oc.api.network.Environment
import li.cil.oc.api.network.SidedEnvironment
import li.cil.oc.api.network.Visibility import li.cil.oc.api.network.Visibility
import li.cil.oc.api.network.WirelessEndpoint import li.cil.oc.api.network.WirelessEndpoint
import li.cil.oc.api.network.{Node => ImmutableNode} import li.cil.oc.api.network.{Node => ImmutableNode}
import li.cil.oc.api.network.SidedEnvironment
import li.cil.oc.api.network.{Node => ImmutableNode} import li.cil.oc.api.network.{Node => ImmutableNode}
import li.cil.oc.common.block.Cable import li.cil.oc.common.block.Cable
import li.cil.oc.common.tileentity import li.cil.oc.common.tileentity
@ -600,6 +600,8 @@ object Network extends api.detail.NetworkAPI {
edges.foreach(edge => edge.other(this).edges -= edge) edges.foreach(edge => edge.other(this).edges -= edge)
searchGraphs(edges.map(_.other(this))) searchGraphs(edges.map(_.other(this)))
} }
override def toString = s"$data [${edges.length}]"
} }
private case class Edge(left: Vertex, right: Vertex) { private case class Edge(left: Vertex, right: Vertex) {

View File

@ -80,6 +80,8 @@ trait Node extends ImmutableNode {
nbt.setString("address", address) nbt.setString("address", address)
} }
} }
override def toString = s"Node($address, $host)"
} }
// We have to mixin the vararg methods individually in the actual // We have to mixin the vararg methods individually in the actual