diff --git a/src/main/scala/resonantinduction/core/prefab/TNodeProvider.scala b/src/main/scala/resonantinduction/core/prefab/TNodeProvider.scala new file mode 100644 index 000000000..7c1c78533 --- /dev/null +++ b/src/main/scala/resonantinduction/core/prefab/TNodeProvider.scala @@ -0,0 +1,28 @@ +package resonantinduction.core.prefab + +import codechicken.multipart.PartMap +import codechicken.multipart.TMultiPart +import codechicken.multipart.TileMultipart +import net.minecraftforge.common.util.ForgeDirection +import universalelectricity.api.core.grid.INode +import universalelectricity.api.core.grid.INodeProvider + +/** + * Created by robert on 8/13/2014. + */ +class TNodeProvider extends TileMultipart with INodeProvider +{ + def getNode(nodeType: Class[_ <: INode], from: ForgeDirection): INode = + { + var nodePart: TMultiPart = partMap(from.ordinal) + if (nodePart == null) + { + nodePart = partMap(PartMap.CENTER.ordinal) + } + if (nodePart.isInstanceOf[INodeProvider]) + { + return (nodePart.asInstanceOf[INodeProvider]).getNode(nodeType, from) + } + return null + } +} \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/prefab/TraitNodeProvider.java b/src/main/scala/resonantinduction/core/prefab/TraitNodeProvider.java deleted file mode 100644 index 57b392688..000000000 --- a/src/main/scala/resonantinduction/core/prefab/TraitNodeProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package resonantinduction.core.prefab; - -import codechicken.multipart.PartMap; -import codechicken.multipart.TMultiPart; -import codechicken.multipart.TileMultipart; -import net.minecraftforge.common.util.ForgeDirection; -import universalelectricity.api.core.grid.INode; -import universalelectricity.api.core.grid.INodeProvider; - -/** - * Created by robert on 8/13/2014. - */ -public class TraitNodeProvider extends TileMultipart implements INodeProvider -{ - @Override - public INode getNode(Class extends INode> nodeType, ForgeDirection from) - { - TMultiPart nodePart = partMap(from.ordinal()); - - if (nodePart == null) - { - nodePart = partMap(PartMap.CENTER.ordinal()); - } - if (nodePart instanceof INodeProvider) - { - return ((INodeProvider) nodePart).getNode(nodeType, from); - } - return null; - } -} diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/PartFramedNode.scala b/src/main/scala/resonantinduction/core/prefab/part/connector/PartFramedNode.scala index 24f2be421..3b5adf008 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/connector/PartFramedNode.scala +++ b/src/main/scala/resonantinduction/core/prefab/part/connector/PartFramedNode.scala @@ -41,12 +41,10 @@ object PartFramedNode } } -abstract class PartFramedNode extends TMultiPart with INodeProvider with TSlottedPart with TNormalOcclusion with TIconHitEffects +abstract class PartFramedNode extends TMultiPart with TNodePartConnector with TSlottedPart with TNormalOcclusion with TIconHitEffects { /** Bitmask connections */ var connectionMask: Byte = 0x00 - protected var connections: Array[AnyRef] = new Array[AnyRef](6) - protected var node: INode = null @SideOnly(Side.CLIENT) protected var breakIcon: IIcon = null @@ -146,21 +144,6 @@ abstract class PartFramedNode extends TMultiPart with INodeProvider with TSlotte return PartFramedNode.connectionMapContainsSide(getAllCurrentConnections, side) } - override def onWorldJoin() - { - node.reconstruct() - } - - override def onNeighborChanged() - { - node.reconstruct() - } - - override def onWorldSeparate() - { - node.deconstruct() - } - /** Packet Methods */ def sendConnectionUpdate() { @@ -192,34 +175,4 @@ abstract class PartFramedNode extends TMultiPart with INodeProvider with TSlotte tile.markRender } } - - def getNode(nodeType: Class[_ <: INode], from: ForgeDirection): INode = - { - if (node != null && nodeType != null) - { - return node - } - return null - } - - override def save(nbt: NBTTagCompound) - { - super.save(nbt) - - if (node.isInstanceOf[ISave]) - node.asInstanceOf[ISave].save(nbt) - } - - override def load(nbt: NBTTagCompound) - { - super.load(nbt) - - if (node.isInstanceOf[ISave]) - node.asInstanceOf[ISave].load(nbt) - } - - def getNode: INode = node - - def setNode(n: INode) - { node = n } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/prefab/part/connector/TNodePartConnector.scala b/src/main/scala/resonantinduction/core/prefab/part/connector/TNodePartConnector.scala new file mode 100644 index 000000000..cce899aa4 --- /dev/null +++ b/src/main/scala/resonantinduction/core/prefab/part/connector/TNodePartConnector.scala @@ -0,0 +1,53 @@ +package resonantinduction.core.prefab.part.connector + +import codechicken.multipart.TMultiPart +import net.minecraft.nbt.NBTTagCompound +import net.minecraftforge.common.util.ForgeDirection +import universalelectricity.api.core.grid.{INode, INodeProvider, ISave} + +/** + * A node trait that can be mixed into any multipart nodes. + * @author Calclavia + */ +trait TNodePartConnector extends TMultiPart with INodeProvider +{ + protected lazy val node: INode = null + + override def onWorldJoin() + { + node.reconstruct() + } + + override def onNeighborChanged() + { + node.reconstruct() + } + + override def onWorldSeparate() + { + node.deconstruct() + } + + override def save(nbt: NBTTagCompound) + { + super.save(nbt) + + if (node.isInstanceOf[ISave]) + node.asInstanceOf[ISave].save(nbt) + } + + override def load(nbt: NBTTagCompound) + { + super.load(nbt) + + if (node.isInstanceOf[ISave]) + node.asInstanceOf[ISave].load(nbt) + } + + override def getNode(nodeType: Class[_ <: INode], from: ForgeDirection): INode = + { + if (nodeType == node.getClass) + return node + return null + } +} diff --git a/src/main/scala/resonantinduction/electrical/wire/base/TWire.scala b/src/main/scala/resonantinduction/electrical/wire/base/TWire.scala index 8072d7852..fee0e8dcc 100644 --- a/src/main/scala/resonantinduction/electrical/wire/base/TWire.scala +++ b/src/main/scala/resonantinduction/electrical/wire/base/TWire.scala @@ -5,16 +5,16 @@ import codechicken.multipart.TMultiPart import net.minecraft.item.{Item, ItemStack} import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.ForgeDirection -import resonantinduction.core.prefab.part.connector.{TColorable, TInsulatable, TMaterial, TPart} +import resonantinduction.core.prefab.part.connector._ import resonantinduction.electrical.ElectricalContent -import universalelectricity.api.core.grid.INodeProvider +import universalelectricity.api.core.grid.{INode, INodeProvider} import universalelectricity.simulator.dc.DCNode /** * Class extended by wires * @author Calclavia */ -abstract class TWire extends TMultiPart with TPart with TMaterial[WireMaterial] with TInsulatable with TColorable +abstract class TWire extends TMultiPart with TNodePartConnector with TPart with TMaterial[WireMaterial] with TInsulatable with TColorable { override protected val insulationItem: Item = ElectricalContent.itemInsulation diff --git a/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.scala b/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.scala index 386ef4282..d0310b333 100644 --- a/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.scala +++ b/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.scala @@ -19,6 +19,8 @@ import net.minecraftforge.common.util.ForgeDirection import org.lwjgl.opengl.GL11 import resonantinduction.core.util.MultipartUtil import resonantinduction.electrical.wire.base.TWire +import universalelectricity.api.core.grid.{INodeProvider, INode} +import universalelectricity.simulator.dc.DCNode import scala.collection.convert.wrapAll._ @@ -50,7 +52,11 @@ object PartFlatWire class PartFlatWire extends TWire with TFacePart with TNormalOcclusion { + /** + * The current side the wire is placed on + */ var side: Byte = 0 + /** * A map of the corners. *
@@ -65,6 +71,17 @@ class PartFlatWire extends TWire with TFacePart with TNormalOcclusion */ var connMap: Int = 0x00 + override lazy val node = new FlatWireNode(this) + + /** + * Flat wire node handles all the connection logic + * @param provider + */ + class FlatWireNode (provider:INodeProvider) extends DCNode(provider) + { + + } + def connections: Array[AnyRef] = { return null @@ -72,7 +89,7 @@ class PartFlatWire extends TWire with TFacePart with TNormalOcclusion def preparePlacement(side: Int, meta: Int) { - this.side = (side ^ 1).asInstanceOf[Byte] + this.side = (side ^ 1).toByte setMaterial(meta) } @@ -135,24 +152,18 @@ class PartFlatWire extends TWire with TFacePart with TNormalOcclusion super.onRemoved if (!world.isRemote) { + for (r <- 0 until 4) { - var r: Int = 0 - while (r < 4) + if (maskConnects(r)) { + if ((connMap & 1 << r) != 0) { - if (maskConnects(r)) - { - if ((connMap & 1 << r) != 0) - { - notifyCornerChange(r) - } - else if ((connMap & 0x10 << r) != 0) - { - notifyStraightChange(r) - } - } + notifyCornerChange(r) + } + else if ((connMap & 0x10 << r) != 0) + { + notifyStraightChange(r) } - ({r += 1; r - 1 }) } } } @@ -174,13 +185,15 @@ class PartFlatWire extends TWire with TFacePart with TNormalOcclusion } tile.markDirty } - this.recalculateConnections - super.onChunkLoad + + recalculateConnections() + super.onChunkLoad() } override def onAdded { - super.onAdded + super.onAdded() + if (!world.isRemote) { updateOpenConnections diff --git a/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.scala b/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.scala index 1cc2abb7b..a5f6dc8b2 100644 --- a/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.scala +++ b/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.scala @@ -22,7 +22,7 @@ import resonantinduction.mechanical.fluid.pipe.PipeMaterials.PipeMaterial */ class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorable with TSlottedPart with TNormalOcclusion with IFluidHandler { - protected final val tank: FluidTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME) + protected final val tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME) /** * Computes the average fluid for client to render. @@ -30,7 +30,7 @@ class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorab private val averageTankData = new EvictingList[Integer](20) private var markPacket: Boolean = true - setNode(new PipePressureNode(this)) + override lazy val node = new PipePressureNode(this) def preparePlacement(meta: Int) {