I've been trying to make a furnace in forge and it works perfectly, minus the fact that the white arrow progress bar doesn't move unless I close and open the gui (The fire graphic works and the arrow works but is not animated).
BoilerMod
package tutorials;
import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
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 = "BoilerMod", name = "BoilerMod", version = "1.0")
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
public class BoilerMod
{
@Instance("BoilerMod")//<<<Must be the same as your modid
public static BoilerMod instance;
private GuiHandler guiHandler = new GuiHandler();
//furnace
public static Block yourFurnaceIdle;
public static Block yourFurnaceActive;
@SidedProxy(clientSide = "tutorials.ClientProxy", serverSide = "tutorials.CommonProxy")
public static CommonProxy proxy;
@cpw.mods.fml.common.Mod.PreInit
public void PreInit(FMLPreInitializationEvent event)
{
}
@Init
public void load(FMLInitializationEvent event)
{
//Furnaces
yourFurnaceIdle = new BlockBoiler(150, false).setHardness(3.5F).setStepSound(Block.soundStoneFootstep).setBlockName("extruder").setRequiresSelfNotify().setCreativeTab(CreativeTabs.tabMisc);
yourFurnaceActive = new BlockBoiler(151, true).setHardness(3.5F).setStepSound(Block.soundStoneFootstep).setBlockName("extruder").setRequiresSelfNotify();
//RegFurnace
GameRegistry.registerBlock(yourFurnaceIdle, "yourFurnaceIdle");
GameRegistry.registerBlock(yourFurnaceActive, "yourFurnaceActive");
LanguageRegistry.addName(yourFurnaceIdle, "YourFurnace Idle");
// GameRegistry.addRecipe(new ItemStack(yourFurnaceIdle, 1), new Object[] {"BBB", "BBB", "BBB", Character.valueOf('B'), Block.dirt.blockID});
BoilerRecipes.smelting().addSmelting(Block.dirt.blockID, new ItemStack(Item.ingotIron), 0.1F);//Add recipes this way or in the recipe class
NetworkRegistry.instance().registerGuiHandler(this, guiHandler);
GameRegistry.registerTileEntity(TileEntityBoiler.class,"tileEntityBoiler");
proxy.registerRenderers();
}
@cpw.mods.fml.common.Mod.PostInit
public void PostInit(FMLPostInitializationEvent event)
{
}
}
TileEntityBoiler
package tutorials;
import net.minecraft.block.Block;
import net.minecraft.block.BlockFurnace;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemHoe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.item.ItemTool;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.ISidedInventory;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class TileEntityBoiler extends TileEntity implements IInventory, ISidedInventory
{
private ItemStack[] furnaceItemStacks = new ItemStack[3];
public int furnaceBurnTime = 0;
public int currentItemBurnTime = 0;
public int furnaceCookTime = 0;
public int getSizeInventory()
{
return this.furnaceItemStacks.length;
}
public ItemStack getStackInSlot(int par1)
{
return this.furnaceItemStacks[par1];
}
public ItemStack decrStackSize(int par1, int par2)
{
if (this.furnaceItemStacks[par1] != null)
{
ItemStack var3;
if (this.furnaceItemStacks[par1].stackSize <= par2)
{
var3 = this.furnaceItemStacks[par1];
this.furnaceItemStacks[par1] = null;
return var3;
}
else
{
var3 = this.furnaceItemStacks[par1].splitStack(par2);
if (this.furnaceItemStacks[par1].stackSize == 0)
{
this.furnaceItemStacks[par1] = null;
}
return var3;
}
}
else
{
return null;
}
}
public ItemStack getStackInSlotOnClosing(int par1)
{
if (this.furnaceItemStacks[par1] != null)
{
ItemStack var2 = this.furnaceItemStacks[par1];
this.furnaceItemStacks[par1] = null;
return var2;
}
else
{
return null;
}
}
public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
{
this.furnaceItemStacks[par1] = par2ItemStack;
if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit())
{
par2ItemStack.stackSize = this.getInventoryStackLimit();
}
}
public String getInvName()
{
return "container.boiler";
}
public void readFromNBT(NBTTagCompound par1NBTTagCompound)
{
super.readFromNBT(par1NBTTagCompound);
NBTTagList var2 = par1NBTTagCompound.getTagList("Items");
this.furnaceItemStacks = new ItemStack[this.getSizeInventory()];
for (int var3 = 0; var3 < var2.tagCount(); ++var3)
{
NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
byte var5 = var4.getByte("Slot");
if (var5 >= 0 && var5 < this.furnaceItemStacks.length)
{
this.furnaceItemStacks[var5] = ItemStack.loadItemStackFromNBT(var4);
}
}
this.furnaceBurnTime = par1NBTTagCompound.getShort("BurnTime");
this.furnaceCookTime = par1NBTTagCompound.getShort("CookTime");
this.currentItemBurnTime = getItemBurnTime(this.furnaceItemStacks[1]);
}
public void writeToNBT(NBTTagCompound par1NBTTagCompound)
{
super.writeToNBT(par1NBTTagCompound);
par1NBTTagCompound.setShort("BurnTime", (short)this.furnaceBurnTime);
par1NBTTagCompound.setShort("CookTime", (short)this.furnaceCookTime);
NBTTagList var2 = new NBTTagList();
for (int var3 = 0; var3 < this.furnaceItemStacks.length; ++var3)
{
if (this.furnaceItemStacks[var3] != null)
{
NBTTagCompound var4 = new NBTTagCompound();
var4.setByte("Slot", (byte)var3);
this.furnaceItemStacks[var3].writeToNBT(var4);
var2.appendTag(var4);
}
}
par1NBTTagCompound.setTag("Items", var2);
}
public int getInventoryStackLimit()
{
return 64;
}
@SideOnly(Side.CLIENT)
public int getCookProgressScaled(int par1)
{
return this.furnaceCookTime * par1 / 200;
}
@SideOnly(Side.CLIENT)
public int getBurnTimeRemainingScaled(int par1)
{
if (this.currentItemBurnTime == 0)
{
this.currentItemBurnTime = 200;
}
return this.furnaceBurnTime * par1 / this.currentItemBurnTime;
}
public boolean isBurning()
{
return this.furnaceBurnTime > 0;
}
public void updateEntity()
{
boolean var1 = this.furnaceBurnTime > 0;
boolean var2 = false;
if (this.furnaceBurnTime > 0)
{
--this.furnaceBurnTime;
}
if (!this.worldObj.isRemote)
{
if (this.furnaceBurnTime == 0 && this.canSmelt())
{
this.currentItemBurnTime = this.furnaceBurnTime = getItemBurnTime(this.furnaceItemStacks[1]);
if (this.furnaceBurnTime > 0)
{
var2 = true;
if (this.furnaceItemStacks[1] != null)
{
--this.furnaceItemStacks[1].stackSize;
if (this.furnaceItemStacks[1].stackSize == 0)
{
this.furnaceItemStacks[1] = this.furnaceItemStacks[1].getItem().getContainerItemStack(furnaceItemStacks[1]);
}
}
}
}
if (this.isBurning() && this.canSmelt())
{
++this.furnaceCookTime;
if (this.furnaceCookTime == 200)
{
this.furnaceCookTime = 0;
this.smeltItem();
var2 = true;
}
}
else
{
this.furnaceCookTime = 0;
}
if (var1 != this.furnaceBurnTime > 0)
{
var2 = true;
BlockBoiler.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
}
}
if (var2)
{
this.onInventoryChanged();
}
}
private boolean canSmelt()
{
if (this.furnaceItemStacks[0] == null)
{
return false;
}
else
{
ItemStack var1 = BoilerRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]);
if (var1 == null) return false;
if (this.furnaceItemStacks[2] == null) return true;
if (!this.furnaceItemStacks[2].isItemEqual(var1)) return false;
int result = furnaceItemStacks[2].stackSize + var1.stackSize;
return (result <= getInventoryStackLimit() && result <= var1.getMaxStackSize());
}
}
public void smeltItem()
{
if (this.canSmelt())
{
ItemStack var1 = BoilerRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]);
if (this.furnaceItemStacks[2] == null)
{
this.furnaceItemStacks[2] = var1.copy();
}
else if (this.furnaceItemStacks[2].isItemEqual(var1))
{
furnaceItemStacks[2].stackSize += var1.stackSize;
}
--this.furnaceItemStacks[0].stackSize;
if (this.furnaceItemStacks[0].stackSize <= 0)
{
this.furnaceItemStacks[0] = null;
}
}
}
public static int getItemBurnTime(ItemStack par0ItemStack)
{
if (par0ItemStack == null)
{
return 0;
}
else
{
int var1 = par0ItemStack.getItem().shiftedIndex;
Item var2 = par0ItemStack.getItem();
if (par0ItemStack.getItem() instanceof ItemBlock && Block.blocksList[var1] != null)
{
Block var3 = Block.blocksList[var1];
if (var3 == Block.woodSingleSlab)
{
return 150;
}
if (var3.blockMaterial == Material.wood)
{
return 300;
}
}
if (var2 instanceof ItemTool && ((ItemTool) var2).getToolMaterialName().equals("WOOD")) return 200;
if (var2 instanceof ItemSword && ((ItemSword) var2).func_77825_f().equals("WOOD")) return 200;
if (var2 instanceof ItemHoe && ((ItemHoe) var2).func_77842_f().equals("WOOD")) return 200;
if (var1 == Item.stick.shiftedIndex) return 100;
if (var1 == Item.coal.shiftedIndex) return 1600;
if (var1 == Item.bucketLava.shiftedIndex) return 20000;
if (var1 == Block.sapling.blockID) return 100;
if (var1 == Item.blazeRod.shiftedIndex) return 2400;
return GameRegistry.getFuelValue(par0ItemStack);
}
}
public static boolean isItemFuel(ItemStack par0ItemStack)
{
return getItemBurnTime(par0ItemStack) > 0;
}
public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
{
return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : par1EntityPlayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
}
public void openChest() {}
public void closeChest() {}
@Override
public int getStartInventorySide(ForgeDirection side)
{
if (side == ForgeDirection.DOWN) return 1;
if (side == ForgeDirection.UP) return 0;
return 2;
}
@Override
public int getSizeInventorySide(ForgeDirection side)
{
return 1;
}
}
SlotBoiler
package tutorials;
import net.minecraft.entity.item.EntityXPOrb;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.stats.AchievementList;
import net.minecraft.util.MathHelper;
import cpw.mods.fml.common.registry.GameRegistry;
public class SlotBoiler extends Slot
{
private EntityPlayer thePlayer;
private int field_75228_b;
public SlotBoiler(EntityPlayer par1EntityPlayer, IInventory par2IInventory, int par3, int par4, int par5)
{
super(par2IInventory, par3, par4, par5);
this.thePlayer = par1EntityPlayer;
}
public boolean isItemValid(ItemStack par1ItemStack)
{
return false;
}
public ItemStack decrStackSize(int par1)
{
if (this.getHasStack())
{
this.field_75228_b += Math.min(par1, this.getStack().stackSize);
}
return super.decrStackSize(par1);
}
public void onPickupFromSlot(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack)
{
this.onCrafting(par2ItemStack);
super.onPickupFromSlot(par1EntityPlayer, par2ItemStack);
}
protected void onCrafting(ItemStack par1ItemStack, int par2)
{
this.field_75228_b += par2;
this.onCrafting(par1ItemStack);
}
protected void onCrafting(ItemStack par1ItemStack)
{
par1ItemStack.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.field_75228_B);
if (!this.thePlayer.worldObj.isRemote)
{
int var2 = this.field_75228_b;
float var3 = BoilerRecipes.smelting().getExperience(par1ItemStack);
int var4;
if (var3 == 0.0F)
{
var2 = 0;
}
else if (var3 < 1.0F)
{
var4 = MathHelper.floor_float((float)var2 * var3);
if (var4 < MathHelper.ceiling_float_int((float)var2 * var3) && (float)Math.random() < (float)var2 * var3 - (float)var4)
{
++var4;
}
var2 = var4;
}
while (var2 > 0)
{
var4 = EntityXPOrb.getXPSplit(var2);
var2 -= var4;
this.thePlayer.worldObj.spawnEntityInWorld(new EntityXPOrb(this.thePlayer.worldObj, this.thePlayer.posX, this.thePlayer.posY + 0.5D, this.thePlayer.posZ + 0.5D, var4));
}
}
this.field_75228_b = 0;
GameRegistry.onItemSmelted(thePlayer, par1ItemStack);
if (par1ItemStack.itemID == Item.ingotIron.shiftedIndex)
{
this.thePlayer.addStat(AchievementList.acquireIron, 1);
}
if (par1ItemStack.itemID == Item.fishCooked.shiftedIndex)
{
this.thePlayer.addStat(AchievementList.cookFish, 1);
}
}
}
BlockBoiler
package tutorials;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class BlockBoiler extends BlockContainer
{
private Random furnaceRand = new Random();
private final boolean isActive;
private static boolean keepFurnaceInventory = false;
protected BlockBoiler(int par1, boolean par2)
{
super(par1, Material.rock);
this.isActive = par2;
this.blockIndexInTexture = 45;
}
public int idDropped(int par1, Random par2Random, int par3)
{
return Block.stoneOvenIdle.blockID;
}
public void onBlockAdded(World par1World, int par2, int par3, int par4)
{
super.onBlockAdded(par1World, par2, par3, par4);
this.setDefaultDirection(par1World, par2, par3, par4);
}
private void setDefaultDirection(World par1World, int par2, int par3, int par4)
{
if (!par1World.isRemote)
{
int var5 = par1World.getBlockId(par2, par3, par4 - 1);
int var6 = par1World.getBlockId(par2, par3, par4 + 1);
int var7 = par1World.getBlockId(par2 - 1, par3, par4);
int var8 = par1World.getBlockId(par2 + 1, par3, par4);
byte var9 = 3;
if (Block.opaqueCubeLookup[var5] && !Block.opaqueCubeLookup[var6])
{
var9 = 3;
}
if (Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var5])
{
var9 = 2;
}
if (Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var8])
{
var9 = 5;
}
if (Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var7])
{
var9 = 4;
}
par1World.setBlockMetadataWithNotify(par2, par3, par4, var9);
}
}
@SideOnly(Side.CLIENT)
public int getBlockTexture(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5)
{
if (par5 == 1)
{
return this.blockIndexInTexture + 17;
}
else if (par5 == 0)
{
return this.blockIndexInTexture + 17;
}
else
{
int var6 = par1IBlockAccess.getBlockMetadata(par2, par3, par4);
return par5 != var6 ? this.blockIndexInTexture : (this.isActive ? this.blockIndexInTexture + 16 : this.blockIndexInTexture - 1);
}
}
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
{
if (this.isActive)
{
int var6 = par1World.getBlockMetadata(par2, par3, par4);
float var7 = (float)par2 + 0.5F;
float var8 = (float)par3 + 0.0F + par5Random.nextFloat() * 6.0F / 16.0F;
float var9 = (float)par4 + 0.5F;
float var10 = 0.52F;
float var11 = par5Random.nextFloat() * 0.6F - 0.3F;
if (var6 == 4)
{
par1World.spawnParticle("smoke", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
par1World.spawnParticle("flame", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
}
else if (var6 == 5)
{
par1World.spawnParticle("smoke", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
par1World.spawnParticle("flame", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
}
else if (var6 == 2)
{
par1World.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D);
par1World.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D);
}
else if (var6 == 3)
{
par1World.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D);
par1World.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D);
}
}
}
public int getBlockTextureFromSide(int par1)
{
return par1 == 1 ? this.blockIndexInTexture + 17 : (par1 == 0 ? this.blockIndexInTexture + 17 : (par1 == 3 ? this.blockIndexInTexture - 1 : this.blockIndexInTexture));
}
public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9)
{
if (par1World.isRemote)
{
return true;
}
else if (!par5EntityPlayer.isSneaking())
{
TileEntityBoiler var10 = (TileEntityBoiler) par1World.getBlockTileEntity(par2, par3, par4);
if (var10 != null)
{
par5EntityPlayer.openGui(BoilerMod.instance, 0, par1World, par2, par3, par4);
}
return true;
}
else
{
return false;
}
}
public static void updateFurnaceBlockState(boolean par0, World par1World, int par2, int par3, int par4)
{
int var5 = par1World.getBlockMetadata(par2, par3, par4);
TileEntity var6 = par1World.getBlockTileEntity(par2, par3, par4);
keepFurnaceInventory = true;
if (par0)
{
par1World.setBlockWithNotify(par2, par3, par4, BoilerMod.yourFurnaceActive.blockID);
}
else
{
par1World.setBlockWithNotify(par2, par3, par4, BoilerMod.yourFurnaceIdle.blockID);
}
keepFurnaceInventory = false;
par1World.setBlockMetadataWithNotify(par2, par3, par4, var5);
if (var6 != null)
{
var6.validate();
par1World.setBlockTileEntity(par2, par3, par4, var6);
}
}
public TileEntity createNewTileEntity(World par1World)
{
return new TileEntityBoiler();
}
public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLiving par5EntityLiving)
{
int var6 = MathHelper.floor_double((double)(par5EntityLiving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
if (var6 == 0)
{
par1World.setBlockMetadataWithNotify(par2, par3, par4, 2);
}
if (var6 == 1)
{
par1World.setBlockMetadataWithNotify(par2, par3, par4, 5);
}
if (var6 == 2)
{
par1World.setBlockMetadataWithNotify(par2, par3, par4, 3);
}
if (var6 == 3)
{
par1World.setBlockMetadataWithNotify(par2, par3, par4, 4);
}
}
public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
{
if (!keepFurnaceInventory)
{
TileEntityBoiler var7 = (TileEntityBoiler)par1World.getBlockTileEntity(par2, par3, par4);
if (var7 != null)
{
for (int var8 = 0; var8 < var7.getSizeInventory(); ++var8)
{
ItemStack var9 = var7.getStackInSlot(var8);
if (var9 != null)
{
float var10 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
float var11 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
float var12 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
while (var9.stackSize > 0)
{
int var13 = this.furnaceRand.nextInt(21) + 10;
if (var13 > var9.stackSize)
{
var13 = var9.stackSize;
}
var9.stackSize -= var13;
EntityItem var14 = new EntityItem(par1World, (double)((float)par2 + var10), (double)((float)par3 + var11), (double)((float)par4 + var12), new ItemStack(var9.itemID, var13, var9.getItemDamage()));
if (var9.hasTagCompound())
{
var14.func_92014_d().setTagCompound((NBTTagCompound)var9.getTagCompound().copy());
}
float var15 = 0.05F;
var14.motionX = (double)((float)this.furnaceRand.nextGaussian() * var15);
var14.motionY = (double)((float)this.furnaceRand.nextGaussian() * var15 + 0.2F);
var14.motionZ = (double)((float)this.furnaceRand.nextGaussian() * var15);
par1World.spawnEntityInWorld(var14);
}
}
}
}
}
super.breakBlock(par1World, par2, par3, par4, par5, par6);
}
}
package tutorials;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;
public class GuiHandler implements IGuiHandler
{
@Override
public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
TileEntity tile_entity = world.getBlockTileEntity(x, y, z);
switch(id)
{
case 0: return new ContainerBoiler(player.inventory, (TileEntityBoiler) tile_entity);
}
return null;
}
@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
TileEntity tile_entity = world.getBlockTileEntity(x, y, z);
switch(id)
{
case 0: return new GuiBoiler(player.inventory, (TileEntityBoiler) tile_entity);
}
return null;
}
}
BoilerRecipes
package tutorials;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
public class BoilerRecipes
{
private static final BoilerRecipes smeltingBase = new BoilerRecipes();
private Map smeltingList = new HashMap();
private Map experienceList = new HashMap();
private HashMap<List<Integer>, ItemStack> metaSmeltingList = new HashMap<List<Integer>, ItemStack>();
private HashMap<List<Integer>, Float> metaExperience = new HashMap<List<Integer>, Float>();
public static final BoilerRecipes smelting()
{
return smeltingBase;
}
private BoilerRecipes()
{
this.addSmelting(Block.oreIron.blockID, new ItemStack(Block.blockSteel), 0.7F);
this.addSmelting(Block.oreGold.blockID, new ItemStack(Item.ingotGold), 1.0F);
this.addSmelting(Block.oreDiamond.blockID, new ItemStack(Item.diamond), 1.0F);
this.addSmelting(Block.sand.blockID, new ItemStack(Block.glass), 0.1F);
this.addSmelting(Item.porkRaw.shiftedIndex, new ItemStack(Item.porkCooked), 0.35F);
this.addSmelting(Item.beefRaw.shiftedIndex, new ItemStack(Item.beefCooked), 0.35F);
this.addSmelting(Item.chickenRaw.shiftedIndex, new ItemStack(Item.chickenCooked), 0.35F);
this.addSmelting(Item.fishRaw.shiftedIndex, new ItemStack(Item.fishCooked), 0.35F);
this.addSmelting(Block.cobblestone.blockID, new ItemStack(Block.stone), 0.1F);
this.addSmelting(Item.clay.shiftedIndex, new ItemStack(Item.brick), 0.3F);
this.addSmelting(Block.cactus.blockID, new ItemStack(Item.dyePowder, 1, 2), 0.2F);
this.addSmelting(Block.wood.blockID, new ItemStack(Item.coal, 1, 1), 0.15F);
this.addSmelting(Block.oreEmerald.blockID, new ItemStack(Item.emerald), 1.0F);
this.addSmelting(Item.potato.shiftedIndex, new ItemStack(Item.bakedPotato), 0.35F);
this.addSmelting(Block.oreCoal.blockID, new ItemStack(Item.coal), 0.1F);
this.addSmelting(Block.oreRedstone.blockID, new ItemStack(Item.redstone), 0.7F);
this.addSmelting(Block.oreLapis.blockID, new ItemStack(Item.dyePowder, 1, 4), 0.2F);
}
public void addSmelting(int par1, ItemStack par2ItemStack, float par3)
{
this.smeltingList.put(Integer.valueOf(par1), par2ItemStack);
this.experienceList.put(Integer.valueOf(par2ItemStack.itemID), Float.valueOf(par3));
}
@Deprecated
public ItemStack getSmeltingResult(int par1)
{
return (ItemStack)this.smeltingList.get(Integer.valueOf(par1));
}
public Map getSmeltingList()
{
return this.smeltingList;
}
@Deprecated //In favor of ItemStack sensitive version
public float getExperience(int par1)
{
return this.experienceList.containsKey(Integer.valueOf(par1)) ? ((Float)this.experienceList.get(Integer.valueOf(par1))).floatValue() : 0.0F;
}
public void addSmelting(int itemID, int metadata, ItemStack itemstack, float experience)
{
metaSmeltingList.put(Arrays.asList(itemID, metadata), itemstack);
metaExperience.put(Arrays.asList(itemID, metadata), experience);
}
public ItemStack getSmeltingResult(ItemStack item)
{
if (item == null)
{
return null;
}
ItemStack ret = (ItemStack)metaSmeltingList.get(Arrays.asList(item.itemID, item.getItemDamage()));
if (ret != null)
{
return ret;
}
return (ItemStack)smeltingList.get(Integer.valueOf(item.itemID));
}
public float getExperience(ItemStack item)
{
if (item == null || item.getItem() == null)
{
return 0;
}
float ret = item.getItem().getSmeltingExperience(item);
if (ret < 0 && metaExperience.containsKey(Arrays.asList(item.itemID, item.getItemDamage())))
{
ret = metaExperience.get(Arrays.asList(item.itemID, item.getItemDamage()));
}
if (ret < 0 && experienceList.containsKey(item.itemID))
{
ret = ((Float)experienceList.get(item.itemID)).floatValue();
}
return (ret < 0 ? 0 : ret);
}
}
Rollback Post to RevisionRollBack
I mod things. Check me out on twitter or on Espernet IRC at #TheSteamTank
I don't really have time/setup to test your code, but that is almost definitely a problem with the math you have in GuiBoiler. It is pretty difficult to figure out, but keep at it, and you can probably figure it out. One thing that helped me was to open up the image in Photoshop, or another image editing program, and check which pixels should be showing after each loop. Good luck!
Rollback Post to RevisionRollBack
Learn some Java before you mod, and skip over the chapter on ModLoader, straight to MinecraftForge. It's better. Trust me.
I don't really have time/setup to test your code, but that is almost definitely a problem with the math you have in GuiBoiler. It is pretty difficult to figure out, but keep at it, and you can probably figure it out. One thing that helped me was to open up the image in Photoshop, or another image editing program, and check which pixels should be showing after each loop. Good luck!
What do you mean? The arrow renders fine, but not constantly, it renders if I close and open the GUI but doesn't move until I open/close it again, and it jumps and gets stuck again,
Rollback Post to RevisionRollBack
I mod things. Check me out on twitter or on Espernet IRC at #TheSteamTank
Did you modify the original code for a custom arrow? Then I have no idea how to help as I am not good with the gui interface, and can olny show you what files were needed to make the thing work in the first place...If not a custom GUI then I will look at it later
What do you mean? The arrow renders fine, but not constantly, it renders if I close and open the GUI but doesn't move until I open/close it again, and it jumps and gets stuck again,
Hmm... I think that could even be a proxy thing if the GUI isn't being rendered right through the server...
Rollback Post to RevisionRollBack
Learn some Java before you mod, and skip over the chapter on ModLoader, straight to MinecraftForge. It's better. Trust me.
Okay, I now have my mod in a running state again and created another furnace using my tutorial and the arrow animation works perfectly, so I would have to say you did something wrong somewhere along the way. So get all the files necessary for the furnace and start again following the tutorial as written, make the NECESSARY changes only and see if that works, if not post any error here and will again try to help.
BoilerMod
TileEntityBoiler
SlotBoiler
BlockBoiler
GuiBoiler
GuiHandler
BoilerRecipes
I mod things. Check me out on twitter or on Espernet IRC at #TheSteamTank
What do you mean? The arrow renders fine, but not constantly, it renders if I close and open the GUI but doesn't move until I open/close it again, and it jumps and gets stuck again,
I mod things. Check me out on twitter or on Espernet IRC at #TheSteamTank
Find out how I generate....coolAlias...world structure generation and rotation tool...
Hmm... I think that could even be a proxy thing if the GUI isn't being rendered right through the server...
Find out how I generate....coolAlias...world structure generation and rotation tool...
Find out how I generate....coolAlias...world structure generation and rotation tool...