Bloc rendu TESR crash



  • Bonjour, je rencontre un crash avec un de mes blocks avec un rendu TESR. Il fonctionnait correctement mais le rendu dans l'inventaire n'est pas texturé et depuis que j'ai ajouté le code nécessaire à la rotation lorsque je pose le bloc, le serveur crash.

    L'erreur :

    La classe de mon block :

    package BlockPers;
    
    import fr.shyfe.dcedo.proxy.ClientProxy;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class FlagSpawn extends Block {
    
    protected FlagSpawn(Material material) {
    super(material);
    }
    
    public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z)
        {
            this.setBlockBounds(0.06F, 0.0F, 0.06F, 0.94F, 0.88F, 0.94F);
        }
    
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityFlagSpawn();
    }
    
    @Override
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
    {
    if(stack.getItemDamage() == 0)
    {
    TileEntity tile = world.getTileEntity(x, y, z);
    if(tile instanceof TileEntityFlagSpawn)
    {
    int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
    ((TileEntityFlagSpawn)tile).setDirection((byte)direction);
    }
    }
    }
    
    @Override
    public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis)
    {
    if((axis == ForgeDirection.UP || axis == ForgeDirection.DOWN) && !world.isRemote && world.getBlockMetadata(x, y, z) == 0)
    {
    TileEntity tile = world.getTileEntity(x, y, z);
    if(tile instanceof TileEntityFlagSpawn)
    {
    TileEntityFlagSpawn tileDirectional = (TileEntityFlagSpawn)tile;
    byte direction = tileDirectional.getDirection();
    direction++;
    if(direction > 3)
    {
    direction = 0;
    }
    tileDirectional.setDirection(direction);
    return true;
    }
    }
    return false;
    }
    
    public ForgeDirection[] getValidRotations(World world, int x, int y, int z)
    {
    return world.getBlockMetadata(x, y, z) == 0 ? new ForgeDirection[] {ForgeDirection.UP, ForgeDirection.DOWN} : ForgeDirection.VALID_DIRECTIONS; // si le metadata est 0, les deux directions sur lesquels on peut faire tourner le bloc, sinon toutes les directions ce qui est la valeur par défaut pour les blocs non directionnels.
    }
    
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public int getRenderType()
    {
    return ClientProxy.tesrRenderId;
    }
    
    }
    
    

    La classe du TileEntity :

    package BlockPers;
    
    import net.minecraft.nbt.NBTTagCompound;
    import net.minecraft.network.NetworkManager;
    import net.minecraft.network.Packet;
    import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
    import net.minecraft.tileentity.TileEntity;
    
    public class TileEntityFlagSpawn extends TileEntity {
    
    private int number;
    private byte direction;
    
        @Override
        public void readFromNBT(NBTTagCompound compound)
        {
            super.readFromNBT(compound);
            this.number = compound.getInteger("Number");
            this.direction = compound.getByte("Direction");
        }
    
        @Override
        public void writeToNBT(NBTTagCompound compound)
        {
            super.writeToNBT(compound);
            compound.setInteger("Number", this.number);
            compound.setByte("Direction", this.direction);
        }
    
        public byte getDirection()
        {
        this.number++;
            return direction;
        }
    
        public void setDirection(byte direction)
        {
        this.number–;
            this.direction = direction;
            this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
        }
    
        public Packet getDescriptionPacket()
        {
            NBTTagCompound nbttagcompound = new NBTTagCompound();
            this.writeToNBT(nbttagcompound);
            return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, nbttagcompound);
        }
    
        public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
        {
            this.readFromNBT(pkt.func_148857_g());
            this.worldObj.markBlockRangeForRenderUpdate(this.xCoord, this.yCoord, this.zCoord, this.xCoord, this.yCoord, this.zCoord);
        }
    }
    
    

    La classe du TileEntitySpecialRenderer :

    package fr.shyfe.dcedo.proxy;
    
    import org.lwjgl.opengl.GL11;
    
    import BlockPers.ModelFlagSpawn;
    import BlockPers.ModelGrassC;
    import BlockPers.TileEntityFlagSpawn;
    import fr.shyfe.dcedo.common.Main;
    import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ResourceLocation;
    
    public class TileEntityFlagSpawnSpecialRenderer extends TileEntitySpecialRenderer {
    
    public static ModelFlagSpawn model = new ModelFlagSpawn();
        public static ResourceLocation texture = new ResourceLocation(Main.MODID, "textures/models/blocks/FlagSpawn.png");
    
        public TileEntityFlagSpawnSpecialRenderer() // TileEntityTutorielSpecialRenderer dans mon cas, c'est la classe que nous avons fait dans la partie précédente
        {
            this.func_147497_a(TileEntityRendererDispatcher.instance);
        }
    
    @Override
    public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialRenderTick) {
    this.renderTileEntityFlagSpawnAt((TileEntityFlagSpawn)tile, x, y, z, partialRenderTick);
    }
    
    private void renderTileEntityFlagSpawnAt(TileEntityFlagSpawn tile, double x, double y, double z, float partialRenderTick)
        {
    GL11.glPushMatrix(); // ouvre une matrix
            GL11.glTranslated(x + 0.5D, y + 1.5D, z + 0.5D); // déplace le bloc sur les coordonnés et le centre
            GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); // met droit le bloc (par défaut il est à l'envers)
            GL11.glRotatef(90F * tile.getDirection(), 0.0F, 1.0F, 0.0F);
            this.bindTexture(texture); // affiche la texture
            model.renderAll(); // rend le modèle
            GL11.glPopMatrix(); // ferme la matrix
        }
    }
    
    

    Ma classe ClientProxy :

    package fr.shyfe.dcedo.proxy;
    
    import BlockPers.TileEntityFlagSpawn;
    import BlockPers.TileEntityGrassA;
    import BlockPers.TileEntityGrassB;
    import BlockPers.TileEntityGrassC;
    import Mobs.EntityBouftou;
    import Mobs.EntityPissenlitDiabolique;
    import Mobs.EntityRoseDemoniaque;
    import Mobs.EntityTofu;
    import Mobs.EntityTournesolSauvage;
    import Mobs.ModelBouftou;
    import Mobs.ModelPissenlitDiabolique;
    import Mobs.ModelRoseDemoniaque;
    import Mobs.ModelTofu;
    import Mobs.ModelTournesolSauvage;
    import Mobs.RenderBouftou;
    import Mobs.RenderPissenlitDiabolique;
    import Mobs.RenderRoseDemoniaque;
    import Mobs.RenderTofu;
    import Mobs.RenderTournesolSauvage;
    import cpw.mods.fml.client.registry.ClientRegistry;
    import cpw.mods.fml.client.registry.RenderingRegistry;
    import net.minecraft.client.model.ModelBiped;
    import net.minecraftforge.client.MinecraftForgeClient;
    
    public class ClientProxy extends CommonProxy {
    
    public static int tesrRenderId;
    
    @Override
    public void registerRender()
    {
    //Mobs
    RenderingRegistry.registerEntityRenderingHandler(EntityBouftou.class, new RenderBouftou(new ModelBouftou(), 0.5F));
    RenderingRegistry.registerEntityRenderingHandler(EntityRoseDemoniaque.class, new RenderRoseDemoniaque(new ModelRoseDemoniaque(), 0.5F));
    RenderingRegistry.registerEntityRenderingHandler(EntityTournesolSauvage.class, new RenderTournesolSauvage(new ModelTournesolSauvage(), 0.5F));
    RenderingRegistry.registerEntityRenderingHandler(EntityPissenlitDiabolique.class, new RenderPissenlitDiabolique(new ModelPissenlitDiabolique(), 0.5F));
    RenderingRegistry.registerEntityRenderingHandler(EntityTofu.class, new RenderTofu(new ModelTofu(), 0.5F));
    
    tesrRenderId = RenderingRegistry.getNextAvailableRenderId();
            RenderingRegistry.registerBlockHandler(new TESRInventoryRenderer());
    
    ClientRegistry.bindTileEntitySpecialRenderer(TileEntityGrassA.class, new TileEntityGrassASpecialRenderer());
    ClientRegistry.bindTileEntitySpecialRenderer(TileEntityGrassB.class, new TileEntityGrassBSpecialRenderer());
    ClientRegistry.bindTileEntitySpecialRenderer(TileEntityGrassC.class, new TileEntityGrassCSpecialRenderer());
    ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFlagSpawn.class, new TileEntityFlagSpawnSpecialRenderer());
    }
    }
    
    

    Ma classe TESRInventoryRenderer :

    package fr.shyfe.dcedo.proxy;
    
    import org.lwjgl.opengl.GL11;
    
    import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
    import fr.shyfe.dcedo.common.Main;
    import net.minecraft.block.Block;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.renderer.RenderBlocks;
    import net.minecraft.world.IBlockAccess;
    
    public class TESRInventoryRenderer implements ISimpleBlockRenderingHandler {
    
    @Override
        public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
        {
            if(block == Main.flagSpawn && metadata == 0)
            {
                GL11.glPushMatrix();
                GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
                GL11.glTranslatef(0.0F, -1.0F, 0.0F);
                Minecraft.getMinecraft().getTextureManager().bindTexture(TileEntityFlagSpawnSpecialRenderer.texture);
                TileEntityFlagSpawnSpecialRenderer.model.renderAll();
                GL11.glPopMatrix();
            }
        }
    
        @Override
        public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer)
        {
            return false;
        }
    
        @Override
        public boolean shouldRender3DInInventory(int modelId)
        {
            return true;
        }
    
        @Override
        public int getRenderId()
        {
            return ClientProxy.tesrRenderId;
        }
    }
    
    

    J'imagine que vous n'avez pas besoin des parties dans la déclaration de ma classe principale et du model (si oui, prévenez-moi et je les rajouterais)


  • Administrateurs

    Salut,
    Erreur classique, tu n'as pas enregistré le tile entity …



  • @'robin4002':

    Salut,
    Erreur classique, tu n'as pas enregistré le tile entity …

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
    proxy.registerRender();
    
    GameRegistry.registerTileEntity(TileEntityFlagSpawn.class, "FlagSpawn");
    }
    

    Cette partie ne suffit pas ? Je vois pas ce qu'il me manque


  • Administrateurs

    D'après ton crash ton tile entity n'est pas enregistré :
    java.lang.RuntimeException: class BlockPers.TileEntityFlagSpawn is missing a mapping! This is a bug!

    Envoies ta classe principale complète.



  • Edit : code supprimé car inutile suite aux réponses


  • Administrateurs

    Je ne vois pas de problème hormis le fait que ton code est très mal organisé et mal nommé (la convention java c'est pas ça).

    Essaies de clean ta workspace (menu project -> clean)



  • @'robin4002':

    Je ne vois pas de problème hormis le fait que ton code est très mal organisé et mal nommé (la convention java c'est pas ça).

    Essaies de clean ta workspace (menu project -> clean)

    Le serveur ne crash plus, mais je n'ai ni visuel dans l'inventaire, ni de rotation.

    Aussi, tu sais ou je pourrais trouver ou mieux gérer mon code ? J'ai conscience que c'est pas top


  • Administrateurs

    Les rendus des mobs que tu enregistres dans ClientProxy fonctionnent-t-ils ?

    Niveau code, tu peux commencer par le formater et respecter la convention java (pas de majuscule dans les noms de package, une majuscule à chaque début de classe, etc …).



  • @'robin4002':

    Les rendus des mobs que tu enregistres dans ClientProxy fonctionnent-t-ils ?

    Niveau code, tu peux commencer par le formater et respecter la convention java (pas de majuscule dans les noms de package, une majuscule à chaque début de classe, etc …).

    Mes mobs fonctionnent parfaitement, j'ai beau re-vérifier, je ne trouve pas ce qui ne va pas


  • Administrateurs

    Envoies-moi un zip de ton src par mp, je regarderai ce soir.



  • @'robin4002':

    Envoies-moi un zip de ton dossier sections par mois, je regarderai ce soir.

    Je dois faire quoi exactement ? Je ne sais pas à quoi correspond sections et Google ne m'a pas aidé



  • Je pense qu'il voulait dire "dossier src", mais que son correcteur automatique a fait quelque chose de foireux.



  • @'AymericRed':

    Je pense qu'il voulait dire "dossier src", mais que son correcteur automatique a fait quelque chose de foireux.

    D'accord, merci

    Je l'ai envoyé par mp


  • Administrateurs

    "src" c'est visiblement transformé en "section" et "mp" en "mois".

    GG à AymericRed qui a un très bon déchiffreur 😄

    J'aurai du pensé à me relire x)



  • J'ai pas déchiffré, j'ai supposé que t'avais voulu dire ça 😛


  • Administrateurs

    Dans le src que tu m'as envoyé il y avait deux classes FlagSpawn.
    Une dans le package BlockPers et l'autre dans le package fr.shyfe.dcedo.common.
    J'ai viré celle dans fr.shyfe.dcedo.common qui ne semble pas utilisé.

    Et elle avait tout le deux le code suivant :

    package BlockPers;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.world.World;
    
    public class FlagSpawn extends Block
    {
    
    public FlagSpawn(Material material)
    {
    super(material);
    }
    
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityFlagSpawn();
    }
    
    @Override
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public int getRenderType()
    {
    return -1;
    }
    }
    

    Qui n'est pas vraiment celui tu as envoyé.
    Avec ce code, c'est normal que le rendu et la direction ne fonctionne pas.

    Après avoir modifié la classe comme ceci :

    package BlockPers;
    
    import fr.shyfe.dcedo.proxy.ClientProxy;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class FlagSpawn extends Block
    {
    public FlagSpawn(Material material)
    {
    super(material);
    }
    
    public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z)
    {
    this.setBlockBounds(0.06F, 0.0F, 0.06F, 0.94F, 0.88F, 0.94F);
    }
    
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityFlagSpawn();
    }
    
    @Override
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
    {
    if(stack.getItemDamage() == 0)
    {
    TileEntity tile = world.getTileEntity(x, y, z);
    if(tile instanceof TileEntityFlagSpawn)
    {
    int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
    ((TileEntityFlagSpawn)tile).setDirection((byte)direction);
    }
    }
    }
    
    @Override
    public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis)
    {
    if((axis == ForgeDirection.UP || axis == ForgeDirection.DOWN) && !world.isRemote && world.getBlockMetadata(x, y, z) == 0)
    {
    TileEntity tile = world.getTileEntity(x, y, z);
    if(tile instanceof TileEntityFlagSpawn)
    {
    TileEntityFlagSpawn tileDirectional = (TileEntityFlagSpawn)tile;
    byte direction = tileDirectional.getDirection();
    direction++;
    if(direction > 3)
    {
    direction = 0;
    }
    tileDirectional.setDirection(direction);
    return true;
    }
    }
    return false;
    }
    
    public ForgeDirection[] getValidRotations(World world, int x, int y, int z)
    {
    return world.getBlockMetadata(x, y, z) == 0 ? new ForgeDirection[] {ForgeDirection.UP, ForgeDirection.DOWN} : ForgeDirection.VALID_DIRECTIONS; // si le metadata est 0, les deux directions sur
    // lesquels on peut faire tourner le bloc, sinon
    // toutes les directions ce qui est la valeur par
    // défaut pour les blocs non directionnels.
    }
    
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public int getRenderType()
    {
    return ClientProxy.tesrRenderId;
    }
    }
    

    C'est ok :
    http://puu.sh/tlfCt/330fb303b5.jpg

    Et j'ai vérifie avec un point d'arrêt en debug la fonction writeToNBT de la classe tile entity (celle-ci) :

    public void writeToNBT(NBTTagCompound p_145841_1_)
    {
    String s = (String)classToNameMap.get(this.getClass());
    
    if (s == null)
    {
    throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!");
    }
    else
    {
    p_145841_1_.setString("id", s);
    p_145841_1_.setInteger("x", this.xCoord);
    p_145841_1_.setInteger("y", this.yCoord);
    p_145841_1_.setInteger("z", this.zCoord);
    }
    }
    

    Et chez moi s avait bien la valeur attendu, donc le jeu ne crash pas.



  • @'robin4002':

    Dans le src que tu m'as envoyé il y avait deux classes FlagSpawn.
    Une dans le package BlockPers et l'autre dans le package fr.shyfe.dcedo.common.
    J'ai viré celle dans fr.shyfe.dcedo.common qui ne semble pas utilisé.

    Et elle avait tout le deux le code suivant :

    package BlockPers;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.world.World;
    
    public class FlagSpawn extends Block
    {
    
       public FlagSpawn(Material material)
       {
           super(material);
       }
    
       @Override
       public TileEntity createTileEntity(World world, int metadata)
       {
           return new TileEntityFlagSpawn();
       }
    
       @Override
       public boolean hasTileEntity(int metadata)
       {
           return true;
       }
    
       public boolean isOpaqueCube()
       {
           return false;
       }
    
       public boolean renderAsNormalBlock()
       {
           return false;
       }
    
       public int getRenderType()
       {
           return -1;
       }
    }
    

    Qui n'est pas vraiment celui tu as envoyé.
    Avec ce code, c'est normal que le rendu et la direction ne fonctionne pas.

    Après avoir modifié la classe comme ceci :

    package BlockPers;
    
    import fr.shyfe.dcedo.proxy.ClientProxy;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    import net.minecraftforge.common.util.ForgeDirection;
    
    public class FlagSpawn extends Block
    {
       public FlagSpawn(Material material)
       {
           super(material);
       }
    
       public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z)
       {
           this.setBlockBounds(0.06F, 0.0F, 0.06F, 0.94F, 0.88F, 0.94F);
       }
    
       @Override
       public TileEntity createTileEntity(World world, int metadata)
       {
           return new TileEntityFlagSpawn();
       }
    
       @Override
       public boolean hasTileEntity(int metadata)
       {
           return true;
       }
    
       public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
       {
           if(stack.getItemDamage() == 0)
           {
               TileEntity tile = world.getTileEntity(x, y, z);
               if(tile instanceof TileEntityFlagSpawn)
               {
                   int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
                   ((TileEntityFlagSpawn)tile).setDirection((byte)direction);
               }
           }
       }
    
       @Override
       public boolean rotateBlock(World world, int x, int y, int z, ForgeDirection axis)
       {
           if((axis == ForgeDirection.UP || axis == ForgeDirection.DOWN) && !world.isRemote && world.getBlockMetadata(x, y, z) == 0)
           {
               TileEntity tile = world.getTileEntity(x, y, z);
               if(tile instanceof TileEntityFlagSpawn)
               {
                   TileEntityFlagSpawn tileDirectional = (TileEntityFlagSpawn)tile;
                   byte direction = tileDirectional.getDirection();
                   direction++;
                   if(direction > 3)
                   {
                       direction = 0;
                   }
                   tileDirectional.setDirection(direction);
                   return true;
               }
           }
           return false;
       }
    
       public ForgeDirection[] getValidRotations(World world, int x, int y, int z)
       {
           return world.getBlockMetadata(x, y, z) == 0 ? new ForgeDirection[] {ForgeDirection.UP, ForgeDirection.DOWN} : ForgeDirection.VALID_DIRECTIONS; // si le metadata est 0, les deux directions sur
                                                                                                                                                          // lesquels on peut faire tourner le bloc, sinon
                                                                                                                                                          // toutes les directions ce qui est la valeur par
                                                                                                                                                          // défaut pour les blocs non directionnels.
       }
    
       public boolean isOpaqueCube()
       {
           return false;
       }
    
       public boolean renderAsNormalBlock()
       {
           return false;
       }
    
       public int getRenderType()
       {
           return ClientProxy.tesrRenderId;
       }
    }
    

    C'est ok :
    http://puu.sh/tlfCt/330fb303b5.jpg

    Et j'ai vérifie avec un point d'arrêt en debug la fonction writeToNBT de la classe tile entity (celle-ci) :

       public void writeToNBT(NBTTagCompound p_145841_1_)
       {
           String s = (String)classToNameMap.get(this.getClass());
    
           if (s == null)
           {
               throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!");
           }
           else
           {
               p_145841_1_.setString("id", s);
               p_145841_1_.setInteger("x", this.xCoord);
               p_145841_1_.setInteger("y", this.yCoord);
               p_145841_1_.setInteger("z", this.zCoord);
           }
       }
    

    Et chez moi s avait bien la valeur attendu, donc le jeu ne crash pas.

    Effectivement, ca fonctionne ! Merci beaucoup 🙂