electrodynamics/src/main/scala/edx/basic/blocks/TileFilterable.scala
2015-01-26 19:40:54 +08:00

149 lines
3.7 KiB
Scala

package edx.basic.blocks
import net.minecraft.block.material.Material
import net.minecraft.entity.item.EntityItem
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraftforge.common.util.ForgeDirection
import resonantengine.api.tile.{IFilterable, IRotatable}
import resonantengine.lib.prefab.tile.mixed.TileInventory
import resonantengine.lib.transform.vector.Vector3
object TileFilterable
{
final val FILTER_SLOT: Int = 0
final val BATERY_DRAIN_SLOT: Int = 1
}
abstract class TileFilterable extends TileInventory(Material.wood) with IRotatable with IFilterable
{
private var filterItem: ItemStack = null
private var inverted: Boolean = false
override def getSizeInventory: Int = 2
/**
* Allows filters to be placed inside of this block.
*/
override def use(player: EntityPlayer, side: Int, hit: Vector3): Boolean =
{
val containingStack: ItemStack = getFilter
if (containingStack != null)
{
if (!world.isRemote)
{
val dropStack: EntityItem = new EntityItem(world, player.posX, player.posY, player.posZ, containingStack)
dropStack.delayBeforeCanPickup = 0
world.spawnEntityInWorld(dropStack)
}
setFilter(null)
return true
}
else
{
if (player.getCurrentEquippedItem != null)
{
if (player.getCurrentEquippedItem.getItem.isInstanceOf[ItemImprint])
{
setFilter(player.getCurrentEquippedItem)
player.inventory.setInventorySlotContents(player.inventory.currentItem, null)
return true
}
}
}
return false
}
def setFilter(filter: ItemStack)
{
this.filterItem = filter
this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord)
}
def getFilter: ItemStack =
{
return this.filterItem
}
override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean =
{
toggleInversion
markUpdate
markRender
return true
}
def toggleInversion
{
setInverted(!isInverted)
}
def isInverted: Boolean =
{
return this.inverted
}
def setInverted(inverted: Boolean)
{
this.inverted = inverted
this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord)
}
/**
* Looks through the things in the filter and finds out which item is being filtered.
*
* @return Is this filterable block filtering this specific ItemStack?
*/
def isFiltering(itemStack: ItemStack): Boolean =
{
if (this.getFilter != null && itemStack != null)
{
val checkStacks: java.util.List[ItemStack] = ItemImprint.getFilters(getFilter)
if (checkStacks != null)
{
import scala.collection.JavaConversions._
for (stack <- checkStacks)
{
if (stack.isItemEqual(itemStack))
{
return !inverted
}
}
}
}
return inverted
}
override def getDirection: ForgeDirection =
{
return ForgeDirection.getOrientation(if (getBlockType != null) getBlockMetadata else 0)
}
override def setDirection(facingDirection: ForgeDirection)
{
this.worldObj.setBlockMetadataWithNotify(this.xCoord, this.yCoord, this.zCoord, facingDirection.ordinal, 3)
}
override def writeToNBT(nbt: NBTTagCompound)
{
super.writeToNBT(nbt)
nbt.setBoolean("inverted", inverted)
}
override def readFromNBT(nbt: NBTTagCompound)
{
super.readFromNBT(nbt)
if (nbt.hasKey("filter"))
{
this.getInventory.setInventorySlotContents(0, ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("filter")))
}
inverted = nbt.getBoolean("inverted")
}
protected def isFunctioning: Boolean =
{
return true
}
}