175 lines
5.9 KiB
Scala
175 lines
5.9 KiB
Scala
package edx.basic.process.grinding
|
|
|
|
import edx.core.{Electrodynamics, Reference}
|
|
import io.netty.buffer.ByteBuf
|
|
import net.minecraft.block.Block
|
|
import net.minecraft.block.material.Material
|
|
import net.minecraft.entity.player.EntityPlayer
|
|
import net.minecraft.init.Blocks
|
|
import net.minecraft.item.{Item, ItemBlock, ItemStack}
|
|
import net.minecraft.util.ResourceLocation
|
|
import net.minecraftforge.client.model.AdvancedModelLoader
|
|
import net.minecraftforge.oredict.OreDictionary
|
|
import org.lwjgl.opengl.GL11
|
|
import resonantengine.api.edx.recipe.{MachineRecipes, RecipeType}
|
|
import resonantengine.lib.content.prefab.TInventory
|
|
import resonantengine.lib.network.discriminator.PacketType
|
|
import resonantengine.prefab.network.{TPacketReceiver, TPacketSender}
|
|
import resonantengine.lib.prefab.tile.spatial.ResonantTile
|
|
import resonantengine.lib.render.{RenderItemOverlayUtility, RenderUtility}
|
|
import resonantengine.lib.transform.vector.Vector3
|
|
import resonantengine.lib.utility.inventory.InventoryUtility
|
|
import resonantengine.lib.wrapper.ByteBufWrapper._
|
|
|
|
/**
|
|
* The workbench is meant for manual ore and wood processing.
|
|
* It is also the core block in Resonant Induction that leads the player to all aspect of the mod.
|
|
*
|
|
* There are two states: 0 - wooden, 1 - stone
|
|
*
|
|
* Functions:
|
|
* Crush ores -> rubble
|
|
* Grind rubble -> dust
|
|
*
|
|
* Cut logs -> slabs
|
|
* Glue slabs -> wood
|
|
*
|
|
* @author Calclavia
|
|
*/
|
|
object TileWorkbench
|
|
{
|
|
val model = Array(AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "workbench_0.obj")), AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "workbench_1.obj")))
|
|
}
|
|
|
|
class TileWorkbench extends ResonantTile(Material.wood) with TInventory with TPacketSender with TPacketReceiver
|
|
{
|
|
//Constructor
|
|
setTextureName("material_wood_surface")
|
|
normalRender = false
|
|
isOpaqueCube = false
|
|
|
|
override def getSizeInventory = 1
|
|
|
|
override def use(player: EntityPlayer, hitSide: Int, hit: Vector3): Boolean =
|
|
{
|
|
if (player.getCurrentEquippedItem != null)
|
|
{
|
|
if (metadata == 1)
|
|
{
|
|
//The player is holding a hammer. Attempt to crush the item on the bench
|
|
if (player.getCurrentEquippedItem.getItem.isInstanceOf[ItemHammer])
|
|
{
|
|
val inputStack = getStackInSlot(0)
|
|
|
|
if (inputStack != null)
|
|
{
|
|
val oreName = OreDictionary.getOreName(OreDictionary.getOreID(inputStack))
|
|
|
|
if (oreName != null && oreName != "Unknown")
|
|
{
|
|
if (!world.isRemote)
|
|
{
|
|
//Try output resource
|
|
def tryOutput(name: String, probability: Float): Boolean =
|
|
{
|
|
val outputs = MachineRecipes.instance.getOutput(name, oreName)
|
|
|
|
if (outputs.length > 0 && world.rand.nextFloat < probability)
|
|
{
|
|
outputs.map(_.getItemStack.copy()).foreach(s => InventoryUtility.dropItemStack(world, new Vector3(player), s, 0))
|
|
inputStack.stackSize -= 1
|
|
setInventorySlotContents(0, if (inputStack.stackSize <= 0) null else inputStack)
|
|
world.spawnParticle("crit", x + 0.5, y + 0.5, z + 0.5, 0, 0, 0)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
tryOutput(RecipeType.GRINDER.name, 0.1f)
|
|
}
|
|
|
|
Electrodynamics.proxy.renderBlockParticle(world, new Vector3(x + 0.5, y + 0.5, z + 0.5), new Vector3((Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3, (Math.random - 0.5f) * 3), Item.getIdFromItem(inputStack.getItem), 1)
|
|
world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, Reference.prefix + "hammer", 0.5f, 0.8f + (0.2f * world.rand.nextFloat))
|
|
player.addExhaustion(0.1f)
|
|
player.getCurrentEquippedItem.damageItem(1, player)
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (player.getCurrentEquippedItem.getItem.isInstanceOf[ItemBlock])
|
|
{
|
|
if (player.getCurrentEquippedItem.getItem.asInstanceOf[ItemBlock].field_150939_a == Blocks.stone)
|
|
{
|
|
setMeta(1)
|
|
player.getCurrentEquippedItem.stackSize -= 1
|
|
if (player.getCurrentEquippedItem.stackSize <= 0)
|
|
player.inventory.setInventorySlotContents(player.inventory.currentItem, null)
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Try putting the current item in.
|
|
interactCurrentItem(this, 0, player)
|
|
onInventoryChanged()
|
|
return true
|
|
}
|
|
|
|
/** Called each time the inventory changes */
|
|
override def onInventoryChanged()
|
|
{
|
|
super.onInventoryChanged()
|
|
|
|
if (!world.isRemote)
|
|
sendDescPacket()
|
|
}
|
|
|
|
override def onRemove(block: Block, metadata: Int)
|
|
{
|
|
if (metadata == 1)
|
|
InventoryUtility.dropItemStack(world, center, new ItemStack(Blocks.stone))
|
|
|
|
super.onRemove(block, metadata)
|
|
}
|
|
|
|
override def isItemValidForSlot(i: Int, itemStack: ItemStack): Boolean =
|
|
{
|
|
return true
|
|
}
|
|
|
|
override def read(buf: ByteBuf, id: Int, packetType: PacketType)
|
|
{
|
|
super.read(buf, id, packetType)
|
|
buf >>> getInventory
|
|
}
|
|
|
|
override def write(buf: ByteBuf, id: Int)
|
|
{
|
|
super.write(buf, id)
|
|
buf <<< getInventory
|
|
}
|
|
|
|
/**
|
|
* Packets
|
|
*/
|
|
override def renderDynamic(pos: Vector3, frame: Float, pass: Int)
|
|
{
|
|
GL11.glPushMatrix()
|
|
if (getStackInSlot(0) != null)
|
|
RenderItemOverlayUtility.renderTopOverlay(this, Array[ItemStack](getStackInSlot(0)), null, 1, 1, pos.x, pos.y - (if (metadata == 1) 0.2 else 0.5), pos.z, if (getStackInSlot(0).getItem.isInstanceOf[ItemBlock]) 1.8f else 1f)
|
|
GL11.glPopMatrix()
|
|
GL11.glPushMatrix()
|
|
GL11.glColor4f(1, 1, 1, 1)
|
|
GL11.glTranslated(pos.x, pos.y, pos.z)
|
|
RenderUtility.bind(Reference.domain, Reference.modelPath + "workbench_" + metadata + ".png")
|
|
TileWorkbench.model(metadata).renderAll()
|
|
GL11.glPopMatrix()
|
|
|
|
}
|
|
}
|