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

Well the title says it all what i'm trying to do is make it so that once I use my bonemeal like item on the tree it is saved on an nbt and counts down from 1200000 (1 minecraft day). uhm, for some reason it's allowing me to continuously use the item without anything holding me back. Please give me some assistance.

 

 

TileEntityTree

 

 

3d8a0bcbd628a1ee527617d3fab30ec7.png

 

 

 

 

Bonemeal Function For Tree

 

 

e3fb44e1a1064a2191e961528881dd04.png

 

 

 

 

 

Any particular reason why you retrieve the NBT from a packet without ever sending it if you could just as well simply get the property of the TileEntity that you have retrieved nonetheless?

 

uhm, for some reason it's allowing me to continuously use the item without anything holding me back.

 

In your TileEntity.writeToNBT, you use

nbt.setLong("TimeLastWatered", timeLastWatered);

 

while in your custom bonemeal function, you attempt to retrieve this value with

nbt.getLong("TimeLastWatering");

which doesn't exist. Default return value for inexistent NBT sub long tags is 0. Current system time - 0 is always bigger than 10,000.

  • Author

so if I simply change my public long to

 

public long timeLastWatered = 10000;

 

it should solve my issue correct? I will that a try. Unless I misread what you said.

so if I simply change my public long to

 

public long timeLastWatered = 10000;

 

it should solve my issue correct? I will that a try. Unless I misread what you said.

 

You did misread what I said. I said the way you are reading information from the NBT is incorrect. You store the property of your TileEntity under a different tag name than the one you try to read it from. Since that tag name does not exist, Minecraft will return 0 for your timeLastWatering local long variable.

 

I'd suggest that you skip the NBT part for the Bonemeal function completely and just use

if( !world.isRemote && /* your other conditions */ ) {
    TileEntityApricornTree tileEntity = (TileEntityApricornTree)world.getBlockTileEntity(event.X, event.Y, event.Z);
    long currentTime = System.nanoTime(),
        timeLastWatered = tileEntity.timeLastWatered;

    if( (currentTime - timeLastWatered) > MILLISPERDELAY ) {
        tileEntity.timeLastWatered = currentTime;
        world.setBlockMetadataWithNotify( /* Blabla, can't read all your parameters. */ );
        event.setResult(Event.ALLOW);
    }
}

 

Note that when writing to the NBT customly the way you do it in your original code, the changes won't be reflected the next time the item is used because the NBT is never read. TileEntity.readFromNBT is only called when the block is loaded, i.e. on chunk load. You could at the utter most try

 

if( (currentTime - timeLastWatered) > MILLISPERDELAY ) {
    nbt.setLong("TimeLastWatered", currentTime);
    
    // tileEntityApricornTree.writeToNBT(nbt);
    // Don't do this. The NBT still has the old TileEntityApricornTree.timeLastWatered set, so you'll
    // end up overwriting the nbt.setLong("TimeLastWatered", currentTime); that you just used.
    
    tileEntityApricornTree.readFromNBT(nbt);
    
    // ... your other code here.
}

 

but I would still suggest you'd take the other approach since it is more straight-forward.

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.