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)
{
((TileFluidDistribution) tile).setSubID(stack.getItemDamage());
((TileFluidDistribution) tile).getTank().fill(getFluid(stack), true);
((TileFluidDistribution) tile).getForwardTank().fill(getFluid(stack), true);
}
return true;

View file

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

View file

@ -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());

View file

@ -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 =
{

View file

@ -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 =
{

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
*
* @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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 =
{