Jump to content

[1.10.2] Block age


Sanshirou

Recommended Posts

Is it possible to get how much time has a block been on the world? And if so, how?

 

Specifically, the block I'm trying to get it's age from are regular torches, and their only properties is "where are they facing", and then I've been trying to find something like a "getAge()" for the block, or it's BlockState, but so far I haven't been succesful on finding it.

 

The objective behind this is to make a WorldTick event to check if torches in the loaded chunks have more than X age, and if so, they break.

 

This is my first time going through this stuff, so I'm still getting lost 

Link to comment
Share on other sites

The only way is to use a ticking TileEntity. There is no other way, all blocks are exactly the same.

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

29 minutes ago, diesieben07 said:

No need for ticking, just store the current world total time when placing the block.

Touche.

In any case, you can't get that data from arbitrary blocks (e.g, torches). You'd have to replace the block.

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

Thank you for the answers.

I tried using the "Current world total time" answer, but I don't exactly know where to store it, in a simple Array it will get cleared when the game instance is closed, so I guess I'll have to find a place to store it into NBT or something.

 

If that doesn't work I'll end up using some other kind of hack.

Link to comment
Share on other sites

9 minutes ago, Sanshirou said:

so I guess I'll have to find a place to store it into NBT or something.

Yes. In a tile entity.

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

I'm going to sleep now, but at the end I ended up doing this:

 

public class TorchDestroyer extends TileEntity{
	private long worldTime;
	public TorchDestroyer(){
		super();
		worldTime = Minecraft.getMinecraft().theWorld.getTotalWorldTime();
	}
	public long getWorldTime() {
		return worldTime;
	}
	public void setWorldTime(long worldTime) {
		this.worldTime = worldTime;
	}
	@Override
	public NBTTagCompound writeToNBT(NBTTagCompound compound){
		super.writeToNBT(compound);
		compound.setLong("torchBorn", getWorldTime());
		return compound;
	}
	@Override
	public void readFromNBT(NBTTagCompound compound){
		super.readFromNBT(compound);
		setWorldTime(compound.getLong("torchBorn"));
	}
}

 

And then:

 

	@SubscribeEvent
	public void listTorch(PlaceEvent event) {
		if (event.getPlacedBlock().getBlock() == Blocks.TORCH) {
			TorchDestroyer n =  new TorchDestroyer();
			n.setPos(event.getPos());
			Minecraft.getMinecraft().theWorld.addTileEntity(n);
		}
	}
    
	int deathTorchTick = 0;
    
	@SubscribeEvent
	public void cancelarAntorcha(WorldTickEvent event) {
		deathTorchTick++;

		if (deathTorchTick >= 1000 && !event.isCanceled()) {
			World w = Minecraft.getMinecraft().theWorld;
			for (TileEntity obj : w.loadedTileEntityList) {
				if (obj instanceof TorchDestroyer) {
					TorchDestroyer torchKiller = (TorchDestroyer) obj;
					if (Minecraft.getMinecraft().theWorld.getTotalWorldTime() > torchKiller.getWorldTime()+ Configuracion.TORCH_DECAY_TIME) {
						if (Minecraft.getMinecraft().theWorld.getBlockState(torchKiller.getPos()).getBlock() == Blocks.TORCH) {
							Minecraft.getMinecraft().theWorld.setBlockToAir(torchKiller.getPos());
							Minecraft.getMinecraft().theWorld.removeTileEntity(torchKiller.getPos());
						} else {
							Minecraft.getMinecraft().theWorld.removeTileEntity(torchKiller.getPos());
						}
					}
				}
			}
			deathTorchTick = 0;
		}
	}

 

And for now it works (In singleplayer), I don't know if I should rename the post in case someone has a trouble like this

 

Will this have any troubles when moving it to a multiplayer environment?

Link to comment
Share on other sites

2 minutes ago, Sanshirou said:

Will this have any troubles when moving it to a multiplayer environment?

Yes.

2 minutes ago, Sanshirou said:

Minecraft.getMinecraft().theWorld.addTileEntity(n);

Because that is client side only.

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

One thing you might want to think about is what happens if someone breaks the torch and picks up the ItemBlock. Should the torch last forever in their inventory? What if they re-place the torch? Do you start the countdown over again? You might consider creating your own Block and/or ItemBlock. You could use a tile entity for the block and the damage field of the ItemBlock to keep track of their age.

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



×
×
  • Create New...

Important Information

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