Skip to content

Commit d7da489

Browse files
committedDec 5, 2014
More AE2 integration! Added part that acts as OC P2P tunnel via ME networks.
Fixed issue when AE2 was the only power providing mod.

File tree

13 files changed

+168
-9
lines changed

13 files changed

+168
-9
lines changed
 

‎src/main/resources/assets/opencomputers/lang/en_US.lang

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ item.oc.AbstractBusCard.name=Abstract Bus Card
3737
item.oc.Acid.name=Grog
3838
item.oc.ALU.name=Arithmetic Logic Unit (ALU)
3939
item.oc.Analyzer.name=Analyzer
40+
item.oc.AppengTunnel.name=P2P Tunnel - OpenComputers
4041
item.oc.ArrowKeys.name=Arrow Keys
4142
item.oc.ButtonGroup.name=Button Group
4243
item.oc.CardBase.name=Card Base

‎src/main/resources/assets/opencomputers/recipes/default.recipes

+5
Original file line numberDiff line numberDiff line change
@@ -496,3 +496,8 @@ screen3 {
496496
[yellowDust, "oc:circuitChip3", glass]
497497
[obsidian, yellowDust, obsidian]]
498498
}
499+
500+
appengTunnel {
501+
type: shapeless
502+
input: [{item="appliedenergistics2:item.ItemMultiPart", subID=460}, "oc:adapter"]
503+
}

‎src/main/scala/li/cil/oc/client/Proxy.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package li.cil.oc.client
22

3+
import appeng.client.render.BusRenderer
34
import cpw.mods.fml.client.registry.ClientRegistry
45
import cpw.mods.fml.client.registry.RenderingRegistry
56
import cpw.mods.fml.common.FMLCommonHandler
@@ -9,6 +10,7 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent
910
import cpw.mods.fml.common.network.NetworkRegistry
1011
import li.cil.oc.OpenComputers
1112
import li.cil.oc.Settings
13+
import li.cil.oc.api
1214
import li.cil.oc.client
1315
import li.cil.oc.client.renderer.PetRenderer
1416
import li.cil.oc.client.renderer.TextBufferRenderCache
@@ -21,6 +23,7 @@ import li.cil.oc.common.init.Items
2123
import li.cil.oc.common.tileentity
2224
import li.cil.oc.common.tileentity.ServerRack
2325
import li.cil.oc.common.{Proxy => CommonProxy}
26+
import li.cil.oc.integration.Mods
2427
import li.cil.oc.util.Audio
2528
import net.minecraftforge.client.MinecraftForgeClient
2629
import net.minecraftforge.common.MinecraftForge
@@ -61,6 +64,9 @@ private[oc] class Proxy extends CommonProxy {
6164
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer)
6265

6366
MinecraftForgeClient.registerItemRenderer(Items.multi, ItemRenderer)
67+
if (Mods.AppliedEnergistics2.isAvailable) {
68+
MinecraftForgeClient.registerItemRenderer(api.Items.get("appengTunnel").item(), BusRenderer.instance)
69+
}
6470

6571
ClientRegistry.registerKeyBinding(KeyBindings.extendedTooltip)
6672
ClientRegistry.registerKeyBinding(KeyBindings.materialCosts)
@@ -78,4 +84,4 @@ private[oc] class Proxy extends CommonProxy {
7884
FMLCommonHandler.instance.bus.register(PetRenderer)
7985
FMLCommonHandler.instance.bus.register(TextBufferRenderCache)
8086
}
81-
}
87+
}

‎src/main/scala/li/cil/oc/common/block/Item.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package li.cil.oc.common.block
22

33
import java.util
44

5+
import li.cil.oc.Settings
6+
import li.cil.oc.api
57
import li.cil.oc.client.KeyBindings
68
import li.cil.oc.common.tileentity
79
import li.cil.oc.util.ItemCosts
810
import li.cil.oc.util.ItemUtils
9-
import li.cil.oc.Settings
10-
import li.cil.oc.api
1111
import net.minecraft.block.Block
1212
import net.minecraft.entity.player.EntityPlayer
1313
import net.minecraft.item.EnumRarity

‎src/main/scala/li/cil/oc/common/init/Items.scala

+14-3
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ object Items extends ItemAPI {
3535
}
3636

3737
def registerBlock[T <: Block](instance: T, id: String) = {
38-
instance.setBlockName("oc." + id)
39-
GameRegistry.registerBlock(instance, classOf[common.block.Item], id)
38+
if (instance.getClass.getName.startsWith("li.cil.oc.")) {
39+
instance.setBlockName("oc." + id)
40+
GameRegistry.registerBlock(instance, classOf[common.block.Item], id)
41+
}
4042
descriptors += id -> new ItemInfo {
4143
override def name = id
4244

@@ -65,6 +67,10 @@ object Items extends ItemAPI {
6567
}
6668

6769
def registerItem(instance: Item, id: String) = {
70+
if (instance.getClass.getName.startsWith("li.cil.oc.")) {
71+
instance.setUnlocalizedName("oc." + id.capitalize)
72+
GameRegistry.registerItem(instance, id)
73+
}
6874
descriptors += id -> new ItemInfo {
6975
override def name = id
7076

@@ -256,5 +262,10 @@ object Items extends ItemAPI {
256262
Recipes.addItem(new item.UpgradeDatabase(multi, Tier.Two), "databaseUpgrade2", "oc:databaseUpgrade2")
257263
Recipes.addItem(new item.UpgradeDatabase(multi, Tier.Three), "databaseUpgrade3", "oc:databaseUpgrade3")
258264
registerItem(new item.Debugger(multi), "debugger")
265+
266+
// 1.4.2
267+
if (Mods.AppliedEnergistics2.isAvailable) {
268+
Recipes.addItem(new item.AppliedEnergisticsP2PTunnel(), "appengTunnel")
269+
}
259270
}
260-
}
271+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package li.cil.oc.common.item
2+
3+
import appeng.api.AEApi
4+
import appeng.api.parts.IPartItem
5+
import appeng.core.CreativeTab
6+
import cpw.mods.fml.relauncher.Side
7+
import cpw.mods.fml.relauncher.SideOnly
8+
import li.cil.oc.api
9+
import li.cil.oc.integration.appeng.PartP2POCNode
10+
import net.minecraft.entity.player.EntityPlayer
11+
import net.minecraft.item.Item
12+
import net.minecraft.item.ItemStack
13+
import net.minecraft.world.World
14+
15+
class AppliedEnergisticsP2PTunnel extends Item with IPartItem {
16+
override def createPartFromItemStack(stack: ItemStack) = new PartP2POCNode(stack)
17+
18+
override def onItemUse(stack: ItemStack, player: EntityPlayer, world: World, x: Int, y: Int, z: Int, side: Int, hitX: Float, hitY: Float, hitZ: Float) =
19+
AEApi.instance().partHelper().placeBus(stack, x, y, z, side, player, world) || super.onItemUse(stack, player, world, x, y, z, side, hitX, hitY, hitZ)
20+
21+
@SideOnly(Side.CLIENT)
22+
override def getSpriteNumber = 0
23+
24+
@SideOnly(Side.CLIENT)
25+
override def getIconFromDamage(damage: Int) = api.Items.get("adapter").block().getIcon(2, 0)
26+
27+
// Override instead of setting manually to be independent of load order.
28+
@SideOnly(Side.CLIENT)
29+
override def getCreativeTab = CreativeTab.instance
30+
}

‎src/main/scala/li/cil/oc/integration/Mods.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ object Mods {
1919

2020
def All = knownMods.clone()
2121

22-
val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2, version = "@[rv1,)")
22+
val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2, version = "@[rv1,)", providesPower = true)
2323
val BattleGear2 = new SimpleMod(IDs.BattleGear2)
2424
val BuildCraft = new SimpleMod(IDs.BuildCraft)
2525
val BuildCraftTiles = new SimpleMod(IDs.BuildCraftTiles)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package li.cil.oc.integration.appeng
2+
3+
import appeng.api.parts.LayerBase
4+
import li.cil.oc.api.network._
5+
import net.minecraftforge.common.util.ForgeDirection
6+
7+
class LayerSidedEnvironment extends LayerBase with SidedEnvironment {
8+
override def sidedNode(side: ForgeDirection) = getPart(side) match {
9+
case env: SidedEnvironment => env.sidedNode(side)
10+
case _ => null
11+
}
12+
13+
override def canConnect(side: ForgeDirection) = getPart(side) match {
14+
case env: SidedEnvironment => env.canConnect(side)
15+
case _ => false
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package li.cil.oc.integration.appeng
22

3+
import appeng.api.AEApi
34
import li.cil.oc.api.Driver
45
import li.cil.oc.integration.ModProxy
56
import li.cil.oc.integration.Mods
@@ -8,9 +9,11 @@ object ModAppEng extends ModProxy {
89
override def getMod = Mods.AppliedEnergistics2
910

1011
override def initialize() {
12+
AEApi.instance().partHelper().registerNewLayer("li.cil.oc.integration.appeng.LayerSidedEnvironment", "li.cil.oc.api.network.SidedEnvironment")
13+
1114
Driver.add(DriverController)
1215
Driver.add(DriverExportBus)
1316

1417
Driver.add(new ConverterCellInventory)
1518
}
16-
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package li.cil.oc.integration.appeng
2+
3+
import appeng.api.config.TunnelType
4+
import appeng.parts.p2p.PartP2PTunnel
5+
import cpw.mods.fml.relauncher.Side
6+
import cpw.mods.fml.relauncher.SideOnly
7+
import li.cil.oc.api
8+
import li.cil.oc.api.network._
9+
import li.cil.oc.common.EventHandler
10+
import net.minecraft.item.ItemStack
11+
import net.minecraft.nbt.NBTTagCompound
12+
import net.minecraftforge.common.util.ForgeDirection
13+
14+
class PartP2POCNode(stack: ItemStack) extends PartP2PTunnel[PartP2POCNode](stack) with Environment with SidedEnvironment {
15+
val node = api.Network.newNode(this, Visibility.None).create()
16+
api.Network.joinNewNetwork(node)
17+
18+
var input: Option[Node] = None
19+
20+
// ----------------------------------------------------------------------- //
21+
22+
override def onConnect(node: Node) {}
23+
24+
override def onMessage(message: Message) {}
25+
26+
override def onDisconnect(node: Node) {}
27+
28+
override def sidedNode(side: ForgeDirection) = if (proxy.isActive) node else null
29+
30+
@SideOnly(Side.CLIENT)
31+
override def canConnect(side: ForgeDirection) = true
32+
33+
// ----------------------------------------------------------------------- //
34+
35+
// TODO Never called, might as well return null. May have to, if enum gets removed.
36+
override def getTunnelType = TunnelType.COMPUTER_MESSAGE
37+
38+
@SideOnly(Side.CLIENT)
39+
override def getTypeTexture = api.Items.get("adapter").block().getIcon(2, 0)
40+
41+
// ----------------------------------------------------------------------- //
42+
43+
override def onTunnelNetworkChange() {
44+
super.onTunnelNetworkChange()
45+
if (node != null) {
46+
input.foreach(in => if (in != node) node.disconnect(in))
47+
input = None
48+
if (output) {
49+
Option(getInput) match {
50+
case Some(part) =>
51+
input = Option(part.node)
52+
input.foreach(node.connect)
53+
case _ =>
54+
}
55+
}
56+
}
57+
}
58+
59+
override def addToWorld() {
60+
super.addToWorld()
61+
EventHandler.schedule(() => api.Network.joinOrCreateNetwork(getHost.getTile))
62+
}
63+
64+
override def removeFromWorld() {
65+
super.removeFromWorld()
66+
if (node != null) node.remove()
67+
}
68+
69+
// ----------------------------------------------------------------------- //
70+
71+
override def readFromNBT(data: NBTTagCompound) {
72+
super.readFromNBT(data)
73+
node.load(data)
74+
}
75+
76+
override def writeToNBT(data: NBTTagCompound) {
77+
super.writeToNBT(data)
78+
node.save(data)
79+
}
80+
}

‎src/main/scala/li/cil/oc/server/network/Component.scala

+2
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,6 @@ trait Component extends network.Component with Node {
129129
super.save(nbt)
130130
nbt.setInteger("visibility", _visibility.ordinal())
131131
}
132+
133+
override def toString = super.toString + s"@$name"
132134
}

‎src/main/scala/li/cil/oc/server/network/Network.scala

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import li.cil.oc.Settings
1010
import li.cil.oc.api
1111
import li.cil.oc.api.network
1212
import li.cil.oc.api.network.Environment
13+
import li.cil.oc.api.network.SidedEnvironment
1314
import li.cil.oc.api.network.Visibility
1415
import li.cil.oc.api.network.WirelessEndpoint
1516
import li.cil.oc.api.network.{Node => ImmutableNode}
16-
import li.cil.oc.api.network.SidedEnvironment
1717
import li.cil.oc.api.network.{Node => ImmutableNode}
1818
import li.cil.oc.common.block.Cable
1919
import li.cil.oc.common.tileentity
@@ -600,6 +600,8 @@ object Network extends api.detail.NetworkAPI {
600600
edges.foreach(edge => edge.other(this).edges -= edge)
601601
searchGraphs(edges.map(_.other(this)))
602602
}
603+
604+
override def toString = s"$data [${edges.length}]"
603605
}
604606

605607
private case class Edge(left: Vertex, right: Vertex) {

‎src/main/scala/li/cil/oc/server/network/Node.scala

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ trait Node extends ImmutableNode {
8080
nbt.setString("address", address)
8181
}
8282
}
83+
84+
override def toString = s"Node($address, $host)"
8385
}
8486

8587
// We have to mixin the vararg methods individually in the actual

0 commit comments

Comments
 (0)
Please sign in to comment.