Jump to content

[1.7.2] Persistant NBT Data [Solved]


Disconsented

Recommended Posts

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

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Sorry I guess that part was a little unclear: PlayerInformation.saveProxyData((EntityPlayer) event.entity); is a replacement for, not an addition to, all the code in the living death event. See section 6 for the exact details, or you can see a working example here: https://github.com/coolAlias/Tutorial-1.7.2/tree/master/src/main/java/tutorial

Link to comment
Share on other sites

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));
}

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.

Announcements



×
×
  • Create New...

Important Information

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