173 lines
4.4 KiB
Scala
173 lines
4.4 KiB
Scala
package edx.mechanical.machine.edit
|
|
|
|
import java.util.ArrayList
|
|
|
|
import cpw.mods.fml.common.network.ByteBufUtils
|
|
import cpw.mods.fml.relauncher.{Side, SideOnly}
|
|
import edx.core.Electrodynamics
|
|
import io.netty.buffer.ByteBuf
|
|
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.IIcon
|
|
import net.minecraft.world.IBlockAccess
|
|
import net.minecraftforge.common.util.ForgeDirection
|
|
import resonantengine.api.network.IPacketReceiver
|
|
import resonantengine.core.network.discriminator.{PacketTile, PacketType}
|
|
import resonantengine.lib.modcontent.block.ResonantTile
|
|
import resonantengine.lib.transform.vector.{Vector3, VectorWorld}
|
|
import resonantengine.lib.utility.inventory.InternalInventoryHandler
|
|
import resonantengine.prefab.block.impl.TRotatable
|
|
|
|
/**
|
|
* @author tgame14
|
|
* @since 18/03/14
|
|
*/
|
|
object TileBreaker
|
|
{
|
|
@SideOnly(Side.CLIENT) private var iconFront: IIcon = null
|
|
@SideOnly(Side.CLIENT) private var iconBack: IIcon = null
|
|
}
|
|
|
|
class TileBreaker extends ResonantTile(Material.iron) with TRotatable with IPacketReceiver
|
|
{
|
|
private var _doWork: Boolean = false
|
|
private var invHandler: InternalInventoryHandler = null
|
|
private var place_delay: Int = 0
|
|
|
|
override def onAdded
|
|
{
|
|
work
|
|
}
|
|
|
|
def work
|
|
{
|
|
if (isIndirectlyPowered)
|
|
{
|
|
_doWork = true
|
|
place_delay = 0
|
|
}
|
|
}
|
|
|
|
override def onNeighborChanged(block: Block)
|
|
{
|
|
work
|
|
}
|
|
|
|
override def update
|
|
{
|
|
if (_doWork)
|
|
{
|
|
if (place_delay < java.lang.Byte.MAX_VALUE)
|
|
{
|
|
place_delay += 1
|
|
}
|
|
if (place_delay >= 10)
|
|
{
|
|
_doWork = false
|
|
place_delay = 0
|
|
}
|
|
}
|
|
}
|
|
|
|
def doWork
|
|
{
|
|
if (isIndirectlyPowered)
|
|
{
|
|
val dir: ForgeDirection = getDirection
|
|
val check: Vector3 = toVectorWorld.add(dir)
|
|
val put: VectorWorld = toVectorWorld.add(dir.getOpposite)
|
|
val block: Block = check.getBlock(world)
|
|
if (block != null)
|
|
{
|
|
val candidateMeta: Int = world.getBlockMetadata(check.xi, check.yi, check.zi)
|
|
val flag: Boolean = true
|
|
val drops: ArrayList[ItemStack] = block.getDrops(getWorldObj, check.xi, check.yi, check.zi, candidateMeta, 0)
|
|
import scala.collection.JavaConversions._
|
|
for (stack <- drops)
|
|
{
|
|
var insert: ItemStack = stack.copy
|
|
insert = getInvHandler.storeItem(insert, this.getDirection.getOpposite)
|
|
if (insert != null)
|
|
{
|
|
getInvHandler.throwItem(this.getDirection.getOpposite, insert)
|
|
}
|
|
}
|
|
Electrodynamics.proxy.renderBlockParticle(worldObj, check.xi, check.yi, check.zi, new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Block.getIdFromBlock(block), 1)
|
|
getWorldObj.setBlockToAir(check.xi, check.yi, check.zi)
|
|
getWorldObj.playAuxSFX(1012, check.xi, check.yi, check.zi, 0)
|
|
}
|
|
}
|
|
}
|
|
|
|
def getInvHandler: InternalInventoryHandler =
|
|
{
|
|
if (invHandler == null)
|
|
{
|
|
invHandler = new InternalInventoryHandler(this)
|
|
}
|
|
return invHandler
|
|
}
|
|
|
|
override def getDescPacket: PacketTile =
|
|
{
|
|
val nbt: NBTTagCompound = new NBTTagCompound
|
|
writeToNBT(nbt)
|
|
return new PacketTile(this, nbt)
|
|
}
|
|
|
|
@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 TileBreaker.iconFront
|
|
}
|
|
else if (side == (meta ^ 1))
|
|
{
|
|
return TileBreaker.iconBack
|
|
}
|
|
return getIcon
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
override def getIcon(side: Int, meta: Int): IIcon =
|
|
{
|
|
if (side == (meta ^ 1))
|
|
{
|
|
return TileBreaker.iconFront
|
|
}
|
|
else if (side == meta)
|
|
{
|
|
return TileBreaker.iconBack
|
|
}
|
|
return getIcon
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
override def registerIcons(iconRegister: IIconRegister)
|
|
{
|
|
super.registerIcons(iconRegister)
|
|
TileBreaker.iconFront = iconRegister.registerIcon(getTextureName + "_front")
|
|
TileBreaker.iconBack = iconRegister.registerIcon(getTextureName + "_back")
|
|
}
|
|
|
|
def read(data: ByteBuf, player: EntityPlayer, `type`: PacketType)
|
|
{
|
|
try
|
|
{
|
|
readFromNBT(ByteBufUtils.readTag(data))
|
|
}
|
|
catch
|
|
{
|
|
case e: Exception =>
|
|
{
|
|
e.printStackTrace
|
|
}
|
|
}
|
|
}
|
|
}
|