From 2dc5dbeb3a8504e9a5b02d9d585ba07d589feba1 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Mon, 21 Jul 2014 09:15:22 -0400 Subject: [PATCH] Fixed some tank node logic --- .../archaic/fluid/tank/ItemBlockTank.java | 2 +- .../archaic/fluid/tank/TileTank.java | 20 ++++----- .../archaic/waila/WailaFluidTank.java | 2 +- .../core/grid/MultipartNode.scala | 2 +- .../distribution/FluidDistributionGrid.scala | 25 ++++++----- .../fluid/distribution/TFluidForwarder.scala | 44 +++++++++++++++++++ .../{TankNetwork.scala => TankGrid.scala} | 6 +-- .../grid/fluid/distribution/TankNode.scala | 10 ++++- .../distribution/TileFluidDistribution.scala | 36 ++------------- .../fluid/pressure/FluidPressureNode.scala | 2 +- .../core/prefab/part/PacketMultiPart.scala | 9 ++-- .../prefab/part/PartColorableMaterial.scala | 2 + .../core/prefab/part/TraitPart.scala | 16 +++---- 13 files changed, 98 insertions(+), 78 deletions(-) create mode 100644 src/main/scala/resonantinduction/core/grid/fluid/distribution/TFluidForwarder.scala rename src/main/scala/resonantinduction/core/grid/fluid/distribution/{TankNetwork.scala => TankGrid.scala} (94%) diff --git a/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.java b/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.java index c1f2f93a6..debf28340 100644 --- a/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.java +++ b/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.java @@ -83,7 +83,7 @@ public class ItemBlockTank extends ItemBlock implements IFluidContainerItem if (tile instanceof TileFluidDistribution) { ((TileFluidDistribution) tile).setSubID(stack.getItemDamage()); - ((TileFluidDistribution) tile).getTank().fill(getFluid(stack), true); + ((TileFluidDistribution) tile).getForwardTank().fill(getFluid(stack), true); } return true; diff --git a/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java b/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java index aa8505b18..63135fa86 100644 --- a/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java +++ b/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java @@ -31,7 +31,7 @@ import archaic.Archaic; import resonantinduction.core.Reference; import resonantinduction.core.grid.fluid.distribution.FluidDistributionGrid; import resonantinduction.core.grid.fluid.distribution.TFluidDistributor; -import resonantinduction.core.grid.fluid.distribution.TankNetwork; +import resonantinduction.core.grid.fluid.distribution.TankGrid; import resonantinduction.core.grid.fluid.distribution.TileFluidDistribution; import universalelectricity.api.UniversalElectricity; import universalelectricity.core.transform.vector.Vector3; @@ -85,9 +85,9 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO @Override public int getLightValue(IBlockAccess access) { - if (getTank().getFluid() != null) + if (getForwardTank().getFluid() != null) { - return getTank().getFluid().getFluid().getLuminosity(); + return getForwardTank().getFluid().getFluid().getLuminosity(); } return super.getLightValue(access); } @@ -97,7 +97,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO { if (this.network == null) { - this.network = new TankNetwork(); + this.network = new TankGrid(); this.network.addConnector(this); } return this.network; @@ -106,7 +106,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO @Override public void setNetwork(FluidDistributionGrid network) { - if (network instanceof TankNetwork) + if (network instanceof TankGrid) { this.network = network; } @@ -153,7 +153,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO if (!fluid.getFluid().isGaseous()) { GL11.glScaled(0.99, 0.99, 0.99); - FluidTank tank = ((TileTank) tileEntity).getTank(); + FluidTank tank = ((TileTank) tileEntity).getForwardTank(); double percentageFilled = (double) tank.getFluidAmount() / (double) tank.getCapacity(); double ySouthEast = FluidUtility.getAveragePercentageFilledForSides(TileTank.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.SOUTH, ForgeDirection.EAST); @@ -166,7 +166,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO { GL11.glTranslated(-0.5, -0.5, -0.5); GL11.glScaled(0.99, 0.99, 0.99); - int capacity = tileEntity instanceof TileTank ? ((TileTank) tileEntity).getTank().getCapacity() : fluid.amount; + int capacity = tileEntity instanceof TileTank ? ((TileTank) tileEntity).getForwardTank().getCapacity() : fluid.amount; double filledPercentage = (double) fluid.amount / (double) capacity; double renderPercentage = fluid.getFluid().isGaseous() ? 1 : filledPercentage; @@ -198,7 +198,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO @Override public boolean renderDynamic(Vector3 position, boolean isItem, float frame) { - renderTank(TileTank.this, position.x, position.y, position.z, getTank().getFluid()); + renderTank(TileTank.this, position.x, position.y, position.z, getForwardTank().getFluid()); return false; } }; @@ -278,9 +278,9 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO ItemStack itemStack = new ItemStack(Archaic.blockTank, 1, 0); if (itemStack != null) { - if (getTank() != null && getTank().getFluid() != null) + if (getForwardTank() != null && getForwardTank().getFluid() != null) { - FluidStack stack = getTank().getFluid(); + FluidStack stack = getForwardTank().getFluid(); if (stack != null) { diff --git a/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.java b/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.java index 076bf1736..fb70afa2d 100644 --- a/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.java +++ b/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.java @@ -22,7 +22,7 @@ public class WailaFluidTank implements IWailaDataProvider TileEntity tile = accessor.getTileEntity(); if (tile instanceof TileTank) { - FluidTank tank = ((TileTank) tile).getTank(); + FluidTank tank = ((TileTank) tile).getForwardTank(); if (tank != null && tank.getFluid() != null) { currenttip.add(LanguageUtility.getLocal("info.waila.tank.fluid") + " " + tank.getFluid().getFluid().getLocalizedName()); diff --git a/src/main/scala/resonantinduction/core/grid/MultipartNode.scala b/src/main/scala/resonantinduction/core/grid/MultipartNode.scala index 80f4056d9..d912ab548 100644 --- a/src/main/scala/resonantinduction/core/grid/MultipartNode.scala +++ b/src/main/scala/resonantinduction/core/grid/MultipartNode.scala @@ -11,7 +11,7 @@ import universalelectricity.core.transform.vector.VectorWorld * A node that works with Forge Multipart * @author Calclavia */ -abstract class MultipartNode[N <: Node[N]](parent: INodeProvider) extends Node[N](parent) +abstract class MultipartNode[N](parent: INodeProvider) extends Node[N](parent) { override def world: World = { diff --git a/src/main/scala/resonantinduction/core/grid/fluid/distribution/FluidDistributionGrid.scala b/src/main/scala/resonantinduction/core/grid/fluid/distribution/FluidDistributionGrid.scala index 55c17eb0b..bab95df11 100644 --- a/src/main/scala/resonantinduction/core/grid/fluid/distribution/FluidDistributionGrid.scala +++ b/src/main/scala/resonantinduction/core/grid/fluid/distribution/FluidDistributionGrid.scala @@ -1,7 +1,7 @@ package resonantinduction.core.grid.fluid.distribution import net.minecraftforge.common.util.ForgeDirection -import net.minecraftforge.fluids.{FluidStack, FluidTank, FluidTankInfo} +import net.minecraftforge.fluids._ import universalelectricity.core.grid.{TickingGrid, UpdateTicker} /** @@ -9,14 +9,14 @@ import universalelectricity.core.grid.{TickingGrid, UpdateTicker} * * @author DarkCow, Calclavia */ -abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor] +abstract class FluidDistributionGrid extends TickingGrid[TankNode] with IFluidHandler { val tank = new FluidTank(0) var needsUpdate = false override def canUpdate: Boolean = { - return needsUpdate && getNodes.size > 0 + return needsUpdate && getNodes().size > 0 } override def continueUpdate: Boolean = @@ -33,9 +33,9 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor] UpdateTicker.addUpdater(this) } - override def reconstructNode(node: TFluidDistributor) + override def reconstructNode(node: TankNode) { - val connectorTank: FluidTank = node.getTank + val connectorTank: FluidTank = node.genericParent.getTank if (connectorTank != null) { @@ -58,7 +58,7 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor] } } - def fill(source: TFluidDistributor, from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = + override def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = { val fill: Int = tank.fill(resource.copy, doFill) if (fill > 0) @@ -69,7 +69,7 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor] return fill } - def drain(source: TFluidDistributor, from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = + override def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = { if (resource != null && resource.isFluidEqual(tank.getFluid)) { @@ -81,7 +81,7 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor] return null } - def drain(source: TFluidDistributor, from: ForgeDirection, resource: Int, doDrain: Boolean): FluidStack = + override def drain(from: ForgeDirection, resource: Int, doDrain: Boolean): FluidStack = { val drain: FluidStack = tank.drain(resource, doDrain) needsUpdate = true @@ -89,10 +89,11 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor] return drain } - def tankInfo: Array[FluidTankInfo] = - { - return Array[FluidTankInfo](tank.getInfo) - } + override def canFill(from: ForgeDirection, fluid: Fluid) = true + + override def canDrain(from: ForgeDirection, fluid: Fluid) = true + + override def getTankInfo(from: ForgeDirection) = Array[FluidTankInfo](tank.getInfo) override def toString: String = { diff --git a/src/main/scala/resonantinduction/core/grid/fluid/distribution/TFluidForwarder.scala b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TFluidForwarder.scala new file mode 100644 index 000000000..ef7ea678b --- /dev/null +++ b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TFluidForwarder.scala @@ -0,0 +1,44 @@ +package resonantinduction.core.grid.fluid.distribution + +import net.minecraftforge.common.util.ForgeDirection +import net.minecraftforge.fluids._ + +/** + * Wraps the fluid handler to forward it to a certain object. + * @author Calclavia + */ +trait TFluidForwarder extends IFluidHandler +{ + def getForwardTank: IFluidHandler + + override def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = + { + return getForwardTank.fill(from, resource, doFill) + } + + override def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = + { + return getForwardTank.drain(from, resource, doDrain) + } + + override def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = + { + return getForwardTank.drain(from, maxDrain, doDrain) + } + + override def canFill(from: ForgeDirection, fluid: Fluid): Boolean = + { + return getForwardTank.canFill(from, fluid) + } + + override def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = + { + return getForwardTank.canDrain(from, fluid) + } + + override def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = + { + return getForwardTank.getTankInfo(from) + } + +} diff --git a/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankNetwork.scala b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankGrid.scala similarity index 94% rename from src/main/scala/resonantinduction/core/grid/fluid/distribution/TankNetwork.scala rename to src/main/scala/resonantinduction/core/grid/fluid/distribution/TankGrid.scala index b0434aa63..bd20536ec 100644 --- a/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankNetwork.scala +++ b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankGrid.scala @@ -10,11 +10,11 @@ import scala.collection.mutable /** Network that handles connected tanks * * @author DarkGuardsman */ -class TankNetwork extends FluidDistributionGrid +class TankGrid extends FluidDistributionGrid { needsUpdate = true - override def update() + override def update(deltaTime: Double) { val networkTankFluid = tank.getFluid @@ -34,7 +34,7 @@ class TankNetwork extends FluidDistributionGrid } }) - heightPriorityQueue ++= getNodes() + heightPriorityQueue ++= (getNodes() map (_.genericParent)) var didChange = false diff --git a/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankNode.scala b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankNode.scala index c9e69fe4f..5b4fe23f2 100644 --- a/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankNode.scala +++ b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TankNode.scala @@ -7,15 +7,19 @@ import resonant.lib.utility.WorldUtility import resonantinduction.core.grid.MultipartNode import universalelectricity.api.core.grid.INodeProvider -class TankNode(parent: INodeProvider) extends MultipartNode[TankNode](parent) with IFluidHandler +class TankNode(parent: INodeProvider) extends MultipartNode[TankNode](parent) with IFluidHandler with TFluidForwarder { var maxFlowRate: Int = 20 var maxPressure: Int = 100 + + //TODO: Do we actually call this? private var pressure: Int = 0 var connectedSides: Byte = 0 var onChange: () => Unit = null + def genericParent = parent.asInstanceOf[TFluidDistributor] + def getMaxFlowRate: Int = { return maxFlowRate @@ -76,6 +80,10 @@ class TankNode(parent: INodeProvider) extends MultipartNode[TankNode](parent) wi return source.isInstanceOf[TankNode] } + override def getForwardTank = getGrid.asInstanceOf[TankGrid] + + override protected def newGrid() = new TankGrid + override def load(nbt: NBTTagCompound) { super.load(nbt) diff --git a/src/main/scala/resonantinduction/core/grid/fluid/distribution/TileFluidDistribution.scala b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TileFluidDistribution.scala index 0951c4e0a..e513156e2 100644 --- a/src/main/scala/resonantinduction/core/grid/fluid/distribution/TileFluidDistribution.scala +++ b/src/main/scala/resonantinduction/core/grid/fluid/distribution/TileFluidDistribution.scala @@ -1,8 +1,6 @@ package resonantinduction.core.grid.fluid.distribution import net.minecraft.block.material.Material -import net.minecraftforge.common.util.ForgeDirection -import net.minecraftforge.fluids.{Fluid, FluidStack, FluidTankInfo} import resonantinduction.core.grid.fluid.TileFluidNodeProvider /** @@ -10,7 +8,7 @@ import resonantinduction.core.grid.fluid.TileFluidNodeProvider * * @author DarkGuardsman */ -abstract class TileFluidDistribution(material: Material) extends TileFluidNodeProvider(material) with TFluidDistributor +abstract class TileFluidDistribution(material: Material) extends TileFluidNodeProvider(material) with TFluidDistributor with TFluidForwarder { tankNode.onChange = () => sendRenderUpdate @@ -26,38 +24,10 @@ abstract class TileFluidDistribution(material: Material) extends TileFluidNodePr super.invalidate() } - def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = - { - return tankNode.fill(from, resource, doFill) - } - - def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = - { - return tankNode.drain(from, resource, doDrain) - } - - def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = - { - return tankNode.drain(from, maxDrain, doDrain) - } - - def canFill(from: ForgeDirection, fluid: Fluid): Boolean = - { - return true - } - - def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = - { - return true - } - - def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = - { - return Array[FluidTankInfo](getTank.getInfo) - } - /** * Network used to link all parts together */ protected var tankNode: TankNode = null + + override def getForwardTank = tankNode } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/grid/fluid/pressure/FluidPressureNode.scala b/src/main/scala/resonantinduction/core/grid/fluid/pressure/FluidPressureNode.scala index 454909e8b..6173ccf3f 100644 --- a/src/main/scala/resonantinduction/core/grid/fluid/pressure/FluidPressureNode.scala +++ b/src/main/scala/resonantinduction/core/grid/fluid/pressure/FluidPressureNode.scala @@ -24,7 +24,7 @@ class FluidPressureNode(parent: INodeProvider) extends MultipartNode[AnyRef](par return this } - def update(deltaTime: Double) + override def update(deltaTime: Double) { if (!world.isRemote) { diff --git a/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.scala b/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.scala index 047f59834..aeb0631ab 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.scala +++ b/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.scala @@ -4,7 +4,6 @@ import codechicken.multipart.{TMultiPart, TileMultipart} import io.netty.buffer.ByteBuf import io.netty.channel.ChannelHandlerContext import net.minecraft.entity.player.EntityPlayer -import net.minecraft.tileentity.TileEntity import resonant.lib.network.discriminator.PacketType import resonant.lib.network.handle.TPacketReceiver import universalelectricity.core.transform.vector.Vector3 @@ -16,10 +15,10 @@ import universalelectricity.core.transform.vector.Vector3 */ class PacketMultiPart extends PacketType { - var x: Int - var y: Int - var z: Int - var partID: Int + var x: Int = 0 + var y: Int = 0 + var z: Int = 0 + var partID: Int = 0 def this(part: TMultiPart, partID: Int) { diff --git a/src/main/scala/resonantinduction/core/prefab/part/PartColorableMaterial.scala b/src/main/scala/resonantinduction/core/prefab/part/PartColorableMaterial.scala index 447b14513..113ad7da9 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/PartColorableMaterial.scala +++ b/src/main/scala/resonantinduction/core/prefab/part/PartColorableMaterial.scala @@ -166,10 +166,12 @@ abstract class PartColorableMaterial[M](insulationType: Item) extends TMultiPart { val drops = mutable.Set.empty[ItemStack] drops.add(getItem) + if (requiresInsulation && isInsulated) { drops.add(new ItemStack(insulationType, 1, BlockColored.func_150031_c(color))) } + return drops } diff --git a/src/main/scala/resonantinduction/core/prefab/part/TraitPart.scala b/src/main/scala/resonantinduction/core/prefab/part/TraitPart.scala index 94d46f1c2..8bb205177 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/TraitPart.scala +++ b/src/main/scala/resonantinduction/core/prefab/part/TraitPart.scala @@ -1,24 +1,20 @@ package resonantinduction.core.prefab.part -import java.util.{ArrayList, List} - import codechicken.multipart.{IRedstonePart, TMultiPart} import net.minecraft.item.ItemStack import net.minecraft.util.MovingObjectPosition import resonant.content.spatial.block.TraitTicker -import scala.collection.JavaConversions._ - trait TraitPart extends TMultiPart with TraitTicker { + override def update() + { + super[TraitTicker].update() + } + protected def getItem: ItemStack - override def getDrops: Iterable[ItemStack] = - { - val drops: List[ItemStack] = new ArrayList[ItemStack] - drops.add(getItem) - return drops - } + override def getDrops: Iterable[ItemStack] = Seq(getItem) override def pickItem(hit: MovingObjectPosition): ItemStack = {