electrodynamics/src/main/scala/edx/mechanical/fluid/pipe/PartPipe.scala

179 lines
4.7 KiB
Scala
Raw Normal View History

2015-01-14 12:06:03 +01:00
package edx.mechanical.fluid.pipe
2014-09-14 05:19:54 +02:00
2014-11-11 13:51:23 +01:00
import java.lang.{Iterable => JIterable}
2014-09-21 08:47:53 +02:00
import codechicken.lib.data.{MCDataInput, MCDataOutput}
2014-11-11 13:51:23 +01:00
import codechicken.lib.raytracer.IndexedCuboid6
2014-09-14 08:16:28 +02:00
import codechicken.lib.render.CCRenderState
import codechicken.lib.vec.Vector3
2014-09-14 08:16:28 +02:00
import cpw.mods.fml.relauncher.{Side, SideOnly}
2015-01-14 12:06:03 +01:00
import edx.core.prefab.part.CuboidShapes
import edx.core.prefab.part.connector.{PartFramedNode, TColorable, TMaterial}
import edx.mechanical.MechanicalContent
import edx.mechanical.fluid.pipe.PipeMaterials.PipeMaterial
2014-09-14 08:16:28 +02:00
import net.minecraft.client.renderer.RenderBlocks
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection
2014-09-14 05:19:54 +02:00
import net.minecraftforge.fluids._
2015-01-26 12:40:32 +01:00
import resonantengine.lib.collection.EvictingList
import resonantengine.lib.wrapper.BitmaskWrapper._
2014-11-11 13:51:23 +01:00
import scala.collection.convert.wrapAll._
import scala.collection.mutable
2014-09-14 05:19:54 +02:00
/**
* Fluid transport pipe
*
2014-09-14 08:16:28 +02:00
* @author Calclavia
2014-09-14 05:19:54 +02:00
*/
2014-09-21 05:08:25 +02:00
class PartPipe extends PartFramedNode with TMaterial[PipeMaterial] with TColorable with IFluidHandler
2014-09-14 05:19:54 +02:00
{
2014-11-08 15:35:48 +01:00
override lazy val node = new NodePipe(this)
2014-09-14 08:16:28 +02:00
/**
* Computes the average fluid for client to render.
*/
private val averageTankData = new EvictingList[Integer](20)
2014-09-21 04:28:51 +02:00
private var markPacket = true
2014-09-14 08:16:28 +02:00
2014-09-21 04:28:51 +02:00
material = PipeMaterials.ceramic
2014-11-10 15:29:33 +01:00
node.onConnectionChanged = () => sendPacket(0)
2014-11-11 15:28:25 +01:00
node.onFluidChanged = () => markPacket = true
2014-09-14 05:19:54 +02:00
2014-11-11 13:51:23 +01:00
override def getSubParts: JIterable[IndexedCuboid6] =
{
val sideCuboids = CuboidShapes.thickSegment
val list = mutable.Set.empty[IndexedCuboid6]
list += CuboidShapes.thickCenter
list ++= ForgeDirection.VALID_DIRECTIONS.filter(s => clientRenderMask.mask(s) || s == testingSide).map(s => sideCuboids(s.ordinal()))
return list
}
2014-09-14 08:40:19 +02:00
def preparePlacement(meta: Int)
{
setMaterial(meta)
}
2014-09-14 05:19:54 +02:00
def setMaterial(i: Int)
{
material = PipeMaterials(i).asInstanceOf[PipeMaterial]
2014-09-14 05:19:54 +02:00
}
2014-09-14 08:16:28 +02:00
override def update()
2014-09-14 05:19:54 +02:00
{
2014-09-14 08:16:28 +02:00
super.update()
averageTankData.add(node.getFluidAmount)
2014-09-14 08:16:28 +02:00
2014-09-14 05:19:54 +02:00
if (!world.isRemote && markPacket)
{
2014-11-10 14:41:46 +01:00
sendPacket(3)
2014-09-14 05:19:54 +02:00
markPacket = false
}
}
/**
2014-11-10 14:41:46 +01:00
* Packet Methods
2014-09-14 05:19:54 +02:00
*/
2014-11-10 14:41:46 +01:00
override def write(packet: MCDataOutput, id: Int)
2014-09-14 05:19:54 +02:00
{
2014-11-10 15:29:33 +01:00
super[PartFramedNode].write(packet, id)
2014-11-11 13:51:23 +01:00
super[TMaterial].write(packet, id)
super[TColorable].write(packet, id)
2014-11-10 14:41:46 +01:00
2014-11-10 15:29:33 +01:00
if (id == 3)
2014-09-14 05:19:54 +02:00
{
//node Packet
2014-11-10 14:41:46 +01:00
val nbt = new NBTTagCompound
2014-11-10 15:29:33 +01:00
val averageAmount = averageTankData.reduce(_ + _) / averageTankData.size
2015-01-26 13:56:09 +01:00
val tempTank = node.getTank //if (node.getFluid != null) new FluidTank(node.getFluid.getFluid, averageAmount, node.getCapacity) else new FluidTank(node.getCapacity)
2014-11-10 14:41:46 +01:00
tempTank.writeToNBT(nbt)
packet.writeInt(node.getCapacity).writeNBTTagCompound(nbt)
2014-11-11 13:51:23 +01:00
}
2014-09-21 05:08:25 +02:00
}
2014-09-14 05:19:54 +02:00
override def read(packet: MCDataInput, packetID: Int)
{
2014-09-21 05:08:25 +02:00
super[PartFramedNode].read(packet, packetID)
2014-11-11 13:51:23 +01:00
super[TMaterial].read(packet, packetID)
super[TColorable].read(packet, packetID)
2014-09-21 04:28:51 +02:00
if (packetID == 3 && world.isRemote)
2014-09-14 05:19:54 +02:00
{
node.setPrimaryTank(new FluidTank(packet.readInt))
2015-01-26 13:56:09 +01:00
node.getTank.readFromNBT(packet.readNBTTagCompound)
2014-11-11 13:51:23 +01:00
}
2014-09-14 05:19:54 +02:00
}
2014-09-21 05:08:25 +02:00
/**
* NBT Methods
*/
override def load(nbt: NBTTagCompound)
{
super[PartFramedNode].load(nbt)
super[TMaterial].load(nbt)
super[TColorable].load(nbt)
node.load(nbt)
2014-09-21 05:08:25 +02:00
}
override def save(nbt: NBTTagCompound)
{
super[PartFramedNode].save(nbt)
super[TMaterial].save(nbt)
super[TColorable].save(nbt)
node.save(nbt)
2014-09-21 05:08:25 +02:00
}
2014-09-14 08:16:28 +02:00
@SideOnly(Side.CLIENT)
override def renderDynamic(pos: Vector3, frame: Float, pass: Int)
2014-09-14 05:19:54 +02:00
{
2014-09-21 05:13:11 +02:00
RenderPipe.render(this, pos.x, pos.y, pos.z, frame)
2014-09-14 05:19:54 +02:00
}
def getItem: ItemStack = new ItemStack(MechanicalContent.itemPipe, 1, getMaterialID)
2014-09-14 05:19:54 +02:00
2015-01-08 12:02:58 +01:00
def getMaterialID: Int = material.id
2014-09-21 08:47:53 +02:00
override def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int =
2014-09-14 05:19:54 +02:00
{
if (!world.isRemote)
{
if (doFill)
markPacket = true
2014-09-21 08:47:53 +02:00
return node.fill(resource, doFill)
2014-09-14 05:19:54 +02:00
}
return 0
}
2014-09-21 08:47:53 +02:00
override def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack =
2014-09-14 05:19:54 +02:00
{
return drain(from, resource.amount, doDrain)
}
2014-09-21 08:47:53 +02:00
override def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack =
2014-09-14 05:19:54 +02:00
{
if (!world.isRemote)
{
if (doDrain)
markPacket = true
2014-09-21 08:47:53 +02:00
return node.drain(maxDrain, doDrain)
2014-09-14 05:19:54 +02:00
}
return null
}
2014-09-21 08:47:53 +02:00
override def canFill(from: ForgeDirection, fluid: Fluid): Boolean = true
2014-09-14 05:19:54 +02:00
2014-09-21 08:47:53 +02:00
override def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = true
2014-09-14 05:19:54 +02:00
override def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = Array[FluidTankInfo](node.getInfo)
2014-09-14 05:19:54 +02:00
override def drawBreaking(renderBlocks: RenderBlocks)
{
2014-09-14 08:16:28 +02:00
CCRenderState.reset()
2014-09-14 05:19:54 +02:00
}
}