electrodynamics/src/main/scala/edx/quantum/machine/extractor/TileProcess.scala
2015-01-26 20:17:04 +08:00

98 lines
3.2 KiB
Scala

package edx.quantum.machine.extractor
import net.minecraft.block.material.Material
import net.minecraft.item.ItemStack
import net.minecraftforge.fluids.{FluidContainerRegistry, FluidStack, FluidTank}
import resonantengine.api.edx.recipe.{MachineRecipes, RecipeResource}
import resonantengine.lib.content.prefab.TInventory
import resonantengine.lib.grid.core.TBlockNodeProvider
import resonantengine.lib.prefab.tile.spatial.ResonantTile
/**
* General class for all machines that do traditional recipe processing
*
* @author Calclavia
*/
abstract class TileProcess(material: Material) extends ResonantTile(material) with TInventory with TBlockNodeProvider
{
protected var inputSlot: Int = 0
protected var outputSlot: Int = 0
protected var tankInputFillSlot: Int = 0
protected var tankInputDrainSlot: Int = 0
protected var tankOutputFillSlot: Int = 0
protected var tankOutputDrainSlot: Int = 0
protected var machineName: String = null
override def update
{
super.update
if (getInputTank != null)
{
fillOrDrainTank(tankInputFillSlot, tankInputDrainSlot, getInputTank)
}
if (getOutputTank != null)
{
fillOrDrainTank(tankOutputFillSlot, tankOutputDrainSlot, getOutputTank)
}
}
/**
* Takes an fluid container item and try to fill the tank, dropping the remains in the output slot.
*/
def fillOrDrainTank(containerInput: Int, containerOutput: Int, tank: FluidTank)
{
val inputStack: ItemStack = getStackInSlot(containerInput)
val outputStack: ItemStack = getStackInSlot(containerOutput)
if (FluidContainerRegistry.isFilledContainer(inputStack))
{
val fluidStack: FluidStack = FluidContainerRegistry.getFluidForFilledItem(inputStack)
val result: ItemStack = inputStack.getItem.getContainerItem(inputStack)
if (result != null && tank.fill(fluidStack, false) >= fluidStack.amount && (outputStack == null || result.isItemEqual(outputStack)))
{
tank.fill(fluidStack, true)
decrStackSize(containerInput, 1)
incrStackSize(containerOutput, result)
}
}
else if (FluidContainerRegistry.isEmptyContainer(inputStack))
{
val avaliable: FluidStack = tank.getFluid
if (avaliable != null)
{
val result: ItemStack = FluidContainerRegistry.fillFluidContainer(avaliable, inputStack)
val filled: FluidStack = FluidContainerRegistry.getFluidForFilledItem(result)
if (result != null && filled != null && (outputStack == null || result.isItemEqual(outputStack)))
{
decrStackSize(containerInput, 1)
incrStackSize(containerOutput, result)
tank.drain(filled.amount, true)
}
}
}
}
/**
* Gets the current result of the input set up.
*
* @return
*/
def getResults: Array[RecipeResource] =
{
val inputStack: ItemStack = getStackInSlot(inputSlot)
val mixedResult: Array[RecipeResource] = MachineRecipes.instance.getOutput(machineName, inputStack, getInputTank.getFluid)
if (mixedResult.length > 0)
{
return mixedResult
}
return MachineRecipes.instance.getOutput(machineName, inputStack)
}
def hasResult: Boolean =
{
return getResults.length > 0
}
def getInputTank: FluidTank
def getOutputTank: FluidTank
}