Jump to content

Variables Behaving improperly


froschi3b

Recommended Posts

I am not sure if it's related to minecraftforge, but my problem is, i have a private variable in my tileEntity that saves the direction, i have a getter and setter for it, and all works fine.

 

But when I reload the world it returns 0, but only when called through the getBlockTexture Method, i made a check in the Block Activaton Method, and that one returns the right number.

 

Can anyone help me?

 

The TileEntity:

 

 

package flabs.mods.betterfurnaces;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;

import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.registry.GameRegistry;

import net.minecraft.src.Block;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.FurnaceRecipes;
import net.minecraft.src.IInventory;
import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
import net.minecraft.src.Material;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.NBTTagList;
import net.minecraft.src.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.ISidedInventory;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.oredict.OreDictionary;
/**
* The Types of Furnaces:
* 0...Iron
* 1...Gold
* 2...Diamond
* 3...Ender
* 4...Lapis
* 5...Obsidian
* 6...TNT
*/
public class TileEntityBFurnace extends TileEntity implements IInventory, ISidedInventory
{
    /**
     * The ItemStacks that hold the items currently being used in the furnace
     */
    private ItemStack[] furnaceItemStacks = new ItemStack[3];
    /**
     * If the furnace is active
     */
    public boolean isActive=false;
    
    
    //public int Type;
    private byte dir;
    
    private byte updateTimer;
    
    /**
     * The Ticks the Furnace needs to burn an item ( referring like this: Speed[Type])
     */
    public int[] Speed={150,100,50,100,100,100,25};

    /**
     * The factor by which the Fuel consumption is multiplied ( referring like this: Fuel[Type])
     */
    public static double[] Fuel={0.75,0.5,0.25,1,1,0.5,0.03125};
    /**
     * Ore Handling Variables for the Obsidian Furnace
     */
public List<ItemStack> ores=new ArrayList <ItemStack>();

    /** 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;
    
    public TileEntityBFurnace(){
    	//loadOres();
    }

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

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

    /**
     * Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
     * stack.
     */
    @Override
    public ItemStack decrStackSize(int par1, int par2)
    {
        if (this.furnaceItemStacks[par1] != null)
        {
            ItemStack var3;

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

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

                return var3;
            }
        }
        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.
     */
    @Override
    public ItemStack getStackInSlotOnClosing(int par1)
    {
        if (this.furnaceItemStacks[par1] != null)
        {
            ItemStack var2 = this.furnaceItemStacks[par1];
            this.furnaceItemStacks[par1] = null;
            return var2;
        }
        else
        {
            return null;
        }
    }

    /**
     * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
     */
    @Override
    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.
     */
    @Override
    public String getInvName()
    {
        return "container.furnace";
    }

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

        for (int var3 = 0; var3 < var2.tagCount(); ++var3)
        {
            NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
            byte var5 = var4.getByte("Slot");

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

        this.furnaceBurnTime = par1NBTTagCompound.getShort("BurnTime");
        this.furnaceCookTime = par1NBTTagCompound.getShort("CookTime");
        this.currentItemBurnTime = getItemBurnTime(this.furnaceItemStacks[1]);
        this.isActive = par1NBTTagCompound.getBoolean("isActive");
        this.setDir(par1NBTTagCompound.getByte("Dire"));
        //loadOres();
    }
    public void loadOres(){
    	System.out.println("Adding Ores on Better Furnace: " + xCoord +", "+ yCoord+", "+zCoord);
	// Ore Handling for the Obsidian Furnace
    	ores.add(new ItemStack(Block.oreCoal));
    	ores.add(new ItemStack(Block.oreDiamond));
    	ores.add(new ItemStack(Block.oreGold));
    	ores.add(new ItemStack(Block.oreIron));
    	ores.add(new ItemStack(Block.oreLapis,);
    	ores.add(new ItemStack(Block.oreRedstone,4));
    	List<ItemStack> oreTin=OreDictionary.getOres("oreTin");
    	List<ItemStack> oreCopper=OreDictionary.getOres("oreCopper");
    	List<ItemStack> oreSilver=OreDictionary.getOres("oreSilver");
    	if (oreTin!=null){
    		int i=0;
        	while (i<oreTin.size()){
        		ItemStack is=oreTin.get(i).copy();
        		is.stackSize=2;
        		ores.add(is);
        		i++;
        	}
    	}
    	if (oreCopper!=null){
    		int i=0;
        	while (i<oreCopper.size()){
        		ItemStack is=oreCopper.get(i).copy();
        		is.stackSize=2;
        		ores.add(is);
        		i++;
        	}
    	}
    	if (oreSilver!=null){
    		int i=0;
        	while (i<oreSilver.size()){
        		ItemStack is=oreSilver.get(i).copy();
        		is.stackSize=2;
        		ores.add(is);
        		i++;
        	}
    	}
    }

    /**
     * Writes a tile entity to NBT.
     */
    @Override
    public void writeToNBT(NBTTagCompound par1NBTTagCompound)
    {
        super.writeToNBT(par1NBTTagCompound);
        par1NBTTagCompound.setShort("BurnTime", (short)this.furnaceBurnTime);
        par1NBTTagCompound.setShort("CookTime", (short)this.furnaceCookTime);
        par1NBTTagCompound.setBoolean("isActive",this.isActive);
        par1NBTTagCompound.setByte("Dire",this.getDir());
        NBTTagList var2 = new NBTTagList();

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

        par1NBTTagCompound.setTag("Items", var2);
        
    }

    /**
     * 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?*
     */
    @Override
    public int getInventoryStackLimit()
    {
        return 64;
    }

    /**
     * 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 / this.Speed[getType()];
    }

    /**
     * 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 = this.Speed[getType()];
        }

        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.
     */
    @Override
    public void updateEntity()
    {
        boolean var1 = this.furnaceBurnTime > 0;
        boolean var2 = false;
        
        if (updateTimer < 10){
        	this.updateTimer++;
        }else if (this.updateTimer==10){
        	this.getWorldObj().notifyBlockChange(this.xCoord, this.yCoord, this.zCoord, this.getBlockType().blockID);
        	this.getWorldObj().updateAllLightTypes(xCoord, yCoord, zCoord);
        	this.updateTimer++;
        }
        
        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)
                {
                    var2 = true;

                    if (this.furnaceItemStacks[1] != null)
                    {
                        --this.furnaceItemStacks[1].stackSize;

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

            if (this.isBurning() && this.canSmelt())
            {
                ++this.furnaceCookTime;

                if (this.furnaceCookTime == this.Speed[getType()])
                {
                    this.furnaceCookTime = 0;
                    this.smeltItem();
                    var2 = true;
                }
            }
            else
            {
                this.furnaceCookTime = 0;
            }

            if (var1 != this.furnaceBurnTime > 0)
            {
                var2 = true;
                if (this.furnaceBurnTime > 0){
                	this.isActive=true;
                	this.worldObj.markBlockNeedsUpdate(xCoord, yCoord, zCoord);
                	this.worldObj.updateAllLightTypes(xCoord, yCoord, zCoord);
                }else{
                	this.isActive=false;
                	this.worldObj.markBlockNeedsUpdate(xCoord, yCoord, zCoord);
                	this.worldObj.updateAllLightTypes(xCoord, yCoord, zCoord);
                }
            }
        }

        if (var2)
        {
            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 var1 = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]);
            if (var1 == null) return false;
            if (this.furnaceItemStacks[2] == null) return true;
            if (!this.furnaceItemStacks[2].isItemEqual(var1)) return false;
            int result = furnaceItemStacks[2].stackSize + var1.stackSize;
            return (result <= getInventoryStackLimit() && result <= var1.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 is = FurnaceRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]);
            ItemStack var1=is.copy();
            if (this.getType()==5){
                if (this.ores.size()==0){
                	loadOres();
                }

            	System.out.println(this.ores.size());
            	int i=0;
            	while (i<this.ores.size()){
            		if (this.furnaceItemStacks[0].itemID==this.ores.get(i).itemID){
            			var1.stackSize=2;
            		}
        			System.out.println(this.furnaceItemStacks[0].itemID + ", " + this.ores.get(i).itemID);
        			i++;
            	}
            }

            if (this.furnaceItemStacks[2] == null)
            {
                this.furnaceItemStacks[2] = var1.copy();
            }
            else if (this.furnaceItemStacks[2].isItemEqual(var1))
            {
                this.furnaceItemStacks[2].stackSize+=var1.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 int getItemBurnTime(ItemStack par1ItemStack)
    {
        if (par1ItemStack == null)
        {
            return 0;
        }
        else
        {
            int var1 = par1ItemStack.getItem().shiftedIndex;
            
            if (var1 < 256 && Block.blocksList[var1].blockMaterial == Material.wood) return (int) Math.ceil(300*Fuel[getType()]);
            if (var1 == Item.stick.shiftedIndex) return (int) Math.ceil(100*Fuel[getType()]);
            if (var1 == Item.coal.shiftedIndex) return (int) Math.ceil(1600*Fuel[getType()]);
            if (var1 == Item.bucketLava.shiftedIndex) return (int) Math.ceil(20000*Fuel[getType()]);
            if (var1 == Block.sapling.blockID) return (int) Math.ceil(100*Fuel[getType()]);
            if (var1 == Item.blazeRod.shiftedIndex) return (int) Math.ceil(2400*Fuel[getType()]);
            int ret = GameRegistry.getFuelValue(par1ItemStack);
            if (ret > 0) 
            {
                return (int) Math.ceil(ret*Fuel[getType()]);
            }
            return 0;
        }
    }

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

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

    @Override
    public void openChest() {}

    @Override
    public void closeChest() {}

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

    @Override
    public int getSizeInventorySide(ForgeDirection side)
    {
        return 1;
    }
    public byte getDir(){
    	if (this.dir==0){return 3;}
    	return this.dir;
    }
    public void setDir(byte b){
    	System.out.println("setting dir to"+b);
    	this.dir=b;
    }
    public int getType(){
    	//System.out.println("Test"+Type);
    	return this.getBlockMetadata();
    }
}

 

 

The Block:

 

package flabs.mods.betterfurnaces;

import java.util.*;

import flabs.mods.betterfurnaces.client.GuiBFurnace;

import net.minecraft.src.Block;
import net.minecraft.src.BlockContainer;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.EntityItem;
import net.minecraft.src.EntityLiving;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.IBlockAccess;
import net.minecraft.src.ItemStack;
import net.minecraft.src.Material;
import net.minecraft.src.MathHelper;
import net.minecraft.src.NBTTagCompound;
import net.minecraft.src.TileEntity;
import net.minecraft.src.World;

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

    protected BlockBFurnace(int i)
    {
        super(i, Material.iron);
        this.blockIndexInTexture = 0;
        this.setCreativeTab(CreativeTabs.tabDecorations);
    }

    @Override
    public void addCreativeItems(ArrayList itemList)
    {
    	for(int l1 = 0; l1 < BetterFurnaces.furnaces.length; l1++)
        {
                itemList.add(new ItemStack(this, 1, l1));
        }
    }
    /**
     * Returns the Metadata of the item to drop on destruction.
     */
    @Override
    public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
    {
    	return ;
    }

    /**
     * Called whenever the block is added into the world. Args: world, x, y, z
     */
    @Override
    public void onBlockAdded(World world, int i, int j, int k)
    {
        super.onBlockAdded(world, i, j, k);
        System.out.println("WEEEEEEEEEEEEEEEEEEEEEEEEE");
        this.setDefaultDirection(world, i, j, k);
    }
    public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List)
    {
        for (int var4 = 0; var4 < BetterFurnaces.furnaces.length; ++var4)
        {
            par3List.add(new ItemStack(par1, 1, var4));
        }
    }
    
    @Override
    public int getLightValue(IBlockAccess world,int  x,int y,int z){
    	TileEntityBFurnace tebf=getTileEntityaround(world,x,y,z);
    	if (tebf!=null){
        	if (tebf.isActive){
        		return 14;
        	}
    	}
    	return 0;
    }
    /**
     * Returns one of the TileEntityBFurnace around it.
     * Args: IBlockAccess,x,y,z
     */
    private TileEntityBFurnace getTileEntityaround(IBlockAccess world,int  x,int y,int z){
    	TileEntity te[]={world.getBlockTileEntity(x, y, z)
    			,world.getBlockTileEntity(x+1, y, z)
    			,world.getBlockTileEntity(x-1, y, z)
    			,world.getBlockTileEntity(x, y+1, z)
    			,world.getBlockTileEntity(x, y-1, z)
    			,world.getBlockTileEntity(x, y, z+1)
    			,world.getBlockTileEntity(x, y, z-1)};
    	int i=0;
    	while(i<te.length){
        	if ((te[i]!=null) && (te[i] instanceof TileEntityBFurnace)){
        		return (TileEntityBFurnace) te[i];
        	}
        	i++;
        }
    	return null;
    }
    

    /**
     * set a blocks direction
     */
    private void setDefaultDirection(World world, int i, int j, int k)
    {
        if (!world.isRemote)
        {
            int var5 = world.getBlockId(i, j, k - 1);
            int var6 = world.getBlockId(i, j, k + 1);
            int var7 = world.getBlockId(i - 1, j, k);
            int var8 = world.getBlockId(i + 1, j, k);
            byte var9 = 3;

            if (Block.opaqueCubeLookup[var5] && !Block.opaqueCubeLookup[var6])
            {
                var9 = 3;
            }

            if (Block.opaqueCubeLookup[var6] && !Block.opaqueCubeLookup[var5])
            {
                var9 = 2;
            }

            if (Block.opaqueCubeLookup[var7] && !Block.opaqueCubeLookup[var8])
            {
                var9 = 5;
            }

            if (Block.opaqueCubeLookup[var8] && !Block.opaqueCubeLookup[var7])
            {
                var9 = 4;
            }
            ((TileEntityBFurnace)world.getBlockTileEntity(i, j, k)).setDir(var9);
        }
    }

    /**
     * Retrieves the block texture to use based on the display side. Args: iBlockAccess, x, y, z, side
     */
    @Override
    public int getBlockTexture(IBlockAccess iblockaccess, int i, int j, int k, int l)
    {
    	TileEntityBFurnace tebf=(TileEntityBFurnace)iblockaccess.getBlockTileEntity(i, j, k);
    	if (tebf==null){return 0;}
        if (l == 1)
        {
            return tebf.getType();
        }
        else if (l == 0)
        {
            return tebf.getType();
        }
        else
        {
            int var6 = tebf.getDir();
            if (var6==0){
            	return 0;
            }
            if (l!=var6){
            	return tebf.getType()+16;
            }
            else if (tebf.isActive)
            {
            	return tebf.getType() +48;
            }else{
            	return tebf.getType()+32;
            }
        }
    }

    /**
     * A randomly called display update to be able to add particles or other items for display
     */
    @Override
    public void randomDisplayTick(World world, int i, int j, int k, Random random)
    {
    	TileEntityBFurnace tebf=(TileEntityBFurnace)world.getBlockTileEntity(i, j, k);
        if (tebf.isActive)
        {
            int var6 = tebf.getDir();
            float var7 = (float)i + 0.5F;
            float var8 = (float)j + 0.0F + random.nextFloat() * 6.0F / 16.0F;
            float var9 = (float)k + 0.5F;
            float var10 = 0.52F;
            float var11 = random.nextFloat() * 0.6F - 0.3F;

            if (var6 == 4)
            {
                world.spawnParticle("smoke", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
                world.spawnParticle("flame", (double)(var7 - var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
            }
            else if (var6 == 5)
            {
                world.spawnParticle("smoke", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
                world.spawnParticle("flame", (double)(var7 + var10), (double)var8, (double)(var9 + var11), 0.0D, 0.0D, 0.0D);
            }
            else if (var6 == 2)
            {
                world.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D);
                world.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 - var10), 0.0D, 0.0D, 0.0D);
            }
            else if (var6 == 3)
            {
                world.spawnParticle("smoke", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D);
                world.spawnParticle("flame", (double)(var7 + var11), (double)var8, (double)(var9 + var10), 0.0D, 0.0D, 0.0D);
            }
        }
    }

    /**
     * Returns the block texture based on the side being looked at.  Args: side
     */
    @Override
    public int getBlockTextureFromSideAndMetadata(int i,int j)
    {
    	if (i==1 || i==0){return j;}
    	if (i==3){return j+32;}
        return j+16;
    }

    /**
     * Called upon block activation (left or right click on the block.). The three integers represent x,y,z of the
     * block.
     */
    @Override
public boolean onBlockActivated(World world, int i, int j, int k, EntityPlayer player, int i1, float f1, float f2, float f3) {
	TileEntity te = world.getBlockTileEntity(i, j, k);

	if (te==null|| !(te instanceof TileEntityBFurnace)){
		return true;
	}
	if (world.isRemote){
		return true;
	}
	TileEntityBFurnace tebf = (TileEntityBFurnace)te;
	byte b=tebf.getDir();
	System.out.println("TileEntity at: "+i+", "+j+", "+k+"; activated. Dir: "+b+" Type: "+tebf.getType());
	tebf.setDir(b);
	player.openGui(BetterFurnaces.instance,0, world, i,j,k);
	return true;
}

    /**
     * Called when the block is placed in the world.
     */
    @Override
    public void onBlockPlacedBy(World world, int i, int j, int k, EntityLiving entityliving)
    {
        int var6 = MathHelper.floor_double((double)(entityliving.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
        TileEntityBFurnace tebf=(TileEntityBFurnace)world.getBlockTileEntity(i, j, k);
        
        if (var6 == 0)
        {
            tebf.setDir((byte) 2);
        }

        if (var6 == 1)
        {
            tebf.setDir((byte) 5);
        }

        if (var6 == 2)
        {
        	tebf.setDir((byte) 3);
        }

        if (var6 == 3)
        {
        	tebf.setDir((byte) 4);
        }
    }

    /**
     * Called whenever the block is removed.
     */
    @Override
    public void breakBlock(World world, int i, int j, int k,int m,int n)
    {
            TileEntityBFurnace var5 = (TileEntityBFurnace)world.getBlockTileEntity(i, j, k);

            if (var5 != null)
            {
            	float var8 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
            	float var9 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
            	float var10 = this.furnaceRand.nextFloat() * 0.8F + 0.1F;
                float var13 = 0.05F;
            	
            	EntityItem BlockDrop = new EntityItem(world, (double)((float)i + var8), (double)((float)j + var9), (double)((float)k + var10), new ItemStack(BetterFurnaces.bfurnace, 1, var5.getType()));

                BlockDrop.motionX = (double)((float)this.furnaceRand.nextGaussian() * var13);
                BlockDrop.motionY = (double)((float)this.furnaceRand.nextGaussian() * var13 + 0.2F);
                BlockDrop.motionZ = (double)((float)this.furnaceRand.nextGaussian() * var13);
            	
            	world.spawnEntityInWorld(BlockDrop);
            	
                for (int var6 = 0; var6 < var5.getSizeInventory(); ++var6)
                {
                    ItemStack var7 = var5.getStackInSlot(var6);

                    if (var7 != null)
                    {
                        
                        while (var7.stackSize > 0)
                        {
                            int var11 = this.furnaceRand.nextInt(21) + 10;

                            if (var11 > var7.stackSize)
                            {
                                var11 = var7.stackSize;
                            }

                            var7.stackSize -= var11;
                            EntityItem var12 = new EntityItem(world, (double)((float)i + var8), (double)((float)j + var9), (double)((float)k + var10), new ItemStack(var7.itemID, var11, var7.getItemDamage()));

                            if (var7.hasTagCompound())
                            {
                                var12.item.setTagCompound((NBTTagCompound)var7.getTagCompound().copy());
                            }
                            
                            var12.motionX = (double)((float)this.furnaceRand.nextGaussian() * var13);
                            var12.motionY = (double)((float)this.furnaceRand.nextGaussian() * var13 + 0.2F);
                            var12.motionZ = (double)((float)this.furnaceRand.nextGaussian() * var13);
                            world.spawnEntityInWorld(var12);
                        }
                    }
                }
            }

        super.breakBlock(world, i, j, k,m,n);
    }
    @Override
    public String getTextureFile(){
    	return "/flabs/mods/betterfurnaces/sprites/BFurnaces.png";
    }

    public TileEntity createNewTileEntity(World world, int metadata)
    {
    	TileEntityBFurnace tebf =new TileEntityBFurnace();
    	return tebf;
    }
@Override
public TileEntity createNewTileEntity(World var1) {
        return new TileEntityBFurnace();
}
}

 

Link to comment
Share on other sites

I think your problem is that the tileEntity on the server will read your 'Dire' from the NBT system, but you need to send a package to make sure your client tileEntity knows the direction as well.

 

Easy way to test whether this is the case is to add the following code to your tileEntity's entityUpdate() method:

Side side = FMLCommonHandler.instance().getEffectiveSide();
System.out.println("The direction is " + this.getDir() + " in " + side);

Make sure you only have a single copy of your tileEntity up in the world, because it'll be spamming a lot of System.out messages once there's a BFurnace. One will say "The direction is ? in SERVER" the other will say "The direction is ? in CLIENT". If ? is not the same in both cases, you'll have found your problem.

Link to comment
Share on other sites

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

    • OLXTOTO: Platform Maxwin dan Gacor Terbesar Sepanjang Masa OLXTOTO telah menetapkan standar baru dalam dunia perjudian dengan menjadi platform terbesar untuk pengalaman gaming yang penuh kemenangan dan kegacoran, sepanjang masa. Dengan fokus yang kuat pada menyediakan permainan yang menghadirkan kesenangan tanpa batas dan peluang kemenangan besar, OLXTOTO telah menjadi pilihan utama bagi para pencinta judi berani di Indonesia. Maxwin: Mengejar Kemenangan Terbesar Maxwin bukan sekadar kata-kata kosong di OLXTOTO. Ini adalah konsep yang ditanamkan dalam setiap aspek permainan yang mereka tawarkan. Dari permainan slot yang menghadirkan jackpot besar hingga berbagai opsi permainan togel dengan hadiah fantastis, para pemain dapat memperoleh peluang nyata untuk mencapai kemenangan terbesar dalam setiap taruhan yang mereka lakukan. OLXTOTO tidak hanya menawarkan kesempatan untuk menang, tetapi juga menjadi wadah bagi para pemain untuk meraih impian mereka dalam perjudian yang berani. Gacor: Keberuntungan yang Tak Tertandingi Keberuntungan seringkali menjadi faktor penting dalam perjudian, dan OLXTOTO memahami betul akan hal ini. Dengan berbagai strategi dan analisis yang disediakan, pemain dapat menemukan peluang gacor yang tidak tertandingi dalam setiap taruhan. Dari hasil togel yang tepat hingga putaran slot yang menguntungkan, OLXTOTO memastikan bahwa setiap taruhan memiliki potensi untuk menjadi momen yang mengubah hidup. Inovasi dan Kualitas Tanpa Batas Tidak puas dengan prestasi masa lalu, OLXTOTO terus berinovasi untuk memberikan pengalaman gaming terbaik kepada para pengguna. Dengan menggabungkan teknologi terbaru dengan desain yang ramah pengguna, platform ini menyajikan antarmuka yang mudah digunakan tanpa mengorbankan kualitas. Setiap pembaruan dan peningkatan dilakukan dengan tujuan tunggal: memberikan pengalaman gaming yang tanpa kompromi kepada setiap pengguna. Komitmen Terhadap Kepuasan Pelanggan Di balik kesuksesan OLXTOTO adalah komitmen mereka terhadap kepuasan pelanggan. Tim dukungan pelanggan yang profesional siap membantu para pemain dalam setiap langkah perjalanan gaming mereka. Dari pertanyaan teknis hingga bantuan dengan transaksi keuangan, OLXTOTO selalu siap memberikan pelayanan terbaik kepada para pengguna mereka. Penutup: Mengukir Sejarah dalam Dunia Perjudian Daring OLXTOTO bukan sekadar platform perjudian berani biasa. Ini adalah ikon dalam dunia perjudian daring Indonesia, sebuah destinasi yang menyatukan kemenangan dan keberuntungan dalam satu tempat yang mengasyikkan. Dengan komitmen mereka terhadap kualitas, inovasi, dan kepuasan pelanggan, OLXTOTO terus mengukir sejarah dalam perjudian dunia berani, menjadi nama yang tak terpisahkan dari pengalaman gaming terbaik. Bersiaplah untuk mengalami sensasi kemenangan terbesar dan keberuntungan tak terduga di OLXTOTO - platform maxwin dan gacor terbesar sepanjang masa.
    • OLXTOTO - Bandar Togel Online Dan Slot Terbesar Di Indonesia OLXTOTO telah lama dikenal sebagai salah satu bandar online terkemuka di Indonesia, terutama dalam pasar togel dan slot. Dengan reputasi yang solid dan pengalaman bertahun-tahun, OLXTOTO menawarkan platform yang aman dan andal bagi para penggemar perjudian daring. DAFTAR OLXTOTO DISINI DAFTAR OLXTOTO DISINI DAFTAR OLXTOTO DISINI Beragam Permainan Togel Sebagai bandar online terbesar di Indonesia, OLXTOTO menawarkan berbagai macam permainan togel. Mulai dari togel Singapura, togel Hongkong, hingga togel Sidney, pemain memiliki banyak pilihan untuk mencoba keberuntungan mereka. Dengan sistem yang transparan dan hasil yang adil, OLXTOTO memastikan bahwa setiap taruhan diproses dengan cepat dan tanpa keadaan. Slot Online Berkualitas Selain togel, OLXTOTO juga menawarkan berbagai permainan slot online yang menarik. Dari slot klasik hingga slot video modern, pemain dapat menemukan berbagai opsi permainan yang sesuai dengan preferensi mereka. Dengan grafis yang memukau dan fitur bonus yang menggiurkan, pengalaman bermain slot di OLXTOTO tidak akan pernah membosankan. Keamanan dan Kepuasan Pelanggan Terjamin Keamanan dan kepuasan pelanggan merupakan prioritas utama di OLXTOTO. Mereka menggunakan teknologi enkripsi terbaru untuk melindungi data pribadi dan keuangan para pemain. Tim dukungan pelanggan yang ramah dan responsif siap membantu pemain dengan setiap pertanyaan atau masalah yang mereka hadapi. Promosi dan Bonus Menarik OLXTOTO sering menawarkan promosi dan bonus menarik kepada para pemainnya. Mulai dari bonus selamat datang hingga bonus deposit, pemain memiliki kesempatan untuk meningkatkan kemenangan mereka dengan memanfaatkan berbagai penawaran yang tersedia. Penutup Dengan reputasi yang solid, beragam permainan berkualitas, dan komitmen terhadap keamanan dan kepuasan pelanggan, OLXTOTO tetap menjadi salah satu pilihan utama bagi para pecinta judi online di Indonesia. Jika Anda mencari pengalaman berjudi yang menyenangkan dan terpercaya, OLXTOTO layak dipertimbangkan.
    • I have been having a problem with minecraft forge. Any version. Everytime I try to launch it it always comes back with error code 1. I have tried launching from curseforge, from the minecraft launcher. I have also tried resetting my computer to see if that would help. It works on my other computer but that one is too old to run it properly. I have tried with and without mods aswell. Fabric works, optifine works, and MultiMC works aswell but i want to use forge. If you can help with this issue please DM on discord my # is Haole_Dawg#6676
    • Add the latest.log (logs-folder) with sites like https://paste.ee/ and paste the link to it here  
    • I have no idea how a UI mod crashed a whole world but HUGE props to you man, just saved me +2 months of progress!  
  • Topics

×
×
  • Create New...

Important Information

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