I have been doing a bit of experimenting with some mod creation and a custom furnace. My problem is that when I put something into the smelting slot [Slot 0] it just moves over to the fuel slot [Slot 1] and replaces the item already there. Any help would be wonderful. Thanks.
ContainerGingaFurnace.java
package net.gingacraft.mod.container;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.gingacraft.mod.Gingacraft;
import net.gingacraft.mod.tileentity.TileEntityGingaFurnace;
import net.minecraft.client.resources.I18n;
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.inventory.SlotFurnace;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.ResourceLocation;
public class ContainerGingaFurnace extends Container{
private TileEntityGingaFurnace gingaFurnace;
public int lastBurnTime;
public int lastCurrentItemBurnTime;
public int lastCookTime;
public ContainerGingaFurnace(InventoryPlayer inventory, TileEntityGingaFurnace tileentity){
this.gingaFurnace = tileentity;
this.addSlotToContainer(new Slot(tileentity, 0, 56, 35));
this.addSlotToContainer(new Slot(tileentity, 1, 8, 62));
this.addSlotToContainer(new SlotFurnace(inventory.player, tileentity, 2, 116, 35));
for(int i = 0; i < 3; i++){
for(int j = 0; j < 9; j++){
this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
for(int i = 0; i < 9; i++){
this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142));
}
}
public void addCraftingToCrafters (ICrafting icrafting){
super.addCraftingToCrafters(icrafting);
icrafting.sendProgressBarUpdate(this, 0, this.gingaFurnace.cookTime);
icrafting.sendProgressBarUpdate(this, 1, this.gingaFurnace.burnTime);
icrafting.sendProgressBarUpdate(this, 2, this.gingaFurnace.currentItemBurnTime);
}
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.gingaFurnace.cookTime){
icrafting.sendProgressBarUpdate(this, 0, this.gingaFurnace.cookTime);
}
if(this.lastBurnTime != this.gingaFurnace.burnTime){
icrafting.sendProgressBarUpdate(this, 1, this.gingaFurnace.burnTime);
}
if(this.lastCurrentItemBurnTime != this.gingaFurnace.currentItemBurnTime){
icrafting.sendProgressBarUpdate(this, 2, this.gingaFurnace.currentItemBurnTime);
}
}
this.lastCookTime = this.gingaFurnace.cookTime;
this.lastBurnTime = this.gingaFurnace.burnTime;
this.lastCurrentItemBurnTime = this.gingaFurnace.currentItemBurnTime;
}
@SideOnly(Side.CLIENT)
public void updateProgressBar(int slot, int par2){
if (slot == 0){
this.gingaFurnace.cookTime = par2;
}
if (slot == 1){
this.gingaFurnace.burnTime = par2;
}
if (slot == 2){
this.gingaFurnace.currentItemBurnTime = par2;
}
}
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 (FurnaceRecipes.smelting().getSmeltingResult(itemstack1) != null){
if (!this.mergeItemStack(itemstack1, 0, 1, false)){
return null;
}
}
else if (TileEntityGingaFurnace.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;
}
@Override
public boolean canInteractWith(EntityPlayer var1) {
return true;
}
}
TileEntityGingaFurnace.java
package net.gingacraft.mod.tileentity;
import cpw.mods.fml.common.registry.GameRegistry;
import net.gingacraft.mod.Gingacraft;
import net.gingacraft.mod.blocks.GingaFurnace;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.WeightedRandom.Item;
public class TileEntityGingaFurnace extends TileEntity implements ISidedInventory{
private String localizedName;
private static final int[] slots_top = new int[]{0};
private static final int[] slots_bottom = new int[]{2, 1};
private static final int[] slots_side = new int[]{1};
private ItemStack[] slots = new ItemStack [3];
public int furnaceSpeed = 150;
public int burnTime;
public int currentItemBurnTime;
public int cookTime;
public void setGuiDisplayName(String displayName){
this.localizedName = displayName;
}
public String getInventoryName(){
return this.hasCustomInventoryName() ? this.localizedName : "container.gingaFurnace";
}
public boolean hasCustomInventoryName() {
return this.localizedName != null && this.localizedName.length() > 0;
}
public int getSizeInventory(){
return this.slots.length;
}
@Override
public ItemStack getStackInSlot(int var1) {
return this.slots[var1];
}
@Override
public ItemStack decrStackSize(int var1, int var2){
if(this.slots[var1] != null){
ItemStack itemstack;
if(this.slots[var1].stackSize <= var2 ){
itemstack = this.slots[var1];
this.slots[var1] = null;
return itemstack;
}else{
itemstack = this.slots[var1].splitStack(var2);
if(this.slots[var1].stackSize == 0){
this.slots[var1] = null;
}
return itemstack;
}
}
else{
return null;
}
}
@Override
public ItemStack getStackInSlotOnClosing(int i){
if(this.slots[i] != null){
ItemStack itemstack = this.slots[i];
this.slots[i] = null;
return itemstack;
}
return null;
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack){
this.slots[1] = itemstack;
if(itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()){
itemstack.stackSize = this.getInventoryStackLimit();
}
}
@Override
public int getInventoryStackLimit(){
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer){
return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entityplayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
}
public void openInventory() {}
public void closeInventory() {}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack){
return i == 2 ? false : (i == 1 ? isItemFuel(itemstack) : true);
}
public static boolean isItemFuel (ItemStack itemstack){
return getItemBurnTime(itemstack) > 0;
}
private static int getItemBurnTime(ItemStack itemstack){
if(itemstack == null){
return 0;
}else{ //net.minecraft.item.Item
net.minecraft.item.Item item = itemstack.getItem();
if(item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air){
Block block = Block.getBlockFromItem(item);
if(block == Blocks.sapling) return 100;
if(block == Blocks.coal_block) return 14400;
}
if(item == Gingacraft.itemTreePitch) return 800;
if(item == Items.coal) return 1600;
if(item == Items.stick) return 100;
if(item == Items.lava_bucket) return 20000;
if(item == Items.blaze_rod) return 2400;
}
return GameRegistry.getFuelValue(itemstack);
}
public boolean isBurning(){
return this.burnTime > 0;
}
public void updateEntity(){
boolean flag = this.burnTime > 0;
boolean flag1 = false;
if(this.isBurning()){
this.burnTime--;
}
if(!this.worldObj.isRemote){
if(this.burnTime == 0 && this.canSmelt()){
this.currentItemBurnTime = this.burnTime = getItemBurnTime(this.slots[1]);
if(this.isBurning()){
flag1 = true;
if(this.slots[1] != null){
this.slots[1].stackSize--;
if(this.slots[1].stackSize == 0){
this.slots[1] = this.slots[1].getItem().getContainerItem(this.slots[1]);
}
}
}
}
if(this.isBurning() && this.canSmelt()){
this.cookTime++;
if(this.cookTime == this.furnaceSpeed){
this.cookTime = 0;
this.smeltItem();
flag1 = true;
}
}else{
this.cookTime = 0;
}
if(flag != this.isBurning()){
flag1 = true;
GingaFurnace.updateGingaFurnaceBlockState(this.burnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
}
}
if(flag1){
this.markDirty();
}
}
public boolean canSmelt(){
if(this.slots[0] == null){
return false;
}else{
ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]);
if(itemstack == null) return false;
if(this.slots[2] == null) return true;
if(this.slots[2].isItemEqual(itemstack)) return false;
int result = this.slots[2].stackSize + itemstack.stackSize;
return (result <= getInventoryStackLimit() && result <= itemstack.getMaxStackSize());
}
}
public void smeltItem(){
if(this.canSmelt()){
ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(this.slots[0]);
if(this.slots[2] == null) {
this.slots[2] = itemstack.copy();
}else if (this.slots[2].isItemEqual(itemstack)){
this.slots[2].stackSize += itemstack.stackSize;
}
this.slots[0].stackSize--;
if(this.slots[0].stackSize <= 0){
this.slots[0] = null;
}
}
}
@Override
public int[] getAccessibleSlotsFromSide(int var1) {
return var1 == 0 ? slots_bottom : (var1 == 1 ? slots_top : slots_side);
}
@Override
public boolean canInsertItem(int i, ItemStack itemStack, int j) {
return this.isItemValidForSlot(i, itemStack);
}
@Override
public boolean canExtractItem(int i, ItemStack itemStack, int j) {
return j != 0 || i != 1 || itemStack.getItem() == Items.bucket;
}
public int getBurnTimeRemainingScaled(int i){
if(this.currentItemBurnTime == 0){
this.currentItemBurnTime = this.furnaceSpeed;
}
return this.burnTime * i / this.currentItemBurnTime;
}
public int getCookProgressScaled(int i){
return this.cookTime * i / this.furnaceSpeed;
}
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
NBTTagList list = nbt.getTagList("Items", 10);
this.slots = new ItemStack[this.getSizeInventory()];
for(int i = 0; i < list.tagCount(); i++) {
NBTTagCompound compound = (NBTTagCompound) list.getCompoundTagAt(i);
byte b = compound.getByte("Slot");
if(b >= 0 && b < this.slots.length) {
this.slots[b] = ItemStack.loadItemStackFromNBT(compound);
}
}
this.burnTime = (int)nbt.getShort("BurnTime");
this.cookTime = (int)nbt.getShort("CookTime");
this.currentItemBurnTime = (int)nbt.getShort("CurrentBurnTime");
if(nbt.hasKey("CustomName")) {
this.localizedName = nbt.getString("CustomName");
}
}
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setShort("BurnTime", (short)this.burnTime);
nbt.setShort("CookTime", (short)this.cookTime);
nbt.setShort("CurrentBurnTime", (short)this.currentItemBurnTime);
NBTTagList list = new NBTTagList();
for (int i = 0; i < this.slots.length; i++) {
if(this.slots[i] != null) {
NBTTagCompound compound = new NBTTagCompound();
compound.setByte("Slot", (byte)i);
this.slots[i].writeToNBT(compound);
list.appendTag(compound);
}
}
nbt.setTag("Items", list);
if (this.hasCustomInventoryName()) {
nbt.setString("CustomName", this.localizedName);
}
}
}
GuiGingaFurnace.java
package net.gingacraft.mod.gui;
import org.lwjgl.opengl.GL11;
import net.gingacraft.mod.Gingacraft;
import net.gingacraft.mod.container.ContainerGingaFurnace;
import net.gingacraft.mod.tileentity.TileEntityGingaFurnace;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.tileentity.TileEntityFurnace;
import net.minecraft.util.ResourceLocation;
public class GuiGingaFurnace extends GuiContainer{
public static final ResourceLocation bground = new ResourceLocation(Gingacraft.modid + ":" + "textures/gui/GuiGingaFurnace.png");
public TileEntityGingaFurnace gingaFurnace;
public GuiGingaFurnace(InventoryPlayer inventoryPlayer, TileEntityGingaFurnace entity) {
super(new ContainerGingaFurnace(inventoryPlayer, entity));
this.gingaFurnace = entity;
this.xSize = 176;
this.ySize = 166;
}
public void drawGuiContainerForegroundLayer(int par1, int par2){
String name = this.gingaFurnace.hasCustomInventoryName() ? this.gingaFurnace.getInventoryName() : I18n.format(this.gingaFurnace.getInventoryName(), new Object[0]);
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 10, 16093987);
this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 118, this.ySize - 96 + 2, 16093987);
}
@Override
protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) {
GL11.glColor4f(1F, 1F, 1F, 1F);
Minecraft.getMinecraft().getTextureManager().bindTexture(bground);
drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
if(this.gingaFurnace.isBurning()){
int k = this.gingaFurnace.getBurnTimeRemainingScaled(40);
int j = 40 - k;
drawTexturedModalRect(guiLeft + 29, guiTop + 65, 176, 0, 40 - j, 10);
}
int k = this.gingaFurnace.getCookProgressScaled(24);
drawTexturedModalRect(guiLeft + 79, guiTop + 34, 176, 10, k + 1, 16);
}
}
GingaFurnace.java
package net.gingacraft.mod.blocks;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.gingacraft.mod.Gingacraft;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
public class GingaBlock extends Block {
public GingaBlock(Material material){
super(material);
this.setStepSound(soundTypeMetal);
this.setCreativeTab(Gingacraft.gingacraftTab);
}
@SideOnly(Side.CLIENT)
public void registerBlockIcons(IIconRegister iconRegister) {
this.blockIcon = iconRegister.registerIcon(Gingacraft.modid + ":" + this.getUnlocalizedName().substring(5));
}
}