Everything posted by GingaNinja042
-
[1.7.2] Custom Furnace Troubles
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)); } }
IPS spam blocked by CleanTalk.