NPE : Saving entity NBT
-
Salut,
J’ai un crash lors de la sauvegarde du joueur dans les tags NBT.
J’ai réussi à identifier la raison du crash et la ligne qui pose problème.- EntityPlayer#writeEntityToNBT
net.minecraftforge.fml.common.FMLCommonHandler.instance().getDataFixer().writeVersionData(compound);
- getDataFixer() renvoie null
Et FMLServerHandler#getDataFixer (voir stackstrace pour comprendre pourquoi je donne FMLServerHandler et non FMLCommonHandler)
@Override public CompoundDataFixer getDataFixer() { return (CompoundDataFixer)this.server.getDataFixer(); }
- this.server est null (je suis en solo)
Le rapport de crash :
–-- Minecraft Crash Report ---- // Would you like a cupcake? Time: 12/28/16 12:07 AM Description: Saving entity NBT java.lang.NullPointerException: Saving entity NBT at net.minecraftforge.fml.server.FMLServerHandler.getDataFixer(FMLServerHandler.java:338) at net.minecraftforge.fml.common.FMLCommonHandler.getDataFixer(FMLCommonHandler.java:758) at net.minecraft.entity.player.EntityPlayer.writeEntityToNBT(EntityPlayer.java:1024) at net.minecraft.entity.player.EntityPlayerMP.writeEntityToNBT(EntityPlayerMP.java:246) at net.minecraft.entity.Entity.writeToNBT(Entity.java:1908) at net.minecraft.server.integrated.IntegratedPlayerList.writePlayerData(IntegratedPlayerList.java:30) at net.minecraft.server.management.PlayerList.saveAllPlayerData(PlayerList.java:959) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:720) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:547) at java.lang.Thread.run(Unknown Source) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Server thread Stacktrace: at net.minecraftforge.fml.server.FMLServerHandler.getDataFixer(FMLServerHandler.java:338) at net.minecraftforge.fml.common.FMLCommonHandler.getDataFixer(FMLCommonHandler.java:758) at net.minecraft.entity.player.EntityPlayer.writeEntityToNBT(EntityPlayer.java:1024) at net.minecraft.entity.player.EntityPlayerMP.writeEntityToNBT(EntityPlayerMP.java:246) -- Entity being saved -- Details: Entity Type: null (net.minecraft.entity.player.EntityPlayerMP) Entity ID: 120 Entity Name: Player862 Entity's Exact location: -1297.83, 4.00, -102.82 Entity's Block location: World: (-1298,4,-103), Chunk: (at 14,0,9 in -82,-7; contains blocks -1312,0,-112 to -1297,255,-97), Region: (-3,-1; contains chunks -96,-32 to -65,-1, blocks -1536,0,-512 to -1025,255,-1) Entity's Momentum: 0.00, -0.08, 0.00 Entity's Passengers: [] Entity's Vehicle: ~~ERROR~~ NullPointerException: null Stacktrace: at net.minecraft.entity.Entity.writeToNBT(Entity.java:1908) at net.minecraft.server.integrated.IntegratedPlayerList.writePlayerData(IntegratedPlayerList.java:30) at net.minecraft.server.management.PlayerList.saveAllPlayerData(PlayerList.java:959) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:720) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:156) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:547) at java.lang.Thread.run(Unknown Source) -- System Details -- Details: Minecraft Version: 1.11.2 Operating System: Windows 10 (amd64) version 10.0 Java Version: 1.8.0_111, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 62577520 bytes (59 MB) / 429391872 bytes (409 MB) up to 939524096 bytes (896 MB) JVM Flags: 0 total; IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP 9.38 Powered by Forge 13.20.0.2201 5 mods loaded, 5 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJAAAA minecraft{1.11.2} [Minecraft] (minecraft.jar) UCHIJAAAA mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJAAAA FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.11.2-13.20.0.2201.jar) UCHIJAAAA forge{13.20.0.2201} [Minecraft Forge] (forgeSrc-1.11.2-13.20.0.2201.jar) UCHIJAAAA eventmaker{0.1.0} [Event Maker] (bin) Loaded coremods (and transformers): GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread. Profiler Position: N/A (disabled) Player Count: 1 / 8; [EntityPlayerMP['Player862'/120, l='New World', x=-1297.83, y=4.00, z=-102.82]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge'
Le crash ne se déclenche que lorsque j’effectue une certaine commande qui entraîne le code suivant :
event.start(); if(event.isStarted()) { sender.sendMessage(ComponentCreator.info("The event " + ChatFormatting.AQUA + eventName + ChatFormatting.RESET + " started")); EventHandler.postEvent(event); } else { sender.sendMessage(ComponentCreator.error("The event " + ChatFormatting.AQUA + eventName + ChatFormatting.RESET + " cannot start")); }
Petite explication : event est une instance d’un objet créé par moi même (Event), la fonction Event#start ne semble pas poser de problèmes, les actions s’effectuent, je ne pense pas du tout que le problème vienne d’ici.
Ensuite EventHandler#postEvent permet d’indiquer qu’il faut update l’event :
public static void postEvent(Event event) { events.add(event); //Ajout de l'event dans un liste, chaque event de la liste est update grâce à un tick event qui appelle Event#update }
Voilà tout, si vous avez besoin d’informations supplémentaires, n’hésitez pas à demander
-
Salut,
Je n’arrives pas à comprendre le rapport entre le crash et ton code.
En effet il n’y a pas de trace de ton mod dans le stacktrace.
Ni rien en rapport l’enregistrement de nbt dans ton code ? -
Salut,
J’enregistre les données concernant mes events dans les tags NBT du monde donc j’ai des WorldSavedData. Ça pourrait venir d’un WorldSavedData#markDirty appelé trop souvent ? (Ça serait bizarre mais bon).
Sachant que j’appelle WorldSavedData#markDirty lors de la création de l’event et qu’à cette étape ci je n’ai aucun problème.
Tient, le code du TickHandler :@SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { ArrayList <event>finishedEvents = new ArrayList<event>(); for(Event e : events) { if(e.isFinished()) { e.onFinished(); finishedEvents.add(e); } else if(e.isStopped()) { finishedEvents.add(e); } else { e.update(); } EventMaker.save(); //Fait un appelle direct de WorldSavedData#markDirty, rien d'autre } for(Event e : finishedEvents) { events.remove(e); } }
Si tu veux le voir un peu ce qui il y a dans le code, le mod est sur github : https://github.com/MFFbrokenSwing/EventMod, là c’est le code pour la 1.8 mais si tu veux je peux mettre le code que j’ai fait actuellement (j’ai rien ajouté, juste fait l’autocomplétition et changé ce qu’il faut pour être en accords avec les changement de la 1.11)</event></event>