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

No, don't create a compound.

 

@Override
public void saveNBTData(NBTTagCompound compound) {
// see that NBTTagCompound compound ^^^^^^^ right there? use that:
compound.setInteger("someData", value);
}

 

Same for reading from NBT. How do you expect the data to persist if you create new data every single time?

  • Author

Okay so some progress, I was able to determine that loadNBTData is in fact working however:

java.lang.NullPointerException
at tutorial.generic.PlayerInformation.loadNBTData(PlayerInformation.java:49)
at net.minecraft.entity.Entity.readFromNBT(Entity.java:1682)
at net.minecraft.server.management.ServerConfigurationManager.readPlayerDataFromFile(ServerConfigurationManager.java:252)
at net.minecraft.server.management.ServerConfigurationManager.initializeConnectionToPlayer(ServerConfigurationManager.java:124)
at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeServerSideConnection(NetworkDispatcher.java:172)
at cpw.mods.fml.common.network.handshake.NetworkDispatcher.completeHandshake(NetworkDispatcher.java:428)
at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:17)
at cpw.mods.fml.common.network.internal.HandshakeCompletionHandler.channelRead0(HandshakeCompletionHandler.java:11)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:98)
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:337)
at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:323)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785)
at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169)
at cpw.mods.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:80)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242)
at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:762)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:650)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:528)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:787)

http://pastebin.com/diff.php?i=rDAGKv0f

I believe the issue is this.currentXp however I cannot for the life of me figure out why

  • Author

You better null check [!=null], create an if statement to check if it is not null before proceeding.

Checking if (this.currentXP != null) ?

 

Edit:

Looks like it loadNBTData isnt actually being called (System.out.println("NBT LOADED");) on player death

Any ideas on whats wrong?

Extended property data doesn't load by default when the player respawns, but you can do so manually using the PlayerRespawnEvent from FML. Be sure to save the data first when the player dies!

 

Also, this may interest you, as it discusses the issue of persisting your data across death and respawn. Note that I didn't use the PlayerRespawnEvent, but that would be preferable as it is only posted for players.

  • Author

Extended property data doesn't load by default when the player respawns, but you can do so manually using the PlayerRespawnEvent from FML. Be sure to save the data first when the player dies!

 

Also, this may interest you, as it discusses the issue of persisting your data across death and respawn. Note that I didn't use the PlayerRespawnEvent, but that would be preferable as it is only posted for players.

Okay so i tried using the method in the link however, How do I resolve:

genericHooks: http://pastebin.com/7jwUHD1Z

"username cannot be resolved or is not a field" (Line 53 and 68)

"The method saveProxyData(EntityPlayer) is undefined for the type PlayerInformation" (Line 55)

"The method saveProxyData(EntityPlayer) is undefined for the type PlayerInformation (Line  75)

CommonProxy: http://pastebin.com/qnztU914

"The method put(String, NBTTagCompound) is undefined for the type PlayerInformation" (Line 24)

"The method remove(String) is undefined for the type PlayerInformation" (Line 32)

http://pastebin.com/C8AJcp9W

  • Author

username cannot be accessed in 1.7.2, change it to getCommandSenderName() or whatever.

 

For the rest, you have to add the methods, otherwise of course they are undefined.

I must have missed the methods in your thread, which section are they under?

So effectively:

There is no simple way of having persistent player data?

This is the simplest way I know of, though that's not to say there isn't any other way. It's basically two steps:

 

1. Store the data when the player dies

 

2. Load the data when the player respawns

 

Maybe you can automate those steps by storing the data directly in the player's PERSISTED_NBT_TAG tag, but I have never had any luck with that one. I didn't try too hard, since I already had everything working, so maybe you can get it to work.

 

EDIT: Here's the relevant code from EntityPlayer#clonePlayer:

//Copy over a section of the Entity Data from the old player.
//Allows mods to specify data that persists after players respawn.
NBTTagCompound old = par1EntityPlayer.getEntityData();
if (old.hasKey(PERSISTED_NBT_TAG))
{
    getEntityData().setTag(PERSISTED_NBT_TAG, old.getCompoundTag(PERSISTED_NBT_TAG));
}

  • Author

So effectively:

There is no simple way of having persistent player data?

This is the simplest way I know of, though that's not to say there isn't any other way. It's basically two steps:

 

1. Store the data when the player dies

 

2. Load the data when the player respawns

 

Maybe you can automate those steps by storing the data directly in the player's PERSISTED_NBT_TAG tag, but I have never had any luck with that one. I didn't try too hard, since I already had everything working, so maybe you can get it to work.

 

EDIT: Here's the relevant code from EntityPlayer#clonePlayer:

//Copy over a section of the Entity Data from the old player.
//Allows mods to specify data that persists after players respawn.
NBTTagCompound old = par1EntityPlayer.getEntityData();
if (old.hasKey(PERSISTED_NBT_TAG))
{
    getEntityData().setTag(PERSISTED_NBT_TAG, old.getCompoundTag(PERSISTED_NBT_TAG));
}

Alright I will have a play with that and post my results

Guest
This topic is now closed to further replies.

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.