222 lines
5.5 KiB
Scala
222 lines
5.5 KiB
Scala
package edx.mechanical.machine.edit
|
|
|
|
import java.util.EnumSet
|
|
|
|
import cpw.mods.fml.relauncher.{Side, SideOnly}
|
|
import net.minecraft.block.Block
|
|
import net.minecraft.block.material.Material
|
|
import net.minecraft.client.renderer.texture.IIconRegister
|
|
import net.minecraft.entity.player.EntityPlayer
|
|
import net.minecraft.item.ItemStack
|
|
import net.minecraft.nbt.NBTTagCompound
|
|
import net.minecraft.util.{ChatComponentText, IIcon}
|
|
import net.minecraft.world.IBlockAccess
|
|
import net.minecraftforge.common.util.ForgeDirection
|
|
import org.lwjgl.opengl.GL11
|
|
import resonantengine.core.network.discriminator.PacketTile
|
|
import resonantengine.lib.content.prefab.TInventory
|
|
import resonantengine.lib.modcontent.block.ResonantTile
|
|
import resonantengine.lib.render.RenderItemOverlayUtility
|
|
import resonantengine.lib.transform.vector.Vector3
|
|
import resonantengine.lib.utility.LanguageUtility
|
|
import resonantengine.lib.utility.inventory.{InternalInventoryHandler, InventoryUtility}
|
|
import resonantengine.prefab.block.impl.TRotatable
|
|
import resonantengine.prefab.network.TPacketSender
|
|
|
|
/**
|
|
* @author tgame14
|
|
* @since 18/03/14
|
|
*/
|
|
object TilePlacer
|
|
{
|
|
@SideOnly(Side.CLIENT) private var iconFront: IIcon = null
|
|
@SideOnly(Side.CLIENT) private var iconBack: IIcon = null
|
|
}
|
|
|
|
class TilePlacer extends ResonantTile(Material.rock) with TInventory with TRotatable with TPacketSender
|
|
{
|
|
private var _doWork: Boolean = false
|
|
private var autoPullItems: Boolean = false
|
|
private var placeDelay: Int = 0
|
|
private var invHandler: InternalInventoryHandler = null
|
|
|
|
//Constructor
|
|
normalRender = false
|
|
forceItemToRenderAsBlock = true
|
|
renderStaticBlock = true
|
|
this.rotationMask = 63
|
|
|
|
override def getSizeInventory = 1
|
|
|
|
override def onAdded
|
|
{
|
|
work
|
|
}
|
|
|
|
def work
|
|
{
|
|
if (isIndirectlyPowered)
|
|
{
|
|
_doWork = true
|
|
placeDelay = 0
|
|
}
|
|
}
|
|
|
|
override def onNeighborChanged(block: Block)
|
|
{
|
|
work
|
|
}
|
|
|
|
override def start
|
|
{
|
|
super.start
|
|
}
|
|
|
|
override def update
|
|
{
|
|
super.update
|
|
if (autoPullItems && this.ticks % 5 == 0)
|
|
{
|
|
if (getStackInSlot(0) == null)
|
|
{
|
|
this.setInventorySlotContents(0, this.getInvHandler.tryGrabFromPosition(this.getDirection.getOpposite, 1))
|
|
}
|
|
}
|
|
if (_doWork)
|
|
{
|
|
if (placeDelay < java.lang.Byte.MAX_VALUE)
|
|
{
|
|
placeDelay += 1
|
|
}
|
|
if (placeDelay >= 5)
|
|
{
|
|
doWork
|
|
_doWork = false
|
|
}
|
|
}
|
|
}
|
|
|
|
def getInvHandler: InternalInventoryHandler =
|
|
{
|
|
if (invHandler == null)
|
|
{
|
|
invHandler = new InternalInventoryHandler(this)
|
|
}
|
|
return invHandler
|
|
}
|
|
|
|
def doWork
|
|
{
|
|
val side: Int = 0
|
|
val placePos: Vector3 = toVectorWorld.add(getDirection)
|
|
val placeStack: ItemStack = getStackInSlot(0)
|
|
if (InventoryUtility.placeItemBlock(world, placePos.xi, placePos.yi, placePos.zi, placeStack, side))
|
|
{
|
|
if (placeStack.stackSize <= 0)
|
|
{
|
|
setInventorySlotContents(0, null)
|
|
}
|
|
markUpdate
|
|
_doWork = false
|
|
}
|
|
}
|
|
|
|
override def use(player: EntityPlayer, hitSide: Int, hit: Vector3): Boolean =
|
|
{
|
|
interactCurrentItem(this, 0, player)
|
|
return true
|
|
}
|
|
|
|
override def configure(player: EntityPlayer, side: Int, hit: Vector3): Boolean =
|
|
{
|
|
if (player.isSneaking)
|
|
{
|
|
this.autoPullItems = !this.autoPullItems
|
|
player.addChatComponentMessage(new ChatComponentText("AutoExtract: " + this.autoPullItems))
|
|
return true
|
|
}
|
|
return super.configure(player, side, hit)
|
|
}
|
|
|
|
override def getDescPacket: PacketTile =
|
|
{
|
|
val nbt: NBTTagCompound = new NBTTagCompound
|
|
writeToNBT(nbt)
|
|
return new PacketTile(this, nbt)
|
|
}
|
|
|
|
/**
|
|
* Writes a tile entity to NBT.
|
|
*/
|
|
override def writeToNBT(nbt: NBTTagCompound)
|
|
{
|
|
super.writeToNBT(nbt)
|
|
nbt.setBoolean("autoPull", this.autoPullItems)
|
|
}
|
|
|
|
override def onInventoryChanged
|
|
{
|
|
sendDescPacket()
|
|
}
|
|
|
|
override def readFromNBT(nbt: NBTTagCompound)
|
|
{
|
|
super.readFromNBT(nbt)
|
|
this.autoPullItems = nbt.getBoolean("autoPull")
|
|
}
|
|
|
|
override def canStore(stack: ItemStack, slot: Int, side: ForgeDirection): Boolean =
|
|
{
|
|
return side == this.getDirection.getOpposite && slot == 0
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT) override def getIcon(access: IBlockAccess, side: Int): IIcon =
|
|
{
|
|
val meta: Int = access.getBlockMetadata(x.toInt, y.toInt, z.toInt)
|
|
if (side == meta)
|
|
{
|
|
return TilePlacer.iconFront
|
|
}
|
|
else if (side == (meta ^ 1))
|
|
{
|
|
return TilePlacer.iconBack
|
|
}
|
|
return getIcon
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT) override def getIcon(side: Int, meta: Int): IIcon =
|
|
{
|
|
if (side == (meta ^ 1))
|
|
{
|
|
return TilePlacer.iconFront
|
|
}
|
|
else if (side == meta)
|
|
{
|
|
return TilePlacer.iconBack
|
|
}
|
|
return getIcon
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT) override def registerIcons(iconRegister: IIconRegister)
|
|
{
|
|
super.registerIcons(iconRegister)
|
|
TilePlacer.iconFront = iconRegister.registerIcon(getTextureName + "_front")
|
|
TilePlacer.iconBack = iconRegister.registerIcon(getTextureName + "_back")
|
|
}
|
|
|
|
override def renderDynamic(position: Vector3, frame: Float, pass: Int)
|
|
{
|
|
if (world != null)
|
|
{
|
|
val set: EnumSet[ForgeDirection] = EnumSet.allOf(classOf[ForgeDirection])
|
|
set.remove(getDirection)
|
|
set.remove(getDirection.getOpposite)
|
|
set.remove(ForgeDirection.UP)
|
|
set.remove(ForgeDirection.DOWN)
|
|
GL11.glPushMatrix
|
|
RenderItemOverlayUtility.renderItemOnSides(this, getStackInSlot(0), position.x, position.y, position.z, LanguageUtility.getLocal("tooltip.noOutput"), set)
|
|
GL11.glPopMatrix
|
|
}
|
|
}
|
|
}
|