Posted June 18, 201312 yr 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 Bonemeal Function For Tree
June 18, 201312 yr 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.
June 18, 201312 yr 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.
June 18, 201312 yr 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.