Fixed some tank node logic

This commit is contained in:
Calclavia 2014-07-21 09:15:22 -04:00
parent 9881d2d209
commit 2dc5dbeb3a
13 changed files with 98 additions and 78 deletions

View file

@ -83,7 +83,7 @@ public class ItemBlockTank extends ItemBlock implements IFluidContainerItem
if (tile instanceof TileFluidDistribution) if (tile instanceof TileFluidDistribution)
{ {
((TileFluidDistribution) tile).setSubID(stack.getItemDamage()); ((TileFluidDistribution) tile).setSubID(stack.getItemDamage());
((TileFluidDistribution) tile).getTank().fill(getFluid(stack), true); ((TileFluidDistribution) tile).getForwardTank().fill(getFluid(stack), true);
} }
return true; return true;

View file

@ -31,7 +31,7 @@ import archaic.Archaic;
import resonantinduction.core.Reference; import resonantinduction.core.Reference;
import resonantinduction.core.grid.fluid.distribution.FluidDistributionGrid; import resonantinduction.core.grid.fluid.distribution.FluidDistributionGrid;
import resonantinduction.core.grid.fluid.distribution.TFluidDistributor; 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 resonantinduction.core.grid.fluid.distribution.TileFluidDistribution;
import universalelectricity.api.UniversalElectricity; import universalelectricity.api.UniversalElectricity;
import universalelectricity.core.transform.vector.Vector3; import universalelectricity.core.transform.vector.Vector3;
@ -85,9 +85,9 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO
@Override @Override
public int getLightValue(IBlockAccess access) 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); return super.getLightValue(access);
} }
@ -97,7 +97,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO
{ {
if (this.network == null) if (this.network == null)
{ {
this.network = new TankNetwork(); this.network = new TankGrid();
this.network.addConnector(this); this.network.addConnector(this);
} }
return this.network; return this.network;
@ -106,7 +106,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO
@Override @Override
public void setNetwork(FluidDistributionGrid network) public void setNetwork(FluidDistributionGrid network)
{ {
if (network instanceof TankNetwork) if (network instanceof TankGrid)
{ {
this.network = network; this.network = network;
} }
@ -153,7 +153,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO
if (!fluid.getFluid().isGaseous()) if (!fluid.getFluid().isGaseous())
{ {
GL11.glScaled(0.99, 0.99, 0.99); 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 percentageFilled = (double) tank.getFluidAmount() / (double) tank.getCapacity();
double ySouthEast = FluidUtility.getAveragePercentageFilledForSides(TileTank.class, percentageFilled, tileEntity.worldObj, new Vector3(tileEntity), ForgeDirection.SOUTH, ForgeDirection.EAST); 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.glTranslated(-0.5, -0.5, -0.5);
GL11.glScaled(0.99, 0.99, 0.99); 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 filledPercentage = (double) fluid.amount / (double) capacity;
double renderPercentage = fluid.getFluid().isGaseous() ? 1 : filledPercentage; double renderPercentage = fluid.getFluid().isGaseous() ? 1 : filledPercentage;
@ -198,7 +198,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO
@Override @Override
public boolean renderDynamic(Vector3 position, boolean isItem, float frame) 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; return false;
} }
}; };
@ -278,9 +278,9 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO
ItemStack itemStack = new ItemStack(Archaic.blockTank, 1, 0); ItemStack itemStack = new ItemStack(Archaic.blockTank, 1, 0);
if (itemStack != null) 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) if (stack != null)
{ {

View file

@ -22,7 +22,7 @@ public class WailaFluidTank implements IWailaDataProvider
TileEntity tile = accessor.getTileEntity(); TileEntity tile = accessor.getTileEntity();
if (tile instanceof TileTank) if (tile instanceof TileTank)
{ {
FluidTank tank = ((TileTank) tile).getTank(); FluidTank tank = ((TileTank) tile).getForwardTank();
if (tank != null && tank.getFluid() != null) if (tank != null && tank.getFluid() != null)
{ {
currenttip.add(LanguageUtility.getLocal("info.waila.tank.fluid") + " " + tank.getFluid().getFluid().getLocalizedName()); currenttip.add(LanguageUtility.getLocal("info.waila.tank.fluid") + " " + tank.getFluid().getFluid().getLocalizedName());

View file

@ -11,7 +11,7 @@ import universalelectricity.core.transform.vector.VectorWorld
* A node that works with Forge Multipart * A node that works with Forge Multipart
* @author Calclavia * @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 = override def world: World =
{ {

View file

@ -1,7 +1,7 @@
package resonantinduction.core.grid.fluid.distribution package resonantinduction.core.grid.fluid.distribution
import net.minecraftforge.common.util.ForgeDirection import net.minecraftforge.common.util.ForgeDirection
import net.minecraftforge.fluids.{FluidStack, FluidTank, FluidTankInfo} import net.minecraftforge.fluids._
import universalelectricity.core.grid.{TickingGrid, UpdateTicker} import universalelectricity.core.grid.{TickingGrid, UpdateTicker}
/** /**
@ -9,14 +9,14 @@ import universalelectricity.core.grid.{TickingGrid, UpdateTicker}
* *
* @author DarkCow, Calclavia * @author DarkCow, Calclavia
*/ */
abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor] abstract class FluidDistributionGrid extends TickingGrid[TankNode] with IFluidHandler
{ {
val tank = new FluidTank(0) val tank = new FluidTank(0)
var needsUpdate = false var needsUpdate = false
override def canUpdate: Boolean = override def canUpdate: Boolean =
{ {
return needsUpdate && getNodes.size > 0 return needsUpdate && getNodes().size > 0
} }
override def continueUpdate: Boolean = override def continueUpdate: Boolean =
@ -33,9 +33,9 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor]
UpdateTicker.addUpdater(this) 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) 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) val fill: Int = tank.fill(resource.copy, doFill)
if (fill > 0) if (fill > 0)
@ -69,7 +69,7 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor]
return fill 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)) if (resource != null && resource.isFluidEqual(tank.getFluid))
{ {
@ -81,7 +81,7 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor]
return null 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) val drain: FluidStack = tank.drain(resource, doDrain)
needsUpdate = true needsUpdate = true
@ -89,10 +89,11 @@ abstract class FluidDistributionGrid extends TickingGrid[TFluidDistributor]
return drain return drain
} }
def tankInfo: Array[FluidTankInfo] = override def canFill(from: ForgeDirection, fluid: Fluid) = true
{
return Array[FluidTankInfo](tank.getInfo) override def canDrain(from: ForgeDirection, fluid: Fluid) = true
}
override def getTankInfo(from: ForgeDirection) = Array[FluidTankInfo](tank.getInfo)
override def toString: String = override def toString: String =
{ {

View file

@ -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)
}
}

View file

@ -10,11 +10,11 @@ import scala.collection.mutable
/** Network that handles connected tanks /** Network that handles connected tanks
* *
* @author DarkGuardsman */ * @author DarkGuardsman */
class TankNetwork extends FluidDistributionGrid class TankGrid extends FluidDistributionGrid
{ {
needsUpdate = true needsUpdate = true
override def update() override def update(deltaTime: Double)
{ {
val networkTankFluid = tank.getFluid val networkTankFluid = tank.getFluid
@ -34,7 +34,7 @@ class TankNetwork extends FluidDistributionGrid
} }
}) })
heightPriorityQueue ++= getNodes() heightPriorityQueue ++= (getNodes() map (_.genericParent))
var didChange = false var didChange = false

View file

@ -7,15 +7,19 @@ import resonant.lib.utility.WorldUtility
import resonantinduction.core.grid.MultipartNode import resonantinduction.core.grid.MultipartNode
import universalelectricity.api.core.grid.INodeProvider 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 maxFlowRate: Int = 20
var maxPressure: Int = 100 var maxPressure: Int = 100
//TODO: Do we actually call this?
private var pressure: Int = 0 private var pressure: Int = 0
var connectedSides: Byte = 0 var connectedSides: Byte = 0
var onChange: () => Unit = null var onChange: () => Unit = null
def genericParent = parent.asInstanceOf[TFluidDistributor]
def getMaxFlowRate: Int = def getMaxFlowRate: Int =
{ {
return maxFlowRate return maxFlowRate
@ -76,6 +80,10 @@ class TankNode(parent: INodeProvider) extends MultipartNode[TankNode](parent) wi
return source.isInstanceOf[TankNode] return source.isInstanceOf[TankNode]
} }
override def getForwardTank = getGrid.asInstanceOf[TankGrid]
override protected def newGrid() = new TankGrid
override def load(nbt: NBTTagCompound) override def load(nbt: NBTTagCompound)
{ {
super.load(nbt) super.load(nbt)

View file

@ -1,8 +1,6 @@
package resonantinduction.core.grid.fluid.distribution package resonantinduction.core.grid.fluid.distribution
import net.minecraft.block.material.Material 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 import resonantinduction.core.grid.fluid.TileFluidNodeProvider
/** /**
@ -10,7 +8,7 @@ import resonantinduction.core.grid.fluid.TileFluidNodeProvider
* *
* @author DarkGuardsman * @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 tankNode.onChange = () => sendRenderUpdate
@ -26,38 +24,10 @@ abstract class TileFluidDistribution(material: Material) extends TileFluidNodePr
super.invalidate() 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 * Network used to link all parts together
*/ */
protected var tankNode: TankNode = null protected var tankNode: TankNode = null
override def getForwardTank = tankNode
} }

View file

@ -24,7 +24,7 @@ class FluidPressureNode(parent: INodeProvider) extends MultipartNode[AnyRef](par
return this return this
} }
def update(deltaTime: Double) override def update(deltaTime: Double)
{ {
if (!world.isRemote) if (!world.isRemote)
{ {

View file

@ -4,7 +4,6 @@ import codechicken.multipart.{TMultiPart, TileMultipart}
import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBuf
import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelHandlerContext
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.tileentity.TileEntity
import resonant.lib.network.discriminator.PacketType import resonant.lib.network.discriminator.PacketType
import resonant.lib.network.handle.TPacketReceiver import resonant.lib.network.handle.TPacketReceiver
import universalelectricity.core.transform.vector.Vector3 import universalelectricity.core.transform.vector.Vector3
@ -16,10 +15,10 @@ import universalelectricity.core.transform.vector.Vector3
*/ */
class PacketMultiPart extends PacketType class PacketMultiPart extends PacketType
{ {
var x: Int var x: Int = 0
var y: Int var y: Int = 0
var z: Int var z: Int = 0
var partID: Int var partID: Int = 0
def this(part: TMultiPart, partID: Int) def this(part: TMultiPart, partID: Int)
{ {

View file

@ -166,10 +166,12 @@ abstract class PartColorableMaterial[M](insulationType: Item) extends TMultiPart
{ {
val drops = mutable.Set.empty[ItemStack] val drops = mutable.Set.empty[ItemStack]
drops.add(getItem) drops.add(getItem)
if (requiresInsulation && isInsulated) if (requiresInsulation && isInsulated)
{ {
drops.add(new ItemStack(insulationType, 1, BlockColored.func_150031_c(color))) drops.add(new ItemStack(insulationType, 1, BlockColored.func_150031_c(color)))
} }
return drops return drops
} }

View file

@ -1,24 +1,20 @@
package resonantinduction.core.prefab.part package resonantinduction.core.prefab.part
import java.util.{ArrayList, List}
import codechicken.multipart.{IRedstonePart, TMultiPart} import codechicken.multipart.{IRedstonePart, TMultiPart}
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.util.MovingObjectPosition import net.minecraft.util.MovingObjectPosition
import resonant.content.spatial.block.TraitTicker import resonant.content.spatial.block.TraitTicker
import scala.collection.JavaConversions._
trait TraitPart extends TMultiPart with TraitTicker trait TraitPart extends TMultiPart with TraitTicker
{ {
override def update()
{
super[TraitTicker].update()
}
protected def getItem: ItemStack protected def getItem: ItemStack
override def getDrops: Iterable[ItemStack] = override def getDrops: Iterable[ItemStack] = Seq(getItem)
{
val drops: List[ItemStack] = new ArrayList[ItemStack]
drops.add(getItem)
return drops
}
override def pickItem(hit: MovingObjectPosition): ItemStack = override def pickItem(hit: MovingObjectPosition): ItemStack =
{ {