Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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 

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.

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.

  • Author

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.

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.

  • Author

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?

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.

  • Author

Hmmm, that's because "theWorld" is an instance of "ClientWorld", right?

 

I'll check on ways to get "World" by itself.

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.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.