Jump to content

Recommended Posts

Posted

(This might be a noob question) I have to make multiple GUIs. My first GUI worked perfectly but as soon as I made my second, the first would not work. I'm sure this is a trivial problem but as I said, I am only a beginner.

 

Core

package TechCraft;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.src.ModLoader;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.PreInit;   
import cpw.mods.fml.common.Mod.Init;       
import cpw.mods.fml.common.Mod.PostInit;   
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.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.common.registry.LanguageRegistry;

@Mod(modid="TechCraftID", name="TechCraft", version="0.0.0")
@NetworkMod(clientSideRequired = true, serverSideRequired = false, channels = {ModInfo.CHANNEL}, packetHandler = PacketHandler.class)


public class Core {
public static CreativeTabs tabTechCraft = new  tabTechCraft(CreativeTabs.getNextID(), "TechCraft");

public final static Item cobaltIngot = new CobaltIngot(4001).setMaxStackSize(64).setUnlocalizedName("ingotcobalt").setCreativeTab(tabTechCraft);;
public final static Block cobaltBlock = new CobaltBlock(4002, Material.ground).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Cobalt Block").setCreativeTab(tabTechCraft);
public final static Block cobaltOre = new CobaltOre(4003, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Cobalt Ore").setCreativeTab(tabTechCraft);

public final static Item nickelIngot = new NickelIngot(4008).setMaxStackSize(64).setUnlocalizedName("ingotnickel").setCreativeTab(tabTechCraft);;
public final static Block nickelOre = new NickelOre(4006, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Nickel Ore").setCreativeTab(tabTechCraft);
public final static Block nickelBlock = new NickelBlock(4007, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Nickel Block").setCreativeTab(tabTechCraft);

public final static Item steelIngot = new SteelIngot(4004).setMaxStackSize(64).setUnlocalizedName("ingotsteel").setCreativeTab(tabTechCraft);;
public final static Block steelBlock = new SteelBlock(4005, Material.ground).setHardness(6.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Steel Block").setCreativeTab(tabTechCraft); 

public final static Item copperIngot = new CopperIngot(4009).setMaxStackSize(64).setUnlocalizedName("ingotCopper").setCreativeTab(tabTechCraft);;
public final static Block copperOre = new CopperOre(4010, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Copper Ore").setCreativeTab(tabTechCraft);
public final static Block copperBlock = new CopperBlock(4011, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Copper Bloc").setCreativeTab(tabTechCraft);

public final static Item zincIngot = new ZincIngot(4012).setMaxStackSize(64).setUnlocalizedName("ingotzinc").setCreativeTab(tabTechCraft);;
public final static Block zincOre = new ZincOre(4013, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Zinc Ore").setCreativeTab(tabTechCraft);
public final static Block zincBlock = new ZincBlock(4014, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Zinc Block").setCreativeTab(tabTechCraft);

public final static Block liquefierIdle = new Liquefier(4015, false).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Liquefier").setCreativeTab(tabTechCraft);
public final static Block liquefierActive = new Liquefier(4016, true).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setLightValue(1F).setUnlocalizedName("Liquefier");
public final static Block coolerIdle = new Cooler(4057, false).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Cooler").setCreativeTab(tabTechCraft);
public final static Block coolerActive = new Cooler(4058, true).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Cooler");

public final static Item bucketOfZincAndCopper = new BucketOfZincAndCopper(4017).setMaxStackSize(16).setUnlocalizedName("bucketBrass").setCreativeTab(tabTechCraft);;
public final static Item bucketOfMoltenZincAndCopper = new BucketOfZincAndCopper(4018).setMaxStackSize(16).setUnlocalizedName("bucketMoltenBrass").setCreativeTab(tabTechCraft);;
public final static Item brassIngot = new BrassIngot(4034).setMaxStackSize(64).setUnlocalizedName("brassIngot").setCreativeTab(tabTechCraft);
public final static Block brassBlock = new BrassBlock(4035, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Brass Block").setCreativeTab(tabTechCraft);

public final static Item invarIngot = new InvarIngot(4036).setMaxStackSize(64).setUnlocalizedName("invarIngot").setCreativeTab(tabTechCraft);
public final static Block invarBlock = new InvarBlock(4037, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Invar Block").setCreativeTab(tabTechCraft);

public final static Item electrumIngot = new ElectrumIngot(4038).setMaxStackSize(64).setUnlocalizedName("electrumIngot").setCreativeTab(tabTechCraft);
public final static Block electrumBlock = new ElectrumBlock(4039, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Electrum Block").setCreativeTab(tabTechCraft);

public final static Item bronzeIngot = new BronzeIngot(4040).setMaxStackSize(64).setUnlocalizedName("bronzeIngot").setCreativeTab(tabTechCraft);
public final static Block bronzeBlock = new BronzeBlock(4041, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Bronze Block").setCreativeTab(tabTechCraft);

public final static Item pewterIngot = new PewterIngot(4042).setMaxStackSize(64).setUnlocalizedName("pewterIngot").setCreativeTab(tabTechCraft);
public final static Block pewterBlock = new PewterBlock(4043, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Pewter Block").setCreativeTab(tabTechCraft);

public final static Item silverIngot = new SilverIngot(4044).setMaxStackSize(64).setUnlocalizedName("silverIngot").setCreativeTab(tabTechCraft);
public final static Block silverBlock = new SilverBlock(4045, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Silver Block").setCreativeTab(tabTechCraft);
public final static Block silverOre = new SilverOre(4046, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Silver Ore").setCreativeTab(tabTechCraft);

public final static Item  tinIngot = new TinIngot(4047).setMaxStackSize(64).setUnlocalizedName("tinIngot").setCreativeTab(tabTechCraft);
public final static Block tinBlock = new TinBlock(4048, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Tin Block").setCreativeTab(tabTechCraft);
public final static Block tinOre = new TinOre(4049, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Tin Ore").setCreativeTab(tabTechCraft);

public final static Item  aluminiumIngot = new AluminiumIngot(4050).setMaxStackSize(64).setUnlocalizedName("aluminiumIngot").setCreativeTab(tabTechCraft);
public final static Block aluminiumBlock = new AluminiumBlock(4051, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Aluminium Block").setCreativeTab(tabTechCraft);
public final static Block aluminiumOre = new AluminiumOre(4052, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Aluminium Ore").setCreativeTab(tabTechCraft);

public final static Item plutoniumShard = new PlutoniumShard(4020).setMaxStackSize(64).setUnlocalizedName("plutoniumShard");
public final static Item plutoniumIngot = new PlutoniumIngot(4021).setMaxStackSize(64).setUnlocalizedName("plutoniumIngot");
public final static Block plutoniumOre = new PlutoniumOre(4019, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Plutonium Ore").setLightValue(0.4F).setCreativeTab(tabTechCraft);
public final static Item plutoniumBillet = new PlutoniumBillet(4022).setMaxStackSize(64).setUnlocalizedName("plutoniumBillet");
public final static Block plutoniumBlock = new PlutoniumBlock(4023, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Plutonium Block").setLightValue(0.7F);

public final static Item  plutonium244Billet = new Plutonium244Billet(4024).setMaxStackSize(64).setUnlocalizedName("plutonium244Billet");
public final static Item plutonium238Billet = new Plutonium238Billet(4025).setMaxStackSize(64).setUnlocalizedName("plutonium238Billet");
public final static Item plutonium239Billet = new Plutonium239Billet(4026).setMaxStackSize(64).setUnlocalizedName("plutonium239Billet");

public final static Item neptuniumShard = new NeptuniumShard(4027).setMaxStackSize(64).setUnlocalizedName("neptuniumShard");
public final static Item neptuniumIngot = new NeptuniumIngot(4028).setMaxStackSize(64).setUnlocalizedName("neptuniumIngot");
public final static Block neptuniumOre = new NeptuniumOre(4029, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Neptunium Ore").setLightValue(0.4F).setCreativeTab(tabTechCraft);
public final static Item neptuniumBillet = new NeptuniumBillet(4030).setMaxStackSize(64).setUnlocalizedName("neptuniumbillet");
public final static Block neptuniumBlock = new NeptuniumBlock(4031, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Neptunium Block").setLightValue(0.4F).setCreativeTab(tabTechCraft);

public final static Item neptunium235Billet = new Neptunium235Billet(4031).setMaxStackSize(64).setUnlocalizedName("neptunium235billet");
public final static Item neptunium236Billet = new Neptunium236Billet(4032).setMaxStackSize(64).setUnlocalizedName("neptunium236billet");
public final static Item neptunium237Billet = new Neptunium237Billet(4033).setMaxStackSize(64).setUnlocalizedName("neptunium239billet");

public final static Item uraniumIngot = new UraniumIngot(4053).setMaxStackSize(64).setUnlocalizedName("uraniumIngot");
public final static Block uraniumOre = new UraniumOre(4054, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Uranium Ore").setLightValue(0.4F).setCreativeTab(tabTechCraft);
public final static Item uraniumBillet = new UraniumBillet(4055).setMaxStackSize(64).setUnlocalizedName("uraniumbillet");
public final static Block uraniumBlock = new UraniumBlock(4056, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Neptunium Block").setLightValue(0.4F).setCreativeTab(tabTechCraft);

public final static Item uranium235Billet = new Uranium235Billet(4077).setMaxStackSize(64).setUnlocalizedName("uranium235billet");
public final static Item uranium238Billet = new Uranium238Billet(4078).setMaxStackSize(64).setUnlocalizedName("uranium238billet");
public final static Item uranium233Billet = new Uranium233Billet(4079).setMaxStackSize(64).setUnlocalizedName("uranium233billet");

public final static Item bucketOfMercury = new bucketOfMercury(4080).setMaxStackSize(16).setUnlocalizedName("bucektOfMercury");
public final static Block mercuryOre = new MercuryOre(4081, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Mercury Ore");

public final static Item  chromiumIngot = new ChromiumIngot(4082).setMaxStackSize(64).setUnlocalizedName("chromiumIngot").setCreativeTab(tabTechCraft);
public final static Block chromiumBlock = new ChromiumBlock(4083, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Chromium Block").setCreativeTab(tabTechCraft);
public final static Block chromiumOre = new ChromiumOre(4084, Material.rock).setHardness(4.0F).setStepSound(Block.soundStoneFootstep).setUnlocalizedName("Chromium Ore").setCreativeTab(tabTechCraft);

public final static Block b83Bomb = new B83Bomb(3000, Material.rock).setHardness(4.0F).setStepSound(Block.soundClothFootstep).setUnlocalizedName("B83 Nuclear Bomb").setCreativeTab(tabTechCraft);
public final static Block rDXExplosive = new RDXExplosive(3001, Material.grass).setHardness(4.0F).setStepSound(Block.soundGrassFootstep).setUnlocalizedName("RDX").setCreativeTab(tabTechCraft);

@Instance(value = "TechCraftID")
public static Core instance = new Core();


@SidedProxy(clientSide="TechCraft.ClientProxy", serverSide="TechCraft.CommonProxy")
public static CommonProxy proxy;





@PreInit
public void preInit(FMLPreInitializationEvent event){
	NetworkRegistry.instance().registerGuiHandler(this, this.proxy);
	instance = this;

}

@Init
public void load(FMLInitializationEvent event){

	new GuiHandler();


	LanguageRegistry.addName(cobaltIngot, ("Cobalt Ingot"));



	LanguageRegistry.addName(cobaltBlock, ("Cobalt Block"));
	MinecraftForge.setBlockHarvestLevel(cobaltBlock, "pickaxe", 2);
	GameRegistry.registerBlock(cobaltBlock, "cobaltBlock");


	LanguageRegistry.addName(cobaltOre, ("Cobalt Ore"));
	MinecraftForge.setBlockHarvestLevel(cobaltOre, "pickaxe", 2);
	GameRegistry.registerBlock(cobaltOre, "cobaltOre");

	LanguageRegistry.addName(steelIngot,("Steel Ingot"));

	LanguageRegistry.addName(steelBlock, ("Steel Block"));
	MinecraftForge.setBlockHarvestLevel(steelBlock, "pickaxe", 2);
	GameRegistry.registerBlock(steelBlock, "steelBlock");

	LanguageRegistry.addName(nickelIngot, ("Nickel Ingot"));

	LanguageRegistry.addName(nickelOre, ("Nickel Ore"));
	MinecraftForge.setBlockHarvestLevel(nickelOre, "pickaxe", 2);
	GameRegistry.registerBlock(nickelOre, "nickelOre");

	LanguageRegistry.addName(nickelBlock, ("Nickel Block"));
	MinecraftForge.setBlockHarvestLevel(nickelBlock, "pickaxe", 2);
	GameRegistry.registerBlock(nickelBlock, "nickelBlock");

	LanguageRegistry.addName(copperIngot, ("Copper Ingot"));

	LanguageRegistry.addName(copperOre, ("Copper Ore"));
	MinecraftForge.setBlockHarvestLevel(copperBlock, "pickaxe", 2);
	GameRegistry.registerBlock(copperOre, "copperOre");

	LanguageRegistry.addName(copperBlock, ("Copper Block"));
	MinecraftForge.setBlockHarvestLevel(copperBlock, "pickaxe", 2);
	GameRegistry.registerBlock(copperBlock, "copperBlock");

	LanguageRegistry.addName(zincIngot, ("Zinc Ingot"));

	LanguageRegistry.addName(zincOre, ("Zinc Ore"));
	MinecraftForge.setBlockHarvestLevel(zincOre, "pickaxe", 2);
	GameRegistry.registerBlock(zincOre, "zincOre");

	LanguageRegistry.addName(zincBlock, ("Zinc Block"));
	MinecraftForge.setBlockHarvestLevel(zincBlock, "pickaxe", 2);
	GameRegistry.registerBlock(zincBlock, "zincBlock");

	LanguageRegistry.addName(plutoniumOre, ("Plutonium Ore"));
	MinecraftForge.setBlockHarvestLevel(plutoniumOre, "pickaxe", 3);
	GameRegistry.registerBlock(plutoniumOre, "plutoniumOre");

	LanguageRegistry.addName(plutoniumBlock, ("Plutonium Block"));
	MinecraftForge.setBlockHarvestLevel(plutoniumBlock, "pickaxe", 3);
	GameRegistry.registerBlock(plutoniumBlock, "plutoniumBlock");

	LanguageRegistry.addName(plutoniumShard, ("Plutonium Shard"));
	LanguageRegistry.addName(plutoniumIngot, ("Plutonium Ingot"));
	LanguageRegistry.addName(plutoniumBillet, ("Plutonium Billet"));
	LanguageRegistry.addName(plutonium244Billet, ("Plutonium 244 Billet"));
	LanguageRegistry.addName(plutonium238Billet, ("Plutonium 238 Billet"));
	LanguageRegistry.addName(plutonium239Billet, ("Plutonium 239 Billet"));

	LanguageRegistry.addName(neptuniumOre, ("Neptunium Ore"));
	MinecraftForge.setBlockHarvestLevel(neptuniumOre, "pickaxe", 3);
	GameRegistry.registerBlock(neptuniumOre, "neptuniumOre");

	LanguageRegistry.addName(neptuniumBlock, ("Neptunium Block"));
	MinecraftForge.setBlockHarvestLevel(neptuniumBlock, "pickaxe", 3);
	GameRegistry.registerBlock(neptuniumBlock, "neptuniumBlock");

	LanguageRegistry.addName(neptuniumShard, ("Neptunium Shard"));
	LanguageRegistry.addName(neptuniumIngot, ("Neptunium Ingot"));
	LanguageRegistry.addName(neptuniumBillet, ("Neptunium Billet"));
	LanguageRegistry.addName(neptunium235Billet, ("Neptunium 235 Billet"));
	LanguageRegistry.addName(neptunium236Billet, ("Neptunium 236 Billet"));
	LanguageRegistry.addName(neptunium237Billet, ("Neptunium 237 Billet"));

	LanguageRegistry.addName(uraniumIngot, ("Uranium Ingot"));
	LanguageRegistry.addName(uraniumBillet, ("Uranium Billet"));
	LanguageRegistry.addName(uranium233Billet, ("Uranium 233 Billet"));
	LanguageRegistry.addName(uranium238Billet, ("Uranium 238 Billet"));
	LanguageRegistry.addName(uranium235Billet, ("Uranium 235 Billet"));

	LanguageRegistry.addName(liquefierIdle, ("Liquefier"));
	MinecraftForge.setBlockHarvestLevel(liquefierIdle, "pickaxe", 2);
	GameRegistry.registerBlock(liquefierIdle, "liquefier");

	LanguageRegistry.addName(liquefierActive, ("Liquefier"));
	MinecraftForge.setBlockHarvestLevel(liquefierActive, "pickaxe", 2);
	GameRegistry.registerBlock(liquefierActive, "liquefieractive");

	LanguageRegistry.addName(bucketOfZincAndCopper, ("Bucket of Zinc and Copper"));

	LanguageRegistry.addName(bucketOfMoltenZincAndCopper, ("Bucket of Molten Brass"));

	LanguageRegistry.addName(brassIngot, ("Brass Ingot"));
	LanguageRegistry.addName(brassBlock, ("Brass Block"));
	MinecraftForge.setBlockHarvestLevel(brassBlock, "pickaxe", 2);
	GameRegistry.registerBlock(brassBlock, "brassBlock");

	LanguageRegistry.addName(invarIngot, ("Invar Ingot"));
	LanguageRegistry.addName(invarBlock, ("Invar Block"));
	MinecraftForge.setBlockHarvestLevel(invarBlock, "pickaxe", 2);
	GameRegistry.registerBlock(invarBlock, "invarBlock");

	LanguageRegistry.addName(electrumIngot, ("Electrum Ingot"));
	LanguageRegistry.addName(electrumBlock, ("Electrum Block"));
	MinecraftForge.setBlockHarvestLevel(electrumBlock, "pickaxe", 2);
	GameRegistry.registerBlock(electrumBlock, "electrumBlock");

	LanguageRegistry.addName(bronzeIngot, ("Bronze Ingot"));
	LanguageRegistry.addName(bronzeBlock, ("Bronze Block"));
	MinecraftForge.setBlockHarvestLevel(bronzeBlock, "pickaxe", 2);
	GameRegistry.registerBlock(bronzeBlock, "bronzeBlock");

	LanguageRegistry.addName(pewterIngot, ("Pewter Ingot"));
	LanguageRegistry.addName(pewterBlock, ("Pewter Block"));
	MinecraftForge.setBlockHarvestLevel(pewterBlock, "pickaxe", 2);
	GameRegistry.registerBlock(pewterBlock, "pewterBlock");

	LanguageRegistry.addName(tinIngot, ("Tin Ingot"));

	LanguageRegistry.addName(tinOre, ("Tin Ore"));
	MinecraftForge.setBlockHarvestLevel(tinOre, "pickaxe", 2);
	GameRegistry.registerBlock(tinOre, "tinOre");

	LanguageRegistry.addName(tinBlock, ("Tin Block"));
	MinecraftForge.setBlockHarvestLevel(tinBlock, "pickaxe", 2);
	GameRegistry.registerBlock(tinBlock, "tinBlock");

	LanguageRegistry.addName(silverIngot, ("Silver Ingot"));

	LanguageRegistry.addName(silverOre, ("Silver Ore"));
	MinecraftForge.setBlockHarvestLevel(silverOre, "pickaxe", 2);
	GameRegistry.registerBlock(silverOre, "silverOre");

	LanguageRegistry.addName(silverBlock, ("Silver Block"));
	MinecraftForge.setBlockHarvestLevel(silverBlock, "pickaxe", 2);
	GameRegistry.registerBlock(silverBlock, "silverBlock");

	LanguageRegistry.addName(coolerIdle, ("Cooler"));
	MinecraftForge.setBlockHarvestLevel(coolerIdle, "pickaxe", 2);
	GameRegistry.registerBlock(coolerIdle, "cooler");

	LanguageRegistry.addName(coolerActive, ("Cooler"));
	MinecraftForge.setBlockHarvestLevel(coolerActive, "pickaxe", 2);
	GameRegistry.registerBlock(coolerActive, "coolerActive");

	LanguageRegistry.addName(aluminiumIngot, ("Aluminium Ingot"));

	LanguageRegistry.addName(aluminiumOre, ("Aluminium Ore"));
	MinecraftForge.setBlockHarvestLevel(aluminiumOre, "pickaxe", 2);
	GameRegistry.registerBlock(aluminiumOre, "AluminiumOre");

	LanguageRegistry.addName(aluminiumBlock, ("Aluminium Block"));
	MinecraftForge.setBlockHarvestLevel(aluminiumBlock, "pickaxe", 2);
	GameRegistry.registerBlock(aluminiumBlock, "AluminiumBlock");

	LanguageRegistry.addName(chromiumIngot, ("Chromium Ingot"));

	LanguageRegistry.addName(chromiumOre, ("Chromium Ore"));
	MinecraftForge.setBlockHarvestLevel(chromiumOre, "pickaxe", 2);
	GameRegistry.registerBlock(chromiumOre, "ChromiumOre");

	LanguageRegistry.addName(chromiumBlock, ("Chromium Block"));
	MinecraftForge.setBlockHarvestLevel(chromiumBlock, "pickaxe", 2);
	GameRegistry.registerBlock(chromiumBlock, "Chromium Block");

	LanguageRegistry.addName(bucketOfMercury, ("Bucket of Mercury"));
	LanguageRegistry.addName(mercuryOre, ("Mercury Ore"));
	MinecraftForge.setBlockHarvestLevel(mercuryOre, "pickaxe", 2);
	GameRegistry.registerBlock(mercuryOre, "Mercury Ore");


	LanguageRegistry.addName(b83Bomb, ("B83 Nuclear Bomb"));
	MinecraftForge.setBlockHarvestLevel(b83Bomb, "pickaxe", 3);
	GameRegistry.registerBlock(b83Bomb, "b61Bomb");

	LanguageRegistry.addName(rDXExplosive, ("RDX"));
	MinecraftForge.setBlockHarvestLevel(rDXExplosive, "pickaxe", 0);
	GameRegistry.registerBlock(rDXExplosive, "rDXEXplosive");


	LanguageRegistry.instance().addStringLocalization("entity.B83", "en_US", "B83 Nuclear Bomb");
	EntityRegistry.registerGlobalEntityID(EntityB83Primed.class, "B83", EntityRegistry.findGlobalUniqueEntityId());
	EntityRegistry.registerModEntity(EntityB83Primed.class, "B83", 1, this, 128, 1, false); 

	LanguageRegistry.instance().addStringLocalization("entity.RDX", "en_US", "RDX");
	RenderingRegistry.registerEntityRenderingHandler(EntityRDXPrimed.class, new RenderRDX());
	EntityRegistry.registerModEntity(EntityRDXPrimed.class, "RDX", 1, this, 127, 1, false);
	EntityRegistry.registerGlobalEntityID(EntityRDXPrimed.class, "RDX", EntityRegistry.findGlobalUniqueEntityId());

	GameRegistry.addSmelting(cobaltOre.blockID, new ItemStack(cobaltIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(cobaltBlock), "xxx", "xxx", "xxx",'x', cobaltIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(cobaltIngot, 9), new ItemStack(cobaltBlock));

	GameRegistry.addSmelting(nickelOre.blockID, new ItemStack(nickelIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(nickelBlock), "xxx", "xxx", "xxx",'x', nickelIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(nickelIngot, 9), new ItemStack(nickelBlock));

	GameRegistry.addSmelting(copperOre.blockID, new ItemStack(copperIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(copperBlock), "xxx", "xxx", "xxx",'x', copperIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(copperIngot, 9), new ItemStack(copperBlock));

	GameRegistry.addSmelting(Item.ingotIron.itemID, new ItemStack(steelIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(steelBlock), "xxx", "xxx", "xxx",'x', steelIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(steelIngot, 9), new ItemStack(steelBlock));

	GameRegistry.addRecipe(new ItemStack(bucketOfZincAndCopper), "xxx", " y ", " z ", 'x', copperIngot, 'y', zincIngot, 'z',Item.bucketEmpty);

	GameRegistry.addRecipe(new ItemStack(brassBlock), "xxx", "xxx", "xxx", 'x', brassIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(brassIngot, 9), new ItemStack(brassBlock));

	GameRegistry.addRecipe(new ItemStack(invarBlock), "xxx", "xxx", "xxx", 'x', invarIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(invarIngot, 9), new ItemStack(invarBlock));

	GameRegistry.addRecipe(new ItemStack(electrumBlock), "xxx", "xxx", "xxx", 'x', electrumIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(electrumIngot, 9), new ItemStack(electrumBlock));

	GameRegistry.addRecipe(new ItemStack(bronzeBlock), "xxx", "xxx", "xxx", 'x', bronzeIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(electrumIngot, 9), new ItemStack(electrumBlock));

	GameRegistry.addSmelting(tinOre.blockID, new ItemStack(tinIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(tinBlock), "xxx", "xxx", "xxx", 'x', tinIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(tinIngot, 9), new ItemStack(tinBlock));

	GameRegistry.addSmelting(silverOre.blockID, new ItemStack(silverIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(silverBlock), "xxx", "xxx", "xxx", 'x', silverIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(silverIngot, 9), new ItemStack(silverBlock));

	GameRegistry.addSmelting(aluminiumOre.blockID, new ItemStack(aluminiumIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(aluminiumBlock), "xxx", "xxx", "xxx", 'x', aluminiumIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(aluminiumIngot, 9), new ItemStack(aluminiumBlock));

	GameRegistry.addSmelting(chromiumOre.blockID, new ItemStack(chromiumIngot), 0.1f);
	GameRegistry.addRecipe(new ItemStack(chromiumBlock), "xxx", "xxx", "xxx", 'x', chromiumIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(chromiumIngot, 9), new ItemStack(chromiumBlock));

	GameRegistry.addRecipe(new ItemStack(liquefierIdle), "xxx", "xyx", "xxx", 'x', steelIngot, 'y', Item.bucketLava);
	GameRegistry.addRecipe(new ItemStack(coolerIdle), "xxx", "xyx", "xxx", 'x', steelIngot, 'x', Block.ice);
	GameRegistry.addRecipe(new ItemStack(plutoniumIngot), "xxx", "xxx", "xxx", 'x', plutoniumShard);
	GameRegistry.addRecipe(new ItemStack(plutoniumBillet), " x ", "xxx", " x ", 'x', plutoniumIngot);
	GameRegistry.addRecipe(new ItemStack(plutoniumBlock), "xxx", "xxx", "xxx", 'x', plutoniumIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(plutoniumIngot, 9), new ItemStack(plutoniumBlock));
	GameRegistry.addRecipe(new ItemStack(neptuniumIngot), "xxx", "xxx", "xxx", 'x', neptuniumShard);
	GameRegistry.addRecipe(new ItemStack(neptuniumBillet), " x ", "xxx", " x ", 'x', neptuniumIngot);
	GameRegistry.addRecipe(new ItemStack(neptuniumBlock), "xxx", "xxx", "xxx", 'x', neptuniumIngot);
	GameRegistry.addShapelessRecipe(new ItemStack(neptuniumIngot, 9), new ItemStack(neptuniumBlock));

	GameRegistry.registerWorldGenerator(new WorldGenerator());

	GameRegistry.registerTileEntity(TileEntityLiquefier.class,"TileEntityLiquefier");
	GameRegistry.registerTileEntity(TileEntityCooler.class,"TileEntityCooler");

                

	proxy.registerRenderers();
}

@PostInit
public void postInit(FMLPostInitializationEvent event){

}

}

Liquefier

package TechCraft;

import cpw.mods.fml.common.network.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import TechCraft.TileEntityLiquefier;
import net.minecraft.util.Icon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class Liquefier extends BlockContainer
{
    /**
     * Is the random generator used by furnace to drop the inventory contents in random directions.
     */
    private final Random furnaceRand = new Random();

    /** True if this is an active furnace, false if idle */
    private final boolean isActive;

    /**
     * This flag is used to prevent the furnace inventory to be dropped upon block removal, is used internally when the
     * furnace block changes from idle to active and vice-versa.
     */
    private static boolean keepFurnaceInventory = false;
    @SideOnly(Side.CLIENT)
    private Icon furnaceIconTop;
    @SideOnly(Side.CLIENT)
    private Icon furnaceIconFront;

    protected Liquefier(int par1, boolean par2)
    {
        super(par1, Material.rock);
        this.isActive = par2;
    }

    /**
     * Returns the ID of the items to drop on destruction.
     */
    public int idDropped(int par1, Random par2Random, int par3)
    {
        return Core.liquefierIdle.blockID;
    }

    /**
     * Called whenever the block is added into the world. Args: world, x, y, z
     */
    public void onBlockAdded(World par1World, int par2, int par3, int par4)
    {
        super.onBlockAdded(par1World, par2, par3, par4);
        this.setDefaultDirection(par1World, par2, par3, par4);
    }

    /**
     * set a blocks direction
     */
    private void setDefaultDirection(World par1World, int par2, int par3, int par4)
    {
        if (!par1World.isRemote)
        {
            int l = par1World.getBlockId(par2, par3, par4 - 1);
            int i1 = par1World.getBlockId(par2, par3, par4 + 1);
            int j1 = par1World.getBlockId(par2 - 1, par3, par4);
            int k1 = par1World.getBlockId(par2 + 1, par3, par4);
            byte b0 = 3;

            if (Block.opaqueCubeLookup[l] && !Block.opaqueCubeLookup[i1])
            {
                b0 = 3;
            }

            if (Block.opaqueCubeLookup[i1] && !Block.opaqueCubeLookup[l])
            {
                b0 = 2;
            }

            if (Block.opaqueCubeLookup[j1] && !Block.opaqueCubeLookup[k1])
            {
                b0 = 5;
            }

            if (Block.opaqueCubeLookup[k1] && !Block.opaqueCubeLookup[j1])
            {
                b0 = 4;
            }

            par1World.setBlockMetadataWithNotify(par2, par3, par4, b0, 2);
        }
    }

    @SideOnly(Side.CLIENT)

    /**
     * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
     */
    public Icon getIcon(int par1, int par2)
    {
        return par1 == 1 ? this.furnaceIconTop : (par1 == 0 ? this.furnaceIconTop : (par1 != par2 ? this.blockIcon : this.furnaceIconFront));
    }

    @SideOnly(Side.CLIENT)

    /**
     * When this method is called, your block should register all the icons it needs with the given IconRegister. This
     * is the only chance you get to register icons.
     */
    public void registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon("TechCraft:machine_side");
        this.furnaceIconFront = par1IconRegister.registerIcon(this.isActive ? "TechCraft:machine_front_lit" : "TechCraft:machine_front");
        this.furnaceIconTop = par1IconRegister.registerIcon("TechCraft:machine_top");
    }

    /**
     * Called upon block activation (right click on the block.)
     */
    public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer player, int par6, float par7, float par8, float par9)
    {
        if (par1World.isRemote)
        {
            return true;
        }
        else
        {
            TileEntityLiquefier tileentityfurnace = (TileEntityLiquefier)par1World.getBlockTileEntity(par2, par3, par4);

            if (tileentityfurnace != null)
            {
            	player.openGui(player, 0, par1World, par2, par3, par4);
            }

            return true;
        }
    }

    /**
     * Update which block ID the furnace is using depending on whether or not it is burning
     */
    public static void updateFurnaceBlockState(boolean par0, World par1World, int par2, int par3, int par4)
    {
        int l = par1World.getBlockMetadata(par2, par3, par4);
        TileEntity tileentity = par1World.getBlockTileEntity(par2, par3, par4);
        keepFurnaceInventory = true;

        if (par0)
        {
            par1World.setBlock(par2, par3, par4, Core.liquefierActive.blockID);
        }
        else
        {
            par1World.setBlock(par2, par3, par4, Core.liquefierIdle.blockID);
        }

        keepFurnaceInventory = false;
        par1World.setBlockMetadataWithNotify(par2, par3, par4, l, 2);

        if (tileentity != null)
        {
            tileentity.validate();
            par1World.setBlockTileEntity(par2, par3, par4, tileentity);
        }
    }

    @SideOnly(Side.CLIENT)

    public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
    {
        if (this.isActive)
        {
            int l = par1World.getBlockMetadata(par2, par3, par4);
            float f = (float)par2 + 0.5F;
            float f1 = (float)par3 + 0.0F + par5Random.nextFloat() * 6.0F / 16.0F;
            float f2 = (float)par4 + 0.5F;
            float f3 = 0.52F;
            float f4 = par5Random.nextFloat() * 0.6F - 0.3F;

            if (l == 4)
            {
                par1World.spawnParticle("smoke", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
                par1World.spawnParticle("flame", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
            }
            else if (l == 5)
            {
                par1World.spawnParticle("smoke", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
                par1World.spawnParticle("flame", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
            }
            else if (l == 2)
            {
                par1World.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0D, 0.0D, 0.0D);
                par1World.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0D, 0.0D, 0.0D);
            }
            else if (l == 3)
            {
                par1World.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0D, 0.0D, 0.0D);
                par1World.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0D, 0.0D, 0.0D);
            }
        }
    }

    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    public TileEntity createNewTileEntity(World par1World)
    {
        return new TileEntityLiquefier();
    }

    /**
     * Called when the block is placed in the world.
     */
    public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLiving par5EntityLiving, ItemStack par6ItemStack)
    {
        int l = MathHelper.floor_double((double)(par5EntityLiving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

        if (l == 0)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 2, 2);
        }

        if (l == 1)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 5, 2);
        }

        if (l == 2)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 3, 2);
        }

        if (l == 3)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 4, 2);
        }

        if (par6ItemStack.hasDisplayName())
        {
            ((TileEntityLiquefier)par1World.getBlockTileEntity(par2, par3, par4)).func_94129_a(par6ItemStack.getDisplayName());
        }
    }

    /**
     * ejects contained items into the world, and notifies neighbours of an update, as appropriate
     */
    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
    {
        if (!keepFurnaceInventory)
        {
            TileEntityLiquefier tileentityfurnace = (TileEntityLiquefier)par1World.getBlockTileEntity(par2, par3, par4);

            if (tileentityfurnace != null)
            {
                for (int j1 = 0; j1 < tileentityfurnace.getSizeInventory(); ++j1)
                {
                    ItemStack itemstack = tileentityfurnace.getStackInSlot(j1);

                    if (itemstack != null)
                    {
                        float f = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
                        float f1 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
                        float f2 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;

                        while (itemstack.stackSize > 0)
                        {
                            int k1 = this.furnaceRand.nextInt(21) + 10;

                            if (k1 > itemstack.stackSize)
                            {
                                k1 = itemstack.stackSize;
                            }

                            itemstack.stackSize -= k1;
                            EntityItem entityitem = new EntityItem(par1World, (double)((float)par2 + f), (double)((float)par3 + f1), (double)((float)par4 + f2), new ItemStack(itemstack.itemID, k1, itemstack.getItemDamage()));

                            if (itemstack.hasTagCompound())
                            {
                                entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
                            }

                            float f3 = 0.05F;
                            entityitem.motionX = (double)((float)this.furnaceRand.nextGaussian() * f3);
                            entityitem.motionY = (double)((float)this.furnaceRand.nextGaussian() * f3 + 0.2F);
                            entityitem.motionZ = (double)((float)this.furnaceRand.nextGaussian() * f3);
                            par1World.spawnEntityInWorld(entityitem);
                        }
                    }
                }

                par1World.func_96440_m(par2, par3, par4, par5);
            }
        }

        super.breakBlock(par1World, par2, par3, par4, par5, par6);
    }

    /**
     * If this returns true, then comparators facing away from this block will use the value from
     * getComparatorInputOverride instead of the actual redstone signal strength.
     */
    public boolean hasComparatorInputOverride()
    {
        return true;
    }

    /**
     * If hasComparatorInputOverride returns true, the return value from this is used instead of the redstone signal
     * strength when this block inputs to a comparator.
     */
    public int getComparatorInputOverride(World par1World, int par2, int par3, int par4, int par5)
    {
        return Container.calcRedstoneFromInventory((IInventory)par1World.getBlockTileEntity(par2, par3, par4));
    }

    @SideOnly(Side.CLIENT)

    /**
     * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
     */
    public int idPicked(World par1World, int par2, int par3, int par4)
    {
        return Core.liquefierIdle.blockID;
    }
}

TileEntityLiquefier

package TechCraft;

import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import TechCraft.Liquefier;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
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 TechCraft.RecipesLiquefier;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.ForgeDummyContainer;

public class TileEntityLiquefier extends TileEntity implements ISidedInventory, net.minecraftforge.common.ISidedInventory
{
    private static final int[] field_102010_d = new int[] {0};
    private static final int[] field_102011_e = new int[] {2, 1};
    private static final int[] field_102009_f = new int[] {1};

    /**
     * The ItemStacks that hold the items currently being used in the furnace
     */
    private ItemStack[] furnaceItemStacks = new ItemStack[3];

    /** The number of ticks that the furnace will keep burning */
    public int furnaceBurnTime = 0;

    /**
     * The number of ticks that a fresh copy of the currently-burning item would keep the furnace burning for
     */
    public int currentItemBurnTime = 0;

    /** The number of ticks that the current item has been cooking for */
    public int furnaceCookTime = 0;
    private String field_94130_e;

    /**
     * Returns the number of slots in the inventory.
     */
    public int getSizeInventory()
    {
        return this.furnaceItemStacks.length;
    }

    /**
     * Returns the stack in slot i
     */
    public ItemStack getStackInSlot(int par1)
    {
        return this.furnaceItemStacks[par1];
    }

    /**
     * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
     * new stack.
     */
    public ItemStack decrStackSize(int par1, int par2)
    {
        if (this.furnaceItemStacks[par1] != null)
        {
            ItemStack itemstack;

            if (this.furnaceItemStacks[par1].stackSize <= par2)
            {
                itemstack = this.furnaceItemStacks[par1];
                this.furnaceItemStacks[par1] = null;
                return itemstack;
            }
            else
            {
                itemstack = this.furnaceItemStacks[par1].splitStack(par2);

                if (this.furnaceItemStacks[par1].stackSize == 0)
                {
                    this.furnaceItemStacks[par1] = null;
                }

                return itemstack;
            }
        }
        else
        {
            return null;
        }
    }

    /**
     * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
     * like when you close a workbench GUI.
     */
    public ItemStack getStackInSlotOnClosing(int par1)
    {
        if (this.furnaceItemStacks[par1] != null)
        {
            ItemStack itemstack = this.furnaceItemStacks[par1];
            this.furnaceItemStacks[par1] = null;
            return itemstack;
        }
        else
        {
            return null;
        }
    }

    /**
     * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
     */
    public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
    {
        this.furnaceItemStacks[par1] = par2ItemStack;

        if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit())
        {
            par2ItemStack.stackSize = this.getInventoryStackLimit();
        }
    }

    /**
     * Returns the name of the inventory.
     */
    public String getInvName()
    {
        return this.isInvNameLocalized() ? this.field_94130_e : "container.furnace";
    }

    /**
     * If this returns false, the inventory name will be used as an unlocalized name, and translated into the player's
     * language. Otherwise it will be used directly.
     */
    public boolean isInvNameLocalized()
    {
        return this.field_94130_e != null && this.field_94130_e.length() > 0;
    }

    public void func_94129_a(String par1Str)
    {
        this.field_94130_e = par1Str;
    }

    /**
     * Reads a tile entity from NBT.
     */
    public void readFromNBT(NBTTagCompound par1NBTTagCompound)
    {
        super.readFromNBT(par1NBTTagCompound);
        NBTTagList nbttaglist = par1NBTTagCompound.getTagList("Items");
        this.furnaceItemStacks = new ItemStack[this.getSizeInventory()];

        for (int i = 0; i < nbttaglist.tagCount(); ++i)
        {
            NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.tagAt(i);
            byte b0 = nbttagcompound1.getByte("Slot");

            if (b0 >= 0 && b0 < this.furnaceItemStacks.length)
            {
                this.furnaceItemStacks[b0] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
            }
        }

        this.furnaceBurnTime = par1NBTTagCompound.getShort("BurnTime");
        this.furnaceCookTime = par1NBTTagCompound.getShort("CookTime");
        this.currentItemBurnTime = getItemBurnTime(this.furnaceItemStacks[1]);

        if (par1NBTTagCompound.hasKey("CustomName"))
        {
            this.field_94130_e = par1NBTTagCompound.getString("CustomName");
        }
    }

    /**
     * Writes a tile entity to NBT.
     */
    public void writeToNBT(NBTTagCompound par1NBTTagCompound)
    {
        super.writeToNBT(par1NBTTagCompound);
        par1NBTTagCompound.setShort("BurnTime", (short)this.furnaceBurnTime);
        par1NBTTagCompound.setShort("CookTime", (short)this.furnaceCookTime);
        NBTTagList nbttaglist = new NBTTagList();

        for (int i = 0; i < this.furnaceItemStacks.length; ++i)
        {
            if (this.furnaceItemStacks[i] != null)
            {
                NBTTagCompound nbttagcompound1 = new NBTTagCompound();
                nbttagcompound1.setByte("Slot", (byte)i);
                this.furnaceItemStacks[i].writeToNBT(nbttagcompound1);
                nbttaglist.appendTag(nbttagcompound1);
            }
        }

        par1NBTTagCompound.setTag("Items", nbttaglist);

        if (this.isInvNameLocalized())
        {
            par1NBTTagCompound.setString("CustomName", this.field_94130_e);
        }
    }

    /**
     * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
     * this more of a set than a get?*
     */
    public int getInventoryStackLimit()
    {
        return 64;
    }

    @SideOnly(Side.CLIENT)

    /**
     * Returns an integer between 0 and the passed value representing how close the current item is to being completely
     * cooked
     */
    public int getCookProgressScaled(int par1)
    {
        return this.furnaceCookTime * par1 / 200;
    }

    @SideOnly(Side.CLIENT)

    /**
     * Returns an integer between 0 and the passed value representing how much burn time is left on the current fuel
     * item, where 0 means that the item is exhausted and the passed value means that the item is fresh
     */
    public int getBurnTimeRemainingScaled(int par1)
    {
        if (this.currentItemBurnTime == 0)
        {
            this.currentItemBurnTime = 200;
        }

        return this.furnaceBurnTime * par1 / this.currentItemBurnTime;
    }

    /**
     * Returns true if the furnace is currently burning
     */
    public boolean isBurning()
    {
        return this.furnaceBurnTime > 0;
    }

    /**
     * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
     * ticks and creates a new spawn inside its implementation.
     */
    public void updateEntity()
    {
        boolean flag = this.furnaceBurnTime > 0;
        boolean flag1 = 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)
                {
                    flag1 = 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();
                    flag1 = true;
                }
            }
            else
            {
                this.furnaceCookTime = 0;
            }

            if (flag != this.furnaceBurnTime > 0)
            {
                flag1 = true;
                Liquefier.updateFurnaceBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
            }
        }

        if (flag1)
        {
            this.onInventoryChanged();
        }
    }

    /**
     * Returns true if the furnace can smelt an item, i.e. has a source item, destination stack isn't full, etc.
     */
    private boolean canSmelt()
    {
        if (this.furnaceItemStacks[0] == null)
        {
            return false;
        }
        else
        {
            ItemStack itemstack = RecipesLiquefier.smelting().getSmeltingResult(this.furnaceItemStacks[0]);
            if (itemstack == null) return false;
            if (this.furnaceItemStacks[2] == null) return true;
            if (!this.furnaceItemStacks[2].isItemEqual(itemstack)) return false;
            int result = furnaceItemStacks[2].stackSize + itemstack.stackSize;
            return (result <= getInventoryStackLimit() && result <= itemstack.getMaxStackSize());
        }
    }

    /**
     * Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack
     */
    public void smeltItem()
    {
        if (this.canSmelt())
        {
            ItemStack itemstack = RecipesLiquefier.smelting().getSmeltingResult(this.furnaceItemStacks[0]);

            if (this.furnaceItemStacks[2] == null)
            {
                this.furnaceItemStacks[2] = itemstack.copy();
            }
            else if (this.furnaceItemStacks[2].isItemEqual(itemstack))
            {
                furnaceItemStacks[2].stackSize += itemstack.stackSize;
            }

            --this.furnaceItemStacks[0].stackSize;

            if (this.furnaceItemStacks[0].stackSize <= 0)
            {
                this.furnaceItemStacks[0] = null;
            }
        }
    }

    /**
     * Returns the number of ticks that the supplied fuel item will keep the furnace burning, or 0 if the item isn't
     * fuel
     */
    public static int getItemBurnTime(ItemStack par0ItemStack)
    {
        if (par0ItemStack == null)
        {
            return 0;
        }
        else
        {
            int i = par0ItemStack.getItem().itemID;
            Item item = par0ItemStack.getItem();

            if (par0ItemStack.getItem() instanceof ItemBlock && Block.blocksList[i] != null)
            {
                Block block = Block.blocksList[i];

                if (block == Block.woodSingleSlab)
                {
                    return 150;
                }

                if (block.blockMaterial == Material.wood)
                {
                    return 300;
                }
            }

            if (item instanceof ItemTool && ((ItemTool) item).getToolMaterialName().equals("WOOD")) return 200;
            if (item instanceof ItemSword && ((ItemSword) item).getToolMaterialName().equals("WOOD")) return 200;
            if (item instanceof ItemHoe && ((ItemHoe) item).getMaterialName().equals("WOOD")) return 200;
            if (i == Item.stick.itemID) return 100;
            if (i == Item.coal.itemID) return 1600;
            if (i == Item.bucketLava.itemID) return 20000;
            if (i == Block.sapling.blockID) return 100;
            if (i == Item.blazeRod.itemID) return 2400;
            return GameRegistry.getFuelValue(par0ItemStack);
        }
    }

    /**
     * Return true if item is a fuel source (getItemBurnTime() > 0).
     */
    public static boolean isItemFuel(ItemStack par0ItemStack)
    {
        return getItemBurnTime(par0ItemStack) > 0;
    }

    /**
     * Do not make give this method the name canInteractWith because it clashes with Container
     */
    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() {}

    /**
     * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot.
     */
    public boolean isStackValidForSlot(int par1, ItemStack par2ItemStack)
    {
        return par1 == 2 ? false : (par1 == 1 ? isItemFuel(par2ItemStack) : true);
    }

    /**
     * Returns an array containing the indices of the slots that can be accessed by automation on the given side of this
     * block.
     */
    public int[] getAccessibleSlotsFromSide(int par1)
    {
        return par1 == 0 ? field_102011_e : (par1 == 1 ? field_102010_d : field_102009_f);
    }

    /**
     * Returns true if automation can insert the given item in the given slot from the given side. Args: Slot, item,
     * side
     */
    public boolean canInsertItem(int par1, ItemStack par2ItemStack, int par3)
    {
        return this.isStackValidForSlot(par1, par2ItemStack);
    }

    /**
     * Returns true if automation can extract the given item in the given slot from the given side. Args: Slot, item,
     * side
     */
    public boolean canExtractItem(int par1, ItemStack par2ItemStack, int par3)
    {
        return par3 != 0 || par1 != 1 || par2ItemStack.itemID == Item.bucketEmpty.itemID;
    }

    /***********************************************************************************
     * This function is here for compatibilities sake, Modders should Check for
     * Sided before ContainerWorldly, Vanilla Minecraft does not follow the sided standard
     * that Modding has for a while.
     *
     * In vanilla:
     *
     *   Top: Ores
     *   Sides: Fuel
     *   Bottom: Output
     *
     * Standard Modding:
     *   Top: Ores
     *   Sides: Output
     *   Bottom: Fuel
     *
     * The Modding one is designed after the GUI, the vanilla one is designed because its
     * intended use is for the hopper, which logically would take things in from the top.
     *
     * This will possibly be removed in future updates, and make vanilla the definitive
     * standard.
     */

    @Override
    public int getStartInventorySide(ForgeDirection side)
    {
        if (ForgeDummyContainer.legacyFurnaceSides)
        {
            if (side == ForgeDirection.DOWN) return 1;
            if (side == ForgeDirection.UP) return 0;
            return 2;
        }
        else
        {
            if (side == ForgeDirection.DOWN) return 2;
            if (side == ForgeDirection.UP) return 0;
            return 1;
        }
    }

    @Override
    public int getSizeInventorySide(ForgeDirection side)
    {
        return 1;
    }
}

ContainerLiquefier

package TechCraft;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import TechCraft.RecipesLiquefier;
import TechCraft.TileEntityLiquefier;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class ContainerLiquefier extends Container
{
    private TileEntityLiquefier furnace;
    private int lastCookTime = 0;
    private int lastBurnTime = 0;
    private int lastItemBurnTime = 0;

    public ContainerLiquefier(InventoryPlayer par1InventoryPlayer, TileEntityLiquefier par2TileEntityFurnace)
    {
        this.furnace = par2TileEntityFurnace;
        this.addSlotToContainer(new Slot(par2TileEntityFurnace, 0, 56, 17));
        this.addSlotToContainer(new Slot(par2TileEntityFurnace, 1, 56, 53));
        this.addSlotToContainer(new SlotLiquefier(par1InventoryPlayer.player, par2TileEntityFurnace, 2, 116, 35));
        int i;

        for (i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(par1InventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
            }
        }

        for (i = 0; i < 9; ++i)
        {
            this.addSlotToContainer(new Slot(par1InventoryPlayer, i, 8 + i * 18, 142));
        }
    }

    public void addCraftingToCrafters(ICrafting par1ICrafting)
    {
        super.addCraftingToCrafters(par1ICrafting);
        par1ICrafting.sendProgressBarUpdate(this, 0, this.furnace.furnaceCookTime);
        par1ICrafting.sendProgressBarUpdate(this, 1, this.furnace.furnaceBurnTime);
        par1ICrafting.sendProgressBarUpdate(this, 2, this.furnace.currentItemBurnTime);
    }

    /**
     * Looks for changes made in the container, sends them to every listener.
     */
    public void detectAndSendChanges()
    {
        super.detectAndSendChanges();

        for (int i = 0; i < this.crafters.size(); ++i)
        {
            ICrafting icrafting = (ICrafting)this.crafters.get(i);

            if (this.lastCookTime != this.furnace.furnaceCookTime)
            {
                icrafting.sendProgressBarUpdate(this, 0, this.furnace.furnaceCookTime);
            }

            if (this.lastBurnTime != this.furnace.furnaceBurnTime)
            {
                icrafting.sendProgressBarUpdate(this, 1, this.furnace.furnaceBurnTime);
            }

            if (this.lastItemBurnTime != this.furnace.currentItemBurnTime)
            {
                icrafting.sendProgressBarUpdate(this, 2, this.furnace.currentItemBurnTime);
            }
        }

        this.lastCookTime = this.furnace.furnaceCookTime;
        this.lastBurnTime = this.furnace.furnaceBurnTime;
        this.lastItemBurnTime = this.furnace.currentItemBurnTime;
    }

    @SideOnly(Side.CLIENT)
    public void updateProgressBar(int par1, int par2)
    {
        if (par1 == 0)
        {
            this.furnace.furnaceCookTime = par2;
        }

        if (par1 == 1)
        {
            this.furnace.furnaceBurnTime = par2;
        }

        if (par1 == 2)
        {
            this.furnace.currentItemBurnTime = par2;
        }
    }

    public boolean canInteractWith(EntityPlayer par1EntityPlayer)
    {
        return this.furnace.isUseableByPlayer(par1EntityPlayer);
    }

    /**
     * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
     */
    public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
    {
        ItemStack itemstack = null;
        Slot slot = (Slot)this.inventorySlots.get(par2);

        if (slot != null && slot.getHasStack())
        {
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();

            if (par2 == 2)
            {
                if (!this.mergeItemStack(itemstack1, 3, 39, true))
                {
                    return null;
                }

                slot.onSlotChange(itemstack1, itemstack);
            }
            else if (par2 != 1 && par2 != 0)
            {
                if (RecipesLiquefier.smelting().getSmeltingResult(itemstack1) != null)
                {
                    if (!this.mergeItemStack(itemstack1, 0, 1, false))
                    {
                        return null;
                    }
                }
                else if (TileEntityLiquefier.isItemFuel(itemstack1))
                {
                    if (!this.mergeItemStack(itemstack1, 1, 2, false))
                    {
                        return null;
                    }
                }
                else if (par2 >= 3 && par2 < 30)
                {
                    if (!this.mergeItemStack(itemstack1, 30, 39, false))
                    {
                        return null;
                    }
                }
                else if (par2 >= 30 && par2 < 39 && !this.mergeItemStack(itemstack1, 3, 30, false))
                {
                    return null;
                }
            }
            else if (!this.mergeItemStack(itemstack1, 3, 39, false))
            {
                return null;
            }

            if (itemstack1.stackSize == 0)
            {
                slot.putStack((ItemStack)null);
            }
            else
            {
                slot.onSlotChanged();
            }

            if (itemstack1.stackSize == itemstack.stackSize)
            {
                return null;
            }

            slot.onPickupFromSlot(par1EntityPlayer, itemstack1);
        }

        return itemstack;
    }
}

GuiLiquefier

package TechCraft;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import TechCraft.ContainerLiquefier;
import TechCraft.TileEntityLiquefier;
import net.minecraft.util.StatCollector;

import org.lwjgl.opengl.GL11;

@SideOnly(Side.CLIENT)
public class GuiLiquefier extends GuiContainer
{
    private TileEntityLiquefier furnaceInventory;

    public GuiLiquefier(InventoryPlayer par1InventoryPlayer, TileEntityLiquefier par2TileEntityFurnace)
    {
        super(new ContainerLiquefier(par1InventoryPlayer, par2TileEntityFurnace));
        this.furnaceInventory = par2TileEntityFurnace;
    }

    /**
     * Draw the foreground layer for the GuiContainer (everything in front of the items)
     */
    protected void drawGuiContainerForegroundLayer(int par1, int par2)
    {
        String s = this.furnaceInventory.isInvNameLocalized() ? this.furnaceInventory.getInvName() : StatCollector.translateToLocal("Liquefier");
        this.fontRenderer.drawString(s, this.xSize / 2 - this.fontRenderer.getStringWidth(s) / 2, 6, 4210752);
        this.fontRenderer.drawString(StatCollector.translateToLocal("Inventory"), 8, this.ySize - 96 + 2, 4210752);
    }

    /**
     * Draw the background layer for the GuiContainer (everything behind the items)
     */
    protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
    {
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        this.mc.renderEngine.bindTexture("/gui/furnace.png");
        int k = (this.width - this.xSize) / 2;
        int l = (this.height - this.ySize) / 2;
        this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
        int i1;

        if (this.furnaceInventory.isBurning())
        {
            i1 = this.furnaceInventory.getBurnTimeRemainingScaled(12);
            this.drawTexturedModalRect(k + 56, l + 36 + 12 - i1, 176, 12 - i1, 14, i1 + 2);
        }

        i1 = this.furnaceInventory.getCookProgressScaled(24);
        this.drawTexturedModalRect(k + 79, l + 34, 176, 14, i1 + 1, 16);
    }
}

SlotLiquefier

package TechCraft;

import cpw.mods.fml.common.registry.GameRegistry;
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 TechCraft.RecipesLiquefier;
import net.minecraft.stats.AchievementList;
import net.minecraft.util.MathHelper;

public class SlotLiquefier extends Slot
{
    /** The player that is using the GUI where this slot resides. */
    private EntityPlayer thePlayer;
    private int field_75228_b;

    public SlotLiquefier(EntityPlayer par1EntityPlayer, IInventory par2IInventory, int par3, int par4, int par5)
    {
        super(par2IInventory, par3, par4, par5);
        this.thePlayer = par1EntityPlayer;
    }

    /**
     * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
     */
    public boolean isItemValid(ItemStack par1ItemStack)
    {
        return false;
    }

    /**
     * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
     * stack.
     */
    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);
    }

    /**
     * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
     * internal count then calls onCrafting(item).
     */
    protected void onCrafting(ItemStack par1ItemStack, int par2)
    {
        this.field_75228_b += par2;
        this.onCrafting(par1ItemStack);
    }

    /**
     * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
     */
    protected void onCrafting(ItemStack par1ItemStack)
    {
        par1ItemStack.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.field_75228_b);

        if (!this.thePlayer.worldObj.isRemote)
        {
            int i = this.field_75228_b;
            float f = RecipesLiquefier.smelting().getExperience(par1ItemStack);
            int j;

            if (f == 0.0F)
            {
                i = 0;
            }
            else if (f < 1.0F)
            {
                j = MathHelper.floor_float((float)i * f);

                if (j < MathHelper.ceiling_float_int((float)i * f) && (float)Math.random() < (float)i * f - (float)j)
                {
                    ++j;
                }

                i = j;
            }

            while (i > 0)
            {
                j = EntityXPOrb.getXPSplit(i);
                i -= j;
                this.thePlayer.worldObj.spawnEntityInWorld(new EntityXPOrb(this.thePlayer.worldObj, this.thePlayer.posX, this.thePlayer.posY + 0.5D, this.thePlayer.posZ + 0.5D, j));
            }
        }

        this.field_75228_b = 0;

        GameRegistry.onItemSmelted(thePlayer, par1ItemStack);

        if (par1ItemStack.itemID == Item.ingotIron.itemID)
        {
            this.thePlayer.addStat(AchievementList.acquireIron, 1);
        }

        if (par1ItemStack.itemID == Item.fishCooked.itemID)
        {
            this.thePlayer.addStat(AchievementList.cookFish, 1);
        }
    }
}

GuiHandler

package TechCraft;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import TechCraft.*;
import cpw.mods.fml.common.network.IGuiHandler;
import cpw.mods.fml.common.network.NetworkRegistry;

public class GuiHandler implements IGuiHandler {
public GuiHandler() {
NetworkRegistry.instance().registerGuiHandler(Core.instance, this);
}

@Override
public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {
TileEntity entity = world.getBlockTileEntity(x, y, z);

switch(id) {
case 0:
return new ContainerCooler(player.inventory, (TileEntityCooler) entity);
case 1:

return new ContainerLiquefier(player.inventory, (TileEntityLiquefier) entity);
}
return null;

}

@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {
TileEntity entity = world.getBlockTileEntity(x, y, z);

switch(id) {
case 0:
return new GuiCooler(player.inventory, (TileEntityCooler) entity);

case 1:

return new GuiLiquefier(player.inventory, (TileEntityLiquefier) entity);

}
return null;
}
}

Cooler

package TechCraft;

import java.util.Random;

import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import TechCraft.TileEntityCooler;
import net.minecraft.util.Icon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class Cooler extends BlockContainer
{
    /**
     * Is the random generator used by furnace to drop the inventory contents in random directions.
     */
    private final Random furnaceRand = new Random();

    /** True if this is an active furnace, false if idle */
    private final boolean isActive;

    /**
     * This flag is used to prevent the furnace inventory to be dropped upon block removal, is used internally when the
     * furnace block changes from idle to active and vice-versa.
     */
    private static boolean keepFurnaceInventory = false;
    @SideOnly(Side.CLIENT)
    private Icon furnaceIconTop;
    @SideOnly(Side.CLIENT)
    private Icon furnaceIconFront;

    protected Cooler(int par1, boolean par2)
    {
        super(par1, Material.rock);
        this.isActive = par2;
    }

    /**
     * Returns the ID of the items to drop on destruction.
     */
    public int idDropped(int par1, Random par2Random, int par3)
    {
        return Core.coolerIdle.blockID;
    }

    /**
     * Called whenever the block is added into the world. Args: world, x, y, z
     */
    public void onBlockAdded(World par1World, int par2, int par3, int par4)
    {
        super.onBlockAdded(par1World, par2, par3, par4);
        this.setDefaultDirection(par1World, par2, par3, par4);
    }

    /**
     * set a blocks direction
     */
    private void setDefaultDirection(World par1World, int par2, int par3, int par4)
    {
        if (!par1World.isRemote)
        {
            int l = par1World.getBlockId(par2, par3, par4 - 1);
            int i1 = par1World.getBlockId(par2, par3, par4 + 1);
            int j1 = par1World.getBlockId(par2 - 1, par3, par4);
            int k1 = par1World.getBlockId(par2 + 1, par3, par4);
            byte b0 = 3;

            if (Block.opaqueCubeLookup[l] && !Block.opaqueCubeLookup[i1])
            {
                b0 = 3;
            }

            if (Block.opaqueCubeLookup[i1] && !Block.opaqueCubeLookup[l])
            {
                b0 = 2;
            }

            if (Block.opaqueCubeLookup[j1] && !Block.opaqueCubeLookup[k1])
            {
                b0 = 5;
            }

            if (Block.opaqueCubeLookup[k1] && !Block.opaqueCubeLookup[j1])
            {
                b0 = 4;
            }

            par1World.setBlockMetadataWithNotify(par2, par3, par4, b0, 2);
        }
    }

    @SideOnly(Side.CLIENT)

    /**
     * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
     */
    public Icon getIcon(int par1, int par2)
    {
        return par1 == 1 ? this.furnaceIconTop : (par1 == 0 ? this.furnaceIconTop : (par1 != par2 ? this.blockIcon : this.furnaceIconFront));
    }

    @SideOnly(Side.CLIENT)

    /**
     * When this method is called, your block should register all the icons it needs with the given IconRegister. This
     * is the only chance you get to register icons.
     */
    public void registerIcons(IconRegister par1IconRegister)
    {
        this.blockIcon = par1IconRegister.registerIcon("TechCraft:machine_side");
        this.furnaceIconFront = par1IconRegister.registerIcon(this.isActive ? "TechCraft:machine_front_frost" : "TechCraft:machine_front");
        this.furnaceIconTop = par1IconRegister.registerIcon("TechCraft:machine_top");
    }

    /**
     * Called upon block activation (right click on the block.)
     */
    public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer player, int par6, float par7, float par8, float par9)
    {
        if (par1World.isRemote)
        {
            return true;
        }
        else
        {
            TileEntityCooler tileentityfurnace = (TileEntityCooler)par1World.getBlockTileEntity(par2, par3, par4);

            if (tileentityfurnace != null)
            {
            	player.openGui(Core.instance, 0, par1World, par2, par3, par4);
            }

            return true;
        }
    }

    /**
     * Update which block ID the furnace is using depending on whether or not it is burning
     */
    public static void updateFurnaceBlockState(boolean par0, World par1World, int par2, int par3, int par4)
    {
        int l = par1World.getBlockMetadata(par2, par3, par4);
        TileEntity tileentity = par1World.getBlockTileEntity(par2, par3, par4);
        keepFurnaceInventory = true;

        if (par0)
        {
            par1World.setBlock(par2, par3, par4, Core.coolerActive.blockID);
        }
        else
        {
            par1World.setBlock(par2, par3, par4, Core.coolerIdle.blockID);
        }

        keepFurnaceInventory = false;
        par1World.setBlockMetadataWithNotify(par2, par3, par4, l, 2);

        if (tileentity != null)
        {
            tileentity.validate();
            par1World.setBlockTileEntity(par2, par3, par4, tileentity);
        }
    }

    @SideOnly(Side.CLIENT)

    public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
    {
        if (this.isActive)
        {
            int l = par1World.getBlockMetadata(par2, par3, par4);
            float f = (float)par2 + 0.5F;
            float f1 = (float)par3 + 0.0F + par5Random.nextFloat() * 6.0F / 16.0F;
            float f2 = (float)par4 + 0.5F;
            float f3 = 0.52F;
            float f4 = par5Random.nextFloat() * 0.6F - 0.3F;

            
        }
    }

    /**
     * Returns a new instance of a block's tile entity class. Called on placing the block.
     */
    public TileEntity createNewTileEntity(World par1World)
    {
        return new TileEntityCooler();
    }

    /**
     * Called when the block is placed in the world.
     */
    public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLiving par5EntityLiving, ItemStack par6ItemStack)
    {
        int l = MathHelper.floor_double((double)(par5EntityLiving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

        if (l == 0)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 2, 2);
        }

        if (l == 1)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 5, 2);
        }

        if (l == 2)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 3, 2);
        }

        if (l == 3)
        {
            par1World.setBlockMetadataWithNotify(par2, par3, par4, 4, 2);
        }

        if (par6ItemStack.hasDisplayName())
        {
            ((TileEntityCooler)par1World.getBlockTileEntity(par2, par3, par4)).func_94129_a(par6ItemStack.getDisplayName());
        }
    }

    /**
     * ejects contained items into the world, and notifies neighbours of an update, as appropriate
     */
    public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6)
    {
        if (!keepFurnaceInventory)
        {
            TileEntityCooler tileentityfurnace = (TileEntityCooler)par1World.getBlockTileEntity(par2, par3, par4);

            if (tileentityfurnace != null)
            {
                for (int j1 = 0; j1 < tileentityfurnace.getSizeInventory(); ++j1)
                {
                    ItemStack itemstack = tileentityfurnace.getStackInSlot(j1);

                    if (itemstack != null)
                    {
                        float f = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
                        float f1 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
                        float f2 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;

                        while (itemstack.stackSize > 0)
                        {
                            int k1 = this.furnaceRand.nextInt(21) + 10;

                            if (k1 > itemstack.stackSize)
                            {
                                k1 = itemstack.stackSize;
                            }

                            itemstack.stackSize -= k1;
                            EntityItem entityitem = new EntityItem(par1World, (double)((float)par2 + f), (double)((float)par3 + f1), (double)((float)par4 + f2), new ItemStack(itemstack.itemID, k1, itemstack.getItemDamage()));

                            if (itemstack.hasTagCompound())
                            {
                                entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
                            }

                            float f3 = 0.05F;
                            entityitem.motionX = (double)((float)this.furnaceRand.nextGaussian() * f3);
                            entityitem.motionY = (double)((float)this.furnaceRand.nextGaussian() * f3 + 0.2F);
                            entityitem.motionZ = (double)((float)this.furnaceRand.nextGaussian() * f3);
                            par1World.spawnEntityInWorld(entityitem);
                        }
                    }
                }

                par1World.func_96440_m(par2, par3, par4, par5);
            }
        }

        super.breakBlock(par1World, par2, par3, par4, par5, par6);
    }

    /**
     * If this returns true, then comparators facing away from this block will use the value from
     * getComparatorInputOverride instead of the actual redstone signal strength.
     */
    public boolean hasComparatorInputOverride()
    {
        return true;
    }

    /**
     * If hasComparatorInputOverride returns true, the return value from this is used instead of the redstone signal
     * strength when this block inputs to a comparator.
     */
    public int getComparatorInputOverride(World par1World, int par2, int par3, int par4, int par5)
    {
        return Container.calcRedstoneFromInventory((IInventory)par1World.getBlockTileEntity(par2, par3, par4));
    }

    @SideOnly(Side.CLIENT)

    /**
     * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
     */
    public int idPicked(World par1World, int par2, int par3, int par4)
    {
        return Core.coolerIdle.blockID;
    }
}

TileEntityCooler

package TechCraft;

import net.minecraft.block.Block;
import TechCraft.Cooler;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
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 TechCraft.RecipesCooler;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.ForgeDummyContainer;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class TileEntityCooler extends TileEntity implements ISidedInventory, net.minecraftforge.common.ISidedInventory
{
    private static final int[] field_102010_d = new int[] {0};
    private static final int[] field_102011_e = new int[] {2, 1};
    private static final int[] field_102009_f = new int[] {1};

    /**
     * The ItemStacks that hold the items currently being used in the furnace
     */
    private ItemStack[] furnaceItemStacks = new ItemStack[3];

    /** The number of ticks that the furnace will keep burning */
    public int coolerFrostTime = 0;

    /**
     * The number of ticks that a fresh copy of the currently-burning item would keep the furnace burning for
     */
    public int currentItemBurnTime = 0;

    /** The number of ticks that the current item has been cooking for */
    public int furnaceCookTime = 0;
    private String field_94130_e;

    /**
     * Returns the number of slots in the inventory.
     */
    public int getSizeInventory()
    {
        return this.furnaceItemStacks.length;
    }

    /**
     * Returns the stack in slot i
     */
    public ItemStack getStackInSlot(int par1)
    {
        return this.furnaceItemStacks[par1];
    }

    /**
     * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
     * new stack.
     */
    public ItemStack decrStackSize(int par1, int par2)
    {
        if (this.furnaceItemStacks[par1] != null)
        {
            ItemStack itemstack;

            if (this.furnaceItemStacks[par1].stackSize <= par2)
            {
                itemstack = this.furnaceItemStacks[par1];
                this.furnaceItemStacks[par1] = null;
                return itemstack;
            }
            else
            {
                itemstack = this.furnaceItemStacks[par1].splitStack(par2);

                if (this.furnaceItemStacks[par1].stackSize == 0)
                {
                    this.furnaceItemStacks[par1] = null;
                }

                return itemstack;
            }
        }
        else
        {
            return null;
        }
    }

    /**
     * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
     * like when you close a workbench GUI.
     */
    public ItemStack getStackInSlotOnClosing(int par1)
    {
        if (this.furnaceItemStacks[par1] != null)
        {
            ItemStack itemstack = this.furnaceItemStacks[par1];
            this.furnaceItemStacks[par1] = null;
            return itemstack;
        }
        else
        {
            return null;
        }
    }

    /**
     * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
     */
    public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
    {
        this.furnaceItemStacks[par1] = par2ItemStack;

        if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit())
        {
            par2ItemStack.stackSize = this.getInventoryStackLimit();
        }
    }

    /**
     * Returns the name of the inventory.
     */
    public String getInvName()
    {
        return this.isInvNameLocalized() ? this.field_94130_e : "container.furnace";
    }

    /**
     * If this returns false, the inventory name will be used as an unlocalized name, and translated into the player's
     * language. Otherwise it will be used directly.
     */
    public boolean isInvNameLocalized()
    {
        return this.field_94130_e != null && this.field_94130_e.length() > 0;
    }

    public void func_94129_a(String par1Str)
    {
        this.field_94130_e = par1Str;
    }

    /**
     * Reads a tile entity from NBT.
     */
    public void readFromNBT(NBTTagCompound par1NBTTagCompound)
    {
        super.readFromNBT(par1NBTTagCompound);
        NBTTagList nbttaglist = par1NBTTagCompound.getTagList("Items");
        this.furnaceItemStacks = new ItemStack[this.getSizeInventory()];

        for (int i = 0; i < nbttaglist.tagCount(); ++i)
        {
            NBTTagCompound nbttagcompound1 = (NBTTagCompound)nbttaglist.tagAt(i);
            byte b0 = nbttagcompound1.getByte("Slot");

            if (b0 >= 0 && b0 < this.furnaceItemStacks.length)
            {
                this.furnaceItemStacks[b0] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
            }
        }

        this.coolerFrostTime = par1NBTTagCompound.getShort("BurnTime");
        this.furnaceCookTime = par1NBTTagCompound.getShort("CookTime");
        this.currentItemBurnTime = getItemBurnTime(this.furnaceItemStacks[1]);

        if (par1NBTTagCompound.hasKey("CustomName"))
        {
            this.field_94130_e = par1NBTTagCompound.getString("CustomName");
        }
    }

    /**
     * Writes a tile entity to NBT.
     */
    public void writeToNBT(NBTTagCompound par1NBTTagCompound)
    {
        super.writeToNBT(par1NBTTagCompound);
        par1NBTTagCompound.setShort("BurnTime", (short)this.coolerFrostTime);
        par1NBTTagCompound.setShort("CookTime", (short)this.furnaceCookTime);
        NBTTagList nbttaglist = new NBTTagList();

        for (int i = 0; i < this.furnaceItemStacks.length; ++i)
        {
            if (this.furnaceItemStacks[i] != null)
            {
                NBTTagCompound nbttagcompound1 = new NBTTagCompound();
                nbttagcompound1.setByte("Slot", (byte)i);
                this.furnaceItemStacks[i].writeToNBT(nbttagcompound1);
                nbttaglist.appendTag(nbttagcompound1);
            }
        }

        par1NBTTagCompound.setTag("Items", nbttaglist);

        if (this.isInvNameLocalized())
        {
            par1NBTTagCompound.setString("CustomName", this.field_94130_e);
        }
    }

    /**
     * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
     * this more of a set than a get?*
     */
    public int getInventoryStackLimit()
    {
        return 64;
    }

    @SideOnly(Side.CLIENT)

    /**
     * Returns an integer between 0 and the passed value representing how close the current item is to being completely
     * cooked
     */
    public int getCookProgressScaled(int par1)
    {
        return this.furnaceCookTime * par1 / 200;
    }

    @SideOnly(Side.CLIENT)

    /**
     * Returns an integer between 0 and the passed value representing how much burn time is left on the current fuel
     * item, where 0 means that the item is exhausted and the passed value means that the item is fresh
     */
    public int getBurnTimeRemainingScaled(int par1)
    {
        if (this.currentItemBurnTime == 0)
        {
            this.currentItemBurnTime = 200;
        }

        return this.coolerFrostTime * par1 / this.currentItemBurnTime;
    }

    /**
     * Returns true if the furnace is currently burning
     */
    public boolean isBurning()
    {
        return this.coolerFrostTime > 0;
    }

    /**
     * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
     * ticks and creates a new spawn inside its implementation.
     */
    public void updateEntity()
    {
        boolean flag = this.coolerFrostTime > 0;
        boolean flag1 = false;

        if (this.coolerFrostTime > 0)
        {
            --this.coolerFrostTime;
        }

        if (!this.worldObj.isRemote)
        {
            if (this.coolerFrostTime == 0 && this.canSmelt())
            {
                this.currentItemBurnTime = this.coolerFrostTime = getItemBurnTime(this.furnaceItemStacks[1]);

                if (this.coolerFrostTime > 0)
                {
                    flag1 = 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();
                    flag1 = true;
                }
            }
            else
            {
                this.furnaceCookTime = 0;
            }

            if (flag != this.coolerFrostTime > 0)
            {
                flag1 = true;
                Cooler.updateFurnaceBlockState(this.coolerFrostTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
            }
        }

        if (flag1)
        {
            this.onInventoryChanged();
        }
    }

    /**
     * Returns true if the furnace can smelt an item, i.e. has a source item, destination stack isn't full, etc.
     */
    private boolean canSmelt()
    {
        if (this.furnaceItemStacks[0] == null)
        {
            return false;
        }
        else
        {
            ItemStack itemstack = RecipesCooler.smelting().getSmeltingResult(this.furnaceItemStacks[0]);
            if (itemstack == null) return false;
            if (this.furnaceItemStacks[2] == null) return true;
            if (!this.furnaceItemStacks[2].isItemEqual(itemstack)) return false;
            int result = furnaceItemStacks[2].stackSize + itemstack.stackSize;
            return (result <= getInventoryStackLimit() && result <= itemstack.getMaxStackSize());
        }
    }

    /**
     * Turn one item from the furnace source stack into the appropriate smelted item in the furnace result stack
     */
    public void smeltItem()
    {
        if (this.canSmelt())
        {
            ItemStack itemstack = RecipesCooler.smelting().getSmeltingResult(this.furnaceItemStacks[0]);

            if (this.furnaceItemStacks[2] == null)
            {
                this.furnaceItemStacks[2] = itemstack.copy();
            }
            else if (this.furnaceItemStacks[2].isItemEqual(itemstack))
            {
                furnaceItemStacks[2].stackSize += itemstack.stackSize;
            }

            --this.furnaceItemStacks[0].stackSize;

            if (this.furnaceItemStacks[0].stackSize <= 0)
            {
                this.furnaceItemStacks[0] = null;
            }
        }
    }

    /**
     * Returns the number of ticks that the supplied fuel item will keep the furnace burning, or 0 if the item isn't
     * fuel
     */
    public static int getItemBurnTime(ItemStack par0ItemStack)
    {
        if (par0ItemStack == null)
        {
            return 0;
        }
        else
        {
            int i = par0ItemStack.getItem().itemID;
            Item item = par0ItemStack.getItem();

            if (par0ItemStack.getItem() instanceof ItemBlock && Block.blocksList[i] != null)
            {
                Block block = Block.blocksList[i];

                if (block == Block.woodSingleSlab)
                {
                    return 150;
                }

                if (block.blockMaterial == Material.wood)
                {
                    return 300;
                }
            }

            if (item instanceof ItemTool && ((ItemTool) item).getToolMaterialName().equals("WOOD")) return 200;
            if (item instanceof ItemSword && ((ItemSword) item).getToolMaterialName().equals("WOOD")) return 200;
            if (item instanceof ItemHoe && ((ItemHoe) item).getMaterialName().equals("WOOD")) return 200;
            if (i == Item.stick.itemID) return 100;
            if (i == Item.coal.itemID) return 1600;
            if (i == Item.bucketLava.itemID) return 20000;
            if (i == Block.sapling.blockID) return 100;
            if (i == Item.blazeRod.itemID) return 2400;
            return GameRegistry.getFuelValue(par0ItemStack);
        }
    }

    /**
     * Return true if item is a fuel source (getItemBurnTime() > 0).
     */
    public static boolean isItemFuel(ItemStack par0ItemStack)
    {
        return getItemBurnTime(par0ItemStack) > 0;
    }

    /**
     * Do not make give this method the name canInteractWith because it clashes with Container
     */
    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() {}

    /**
     * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot.
     */
    public boolean isStackValidForSlot(int par1, ItemStack par2ItemStack)
    {
        return par1 == 2 ? false : (par1 == 1 ? isItemFuel(par2ItemStack) : true);
    }

    /**
     * Returns an array containing the indices of the slots that can be accessed by automation on the given side of this
     * block.
     */
    public int[] getAccessibleSlotsFromSide(int par1)
    {
        return par1 == 0 ? field_102011_e : (par1 == 1 ? field_102010_d : field_102009_f);
    }

    /**
     * Returns true if automation can insert the given item in the given slot from the given side. Args: Slot, item,
     * side
     */
    public boolean canInsertItem(int par1, ItemStack par2ItemStack, int par3)
    {
        return this.isStackValidForSlot(par1, par2ItemStack);
    }

    /**
     * Returns true if automation can extract the given item in the given slot from the given side. Args: Slot, item,
     * side
     */
    public boolean canExtractItem(int par1, ItemStack par2ItemStack, int par3)
    {
        return par3 != 0 || par1 != 1 || par2ItemStack.itemID == Item.bucketEmpty.itemID;
    }

    /***********************************************************************************
     * This function is here for compatibilities sake, Modders should Check for
     * Sided before ContainerWorldly, Vanilla Minecraft does not follow the sided standard
     * that Modding has for a while.
     *
     * In vanilla:
     *
     *   Top: Ores
     *   Sides: Fuel
     *   Bottom: Output
     *
     * Standard Modding:
     *   Top: Ores
     *   Sides: Output
     *   Bottom: Fuel
     *
     * The Modding one is designed after the GUI, the vanilla one is designed because its
     * intended use is for the hopper, which logically would take things in from the top.
     *
     * This will possibly be removed in future updates, and make vanilla the definitive
     * standard.
     */

    @Override
    public int getStartInventorySide(ForgeDirection side)
    {
        if (ForgeDummyContainer.legacyFurnaceSides)
        {
            if (side == ForgeDirection.DOWN) return 1;
            if (side == ForgeDirection.UP) return 0;
            return 2;
        }
        else
        {
            if (side == ForgeDirection.DOWN) return 2;
            if (side == ForgeDirection.UP) return 0;
            return 1;
        }
    }

    @Override
    public int getSizeInventorySide(ForgeDirection side)
    {
        return 1;
    }
}

GuiCooler

package TechCraft;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import TechCraft.ContainerCooler;
import TechCraft.TileEntityCooler;
import net.minecraft.util.StatCollector;

import org.lwjgl.opengl.GL11;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

@SideOnly(Side.CLIENT)
public class GuiCooler extends GuiContainer
{
    private TileEntityCooler furnaceInventory;

    public GuiCooler(InventoryPlayer par1InventoryPlayer, TileEntityCooler par2TileEntityFurnace)
    {
        super(new ContainerCooler(par1InventoryPlayer, par2TileEntityFurnace));
        this.furnaceInventory = par2TileEntityFurnace;
    }

    /**
     * Draw the foreground layer for the GuiContainer (everything in front of the items)
     */
    protected void drawGuiContainerForegroundLayer(int par1, int par2)
    {
        String s = this.furnaceInventory.isInvNameLocalized() ? this.furnaceInventory.getInvName() : StatCollector.translateToLocal("Cooler");
        this.fontRenderer.drawString(s, this.xSize / 2 - this.fontRenderer.getStringWidth(s) / 2, 6, 4210752);
        this.fontRenderer.drawString(StatCollector.translateToLocal("Inventory"), 8, this.ySize - 96 + 2, 4210752);
    }

    /**
     * Draw the background layer for the GuiContainer (everything behind the items)
     */
    protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
    {
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        this.mc.renderEngine.bindTexture("/gui/furnace.png");
        int k = (this.width - this.xSize) / 2;
        int l = (this.height - this.ySize) / 2;
        this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
        int i1;

        if (this.furnaceInventory.isBurning())
        {
            i1 = this.furnaceInventory.getBurnTimeRemainingScaled(12);
            this.drawTexturedModalRect(k + 56, l + 36 + 12 - i1, 176, 12 - i1, 14, i1 + 2);
        }

        i1 = this.furnaceInventory.getCookProgressScaled(24);
        this.drawTexturedModalRect(k + 79, l + 34, 176, 14, i1 + 1, 16);
    }
}

SlotCooler

package TechCraft;

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.stats.AchievementList;
import net.minecraft.util.MathHelper;
import cpw.mods.fml.common.registry.GameRegistry;

public class SlotCooler extends Slot
{
    /** The player that is using the GUI where this slot resides. */
    private EntityPlayer thePlayer;
    private int field_75228_b;

    public SlotCooler(EntityPlayer par1EntityPlayer, IInventory par2IInventory, int par3, int par4, int par5)
    {
        super(par2IInventory, par3, par4, par5);
        this.thePlayer = par1EntityPlayer;
    }

    /**
     * Check if the stack is a valid item for this slot. Always true beside for the armor slots.
     */
    public boolean isItemValid(ItemStack par1ItemStack)
    {
        return false;
    }

    /**
     * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
     * stack.
     */
    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);
    }

    /**
     * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
     * internal count then calls onCrafting(item).
     */
    protected void onCrafting(ItemStack par1ItemStack, int par2)
    {
        this.field_75228_b += par2;
        this.onCrafting(par1ItemStack);
    }

    /**
     * the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
     */
    protected void onCrafting(ItemStack par1ItemStack)
    {
        par1ItemStack.onCrafting(this.thePlayer.worldObj, this.thePlayer, this.field_75228_b);

        if (!this.thePlayer.worldObj.isRemote)
        {
            int i = this.field_75228_b;
            float f = RecipesCooler.smelting().getExperience(par1ItemStack);
            int j;

            if (f == 0.0F)
            {
                i = 0;
            }
            else if (f < 1.0F)
            {
                j = MathHelper.floor_float((float)i * f);

                if (j < MathHelper.ceiling_float_int((float)i * f) && (float)Math.random() < (float)i * f - (float)j)
                {
                    ++j;
                }

                i = j;
            }

            while (i > 0)
            {
                j = EntityXPOrb.getXPSplit(i);
                i -= j;
                this.thePlayer.worldObj.spawnEntityInWorld(new EntityXPOrb(this.thePlayer.worldObj, this.thePlayer.posX, this.thePlayer.posY + 0.5D, this.thePlayer.posZ + 0.5D, j));
            }
        }

        this.field_75228_b = 0;

        GameRegistry.onItemSmelted(thePlayer, par1ItemStack);

        if (par1ItemStack.itemID == Item.ingotIron.itemID)
        {
            this.thePlayer.addStat(AchievementList.acquireIron, 1);
        }

        if (par1ItemStack.itemID == Item.fishCooked.itemID)
        {
            this.thePlayer.addStat(AchievementList.cookFish, 1);
        }
    }
}

ContainerCooler

package TechCraft;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import TechCraft.SlotCooler;
import net.minecraft.item.ItemStack;
import TechCraft.RecipesCooler;
import TechCraft.TileEntityCooler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class ContainerCooler extends Container
{
    private TileEntityCooler cooler;
    private int lastCoolTime = 0;
    private int lastFrostTime = 0;
    private int lastItemFrostTime = 0;

    public ContainerCooler(InventoryPlayer par1InventoryPlayer, TileEntityCooler par2TileEntityFurnace)
    {
        this.cooler = par2TileEntityFurnace;
        this.addSlotToContainer(new Slot(par2TileEntityFurnace, 0, 56, 17));
        this.addSlotToContainer(new Slot(par2TileEntityFurnace, 1, 56, 53));
        this.addSlotToContainer(new SlotCooler(par1InventoryPlayer.player, par2TileEntityFurnace, 2, 116, 35));
        int i;

        for (i = 0; i < 3; ++i)
        {
            for (int j = 0; j < 9; ++j)
            {
                this.addSlotToContainer(new Slot(par1InventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
            }
        }

        for (i = 0; i < 9; ++i)
        {
            this.addSlotToContainer(new Slot(par1InventoryPlayer, i, 8 + i * 18, 142));
        }
    }

    public void addCraftingToCrafters(ICrafting par1ICrafting)
    {
        super.addCraftingToCrafters(par1ICrafting);
        par1ICrafting.sendProgressBarUpdate(this, 0, this.cooler.furnaceCookTime);
        par1ICrafting.sendProgressBarUpdate(this, 1, this.cooler.coolerFrostTime);
        par1ICrafting.sendProgressBarUpdate(this, 2, this.cooler.currentItemBurnTime);
    }

    /**
     * Looks for changes made in the container, sends them to every listener.
     */
    public void detectAndSendChanges()
    {
        super.detectAndSendChanges();

        for (int i = 0; i < this.crafters.size(); ++i)
        {
            ICrafting icrafting = (ICrafting)this.crafters.get(i);

            if (this.lastCoolTime != this.cooler.furnaceCookTime)
            {
                icrafting.sendProgressBarUpdate(this, 0, this.cooler.furnaceCookTime);
            }

            if (this.lastFrostTime != this.cooler.coolerFrostTime)
            {
                icrafting.sendProgressBarUpdate(this, 1, this.cooler.coolerFrostTime);
            }

            if (this.lastItemFrostTime != this.cooler.currentItemBurnTime)
            {
                icrafting.sendProgressBarUpdate(this, 2, this.cooler.currentItemBurnTime);
            }
        }

        this.lastCoolTime = this.cooler.furnaceCookTime;
        this.lastFrostTime = this.cooler.coolerFrostTime;
        this.lastItemFrostTime = this.cooler.currentItemBurnTime;
    }

    @SideOnly(Side.CLIENT)
    public void updateProgressBar(int par1, int par2)
    {
        if (par1 == 0)
        {
            this.cooler.furnaceCookTime = par2;
        }

        if (par1 == 1)
        {
            this.cooler.coolerFrostTime = par2;
        }

        if (par1 == 2)
        {
            this.cooler.currentItemBurnTime = par2;
        }
    }

    public boolean canInteractWith(EntityPlayer par1EntityPlayer)
    {
        return this.cooler.isUseableByPlayer(par1EntityPlayer);
    }

    /**
     * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
     */
    public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
    {
        ItemStack itemstack = null;
        Slot slot = (Slot)this.inventorySlots.get(par2);

        if (slot != null && slot.getHasStack())
        {
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();

            if (par2 == 2)
            {
                if (!this.mergeItemStack(itemstack1, 3, 39, true))
                {
                    return null;
                }

                slot.onSlotChange(itemstack1, itemstack);
            }
            else if (par2 != 1 && par2 != 0)
            {
                if (RecipesCooler.smelting().getSmeltingResult(itemstack1) != null)
                {
                    if (!this.mergeItemStack(itemstack1, 0, 1, false))
                    {
                        return null;
                    }
                }
                else if (TileEntityCooler.isItemFuel(itemstack1))
                {
                    if (!this.mergeItemStack(itemstack1, 1, 2, false))
                    {
                        return null;
                    }
                }
                else if (par2 >= 3 && par2 < 30)
                {
                    if (!this.mergeItemStack(itemstack1, 30, 39, false))
                    {
                        return null;
                    }
                }
                else if (par2 >= 30 && par2 < 39 && !this.mergeItemStack(itemstack1, 3, 30, false))
                {
                    return null;
                }
            }
            else if (!this.mergeItemStack(itemstack1, 3, 39, false))
            {
                return null;
            }

            if (itemstack1.stackSize == 0)
            {
                slot.putStack((ItemStack)null);
            }
            else
            {
                slot.onSlotChanged();
            }

            if (itemstack1.stackSize == itemstack.stackSize)
            {
                return null;
            }

            slot.onPickupFromSlot(par1EntityPlayer, itemstack1);
        }

        return itemstack;
    }
}

ClientProxy

package TechCraft;

import cpw.mods.fml.client.registry.RenderingRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.client.MinecraftForgeClient;
import net.minecraftforge.common.MinecraftForge;


public class ClientProxy extends CommonProxy
{



@Override
public void registerRenderers()
{
RenderingRegistry.registerEntityRenderingHandler(EntityRDXPrimed.class, new RenderRDX());

}
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
{

TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if (tileEntity != null)
{
switch(ID)
{
case 0: /* your GUIs go here */
}
}
return tileEntity;

}
}

CommonProxy

package TechCraft;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;
import cpw.mods.fml.common.registry.EntityRegistry;
import cpw.mods.fml.common.registry.GameRegistry;

public class CommonProxy implements IGuiHandler
{

@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
{
return null;
}
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
{
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);

if(tileEntity != null)
{
switch(ID)
{
case 0: /* your Containers go here*/
}
}
return tileEntity;
}
public void registerRenderers() {
    EntityRegistry.registerGlobalEntityID(EntityRDXPrimed.class, "RDX", 180);
    EntityRegistry.registerModEntity(EntityRDXPrimed.class, "RDX", 10, Core.instance, 180, 1, false);


}
}

Please help. Any assistance will be much appreciated.

Posted
guiid.png

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

+1 for the awesome Paint art.

 

Snip tool, actually, but it amounts to the same thing. ;)

(I love the Windows Vista/7 snip tool.  *Drool*)

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Thanks but now it returns the error "A mod tried to open a gui without being a NetworkMod"

 

Good thing you solved it, as that error is woefully inadequate, as there are something like FIVE different problems that will generate that error.  I had the misfortune of having the most uncommon one when I was doing my gui container.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Thanks but now it returns the error "A mod tried to open a gui without being a NetworkMod"

 

Good thing you solved it, as that error is woefully inadequate, as there are something like FIVE different problems that will generate that error.  I had the misfortune of having the most uncommon one when I was doing my gui container.

 

Glad to see your back from your hiatus Draco :D

I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes.

 

I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there xD

Posted

Glad to see your back from your hiatus Draco :D

 

It's what happens when you tear your hair out trying to do something that should be simple, only to find that Forge didn't unfinalize something* and get dragged back into the help forum. :P

 

*Lex told me that there's no reason it should be unfinalized, three days later a pull request is made, acted on, and merged with the main trunk.  I think Lex just hates me.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Glad to see your back from your hiatus Draco :D

 

It's what happens when you tear your hair out trying to do something that should be simple, only to find that Forge didn't unfinalize something* and get dragged back into the help forum. :P

 

*Lex told me that there's no reason it should be unfinalized, three days later a pull request is made, acted on, and merged with the main trunk.  I think Lex just hates me.

 

Lol, maybe. It seems as if he has minor respect for everyone with a descent question, and those that answer correctly and know what they are doing, and then no respect for anyone else xD ( except for the moderators etc. and the Forge team )

I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes.

 

I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there xD

Posted
Lol, maybe. It seems as if he has minor respect for everyone with a descent question, and those that answer correctly and know what they are doing, and then no respect for anyone else xD ( except for the moderators etc. and the Forge team )

 

More like "no respect for anyone asking what appears to be an uninformed question" regardless of how informed that person actually is.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Lol, maybe. It seems as if he has minor respect for everyone with a descent question, and those that answer correctly and know what they are doing, and then no respect for anyone else xD ( except for the moderators etc. and the Forge team )

 

More like "no respect for anyone asking what appears to be an uninformed question" regardless of how informed that person actually is.

 

True.. Even though you can be entirely informed, if you phrase something wrong, the question then takes a completely new path. And that in turn can lead to something that you had not entirely wanted to be informed on. Thus resulting in yourself seeming uninformed.

 

:/ The joys of misdirection in its fullest. ( and no the magician kind xD )

I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes.

 

I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there xD

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • It is 1.12.2 - I have no idea if there is a 1.12 pack
    • Okay, but does the modpack works with 1.12 or just with 1.12.2, because I need the Forge client specifically for Minecraft 1.12, not 1.12.2
    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
    • Do you use features of inventory profiles next (ipnext) or is there a change without it?
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.