Jump to content

Recommended Posts

Posted

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?

Posted

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

Posted

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?

Posted

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.

Posted

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

Posted

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?

Posted

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

Posted

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.
×
×
  • Create New...

Important Information

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