Posted May 25, 201510 yr 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
May 25, 201510 yr 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
May 26, 201510 yr Author 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.
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.