Jump to content

Use bonemeal like item once a day per tree/tileentity


Xwaffle

Recommended Posts

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

 

 

 

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

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.