electrodynamics/src/main/scala/edx/quantum/machine/plasma/TilePlasmaHeater.scala

198 lines
6.4 KiB
Scala
Raw Normal View History

2015-01-14 12:06:03 +01:00
package edx.quantum.machine.plasma
import java.util.HashMap
import cpw.mods.fml.common.network.ByteBufUtils
2015-01-14 12:06:03 +01:00
import edx.quantum.QuantumContent
import io.netty.buffer.ByteBuf
import net.minecraft.block.material.Material
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.network.Packet
import net.minecraftforge.common.util.ForgeDirection
import net.minecraftforge.fluids._
2015-01-22 03:30:51 +01:00
import resonant.core.ResonantEngine
2015-01-26 11:13:56 +01:00
import resonant.lib.grid.core.TBlockNodeProvider
2014-12-09 23:46:07 +01:00
import resonant.lib.grid.energy.EnergyStorage
2015-01-26 11:13:56 +01:00
import resonant.lib.grid.energy.electric.NodeElectricComponent
2014-12-09 23:46:07 +01:00
import resonant.lib.mod.config.Config
2014-12-10 19:47:51 +01:00
import resonant.lib.network.discriminator.{PacketTile, PacketType}
import resonant.lib.network.handle.IPacketReceiver
2015-01-26 11:13:56 +01:00
import resonant.lib.prefab.tile.spatial.SpatialTile
2015-01-21 04:12:44 +01:00
import resonant.lib.prefab.tile.traits.TEnergyProvider
2014-11-02 13:56:11 +01:00
import resonant.lib.transform.vector.Vector3
import resonant.lib.utility.science.UnitDisplay
import resonant.lib.utility.{FluidUtility, LanguageUtility}
object TilePlasmaHeater
{
2015-01-21 04:12:44 +01:00
var power: Long = 10000000000L
2014-11-02 13:56:11 +01:00
@Config var plasmaHeatAmount: Int = 100
}
2015-01-26 11:13:56 +01:00
class TilePlasmaHeater extends SpatialTile(Material.iron) with TBlockNodeProvider with IPacketReceiver with IFluidHandler with TEnergyProvider
{
2014-11-02 13:56:11 +01:00
final val tankInputDeuterium: FluidTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME * 10)
final val tankInputTritium: FluidTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME * 10)
final val tankOutput: FluidTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME * 10)
2015-01-26 11:13:56 +01:00
private val electricNode = new NodeElectricComponent(this)
2014-11-02 13:56:11 +01:00
var rotation: Float = 0
//Constructor
//TODO: Dummy
2015-01-21 04:12:44 +01:00
energy = new EnergyStorage
energy.max = TilePlasmaHeater.power
2015-01-17 06:13:26 +01:00
normalRender = false
isOpaqueCube = false
2014-11-02 13:56:11 +01:00
override def update()
{
super.update()
2015-01-21 04:12:44 +01:00
rotation = (rotation + energy.value / 10000f).asInstanceOf[Float]
2014-11-02 13:56:11 +01:00
if (!worldObj.isRemote)
{
2015-01-21 04:12:44 +01:00
if (energy >= TilePlasmaHeater.power / 20)
2014-11-02 13:56:11 +01:00
{
if (tankInputDeuterium.getFluidAmount >= TilePlasmaHeater.plasmaHeatAmount && tankInputTritium.getFluidAmount >= TilePlasmaHeater.plasmaHeatAmount && tankOutput.getFluidAmount < tankOutput.getCapacity)
{
2014-11-02 13:56:11 +01:00
tankInputDeuterium.drain(TilePlasmaHeater.plasmaHeatAmount, true)
tankInputTritium.drain(TilePlasmaHeater.plasmaHeatAmount, true)
2015-01-14 12:06:03 +01:00
tankOutput.fill(new FluidStack(QuantumContent.FLUID_PLASMA, tankOutput.getCapacity), true)
2015-01-21 04:12:44 +01:00
energy -= TilePlasmaHeater.power / 20
}
2014-11-02 13:56:11 +01:00
}
}
2014-11-02 13:56:11 +01:00
if (ticks % 80 == 0)
{
2014-11-02 13:56:11 +01:00
world.markBlockForUpdate(xi, yi, zi)
}
2014-11-02 13:56:11 +01:00
}
override def getDescriptionPacket: Packet =
{
val nbt: NBTTagCompound = new NBTTagCompound
writeToNBT(nbt)
return ResonantEngine.packetHandler.toMCPacket(new PacketTile(this, nbt))
}
/**
* Writes a tile entity to NBT.
*/
override def writeToNBT(nbt: NBTTagCompound)
{
super.writeToNBT(nbt)
if (tankInputDeuterium.getFluid != null)
{
val compound: NBTTagCompound = new NBTTagCompound
tankInputDeuterium.getFluid.writeToNBT(compound)
nbt.setTag("tankInputDeuterium", compound)
}
if (tankInputTritium.getFluid != null)
{
val compound: NBTTagCompound = new NBTTagCompound
tankInputTritium.getFluid.writeToNBT(compound)
nbt.setTag("tankInputTritium", compound)
}
if (tankOutput.getFluid != null)
{
val compound: NBTTagCompound = new NBTTagCompound
tankOutput.getFluid.writeToNBT(compound)
nbt.setTag("tankOutput", compound)
}
2014-11-02 13:56:11 +01:00
}
def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType)
{
try
{
2014-11-02 13:56:11 +01:00
readFromNBT(ByteBufUtils.readTag(data))
}
2014-11-02 13:56:11 +01:00
catch
{
case e: Exception =>
{
2014-11-02 13:56:11 +01:00
e.printStackTrace
}
2014-11-02 13:56:11 +01:00
}
}
/**
* Reads a tile entity from NBT.
*/
override def readFromNBT(nbt: NBTTagCompound)
{
super.readFromNBT(nbt)
val deuterium: NBTTagCompound = nbt.getCompoundTag("tankInputDeuterium")
tankInputDeuterium.setFluid(FluidStack.loadFluidStackFromNBT(deuterium))
val tritium: NBTTagCompound = nbt.getCompoundTag("tankInputTritium")
tankInputTritium.setFluid(FluidStack.loadFluidStackFromNBT(tritium))
val output: NBTTagCompound = nbt.getCompoundTag("tankOutput")
tankOutput.setFluid(FluidStack.loadFluidStackFromNBT(output))
}
def addInformation(map: HashMap[String, Integer], player: EntityPlayer): Float =
{
if (energy != null)
{
2015-01-21 04:12:44 +01:00
map.put(LanguageUtility.getLocal("tooltip.energy") + ": " + new UnitDisplay(UnitDisplay.Unit.JOULES, energy.value), 0xFFFFFF)
}
2014-11-02 13:56:11 +01:00
if (tankInputDeuterium.getFluidAmount > 0)
{
2014-11-02 13:56:11 +01:00
map.put(LanguageUtility.getLocal("fluid.deuterium") + ": " + tankInputDeuterium.getFluidAmount + " L", 0xFFFFFF)
}
2014-11-02 13:56:11 +01:00
if (tankInputTritium.getFluidAmount > 0)
{
2014-11-02 13:56:11 +01:00
map.put(LanguageUtility.getLocal("fluid.tritium") + ": " + tankInputTritium.getFluidAmount + " L", 0xFFFFFF)
}
2014-11-02 13:56:11 +01:00
if (tankOutput.getFluidAmount > 0)
{
2014-11-02 13:56:11 +01:00
map.put(LanguageUtility.getLocal("fluid.plasma") + ": " + tankOutput.getFluidAmount + " L", 0xFFFFFF)
}
2014-11-02 13:56:11 +01:00
return 1.5f
}
2014-11-02 13:56:11 +01:00
def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int =
{
2015-01-14 12:06:03 +01:00
if (resource.isFluidEqual(QuantumContent.FLUIDSTACK_DEUTERIUM))
{
2014-11-02 13:56:11 +01:00
return tankInputDeuterium.fill(resource, doFill)
}
2015-01-14 12:06:03 +01:00
if (resource.isFluidEqual(QuantumContent.getFluidStackTritium))
{
2014-11-02 13:56:11 +01:00
return tankInputTritium.fill(resource, doFill)
}
2014-11-02 13:56:11 +01:00
return 0
}
def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack =
{
return drain(from, resource.amount, doDrain)
}
def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack =
{
return tankOutput.drain(maxDrain, doDrain)
}
def canFill(from: ForgeDirection, fluid: Fluid): Boolean =
{
2015-01-14 12:06:03 +01:00
return fluid.getID == QuantumContent.FLUID_DEUTERIUM.getID || fluid.getID == QuantumContent.getFluidTritium.getID
2014-11-02 13:56:11 +01:00
}
def canDrain(from: ForgeDirection, fluid: Fluid): Boolean =
{
2015-01-14 12:06:03 +01:00
return fluid eq QuantumContent.FLUID_PLASMA
2014-11-02 13:56:11 +01:00
}
def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] =
{
return Array[FluidTankInfo](tankInputDeuterium.getInfo, tankInputTritium.getInfo, tankOutput.getInfo)
}
override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean =
{
return FluidUtility.playerActivatedFluidItem(world, xi, yi, zi, player, side)
}
}