NPE : Saving entity NBT


  • Rédacteurs

    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


  • Administrateurs

    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 ?


  • Rédacteurs

    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>