So I made a custom tile entity renderer and I don't know what I did wrong. Can you please analyze my code and tell me what is wrong? Also, if it is not already obvious, please put the code that is correct?
Main Class:
package KitchenCraft.MainClass;
import KitchenCraft.MainClass.CounterProperties.CounterGuiHandler;
import KitchenCraft.MainClass.CounterProperties.CounterTileEnity;
import net.minecraft.block.Block;
import net.minecraft.block.BlockBreakable;
import net.minecraft.block.BlockFurnace;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.entity.RenderSnowball;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.src.ModLoader;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.Configuration;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;
@Mod(modid="GummyBah", name="GummyBear", version="1.0.0")
@NetworkMod(clientSideRequired=true, serverSideRequired=false)
public class Main {
public static CreativeTabs tabBlasters = new CreativeTabs("tabBlasters") {
public ItemStack getIconItemStack() {
return new ItemStack(Item.diamond, 1, 0);
}
};
// The instance of your mod that Forge uses.
@Instance("GummyBah")
public static Main instance;
// Says where the client and server 'proxy' code is loaded.
@SidedProxy(clientSide="KitchenCraft.MainClass.client.ClientProxy", serverSide="KitchenCraft.MainClass.CommonProxy")
public static CommonProxy proxy;
public Block Counter = new Counter(1408, Material.wood).setUnlocalizedName("KitchenCounterCraftBlock");
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
Configuration config = new Configuration(event.getSuggestedConfigurationFile());
config.load();
config.save();
}
@EventHandler
public void Init(FMLInitializationEvent event) {
proxy.registerRenderers();
NetworkRegistry.instance().registerGuiHandler(this, new CounterGuiHandler());
GameRegistry.registerBlock(Counter, "Counter");
LanguageRegistry.addName(Counter, "Counter");
GameRegistry.registerTileEntity(KitchenCraft.MainClass.CounterProperties.CounterTileEnity.class, "KitchenCounterCraft");
LanguageRegistry.instance().addStringLocalization("carmel", "en_US", "Carmalizer");
LanguageRegistry.instance().addStringLocalization("tabBlasters", "en_US", "Gummy Mod");
proxy.registerRenderers();
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) {
// Stub Method
}
}
Block Class:
package KitchenCraft.MainClass;
import java.util.Random;
import KitchenCraft.MainClass.CounterProperties.CounterTileEnity;
import cpw.mods.fml.common.Mod.Instance;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
public class Counter extends BlockContainer {
protected Counter (int id, Material wood) {
super(2048, Material.wood);
setHardness(2.0F);
setResistance(5.0F);
setCreativeTab(CreativeTabs.tabDecorations);
}
@Override
public boolean onBlockActivated(World world, int x, int y, int z,
EntityPlayer player, int metadata, float what, float these, float are) {
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if (tileEntity == null || player.isSneaking()) {
return false;
}
//code to open gui explained later
player.openGui(Main.instance, 0, world, x, y, z);
return true;
}
@Override
public void breakBlock(World world, int x, int y, int z, int par5, int par6) {
dropItems(world, x, y, z);
super.breakBlock(world, x, y, z, par5, par6);
}
private void dropItems(World world, int x, int y, int z){
Random rand = new Random();
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if (!(tileEntity instanceof IInventory)) {
return;
}
IInventory inventory = (IInventory) tileEntity;
for (int i = 0; i < inventory.getSizeInventory(); i++) {
ItemStack item = inventory.getStackInSlot(i);
if (item != null && item.stackSize > 0) {
float rx = rand.nextFloat() * 0.8F + 0.1F;
float ry = rand.nextFloat() * 0.8F + 0.1F;
float rz = rand.nextFloat() * 0.8F + 0.1F;
EntityItem entityItem = new EntityItem(world,
x + rx, y + ry, z + rz,
new ItemStack(item.itemID, item.stackSize, item.getItemDamage()));
if (item.hasTagCompound()) {
entityItem.getEntityItem().setTagCompound((NBTTagCompound) item.getTagCompound().copy());
}
float factor = 0.05F;
entityItem.motionX = rand.nextGaussian() * factor;
entityItem.motionY = rand.nextGaussian() * factor + 0.2F;
entityItem.motionZ = rand.nextGaussian() * factor;
world.spawnEntityInWorld(entityItem);
item.stackSize = 0;
}
}
}
@Override
public TileEntity createNewTileEntity(World world) {
return new CounterTileEnity();
}
@Override
public int getRenderType() {
return -1;
}
//It's not an opaque cube, so you need this.
@Override
public boolean isOpaqueCube() {
return false;
}
//It's not a normal block, so you need this too.
public boolean renderAsNormalBlock() {
return false;
}
}
Tile Entity Class:
package KitchenCraft.MainClass.CounterProperties;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
public class CounterTileEnity extends TileEntity implements IInventory {
private ItemStack[] inv;
public CounterTileEnity(){
inv = new ItemStack[9];
}
@Override
public int getSizeInventory() {
return inv.length;
}
@Override
public ItemStack getStackInSlot(int slot) {
return inv[slot];
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
inv[slot] = stack;
if (stack != null && stack.stackSize > getInventoryStackLimit()) {
stack.stackSize = getInventoryStackLimit();
}
}
@Override
public ItemStack decrStackSize(int slot, int amt) {
ItemStack stack = getStackInSlot(slot);
if (stack != null) {
if (stack.stackSize <= amt) {
setInventorySlotContents(slot, null);
} else {
stack = stack.splitStack(amt);
if (stack.stackSize == 0) {
setInventorySlotContents(slot, null);
}
}
}
return stack;
}
@Override
public ItemStack getStackInSlotOnClosing(int slot) {
ItemStack stack = getStackInSlot(slot);
if (stack != null) {
setInventorySlotContents(slot, null);
}
return stack;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return worldObj.getBlockTileEntity(xCoord, yCoord, zCoord) == this &&
player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64;
}
@Override
public void openChest() {}
@Override
public void closeChest() {}
@Override
public void readFromNBT(NBTTagCompound tagCompound) {
super.readFromNBT(tagCompound);
NBTTagList tagList = tagCompound.getTagList("Inventory");
for (int i = 0; i < tagList.tagCount(); i++) {
NBTTagCompound tag = (NBTTagCompound) tagList.tagAt(i);
byte slot = tag.getByte("Slot");
if (slot >= 0 && slot < inv.length) {
inv[slot] = ItemStack.loadItemStackFromNBT(tag);
}
}
}
@Override
public void writeToNBT(NBTTagCompound tagCompound) {
super.writeToNBT(tagCompound);
NBTTagList itemList = new NBTTagList();
for (int i = 0; i < inv.length; i++) {
ItemStack stack = inv[i];
if (stack != null) {
NBTTagCompound tag = new NBTTagCompound();
tag.setByte("Slot", (byte) i);
stack.writeToNBT(tag);
itemList.appendTag(tag);
}
}
tagCompound.setTag("Inventory", itemList);
}
@Override
public String getInvName() {
return "tco.tileentitytiny";
}
@Override
public boolean isInvNameLocalized() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack) {
// TODO Auto-generated method stub
return false;
}
}
Tile Entity Renderer:
package KitchenCraft.MainClass.CounterProperties;
import org.lwjgl.opengl.GL11;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
public class CounterRenderer extends TileEntitySpecialRenderer {
//The model of your block
private final CounterRender model;
public CounterRenderer() {
this.model = new CounterRender();
}
private void adjustRotatePivotViaMeta(World world, int x, int y, int z) {
int meta = world.getBlockMetadata(x, y, z);
GL11.glPushMatrix();
GL11.glRotatef(meta * (-90), 0.0F, 0.0F, 1.0F);
GL11.glPopMatrix();
}
@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale) {
//The PushMatrix tells the renderer to "start" doing something.
GL11.glPushMatrix();
//This is setting the initial location.
GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
//This is the texture of your block. It's pathed to be the same place as your other blocks here.
//Outdated bindTextureByName("/mods/roads/textures/blocks/TrafficLightPoleRed.png");
//Use in 1.6.2 this
ResourceLocation textures = (new ResourceLocation("bettermc:textures/blocks/Counter.png"));
//the ':' is very important
//binding the textures
Minecraft.getMinecraft().renderEngine.func_110577_a(textures);;;
//This rotation part is very important! Without it, your model will render upside-down! And for some reason you DO need PushMatrix again!
GL11.glPushMatrix();
GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
//A reference to your Model file. Again, very important.
//Tell it to stop rendering for both the PushMatrix's
GL11.glPopMatrix();
GL11.glPopMatrix();
}
//Set the lighting stuff, so it changes it's brightness properly.
private void adjustLightFixture(World world, int i, int j, int k, Block block) {
Tessellator tess = Tessellator.instance;
float brightness = block.getBlockBrightness(world, i, j, k);
int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
int modulousModifier = skyLight % 65536;
int divModifier = skyLight / 65536;
tess.setColorOpaque_F(brightness, brightness, brightness);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) modulousModifier, divModifier);
}
}
Model:
// Date: 2/15/2014 11:17:48 AM
// Template version 1.1
// Java generated by Techne
// Keep in mind that you still need to fill in some blanks
// - ZeuX
package KitchenCraft.MainClass.CounterProperties;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;
public class CounterRender extends ModelBase
{
//fields
public ModelRenderer Leg1;
public ModelRenderer Leg2;
public ModelRenderer Leg4;
public ModelRenderer Leg3;
public ModelRenderer Top;
public CounterRender()
{
textureWidth = 128;
textureHeight = 64;
Leg1 = new ModelRenderer(this, 0, 0);
Leg1.addBox(0F, 0F, 0F, 2, 15, 2);
Leg1.setRotationPoint(6F, 9F, 6F);
Leg1.setTextureSize(128, 64);
Leg1.mirror = true;
setRotation(Leg1, 0F, 0F, 0F);
Leg2 = new ModelRenderer(this, 0, 0);
Leg2.addBox(0F, 0F, 0F, 2, 15, 2);
Leg2.setRotationPoint(-8F, 9F, 6F);
Leg2.setTextureSize(128, 64);
Leg2.mirror = true;
setRotation(Leg2, 0F, 0F, 0F);
Leg4 = new ModelRenderer(this, 0, 0);
Leg4.addBox(0F, 0F, 0F, 2, 15, 2);
Leg4.setRotationPoint(-8F, 9F, -8F);
Leg4.setTextureSize(128, 64);
Leg4.mirror = true;
setRotation(Leg4, 0F, 0F, 0F);
Leg3 = new ModelRenderer(this, 0, 0);
Leg3.addBox(0F, 0F, 0F, 2, 15, 2);
Leg3.setRotationPoint(6F, 9F, -8F);
Leg3.setTextureSize(128, 64);
Leg3.mirror = true;
setRotation(Leg3, 0F, 0F, 0F);
Top = new ModelRenderer(this, 0, 17);
Top.addBox(0F, 0F, 0F, 16, 2, 16);
Top.setRotationPoint(-8F, 7F, -8F);
Top.setTextureSize(128, 64);
Top.mirror = true;
setRotation(Top, 0F, 0F, 0F);
}
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
{
super.render(entity, f, f1, f2, f3, f4, f5);
setRotationAngles(f, f1, f2, f3, f4, f5, entity);
Leg1.render(f5);
Leg2.render(f5);
Leg4.render(f5);
Leg3.render(f5);
Top.render(f5);
}
private void setRotation(ModelRenderer model, float x, float y, float z)
{
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity ent)
{
super.setRotationAngles(f, f1, f2, f3, f4, f5, ent);
}
}
Client Proxy:
package KitchenCraft.MainClass.client;
import cpw.mods.fml.client.registry.ClientRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import KitchenCraft.MainClass.CommonProxy;
import KitchenCraft.MainClass.CounterProperties.CounterRenderer;
import KitchenCraft.MainClass.CounterProperties.CounterTileEnity;
import net.minecraftforge.client.MinecraftForgeClient;
public class ClientProxy extends CommonProxy {
@Override
public void registerRenderers() {
ClientRegistry.bindTileEntitySpecialRenderer(CounterTileEnity.class, new CounterRenderer());
}
public static void registerTileEntities() {
GameRegistry.registerTileEntity(CounterTileEnity.class, "TutorialDeployerAMCFMT");
}
}
Thank you in advance!