Hey,
I have a problem which I've been trying to solve for the past hour. I've made a custom furnace, a blast furnace, and it smelts 1 item (hematite) into 2 items (2 magnetite & slag) if the temperature is over 434. Everything is fine until you remove the items at the output, it all goes down hill after that.
I've also rigged up some loggers to see what's inside the outputs array.
Testing results:
1 Hematite in the input, 1 coke in the fuel input: Everything seems to be working fine. Magnetite increases with 2 every cycle, and slag with 1. The output arrays show the correct numbers, 2xmagnetite 1xslag. But when I remove the items in the output slot. The loggers show 0xair 0xair and the cycles continue but no output items are being made. The same happens when I remove the input and put it back.
I really don't know whats causing this. Here's my code;
(Blast furnace tile entity)
package com.bonphy.chemicraft.block.tileentity;
import com.bonphy.chemicraft.ChemiCraft;
import com.bonphy.chemicraft.block.blocks.BlockBlastFurnace;
import com.bonphy.chemicraft.block.recipes.RecipeBlastFurnace;
import com.bonphy.chemicraft.init.ItemRef;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.*;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemStackHandler;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class TileEntityBlastFurnace extends TileEntity implements ITickable {
private ItemStackHandler handler = new ItemStackHandler(4);
private String customName;
private ItemStack[] outputs = null;
private int burnTime;
private int currentBurnTime;
private int cookTime;
private int totalCookTime = 200;
private int temperature;
private int maxTemperature = 1000;
private Item currentlySmelting;
Logger logger = LogManager.getLogger(ChemiCraft.MODID);
@Override
public boolean hasCapability(Capability<?> capability, EnumFacing facing)
{
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return true;
else return false;
}
@Override
public <T> T getCapability(Capability<T> capability, EnumFacing facing)
{
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return (T) this.handler;
return super.getCapability(capability, facing);
}
public boolean hasCustomName()
{
return this.customName != null && !this.customName.isEmpty();
}
public void setCustomName(String customName)
{
this.customName = customName;
}
@Override
public ITextComponent getDisplayName()
{
return this.hasCustomName() ? new TextComponentString(this.customName) : new TextComponentTranslation("container.electrolyzer_block");
}
@Override
public void readFromNBT(NBTTagCompound compound)
{
super.readFromNBT(compound);
this.handler.deserializeNBT(compound.getCompoundTag("Inventory"));
this.burnTime = compound.getInteger("BurnTime");
this.cookTime = compound.getInteger("CookTime");
this.totalCookTime = compound.getInteger("CookTimeTotal");
this.temperature = compound.getInteger("temperature");
this.currentBurnTime = getItemBurnTime((ItemStack)this.handler.getStackInSlot(2));
if(compound.hasKey("CustomName", 8)) this.setCustomName(compound.getString("CustomName"));
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound)
{
super.writeToNBT(compound);
compound.setInteger("BurnTime", (short)this.burnTime);
compound.setInteger("CookTime", (short)this.cookTime);
compound.setInteger("CookTimeTotal", (short)this.totalCookTime);
compound.setInteger("temperature", (short)this.temperature);
compound.setTag("Inventory", this.handler.serializeNBT());
if(this.hasCustomName()) compound.setString("CustomName", this.customName);
return compound;
}
public boolean isBurning()
{
return this.burnTime > 0;
}
@SideOnly(Side.CLIENT)
public static boolean isBurning(TileEntityBlastFurnace te)
{
return te.getField(0) > 0;
}
public void update()
{
boolean dirtyMark = false;
if (handler.getStackInSlot(0).isEmpty()) {
this.cookTime = 0;
this.currentlySmelting = null;
this.outputs = null;
dirtyMark = true;
}
if(this.isBurning())
{
--this.currentBurnTime;
if (this.temperature < this.maxTemperature) {
this.temperature += 1;
}
BlockBlastFurnace.setState(true, world, pos);
}
if(!this.isBurning()) {
if (this.temperature != 0) {
this.temperature -= 3;
}
}
ItemStack input = handler.getStackInSlot(0);
ItemStack fuel = handler.getStackInSlot(1);
if(this.isBurning() || !fuel.isEmpty())
{
if(!this.isBurning() && this.canSmelt())
{
this.burnTime = getItemBurnTime(fuel);
this.currentBurnTime = burnTime;
if(this.isBurning() && !fuel.isEmpty())
{
dirtyMark = true;
Item item = fuel.getItem();
fuel.shrink(1);
if(fuel.isEmpty())
{
ItemStack item1 = item.getContainerItem(fuel);
this.handler.setStackInSlot(1, item1);
}
}
}
}
if(this.isBurning() && this.canSmelt() && cookTime > 0)
{
if (cookTime != totalCookTime) {
cookTime++;
}
if(cookTime == totalCookTime)
{
if (this.currentlySmelting.equals(ItemRef.HEMATITE_ITEM) && this.temperature > 454) {
if(!handler.getStackInSlot(2).isEmpty() && !handler.getStackInSlot(3).isEmpty())
{
handler.getStackInSlot(2).grow(2);
handler.getStackInSlot(3).grow(1);
this.currentlySmelting = null;
outputs = null;
cookTime = 0;
input.shrink(1);
dirtyMark = true;
}
else
{
handler.insertItem(2, outputs[0], false);
handler.insertItem(3, outputs[1], false);
this.currentlySmelting = null;
outputs = null;
cookTime = 0;
input.shrink(1);
dirtyMark = true;
}
}
}
}
else
{
if(this.canSmelt() && this.isBurning())
{
ItemStack[] outputs = RecipeBlastFurnace.getInstance().getResults(input);
if(outputs != null)
{
this.outputs = null;
this.outputs = outputs;
logger.info(outputs[0] + "" + outputs[1]);
cookTime++;
this.currentlySmelting = input.getItem();
handler.setStackInSlot(0, input);
dirtyMark = true;
}
}
}
if(dirtyMark) {
this.markDirty();
}
}
private boolean canSmelt()
{
if((this.handler.getStackInSlot(0)).isEmpty()) return false;
else
{
ItemStack[] results = RecipeBlastFurnace.getInstance().getResults(this.handler.getStackInSlot(0));
if(results == null) return false;
else
{
ItemStack[] outputs = new ItemStack[] {this.handler.getStackInSlot(2), this.handler.getStackInSlot(3)};
if(outputs[0].isEmpty() && outputs[1].isEmpty()) return true;
if(!outputs[0].isItemEqual(results[0]) && !outputs[1].isItemEqual(results[1])) return false;
int res0 = outputs[0].getCount() + results[0].getCount();
int res1 = outputs[1].getCount() + results[1].getCount();
return res0 <= 64 && res0 <= outputs[0].getMaxStackSize() && res1 <= 64 && res1 <= outputs[1].getMaxStackSize();
}
}
}
public static int getItemBurnTime(ItemStack fuel)
{
if(fuel.isEmpty()) return 0;
else
{
Item item = fuel.getItem();
if (item == ItemRef.COKE_ITEM) return 2400;
return GameRegistry.getFuelValue(fuel);
}
}
public static boolean isItemFuel(ItemStack fuel)
{
return getItemBurnTime(fuel) > 0;
}
public boolean isUsableByPlayer(EntityPlayer player)
{
return this.world.getTileEntity(this.pos) != this ? false : player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
}
public int getField(int id)
{
switch(id)
{
case 0:
return this.burnTime;
case 1:
return this.currentBurnTime;
case 2:
return this.cookTime;
case 3:
return this.totalCookTime;
case 4:
return this.temperature;
case 5:
return this.maxTemperature;
default:
return 0;
}
}
public void setField(int id, int value)
{
switch(id)
{
case 0:
this.burnTime = value;
break;
case 1:
this.currentBurnTime = value;
break;
case 2:
this.cookTime = value;
break;
case 3:
this.totalCookTime = value;
break;
case 4:
this.temperature = value;
break;
}
}
}
(Recipes class for blast furnace)
package com.bonphy.chemicraft.block.recipes;
import com.bonphy.chemicraft.init.ItemRef;
import net.minecraft.item.ItemStack;
import java.util.HashMap;
import java.util.Map;
public class RecipeBlastFurnace {
private static final RecipeBlastFurnace INSTANCE = new RecipeBlastFurnace();
private final Map<ItemStack, ItemStack[]> recipesList = new HashMap<>();
public static RecipeBlastFurnace getInstance()
{
return INSTANCE;
}
private RecipeBlastFurnace()
{
addSinteringRecipe(new ItemStack(ItemRef.HEMATITE_ITEM), new ItemStack(ItemRef.MAGNETITE_ITEM, 2), new ItemStack(ItemRef.SLAG_ITEM,1));
}
public void addSinteringRecipe(ItemStack input, ItemStack output1, ItemStack output2)
{
if(getResults(input) != null) return;
this.recipesList.put(input, new ItemStack[]{output1, output2});
}
public ItemStack[] getResults(ItemStack input)
{
for(Map.Entry<ItemStack, ItemStack[]> entry : this.recipesList.entrySet())
{
if(this.compareItemStacks(input, entry.getKey()))
{
return entry.getValue();
}
}
return null;
}
private boolean compareItemStacks(ItemStack stack1, ItemStack stack2)
{
return stack2.getItem() == stack1.getItem() && (stack2.getMetadata() == 32767 || stack2.getMetadata() == stack1.getMetadata());
}
}
(Blast furnace GUI, still work in progress don't worry)
Thanks for reading my question, and I would be thankful if you can help me.
-Berry