Jump to content

how to call non random updateTick for blocks Forge [1.12]


JavaMan7

Recommended Posts

I want to make a block despawn after a time. but the update is called randomly so i can not control  the time for the block to despawn. i tried scheduleUpdate method but that dose not seem to work. 

 

package com.javaman.subterranean.blocks;

import java.util.Random;

import org.w3c.dom.css.ElementCSSInlineStyle;

import com.javaman.subterranean.SubterraneanCreaturesMod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Blocks;
import net.minecraft.util.DamageSource;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class LapisCobblestone extends Block {
	public long timelast = 0;
	public long time = 0;
	public boolean l = true;
	
	public LapisCobblestone() {
		super(Material.ROCK);
		this.setUnlocalizedName("simie_cobblestone");
		this.setRegistryName(SubterraneanCreaturesMod.MODID+":"+"simie_cobblestone");
		this.setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
		this.setTickRandomly(true);
		  // this.setTickRandomly(true);
	}
	@Override
	 public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand)
	    {
		
		 worldIn.scheduleUpdate(pos, this, 1);
		 if(l) {
			 timelast =	Minecraft.getMinecraft().getSystemTime();
			 
			 l=false;
		 }else {
			 
			 System.out.println("hi");
			 time =Minecraft.getMinecraft().getSystemTime();
			 
			 if(timelast - time >= 5000) {
				 worldIn.setBlockState(pos, Blocks.AIR.getDefaultState());
				 
				 l=true;
				 
			 }
			 
			
			// worldIn.setBlockState(pos, Blocks.AIR.getDefaultState());
		 }
			
			
		
		
		
		
	    }
	@Override
	  public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn)
	    {
	        if (!entityIn.isImmuneToFire() && entityIn instanceof EntityLivingBase && !EnchantmentHelper.hasFrostWalkerEnchantment((EntityLivingBase)entityIn))
	        {
	            entityIn.attackEntityFrom(DamageSource.HOT_FLOOR, 1.0F);
	           
	        }

	        super.onEntityWalk(worldIn, pos, entityIn);
	    }
	@Override
	public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn)
    {
        entityIn.motionX *= 0.4D;
        entityIn.motionZ *= 0.4D;
    }
	@Override
	 public int tickRate(World worldIn)
	    {
	        return 10;
	    }
	@Override
	 public boolean requiresUpdates()
	    {
	        return true;
	    }
}

 

Link to comment
Share on other sites

First of all, your LapisCobblestone is a Block, and blocks are singletons, meaning that only one instance of them is made (the instance you use when you register it).

 

Therefore, all of your variables (timelast, time, l) will be the same for every LapisCobblestone block placed in the world. You don't really want to do that.

 

I'd add a tile entity to the block that extends ITickable, personally (see vanilla tile entities such as the furnace)

 

Link to comment
Share on other sites

You have to remember that any Minecraft world ends up with literally millions of block positions. Each chunk alone has 65k block positions! So for performance and memory/storage reasons, only a little bit can be done with blocks. So you can't have lots of blocks ticking or it will cause a performance problem. Of course it is nice to have some blocks that change over time so there are two options -- tile entities (which really just means a "ticking block position that can contain extra data") or random ticks. Of course you can try to do your own ticking by handling a world tick event and scanning blocks but that would cause performance problems.

 

So the main way to have your block tick is to assign a tile entity. However, it sounds like you want to replace a lot of blocks since you're calling it "dirt". That will still be a problem because a lot of tile entities will have same problem with performance.

 

Basically I'm saying there isn't really any way you can have a lot of blocks (like dirt) ticking constantly without a serious performance impact.

 

But if you want to try, you should use tile entities as that is the optimized way of ticking a block position.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Cough.

There's also scheduled block ticks. Which is what redstone uses.

 

And TEs are not always ticking. You can have non-ticking TEs.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

8 minutes ago, Draco18s said:

Cough.

There's also scheduled block ticks. Which is what redstone uses.

 

And TEs are not always ticking. You can have non-ticking TEs.

I never said TEs have to tick.

 

Regarding scheduled ticks, you're right I forgot about that mechanism. But again none of these save him anything. Ticking a block is easy -- at least five simple ways come to mind to do it. But there is a reason why there are special mechanisms for ticking -- anything that tries to tick a lot of blocks will have potential performance problems.

 

My answer is mostly reacting to fact he's talking about "dirt" blocks which I assume would form a lot of surface. If he's only placing these occasionally like redstone-based things, then sure use scheduled.

 

Also, I would suggest that random isn't necessarily that bad. Vanilla ice blocks melt randomly, so turning a "frozen dirt" to "dirt" with random ticking is very consistent with way Minecraft already treats melting blocks.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

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.