[1.4.7] Spawn de mob dans une structure & NPE MinecraftServer playerEntityList



  • Bonsoir à tous
    Vieille version, je sais 🙂 mais à mon avis le code est sensiblement le même que dans la 1.7x
    Alors j'ai 2 problèmes :
    1)J'ai ce code :

    
    public class ShrineWorldGen implements IWorldGenerator
    {
    public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
    {
    switch (world.provider.dimensionId)
    {
    case -1:
    generateNether(world, random, chunkX * 16, chunkZ * 16);
    case 0:
    generateSurface(world, random, chunkX * 16, chunkZ * 16);
    }
    }
    
    private void generateSurface(World world, Random random, int blockX, int blockZ)
    {
    for (int i = 0; i < 25; i++)
    {
    int Xcoord = blockX + random.nextInt(16);
    int Ycoord = random.nextInt(60);
    int Zcoord = blockZ + random.nextInt(16);
    new SlenderShrine().generate(world, random, Xcoord, Ycoord, Zcoord);
    for(int a = 0; i < 10; i++)
    {
    EntityBlaze blaze= new EntityBlaze(world);
    blaze.texture = "/slendyBlaze.png";
    blaze.setLocationAndAngles(Xcoord, Ycoord + 2D, Zcoord, 0F, 0F);
    //blaze.persistenceRequired = true;
    world.spawnEntityInWorld(blaze);
    }
    }
    }
    
    private void generateNether(World world, Random random, int blockX, int blockZ)
    {
    }
    }
    
    

    Avec lequel j'essaie de faire générer une certaine structure avec dedans 10 blaze. Mais bizarre ! Pas un seul ne spawn. J'ai suspecté dans 1 premier temps le fait qu'ils pourrait despawn. Donc j'ai voulu me servir du boolean persistenceRequired mais aucun changement 😕 J'ai essayé avec d'autres mobs, mais rien….Alors je vous laisse la main x)

    2)J'ai ce code :

    
    protected Entity findPlayerToAttack()
    {
    EntityPlayer var1 = this.worldObj.getClosestPlayerToEntity(this, 200.0D);
    if ((var1 != null) && (this.tellingtimer == 300))
    {
    String targetUsername = var1.username;
    var1.sendChatToPlayer("§l§k§4H§4e §4f§ko§4un§kd y§4ou");
    for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++)
    {
    if(((EntityPlayerMP) MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i)).username != targetUsername)
    {
    ((EntityPlayerMP) MinecraftServer.getServer().getConfigurationManager().playerEntityList.get(i)).sendChatToPlayer("§l§k§4H§4e §4f§ko§4un§kd §l§k§4" + targetUsername);
    }
    }
    this.tellingtimer = 0;
    }
    return (var1 != null) && (canSlendermanBeSeen(var1)) ? var1 : null;
    }
    
    

    Mon but est d'envoyer un message au joueur ciblé, et un autre différent à tous les autres joueurs présents sur le serveur. Mais le problème, c'est que ça marche une fois sur 2...Voici le crash report :

    2016-01-24 12:54:03 [INFOS] [STDERR] Caused by: java.lang.NullPointerException
    2016-01-24 12:54:03 [INFOS] [STDERR] at fr.plaigon.slenderman.common.entities.EntitySlenderMan.findPlayerToAttack(EntitySlenderMan.java:103)
    2016-01-24 12:54:03 [INFOS] [STDERR] at fr.plaigon.slenderman.common.entities.EntitySlenderMan.onUpdate(EntitySlenderMan.java:132)
    2016-01-24 12:54:03 [INFOS] [STDERR] at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2293)
    2016-01-24 12:54:03 [INFOS] [STDERR] at net.minecraft.world.World.updateEntity(World.java:2255)
    2016-01-24 12:54:03 [INFOS] [STDERR] at net.minecraft.world.World.updateEntities(World.java:2109)
    

    Le crash report pointe sur cette ligne là :
    var1.sendChatToPlayer("§l§k§4H§4e §4f§ko§4un§kd y§4ou");
    Je pense que var1 est null. Ce qui est bizarre, c'est qu'il y a un null check juste avant o_O
    Ou alors cette méthode est uniquement gérée côté client, or findPlayerToAttack est server side only, par-conséquent je ferai comme les autres joueurs sur le serveur, pour qui il n'y a aucun problème (le message est bien reçu sans crash…) !

    Merci d'avance 😃


  • Administrateurs

    1. Je pense que les blaze ne spawn pas du tout cas il n'y a pas de joueur proche. À vérifier.

    2. Étrange en effet. Essaies avec un if(!worldObj.isRemote)



    1. J ai essayé avec tous les mobs. Si sa continue, je vais devoir penser à faire autrement

    2)La méthode findPlayerToAttack est server side only, du coup la condition ne servirait pas à grand chose….



  • 2)J'ai essayé cette ligne
    ((EntityPlayerMP)var1).sendChatToPlayer("§l§k§4H§4e §4f§ko§4un§kd y§4ou");
    Mais crash report le var1 repart avec un cast exception du genre EntityClientPlayerMP can't be casted to EntityPlayerMP
    Et les autres joueurs c'est pas EntityClientPlayerMP, c'est EntityOtherPlayerMP
    C'est bizarre moi qui croyait qu'on était seulement côté serveur, qu'il me sorte du EntityClientPlayerMP ???
    Je pense que mon soucis vient de la méthode ICommandSender#void sendChatToPlayer(String var1)
    Devrais-je envoyer un packet ? Le système des packets est bien différent en 1.4x qu'en 1.7. J'ai regardé un tuto vite fait, ça m'a l'air bien plus compliqué, donc j'aimerai évité. Le pire c'est que je sais qu'on peut sûrement faire sans… Sachant si je laisse cette ligne :
    var1.sendChatToPlayer("§l§k§4H§4e §4f§ko§4un§kd y§4ou");
    J'ai ça par la suite :

    2016-01-25 17:07:12 [INFOS] [STDERR] Caused by: java.lang.NullPointerException
    2016-01-25 17:07:12 [INFOS] [STDERR] at fr.plaigon.slenderman.common.entities.EntitySlenderMan.findPlayerToAttack(EntitySlenderMan.java:104)
    2016-01-25 17:07:12 [INFOS] [STDERR] at fr.plaigon.slenderman.common.entities.EntitySlenderMan.onUpdate(EntitySlenderMan.java:133)
    2016-01-25 17:07:12 [INFOS] [STDERR] at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2293)
    2016-01-25 17:07:12 [INFOS] [STDERR] at net.minecraft.world.World.updateEntity(World.java:2255)
    2016-01-25 17:07:12 [INFOS] [STDERR] at net.minecraft.world.World.updateEntities(World.java:2109)
    

    Qui pointe sur cette ligne :
    for (int i = 0; i < MinecraftServer.getServer().getConfigurationManager().playerEntityList.size(); i++)

    Sa me quand même rigoler de savoir qu'on sur serveur et qu'il me fait un NPE quand je parle du MinecraftServer …

    EDIT = Alors j'ai débuggé, et en fait il semblerait que la méthode est des 2 côtés...1 console m'indique cela, l'autre qui crash (puisque c'est celle qui reçoit le second message) m'indique le contraire (server side only). Je comprends pas tellement ^^'
    Toute aide sera appréciée 🙂

    EDIT 2 = Après bcp de blabla inutile, j'ai remarqué que c'était configurationManager qui était null. Je pense en fait que quand je fais référence à getConfigurationManager, DedicatedServer ou IntegratedServer ne sont pas encore instanciées et vu que c'est eux qui set configurationManager, je ne vois pas trop comment faire 😕


  • Administrateurs

    Ta méthode findPlayerToAttack est appelé des deux côtés, c'est pour ça que tu te retrouve avec ce npe et avec des EntityClientPlayerMP/
    Et c'est aussi pour ça que je t'ai dit de tout mettre dans un !if(world.isRemote).



  • Ok nikel, j'sais pas pourquoi je ne t'ai pas écouté + tôt ….
    Et pour le premier problème ? J'ai essayé avec d'autres mobs, même soucis ....


  • Administrateurs

    Faudrait voir comment fait mc dans les structures du nether