Jump to content

[1.8] Slow lighting update


TheRedMezek

Recommended Posts

I have a block which alternates between states of producing and not producing light, but for some reason the change only effects the block itself, until several seconds after (once I've placed stuff around it) it finally shines out into neighboring blocks.

 

Block class

 

public class CookingBrazier extends BlockContainer{

    private String name = "cookingbrazier";

    private static boolean keepInventory;

    public static final PropertyBool ISBURNING = PropertyBool.create("active");

 

 

    public boolean isOpaqueCube(){

        return false;

    }

    public boolean isFullCube()

    {

        return false;

    }

 

    @SideOnly(Side.CLIENT)

    public void randomDisplayTick(World worldIn, BlockPos pos, IBlockState state, Random rand)

    {

        boolean isBurning = ((Boolean)state.getValue(ISBURNING)).booleanValue();

        if(isBurning) {

            double d0 = (double) pos.getX() + 0.5D;

            double d1 = (double) pos.getY() + 0.9D;

            double d2 = (double) pos.getZ() + 0.5D;

 

            worldIn.spawnParticle(EnumParticleTypes.SMOKE_NORMAL, d0, d1, d2, 0.0D, 0.0D, 0.0D, new int[0]);

        }

    }

 

    @Override

    public int getRenderType() {

        return 3;

    }

 

    public String getName(){

        return name;

    }

 

    @Override

    public int getLightValue(IBlockAccess world, BlockPos pos){

 

        Block block = world.getBlockState(pos).getBlock();

        if (block != this)

        {

            return block.getLightValue(world, pos);

        }

 

        IBlockState state = world.getBlockState(pos);

        boolean isBurning = ((Boolean)state.getValue(ISBURNING)).booleanValue();

        if(isBurning) {

            return 15;

        }

        return 0;

    }

 

    public void setBlockBoundsBasedOnState(IBlockAccess worldIn, BlockPos pos) {

        setBlockBounds(0.1F, 0.0F, 0.1F, 0.9F, 1F, 0.9F);

    }

 

    public CookingBrazier(boolean isBurning){

        super(Material.circuits);

        this.setDefaultState(this.blockState.getBaseState().withProperty(ISBURNING, Boolean.valueOf(false)));

        this.setCreativeTab(CreativeTabs.tabDecorations);

        this.setUnlocalizedName("braziermod" + "_" + name);

        this.setHardness(0.8f);

        this.setLightLevel(0f);

        GameRegistry.registerBlock(this, name);

    }

 

    public TileEntity createNewTileEntity(World worldIn, int meta)

    {

        return new TileEntityCookingBrazier();

    }

 

    @SideOnly(Side.CLIENT)

    public EnumWorldBlockLayer getBlockLayer()

    {

        return EnumWorldBlockLayer.CUTOUT;

    }

 

    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)

    {

        if (worldIn.isRemote)

        {

            return true;

        }

        else

        {

            TileEntity tileentity = worldIn.getTileEntity(pos);

 

            if (tileentity instanceof TileEntityCookingBrazier)

            {

                playerIn.displayGUIChest((TileEntityCookingBrazier)tileentity);

            }

 

            return true;

        }

    }

 

    public void breakBlock(World worldIn, BlockPos pos, IBlockState state)

    {

        if (!keepInventory)

        {

            TileEntity tileentity = worldIn.getTileEntity(pos);

 

            if (tileentity instanceof TileEntityFurnace)

            {

                InventoryHelper.dropInventoryItems(worldIn, pos, (TileEntityFurnace)tileentity);

                worldIn.updateComparatorOutputLevel(pos, this);

            }

        }

 

        super.breakBlock(worldIn, pos, state);

    }

 

    public static void setState(boolean active, World worldIn, BlockPos pos){

        TileEntity tileentity = worldIn.getTileEntity(pos);

        worldIn.setBlockState(pos, BrazierMod.cookingbrazier.getDefaultState().withProperty(ISBURNING, active), 3);

 

        if (tileentity != null)

        {

            tileentity.validate();

            worldIn.setTileEntity(pos, tileentity);

        }

    }

 

    //public IBlockState onBlockPlaced(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)

    //{

        //return this.getDefaultState().withProperty(ISBURNING, Boolean.valueOf(false));

    //}

 

 

 

    protected BlockState createBlockState()

    {

        return new BlockState(this, new IProperty[] {ISBURNING});

    }

 

    //public IBlockState getStateFromMeta(int meta)

    //{

        //return this.getDefaultState();

        //return this.getDefaultState().withProperty(ISBURNING, meta == 1);

        //return this.getDefaultState().withProperty(ISBURNING, Boolean.valueOf(isBurning));

    //}

    public IBlockState getStateFromMeta(int meta)

    {

        return this.getDefaultState().withProperty(ISBURNING, Boolean.valueOf(meta == 1));

    }

 

    public int getMetaFromState(IBlockState state)

    {

        return ((Boolean)state.getValue(ISBURNING)).booleanValue() ? 1 : 0;

    }

}

 

 

Picture of block before the lighting updates

XstlSDM.png

Link to comment
Share on other sites

Lighting is not updated every tick because it is too much work and would slow the game down too much.  You need to trigger a relighting check manually (like we said in your other post a few days ago) http://www.minecraftforge.net/forum/index.php/topic,30574.msg158789.html#msg158789.  Don't put it in getLightValue because that will probably cause recursion and a crash.

 

Some background info on lighting

http://greyminecraftcoder.blogspot.com.au/2014/12/lighting-18.html

 

-TGG

Link to comment
Share on other sites

I now have this in my tile entity's update method, but it still doesn't work. Thank you for your replies, I hadn't noticed you posted anything in my last thread.

 

//Before the update method:

private boolean prevIsBurning;

 

//Within the update method:

boolean flag = this.isBurning();

 

        if (prevIsBurning != flag) {

            prevIsBurning = flag;

            if (worldObj.isRemote) {

                worldObj.markBlockForUpdate(pos);

            }

            worldObj.checkLightFor(EnumSkyBlock.BLOCK, pos);

        }

 

The last post in the last thread said to use checkLightFor on the surrounding blocks if this didn't work. I tied changing the line to this:

worldObj.checkLightFor(EnumSkyBlock.BLOCK, pos.east());

but it didn't do anything different. I will keep experimenting, any advice is appreciated.

 

P.S. I won't be able to look back here for a while.

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.



×
×
  • Create New...

Important Information

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