167 lines
4.3 KiB
Scala
167 lines
4.3 KiB
Scala
package edx.basic.process.smelting
|
|
|
|
import cpw.mods.fml.common.network.ByteBufUtils
|
|
import io.netty.buffer.ByteBuf
|
|
import net.minecraft.block.material.Material
|
|
import net.minecraft.entity.player.EntityPlayer
|
|
import net.minecraft.item.ItemStack
|
|
import net.minecraft.nbt.NBTTagCompound
|
|
import net.minecraftforge.common.util.ForgeDirection
|
|
import net.minecraftforge.fluids._
|
|
import resonantengine.api.edx.recipe.{MachineRecipes, RecipeResource, RecipeType}
|
|
import resonantengine.api.network.IPacketReceiver
|
|
import resonantengine.core.network.discriminator.{PacketTile, PacketType}
|
|
import resonantengine.lib.transform.vector.Vector3
|
|
import resonantengine.lib.utility.FluidUtility
|
|
import resonantengine.lib.utility.inventory.InventoryUtility
|
|
import resonantengine.prefab.block.mixed.TileInventory
|
|
|
|
/**
|
|
* Turns molten fuilds into ingots.
|
|
* <p/>
|
|
* 1 cubed meter of molten fluid = 1 block
|
|
* Approximately 100-110 L of fluid = 1 ingot.
|
|
|
|
* @author Calclavia
|
|
*/
|
|
class TileCastingMold extends TileInventory(Material.rock) with IFluidHandler with IPacketReceiver
|
|
{
|
|
private final val amountPerIngot: Int = 100
|
|
protected var tank: FluidTank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME)
|
|
|
|
//Constructor
|
|
textureName = "material_metal_side"
|
|
normalRender = false
|
|
isOpaqueCube = false
|
|
|
|
override def getSizeInventory: Int = 1
|
|
|
|
override def canUpdate: Boolean =
|
|
{
|
|
return false
|
|
}
|
|
|
|
override def getDescPacket: PacketTile =
|
|
{
|
|
val nbt: NBTTagCompound = new NBTTagCompound
|
|
this.writeToNBT(nbt)
|
|
return new PacketTile(this, nbt)
|
|
}
|
|
|
|
override def writeToNBT(tag: NBTTagCompound)
|
|
{
|
|
super.writeToNBT(tag)
|
|
tank.readFromNBT(tag)
|
|
}
|
|
|
|
def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType)
|
|
{
|
|
try
|
|
{
|
|
this.readFromNBT(ByteBufUtils.readTag(data))
|
|
}
|
|
catch
|
|
{
|
|
case e: Exception =>
|
|
{
|
|
e.printStackTrace
|
|
}
|
|
}
|
|
}
|
|
|
|
override def readFromNBT(tag: NBTTagCompound)
|
|
{
|
|
super.readFromNBT(tag)
|
|
tank.writeToNBT(tag)
|
|
}
|
|
|
|
def fill(from: ForgeDirection, resource: FluidStack, doFill: Boolean): Int =
|
|
{
|
|
val fill: Int = tank.fill(resource, doFill)
|
|
updateEntity
|
|
return fill
|
|
}
|
|
|
|
def drain(from: ForgeDirection, resource: FluidStack, doDrain: Boolean): FluidStack =
|
|
{
|
|
return null
|
|
}
|
|
|
|
def drain(from: ForgeDirection, maxDrain: Int, doDrain: Boolean): FluidStack =
|
|
{
|
|
return null
|
|
}
|
|
|
|
def canFill(from: ForgeDirection, fluid: Fluid): Boolean =
|
|
{
|
|
return fluid != null && fluid.getName.contains("molten")
|
|
}
|
|
|
|
def canDrain(from: ForgeDirection, fluid: Fluid): Boolean =
|
|
{
|
|
return false
|
|
}
|
|
|
|
def getTankInfo(from: ForgeDirection): Array[FluidTankInfo] =
|
|
{
|
|
return Array[FluidTankInfo](tank.getInfo)
|
|
}
|
|
|
|
override def click(player: EntityPlayer)
|
|
{
|
|
if (!world.isRemote)
|
|
{
|
|
val output: ItemStack = getStackInSlot(0)
|
|
if (output != null)
|
|
{
|
|
InventoryUtility.dropItemStack(world, new Vector3(player), output, 0)
|
|
setInventorySlotContents(0, null)
|
|
}
|
|
onInventoryChanged
|
|
}
|
|
}
|
|
|
|
override def onInventoryChanged
|
|
{
|
|
if (worldObj != null)
|
|
{
|
|
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord)
|
|
}
|
|
}
|
|
|
|
override def use(player: EntityPlayer, hitSide: Int, hit: Vector3): Boolean =
|
|
{
|
|
update
|
|
val current: ItemStack = player.inventory.getCurrentItem
|
|
val output: ItemStack = getStackInSlot(0)
|
|
if (output != null)
|
|
{
|
|
InventoryUtility.dropItemStack(world, new Vector3(player), output, 0)
|
|
setInventorySlotContents(0, null)
|
|
}
|
|
return true
|
|
}
|
|
|
|
override def update
|
|
{
|
|
val checkPos: Vector3 = toVectorWorld.add(0, 1, 0)
|
|
val drainStack: FluidStack = FluidUtility.drainBlock(worldObj, checkPos, false)
|
|
if (MachineRecipes.instance.getOutput(RecipeType.SMELTER.name, drainStack).length > 0)
|
|
{
|
|
if (drainStack.amount == tank.fill(drainStack, false))
|
|
{
|
|
tank.fill(FluidUtility.drainBlock(worldObj, checkPos, true), true)
|
|
}
|
|
}
|
|
while (tank.getFluidAmount >= amountPerIngot && (getStackInSlot(0) == null || getStackInSlot(0).stackSize < getStackInSlot(0).getMaxStackSize))
|
|
{
|
|
val outputs: Array[RecipeResource] = MachineRecipes.instance.getOutput(RecipeType.SMELTER.name, tank.getFluid)
|
|
for (output <- outputs)
|
|
{
|
|
incrStackSize(0, output.getItemStack)
|
|
}
|
|
tank.drain(amountPerIngot, true)
|
|
}
|
|
}
|
|
}
|