electrodynamics/src/main/scala/edx/core/prefab/node/TileFluidProvider.scala
2015-01-26 20:28:38 +08:00

118 lines
3.1 KiB
Scala

package edx.core.prefab.node
import io.netty.buffer.ByteBuf
import net.minecraft.block.material.Material
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection
import net.minecraftforge.fluids._
import resonantengine.core.network.discriminator.PacketType
import resonantengine.lib.grid.core.TBlockNodeProvider
import resonantengine.lib.modcontent.block.ResonantTile
import resonantengine.lib.prefab.fluid.NodeFluid
import resonantengine.lib.wrapper.ByteBufWrapper._
import resonantengine.prefab.network.{TPacketReceiver, TPacketSender}
/**
* A prefab class for tiles that use the fluid network.
*
* @author DarkGuardsman, Calclavia
*/
abstract class TileFluidProvider(material: Material) extends ResonantTile(material) with TBlockNodeProvider with IFluidHandler with TPacketReceiver with TPacketSender
{
protected var colorID: Int = 0
protected var clientRenderMask = 0x3F
private var _fluidNode: NodeFluid = null
override def start()
{
super.start()
if (!world.isRemote)
{
fluidNode.onConnectionChanged()
}
}
override def write(buf: ByteBuf, id: Int)
{
super.write(buf, id)
id match
{
case 0 =>
{
buf <<< colorID
buf <<< clientRenderMask
buf <<< fluidNode.getPrimaryTank
}
case 1 =>
{
buf <<< fluidNode.getPrimaryTank
}
}
}
def fluidNode = _fluidNode
def fluidNode_=(newNode: NodeFluid)
{
_fluidNode = newNode
fluidNode.onConnectionChanged = () =>
{
clientRenderMask = fluidNode.connectedMask
sendPacket(0)
}
fluidNode.onFluidChanged = () => if (!world.isRemote) sendPacket(1)
nodes.add(fluidNode)
}
override def read(buf: ByteBuf, id: Int, packet: PacketType)
{
super.read(buf, id, packet)
if (world.isRemote)
{
id match
{
case 0 =>
{
colorID = buf.readInt()
clientRenderMask = buf.readInt()
fluidNode.setPrimaryTank(buf.readTank())
}
case 1 =>
{
fluidNode.setPrimaryTank(buf.readTank())
}
}
markRender()
}
}
override def readFromNBT(nbt: NBTTagCompound)
{
super.readFromNBT(nbt)
fluidNode.load(nbt)
colorID = nbt.getInteger("colorID")
}
override def writeToNBT(nbt: NBTTagCompound)
{
super.writeToNBT(nbt)
fluidNode.save(nbt)
nbt.setInteger("colorID", colorID)
}
override def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack = fluidNode.drain(from, resource, doDrain)
override def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack = fluidNode.drain(from, maxDrain, doDrain)
override def canFill(from: ForgeDirection, fluid: Fluid): Boolean = fluidNode.canFill(from, fluid)
override def canDrain(from: ForgeDirection, fluid: Fluid): Boolean = fluidNode.canDrain(from, fluid)
override def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int = fluidNode.fill(from, resource, doFill)
override def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] = fluidNode.getTankInfo(from)
}