From c63f3d4eafa68485ffe01ca58dbbcdf887f6174b Mon Sep 17 00:00:00 2001 From: Calclavia Date: Fri, 16 Jan 2015 12:07:06 +0800 Subject: [PATCH] Current now flows, but still contains glitches --- .../prefab/part/connector/TInsulatable.scala | 40 ++--- .../edx/electrical/battery/TileBattery.scala | 158 ++++++++---------- .../electrical/wire/flat/PartFlatWire.scala | 28 ++-- 3 files changed, 106 insertions(+), 120 deletions(-) diff --git a/src/main/scala/edx/core/prefab/part/connector/TInsulatable.scala b/src/main/scala/edx/core/prefab/part/connector/TInsulatable.scala index addaf679d..f4ccbc663 100644 --- a/src/main/scala/edx/core/prefab/part/connector/TInsulatable.scala +++ b/src/main/scala/edx/core/prefab/part/connector/TInsulatable.scala @@ -63,28 +63,6 @@ trait TInsulatable extends PartAbstract return false } - override def write(packet: MCDataOutput, id: Int) - { - super.write(packet, id) - - if (id <= 1) - packet.writeBoolean(insulated) - } - - override def read(packet: MCDataInput, packetID: Int) - { - super.read(packet, packetID) - - if (packetID <= 1) - _insulated = packet.readBoolean - } - - override def save(nbt: NBTTagCompound) - { - super.save(nbt) - nbt.setBoolean("isInsulated", insulated) - } - def insulated: Boolean = _insulated /** @@ -108,6 +86,24 @@ trait TInsulatable extends PartAbstract tile.getWriteStream(this).writeByte(1).writeBoolean(this._insulated) } + override def write(packet: MCDataOutput, id: Int) + { + if (id <= 1) + packet.writeBoolean(insulated) + } + + override def read(packet: MCDataInput, packetID: Int) + { + if (packetID <= 1) + _insulated = packet.readBoolean + } + + override def save(nbt: NBTTagCompound) + { + super.save(nbt) + nbt.setBoolean("isInsulated", insulated) + } + override def load(nbt: NBTTagCompound) { super.load(nbt) diff --git a/src/main/scala/edx/electrical/battery/TileBattery.scala b/src/main/scala/edx/electrical/battery/TileBattery.scala index ddd2bfb16..b21530f01 100644 --- a/src/main/scala/edx/electrical/battery/TileBattery.scala +++ b/src/main/scala/edx/electrical/battery/TileBattery.scala @@ -1,6 +1,6 @@ package edx.electrical.battery -import java.util.{ArrayList, Arrays, List} +import java.util.ArrayList import cpw.mods.fml.relauncher.{Side, SideOnly} import edx.core.Reference @@ -12,7 +12,6 @@ import net.minecraft.item.ItemStack import net.minecraft.util.ResourceLocation import net.minecraftforge.client.model.AdvancedModelLoader import net.minecraftforge.common.util.ForgeDirection -import org.lwjgl.opengl.GL11 import org.lwjgl.opengl.GL11._ import resonant.lib.content.prefab.{TElectric, TEnergyStorage} import resonant.lib.grid.energy.EnergyStorage @@ -31,8 +30,7 @@ object TileBattery { /** Tiers: 0, 1, 2 */ final val maxTier = 2 - /** The transfer rate **/ - final val defaultPower = getEnergyForTier(0) + @SideOnly(Side.CLIENT) val model = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "battery/battery.tcn")) @@ -48,9 +46,10 @@ object TileBattery class TileBattery extends SpatialTile(Material.iron) with TElectric with IPacketReceiver with TEnergyStorage { - var renderEnergyAmount: Double = 0 + var renderEnergyAmount = 0d var doCharge = false - private var markClientUpdate: Boolean = false + private var markClientUpdate = false + private var markDistributionUpdate = false energy = new EnergyStorage textureName = "material_metal_side" @@ -59,7 +58,20 @@ class TileBattery extends SpatialTile(Material.iron) with TElectric with IPacket normalRender = false isOpaqueCube = false itemBlock = classOf[ItemBlockBattery] - private var markDistributionUpdate: Boolean = false + + override def start() + { + super.start() + updateConnectionMask() + } + + def updateConnectionMask() + { + dcNode.connectionMask = ForgeDirection.VALID_DIRECTIONS.filter(getIO(_) > 0).map(d => 1 << d.ordinal()).foldLeft(0)(_ | _) + dcNode.positiveTerminals.addAll(getInputDirections()) + dcNode.negativeTerminals.addAll(getOutputDirections()) + notifyChange() + } override def update() { @@ -94,9 +106,9 @@ class TileBattery extends SpatialTile(Material.iron) with TElectric with IPacket if (player.isSneaking) { doCharge = !doCharge + println("Charge: " + doCharge) } - println(dcNode) } return true @@ -113,19 +125,12 @@ class TileBattery extends SpatialTile(Material.iron) with TElectric with IPacket override def setIO(dir: ForgeDirection, packet: Int) { super.setIO(dir, packet) - - //TODO: Not set during init - dcNode.connectionMask = ForgeDirection.VALID_DIRECTIONS.filter(getIO(_) > 0).map(d => 1 << d.ordinal()).foldLeft(0)(_ | _) - //TODO: Connection logic having an issue - dcNode.positiveTerminals.clear() - dcNode.positiveTerminals.addAll(getOutputDirections()) - notifyChange() + updateConnectionMask() dcNode.reconstruct() - markUpdate() } - override def onPlaced(entityliving: EntityLivingBase, itemStack: ItemStack) + override def onPlaced(entityLiving: EntityLivingBase, itemStack: ItemStack) { if (!world.isRemote && itemStack.getItem.isInstanceOf[ItemBlockBattery]) { @@ -152,19 +157,21 @@ class TileBattery extends SpatialTile(Material.iron) with TElectric with IPacket glPushMatrix() val energyLevel = ((itemStack.getItem.asInstanceOf[ItemBlockBattery].getEnergy(itemStack) / itemStack.getItem.asInstanceOf[ItemBlockBattery].getEnergyCapacity(itemStack)) * 8).toInt RenderUtility.bind(Reference.domain, Reference.modelPath + "battery/battery.png") - val disabledParts: List[String] = new ArrayList[String] - disabledParts.addAll(Arrays.asList(Array[String]("connector", "connectorIn", "connectorOut"): _*)) - disabledParts.addAll(Arrays.asList(Array[String]("coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8"): _*)) - disabledParts.addAll(Arrays.asList(Array[String]("coil1lit", "coil2lit", "coil3lit", "coil4lit", "coil5lit", "coil6lit", "coil7lit", "coil8lit"): _*)) - disabledParts.addAll(Arrays.asList(Array[String]("frame1con", "frame2con", "frame3con", "frame4con"): _*)) - TileBattery.model.renderAllExcept(disabledParts.toArray(new Array[String](0)): _*) + var disabledParts = Set.empty[String] + disabledParts ++= Set("connector", "connectorIn", "connectorOut") + disabledParts ++= Set("coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8") + disabledParts ++= Set("coil1lit", "coil2lit", "coil3lit", "coil4lit", "coil5lit", "coil6lit", "coil7lit", "coil8lit") + disabledParts ++= Set("frame1con", "frame2con", "frame3con", "frame4con") + TileBattery.model.renderAllExcept(disabledParts.toList: _*) for (i <- 1 until 8) { if (i != 1 || !disabledParts.contains("coil1")) { - if ((8 - i) <= energyLevel) TileBattery.model.renderOnly("coil" + i + "lit") - else TileBattery.model.renderOnly("coil" + i) + if ((8 - i) <= energyLevel) + TileBattery.model.renderOnly("coil" + i + "lit") + else + TileBattery.model.renderOnly("coil" + i) } } glPopMatrix() @@ -173,98 +180,77 @@ class TileBattery extends SpatialTile(Material.iron) with TElectric with IPacket @SideOnly(Side.CLIENT) override def renderDynamic(pos: Vector3, frame: Float, pass: Int) { - val partToDisable: Array[Array[String]] = Array[Array[String]](Array[String]("bottom"), Array[String]("top"), Array[String]("frame1", "frame2"), Array[String]("frame3", "frame4"), Array[String]("frame4", "frame1"), Array[String]("frame2", "frame3")) - val connectionPartToEnable: Array[Array[String]] = Array[Array[String]](null, null, Array[String]("frame1con", "frame2con"), Array[String]("frame3con", "frame4con"), Array[String]("frame4con", "frame1con"), Array[String]("frame2con", "frame3con")) + val partToDisable = Array[Array[String]](Array[String]("bottom"), Array[String]("top"), Array[String]("frame1", "frame2"), Array[String]("frame3", "frame4"), Array[String]("frame4", "frame1"), Array[String]("frame2", "frame3")) + val connectionPartToEnable = Array[Array[String]](null, null, Array[String]("frame1con", "frame2con"), Array[String]("frame3con", "frame4con"), Array[String]("frame4con", "frame1con"), Array[String]("frame2con", "frame3con")) glPushMatrix() glTranslated(pos.x + 0.5, pos.y + 0.5, pos.z + 0.5) - val energyLevel: Int = Math.round((energy.getEnergy / TileBattery.getEnergyForTier(getBlockMetadata).asInstanceOf[Double]) * 8).asInstanceOf[Int] + val energyLevel = Math.round((energy.getEnergy / TileBattery.getEnergyForTier(getBlockMetadata).asInstanceOf[Double]) * 8).toInt + RenderUtility.bind(Reference.domain, Reference.modelPath + "battery/battery.png") - val disabledParts = new ArrayList[String] - val enabledParts = new ArrayList[String] + var disabledParts = Set.empty[String] + var enabledParts = Set.empty[String] for (check <- ForgeDirection.VALID_DIRECTIONS) { - if (center.add(check).getTileEntity.isInstanceOf[TileBattery]) + if ((toVectorWorld + check).getTileEntity.isInstanceOf[TileBattery]) { - disabledParts.addAll(Arrays.asList(partToDisable(check.ordinal): _*)) - if (check eq ForgeDirection.UP) + disabledParts ++= partToDisable(check.ordinal) + if (check == ForgeDirection.UP) { - enabledParts.addAll(Arrays.asList(partToDisable(check.ordinal): _*)) - enabledParts.add("coil1") + enabledParts ++= partToDisable(check.ordinal) + enabledParts += "coil1" } - else if (check eq ForgeDirection.DOWN) + else if (check == ForgeDirection.DOWN) { - val connectionParts = new ArrayList[String] - for (sideCheck <- ForgeDirection.VALID_DIRECTIONS) if (sideCheck.offsetY == 0) connectionParts.addAll(Arrays.asList(connectionPartToEnable(sideCheck.ordinal): _*)) - for (sideCheck <- ForgeDirection.VALID_DIRECTIONS) - { - if (sideCheck.offsetY == 0) - { - if (center.add(sideCheck).getTileEntity.isInstanceOf[TileBattery]) - { - connectionParts.removeAll(Arrays.asList(connectionPartToEnable(sideCheck.ordinal))) - } - } - } - enabledParts.addAll(connectionParts) + var connectionParts = Set.empty[String] + val downDirs = ForgeDirection.VALID_DIRECTIONS.filter(_.offsetY == 0) + downDirs.foreach(s => connectionParts ++= connectionPartToEnable(s.ordinal)) + downDirs.filter(s => (toVectorWorld + s).getTileEntity.isInstanceOf[TileBattery]).foreach(s => connectionParts --= connectionPartToEnable(s.ordinal)) + enabledParts ++= connectionParts } } + //Render connectors if (check.offsetY == 0) { - GL11.glPushMatrix() + glPushMatrix() RenderUtility.rotateBlockBasedOnDirection(check) - if (check == ForgeDirection.NORTH) + glRotatef(-90, 0, 1, 0) + + getIO(check) match { - glRotatef(0, 0, 1, 0) + case 1 => TileBattery.model.renderOnly("connectorIn") + case 2 => TileBattery.model.renderOnly("connectorOut") + case _ => } - if (check == ForgeDirection.SOUTH) - { - glRotatef(0, 0, 1, 0) - } - else if (check == ForgeDirection.WEST) - { - glRotatef(-180, 0, 1, 0) - } - else if (check == ForgeDirection.EAST) - { - glRotatef(180, 0, 1, 0) - } - GL11.glRotatef(-90, 0, 1, 0) - val io: Int = getIO(check) - if (io == 1) - { - TileBattery.model.renderOnly("connectorIn") - } - else if (io == 2) - { - TileBattery.model.renderOnly("connectorOut") - } - GL11.glPopMatrix() + + glPopMatrix() } } - enabledParts.removeAll(disabledParts) + enabledParts --= disabledParts for (i <- 1 to 8) { if (i != 1 || enabledParts.contains("coil1")) { - if ((8 - i) < energyLevel) TileBattery.model.renderOnly("coil" + i + "lit") - else TileBattery.model.renderOnly("coil" + i) + if ((8 - i) < energyLevel) + TileBattery.model.renderOnly("coil" + i + "lit") + else + TileBattery.model.renderOnly("coil" + i) } } - disabledParts.addAll(Arrays.asList(Array[String]("connector", "connectorIn", "connectorOut"): _*)) - disabledParts.addAll(Arrays.asList(Array[String]("coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8"): _*)) - disabledParts.addAll(Arrays.asList(Array[String]("coil1lit", "coil2lit", "coil3lit", "coil4lit", "coil5lit", "coil6lit", "coil7lit", "coil8lit"): _*)) - disabledParts.addAll(Arrays.asList(Array[String]("frame1con", "frame2con", "frame3con", "frame4con"): _*)) - enabledParts.removeAll(Arrays.asList(Array[String]("coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8"))) - TileBattery.model.renderAllExcept(disabledParts.toArray(new Array[String](0)): _*) - TileBattery.model.renderOnly(enabledParts.toArray(new Array[String](0)): _*) - GL11.glPopMatrix() + disabledParts ++= Set("connector", "connectorIn", "connectorOut") + disabledParts ++= Set("coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8") + disabledParts ++= Set("coil1lit", "coil2lit", "coil3lit", "coil4lit", "coil5lit", "coil6lit", "coil7lit", "coil8lit") + disabledParts ++= Set("frame1con", "frame2con", "frame3con", "frame4con") + enabledParts --= Set("coil1", "coil2", "coil3", "coil4", "coil5", "coil6", "coil7", "coil8") + TileBattery.model.renderAllExcept(disabledParts.toList: _*) + TileBattery.model.renderOnly(enabledParts.toList: _*) + glPopMatrix() } override def toString: String = diff --git a/src/main/scala/edx/electrical/wire/flat/PartFlatWire.scala b/src/main/scala/edx/electrical/wire/flat/PartFlatWire.scala index db6ff5595..30508c615 100644 --- a/src/main/scala/edx/electrical/wire/flat/PartFlatWire.scala +++ b/src/main/scala/edx/electrical/wire/flat/PartFlatWire.scala @@ -56,15 +56,14 @@ object PartFlatWire class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOcclusion { - private val node = new FlatWireNode(this) + private val dcNode = new FlatWireNode(this) /** * The current side the wire is placed on */ var side: Byte = 0 /** * A map of the corners. - *

- *

+ * * Currently split into 4 nybbles (from lowest) 0 = Corner connections (this wire should connect * around a corner to something external) 1 = Straight connections (this wire should connect to * something external) 2 = Internal connections (this wire should connect to something internal) @@ -75,7 +74,10 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc */ var connectionMask = 0x00 - nodes.add(node) + nodes.add(dcNode) + //TODO: Create DC wire nodes to allow omni directional connections + dcNode.positiveTerminals.addAll(Seq(ForgeDirection.UP, ForgeDirection.NORTH, ForgeDirection.EAST)) + dcNode.negativeTerminals.addAll(Seq(ForgeDirection.DOWN, ForgeDirection.SOUTH, ForgeDirection.WEST)) def preparePlacement(side: Int, meta: Int) { @@ -86,22 +88,19 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc override def setMaterial(i: Int) { super.setMaterial(i) - node.resistance = material.resistance + dcNode.resistance = material.resistance } override def update() { super.update() - - if (node.current > 0) - println("Current is flowing: " + node) } override def activate(player: EntityPlayer, hit: MovingObjectPosition, item: ItemStack): Boolean = { if (!world.isRemote) { - println(node) + println(dcNode) } return true @@ -140,6 +139,7 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc override def write(packet: MCDataOutput, id: Int) { + super[PartAbstract].write(packet, id) super.write(packet, id) id match @@ -154,15 +154,16 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc override def read(packet: MCDataInput, id: Int) { + super[PartAbstract].read(packet, id) super.read(packet, id) id match { case 0 => - side = packet.readByte - connectionMask = packet.readInt + side = packet.readByte() + connectionMask = packet.readInt() case 3 => - connectionMask = packet.readInt + connectionMask = packet.readInt() tile.markRender() } } @@ -412,6 +413,9 @@ class PartFlatWire extends PartAbstract with TWire with TFacePart with TNormalOc updateExternalConnections() updateInternalConnections() + + //Reconstruct the grid + grid.reconstruct(this) } }