mirror of
https://github.com/GTNewHorizons/ForgeMultipart.git
synced 2026-11-12 16:37:38 +00:00
170 lines
6.3 KiB
Scala
170 lines
6.3 KiB
Scala
package codechicken.microblock
|
|
|
|
import net.minecraft.item.Item
|
|
import net.minecraft.item.ItemStack
|
|
import net.minecraft.nbt.NBTTagCompound
|
|
import ItemMicroPart._
|
|
import net.minecraftforge.client.IItemRenderer
|
|
import net.minecraftforge.client.IItemRenderer.ItemRenderType
|
|
import net.minecraftforge.client.IItemRenderer.ItemRendererHelper
|
|
import org.lwjgl.opengl.GL11
|
|
import codechicken.microblock.MicroMaterialRegistry.IMicroMaterial
|
|
import net.minecraft.util.StatCollector
|
|
import java.util.List
|
|
import net.minecraft.creativetab.CreativeTabs
|
|
import codechicken.microblock.MicroblockClassRegistry._
|
|
import codechicken.lib.render.CCRenderState
|
|
import net.minecraft.client.renderer.texture.IconRegister
|
|
import codechicken.microblock.handler.MicroblockProxy
|
|
import net.minecraft.util.MovingObjectPosition
|
|
import net.minecraft.entity.player.EntityPlayer
|
|
import net.minecraft.world.World
|
|
import codechicken.lib.raytracer.RayTracer
|
|
import net.minecraft.util.EnumMovingObjectType
|
|
import codechicken.lib.vec.Vector3
|
|
import codechicken.lib.render.TextureUtils
|
|
|
|
class ItemMicroPart(id:Int) extends Item(id)
|
|
{
|
|
setHasSubtypes(true)
|
|
|
|
override def getItemDisplayName(stack:ItemStack):String =
|
|
{
|
|
val material = getMaterial(stack)
|
|
val mcrClass = MicroblockClassRegistry.getMicroClass(stack.getItemDamage)
|
|
val size = stack.getItemDamage&0xFF
|
|
if(material == null || mcrClass == null)
|
|
return "Unnamed"
|
|
|
|
return material.getLocalizedName+" "+mcrClass.getDisplayName(size)
|
|
}
|
|
|
|
override def getSubItems(id:Int, tab:CreativeTabs, list$:List[_])
|
|
{
|
|
val list = list$.asInstanceOf[List[ItemStack]]
|
|
for(classId <- 0 until classes.length)
|
|
{
|
|
val mcrClass = classes(classId)
|
|
if(mcrClass != null)
|
|
for(size <- Seq(1, 2, 4))
|
|
MicroMaterialRegistry.getIdMap.foreach(e => list.add(create(classId<<8|size, e._1)))
|
|
}
|
|
}
|
|
|
|
override def registerIcons(register:IconRegister){}
|
|
|
|
override def onItemUse(item:ItemStack, player:EntityPlayer, world:World, x:Int, y:Int, z:Int, s:Int, hitX:Float, hitY:Float, hitZ:Float):Boolean =
|
|
{
|
|
val material = getMaterialID(item)
|
|
val mcrClass = MicroblockClassRegistry.getMicroClass(item.getItemDamage)
|
|
val size = item.getItemDamage&0xFF
|
|
if(material < 0 || mcrClass == null)
|
|
return false
|
|
|
|
val hit = RayTracer.retraceBlock(world, player, x, y, z)
|
|
if(hit != null && hit.typeOfHit == EnumMovingObjectType.TILE)
|
|
{
|
|
val placement = MicroblockPlacement(world, player, hit, size, material, !player.capabilities.isCreativeMode, mcrClass.placementProperties)
|
|
if(placement == null)
|
|
return false
|
|
|
|
if(!world.isRemote)
|
|
{
|
|
placement.place(world, player, item)
|
|
if(!player.capabilities.isCreativeMode)
|
|
placement.consume(world, player, item)
|
|
|
|
val sound = MicroMaterialRegistry.getMaterial(material).getSound
|
|
if(sound != null)
|
|
world.playSoundEffect(placement.pos.x + 0.5D, placement.pos.y + 0.5D, placement.pos.z + 0.5D, sound.getPlaceSound, (sound.getVolume + 1.0F) / 2.0F, sound.getPitch * 0.8F)
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
}
|
|
|
|
object ItemMicroPart
|
|
{
|
|
def checkTagCompound(stack:ItemStack)
|
|
{
|
|
if(!stack.hasTagCompound())
|
|
stack.setTagCompound(new NBTTagCompound("tag"))
|
|
}
|
|
|
|
def create(damage:Int, material:Int):ItemStack = create(damage, MicroMaterialRegistry.materialName(material))
|
|
|
|
def create(damage:Int, material:String):ItemStack = create(1, damage, material)
|
|
|
|
def create(amount:Int, damage:Int, material:String):ItemStack =
|
|
{
|
|
val stack = new ItemStack(MicroblockProxy.itemMicro, amount, damage)
|
|
checkTagCompound(stack)
|
|
stack.getTagCompound().setString("mat", material)
|
|
return stack
|
|
}
|
|
|
|
def getMaterial(stack:ItemStack):IMicroMaterial =
|
|
{
|
|
checkTagCompound(stack)
|
|
if(!stack.getTagCompound().hasKey("mat"))
|
|
return null;
|
|
|
|
return MicroMaterialRegistry.getMaterial(stack.getTagCompound().getString("mat"))
|
|
}
|
|
|
|
def getMaterialID(stack:ItemStack):Int =
|
|
{
|
|
checkTagCompound(stack)
|
|
if(!stack.getTagCompound().hasKey("mat"))
|
|
return -1;
|
|
|
|
return MicroMaterialRegistry.materialID(stack.getTagCompound().getString("mat"))
|
|
}
|
|
}
|
|
|
|
object ItemMicroPartRenderer extends IItemRenderer
|
|
{
|
|
def handleRenderType(item:ItemStack, t:ItemRenderType) = true
|
|
|
|
def shouldUseRenderHelper(t:ItemRenderType, item:ItemStack, helper:ItemRendererHelper) = true
|
|
|
|
def renderItem(t:ItemRenderType, item:ItemStack, data:Object*)
|
|
{
|
|
val material = getMaterial(item)
|
|
val mcrClass = MicroblockClassRegistry.getMicroClass(item.getItemDamage)
|
|
val size = item.getItemDamage&0xFF
|
|
if(material == null || mcrClass == null)
|
|
return
|
|
|
|
GL11.glPushMatrix()
|
|
if(t == ItemRenderType.ENTITY)
|
|
GL11.glScaled(0.5, 0.5, 0.5)
|
|
if(t == ItemRenderType.INVENTORY || t == ItemRenderType.ENTITY)
|
|
GL11.glTranslatef(-0.5F, -0.5F, -0.5F)
|
|
|
|
CCRenderState.reset()
|
|
TextureUtils.bindAtlas(0);
|
|
CCRenderState.useNormals(true)
|
|
CCRenderState.useModelColours(true)
|
|
CCRenderState.pullLightmap()
|
|
CCRenderState.startDrawing(7)
|
|
val part = mcrClass.create(size, mcrClass.itemSlot, 0, true).asInstanceOf[MicroblockClient]
|
|
part.render(new Vector3(0.5, 0.5, 0.5).subtract(part.getBounds.center), null, material, part.getBounds, 0)
|
|
CCRenderState.draw()
|
|
GL11.glPopMatrix()
|
|
}
|
|
|
|
def renderHighlight(world:World, player:EntityPlayer, stack:ItemStack, hit:MovingObjectPosition):Boolean =
|
|
{
|
|
val material = getMaterialID(stack)
|
|
val mcrClass = MicroblockClassRegistry.getMicroClass(stack.getItemDamage)
|
|
val size = stack.getItemDamage&0xFF
|
|
if(material < 0 || mcrClass == null)
|
|
return false
|
|
|
|
return MicroMaterialRegistry.renderHighlight(world, player, hit, mcrClass, size, material)
|
|
}
|
|
} |