Solved it by manipulating the block metadata when condition is met and then checking for block metadata changes in the randomDisplayTick, seems similar to how vanilla redstone wire handles their particles.
Full code of block and tile entity for reference in case others want to do something like this:
public class SoftGlassBlock extends Block implements ITileEntityProvider {
public SoftGlassBlock(Material material){
super(material);
setTickRandomly(true);
setBlockName("softGlassBlock");
setBlockTextureName(QuenchProperties.MODID + ":" + getUnlocalizedName().substring(5));
setCreativeTab(CreativeTabs.tabBlock);
setLightLevel(0.3F);
setLightOpacity(3);
}
@SideOnly(Side.CLIENT)
public int getRenderBlockPass(){
return 1;
}
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockAccess p_149646_1_, int p_149646_2_, int p_149646_3_, int p_149646_4_, int p_149646_5_)
{
Block block = p_149646_1_.getBlock(p_149646_2_, p_149646_3_, p_149646_4_);
return block == this ? false : super.shouldSideBeRendered(p_149646_1_, p_149646_2_, p_149646_3_, p_149646_4_, p_149646_5_);
}
public boolean isOpaqueCube(){
return false;
}
public void updateTick(World world, int x, int y, int z, Random rand)
{
if (world.provider.isHellWorld) {
return;
} else {
if (world.getSavedLightValue(EnumSkyBlock.Block, x, y, z) > 10 - this.getLightOpacity()) {
return;
} else {
SoftGlassEntity entity = (SoftGlassEntity) world.getTileEntity(x, y, z);
int currentTemperature = entity.getGlassTemperature();
if(currentTemperature > 0){
currentTemperature--;
entity.setGlassTemperature(currentTemperature);
world.markBlockForUpdate(x, y, z);
world.playSoundEffect((double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "random.fizz", 1.0F, world.rand.nextFloat() * 0.1F + 0.9F);
} else {
world.setBlock(x, y, z, Blocks.glass);
world.removeTileEntity(x, y, z);
}
}
}
}
@SideOnly(Side.CLIENT)
public void randomDisplayTick(World world, int x, int y, int z, Random rand) {
int meta = world.getBlockMetadata(x, y, z);
if(meta > 0){
world.spawnParticle("largesmoke", (double)x + 0.5D, (double)y + 1.2D, (double)z + 0.5D, 0.0D, 0.1D, 0.0D);
world.setBlockMetadataWithNotify(x, y, z, 0, 2);
}
}
@Override
public TileEntity createNewTileEntity(World world, int p_149915_2_) {
return new SoftGlassEntity();
}
}
public class SoftGlassEntity extends TileEntity {
private int glassTemperature;
public SoftGlassEntity(){
this.glassTemperature = 3;
}
public void setGlassTemperature(int temperature){
worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2);
this.glassTemperature = temperature;
}
public int getGlassTemperature(){
return this.glassTemperature;
}
public void writeToNBT(NBTTagCompound tag)
{
super.writeToNBT(tag);
tag.setInteger("GlassTemperature", this.glassTemperature);
}
public void readFromNBT(NBTTagCompound tag)
{
super.readFromNBT(tag);
this.glassTemperature = tag.getInteger("GlassTemperature");
}
}