hi
i'm trying to make a dual input(technicly quard input) furnace that takes 2 inputs with fuel and 2 inputs of items.
when i put the right fuel in the right slot then it shall be stored in a progress bar thingy,
but when i close the gui and opens it again then it messes up and idk why.
package dk.MathiasVO053.RobinsamseCraft.inventory;
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 cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import dk.MathiasVO053.RobinsamseCraft.Crafting.InfuserRecipes;
import dk.MathiasVO053.RobinsamseCraft.tile_entity.TileEntityInfuser2;
public class InfuserContainer2 extends Container{
private TileEntityInfuser2 Infuser;
public int fuelCount;
public int infuciumCount;
public int lastCookTime;
public InfuserContainer2(InventoryPlayer inventory, TileEntityInfuser2 tileentity) {
this.Infuser = tileentity;
this.addSlotToContainer(new Slot(tileentity, 0, 66, 16)); /*input 1*/
this.addSlotToContainer(new Slot(tileentity, 1, 66, 56)); /*input 2*/
this.addSlotToContainer(new SlotFurnace(inventory.player, tileentity, 2, 113, 36)); /*output*/
this.addSlotToContainer(new Slot(tileentity, 3, 150, 65)); /*infucium*/
this.addSlotToContainer(new Slot(tileentity, 4, 10, 65)); /*fuel*/
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, 1, this.Infuser.cookTime);
icrafting.sendProgressBarUpdate(this, 2, this.Infuser.currentItemBurnTime);
icrafting.sendProgressBarUpdate(this, 3, this.Infuser.FuelCount);
icrafting.sendProgressBarUpdate(this, 4, this.Infuser.InfuciumCount);
}
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.Infuser.cookTime) {
icrafting.sendProgressBarUpdate(this, 1, this.Infuser.cookTime);
}
if(this.fuelCount != this.Infuser.FuelCount) {
icrafting.sendProgressBarUpdate(this, 2, this.Infuser.FuelCount);
}
if(this.infuciumCount != this.Infuser.InfuciumCount) {
icrafting.sendProgressBarUpdate(this, 3, this.Infuser.InfuciumCount);
}
}
this.lastCookTime = this.Infuser.cookTime;
this.infuciumCount = this.Infuser.InfuciumCount;
this.fuelCount = this.Infuser.FuelCount;
}
@SideOnly(Side.CLIENT)
public void updateProgressBar(int i, int j){
if(i == 1){
Infuser.cookTime = j;
}
if(i == 2){
Infuser.FuelCount = j;
}
if(i == 3){
Infuser.InfuciumCount = j;
}
}
public boolean canInteractWith(EntityPlayer var1) {
return true;
}
}
package dk.MathiasVO053.RobinsamseCraft.tile_entity;
import cpw.mods.fml.common.registry.GameRegistry;
import dk.MathiasVO053.RobinsamseCraft.ItemReg;
import dk.MathiasVO053.RobinsamseCraft.Crafting.InfuserRecipes;
import dk.MathiasVO053.RobinsamseCraft.blocks.Infuser2;
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.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
public class TileEntityInfuser2 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};
public static final int maxInfucium = 900;
public static final int maxFuel = 900;
private ItemStack[] slots = new ItemStack [5];
public int furnaceSpeed = 150;
public int currentItemBurnTime;
public int cookTime;
public int FuelCount;
public int InfuciumCount;
public void setGuiDisplayName(String displayName) {
this.localizedName = displayName;
}
public String getInventoryName() {
return this.hasCustomInventoryName() ? this.localizedName : "container.Infuser";
}
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!= null) {
ItemStack itemstack = this.slots;
this.slots = null;
return itemstack;
}
return null;
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack) {
this.slots = 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 ? hasItemPower(itemstack) : true);
}
private static int getItemInfucium(ItemStack itemstack) {
if(itemstack == null){
return 0;
}else{
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(item == ItemReg.InfuciumMk2) return 100;
}
return GameRegistry.getFuelValue(itemstack);
}
private static int getItemPower(ItemStack itemstack) {
if(itemstack == null){
return 0;
}else{
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(item == ItemReg.RainbowPowder) return 100;
}
return GameRegistry.getFuelValue(itemstack);
}
public boolean hasItemPower(ItemStack itemstack) {
return getItemPower(itemstack) > 0;
}
public boolean hasItemInfucium(ItemStack itemstack) {
return getItemInfucium(itemstack) > 0;
}
public int getFuelRemainingScaled(int i) {
return (FuelCount * i) / maxFuel;
}
public int getInfuciumRemainingScaled(int i) {
return (InfuciumCount * i) / maxInfucium;
}
public boolean hasEnergy() {
return FuelCount > 0;
}
public boolean hasInfucium() {
return InfuciumCount > 0;
}
public void updateEntity() {
boolean flag = this.hasEnergy();
boolean flag1 = false;
boolean flag2 = false;
if(hasEnergy() && this.isBurning()){
this.FuelCount--;
this.InfuciumCount--;
}
if(!worldObj.isRemote){
if(this.hasItemInfucium(this.slots[3]) && this.InfuciumCount < (this.maxInfucium - this.getItemInfucium(this.slots[3]))){
this.InfuciumCount += getItemInfucium(this.slots[3]);
if(this.slots[3] != null){
flag2 = true;
this.slots[3].stackSize--;
if(this.slots[3].stackSize == 0){
this.slots[3] = this.slots[3].getItem().getContainerItem(this.slots[3]);
}
}
}
if(!worldObj.isRemote){
if(this.hasItemPower(this.slots[4]) && this.FuelCount < (this.maxFuel - this.getItemPower(this.slots[4]))){
this.FuelCount += getItemPower(this.slots[4]);
if(this.slots[4] != null){
flag1 = true;
this.slots[4].stackSize--;
if(this.slots[4].stackSize == 0){
this.slots[4] = this.slots[4].getItem().getContainerItem(this.slots[4]);
}
}
}
if(hasEnergy() && canSmelt()){
cookTime++;
if(this.cookTime == this.furnaceSpeed){
this.cookTime = 0;
this.smeltItem();
flag1 = true;
flag2 = true;
}else{
cookTime = 0;
}
if(flag != this.hasEnergy()){
flag1 = true;
flag2 = true;
Infuser2.updateInfuserBlockState(this.hasEnergy(), worldObj, xCoord, yCoord, zCoord);
}
}
if(flag1 && flag2){
this.markDirty();
}
}
}
}
public boolean canSmelt() {
if (this.slots[0] == null) {
return false;
}else{
ItemStack itemstack = InfuserRecipes.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 = InfuserRecipes.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 boolean isBurning(){
return this.cookTime > 0;
}
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 = ItemStack.loadItemStackFromNBT(compound);
}
}
this.cookTime = (int)nbt.getShort("CookTime");
this.currentItemBurnTime = (int)nbt.getShort("CurrentBurnTime");
this.InfuciumCount = (int)nbt.getShort("InfuciumCount");
this.FuelCount = (int)nbt.getShort("FuelCount");
if(nbt.hasKey("CustomName")) {
this.localizedName = nbt.getString("CustomName");
}
}
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setShort("CookTime", (short)this.cookTime);
nbt.setShort("CurrentBurnTime", (short)this.currentItemBurnTime);
nbt.setShort("InfuciumCount", (short)this.InfuciumCount);
nbt.setShort("FuelCount", (short)this.FuelCount);
NBTTagList list = new NBTTagList();
for (int i = 0; i < this.slots.length; i++) {
if(this.slots != null) {
NBTTagCompound compound = new NBTTagCompound();
compound.setByte("Slot", (byte)i);
this.slots.writeToNBT(compound);
list.appendTag(compound);
}
}
nbt.setTag("Items", list);
if (this.hasCustomInventoryName()) {
nbt.setString("CustomName", this.localizedName);
}
}
}
package dk.MathiasVO053.RobinsamseCraft.inventory;
import org.lwjgl.opengl.GL11;
import dk.MathiasVO053.RobinsamseCraft.Strings;
import dk.MathiasVO053.RobinsamseCraft.tile_entity.TileEntityInfuser2;
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.util.ResourceLocation;
public class InfuserGui2 extends GuiContainer {
public static final ResourceLocation bground = new ResourceLocation(Strings.MODID + ":" + "textures/gui/InfuserMk2Gui.png");
public TileEntityInfuser2 Infuser;
public InfuserGui2(InventoryPlayer inventoryPlayer, TileEntityInfuser2 entity) {
super(new InfuserContainer2(inventoryPlayer, entity));
this.Infuser = entity;
this.xSize = 176;
this.ySize = 166;
}
public void drawGuiContainerForegroundLayer(int par1, int par2) {
String name = "InfuserMk2";
this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 118, this.ySize - 96 + 2, 4210752);
}
@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 (Infuser.hasEnergy())
{
int i1 = Infuser.getFuelRemainingScaled(48);
drawTexturedModalRect(guiLeft + 10, guiTop + 62 - i1, 180, 101 - i1, 16, i1);
}
if (Infuser.hasInfucium())
{
int i2 = Infuser.getInfuciumRemainingScaled(48);
drawTexturedModalRect(guiLeft + 150, guiTop + 62 - i2, 198, 101 - i2, 16, i2);
}
int k = this.Infuser.getCookProgressScaled(52);
drawTexturedModalRect(guiLeft + 82, guiTop + 19, 176, 0, k + 1, 50);
}
}