Crash report rendu TESR



  • J'ai créer des Modeles 3D pour mon serveur tout fonctionne en solo mais ne multijoueur j'ai un beau crash report

    Description: Exception in server tick loop
    
    java.lang.NoClassDefFoundError: net/minecraft/client/gui/GuiScreen
    at blocks.blocksdeco.Blocktombe.func_149645_b(Blocktombe.java:46)
    at net.minecraft.entity.Entity.func_70091_d(Entity.java:936)
    at net.minecraft.network.NetHandlerPlayServer.func_147347_a(NetHandlerPlayServer.java:520)
    at net.minecraft.network.play.client.C03PacketPlayer.func_148833_a(C03PacketPlayer.java:36)
    at net.minecraft.network.play.client.C03PacketPlayer$C06PacketPlayerPosLook.func_148833_a(C03PacketPlayer.java:234)
    at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:244)
    at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:173)
    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:991)
    at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:431)
    at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:809)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:669)
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.ClassNotFoundException: net.minecraft.client.gui.GuiScreen
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:101)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    … 12 more
    

    La classe de mon Block

    package blocks.blocksdeco;
    
    import blocks.culture.TileEntityBlockavoine;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import mods.client.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;
    
    public class Blocktombe extends Block
    {
    public Blocktombe(Material material)
    {
    super(material.wood);
    }
    
    @Override
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityBlocktombe();
    }
    public boolean isOpaqueCube()
       {
           return false;
       }
    
       public boolean renderAsNormalBlock()
       {
           return false;
       }
    
       public int getRenderType()
       {
           return Clientproxy.tesrRenderId;
       }
    
       @SideOnly(Side.CLIENT)
       public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z)
       {
        this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
       }
    
       //Rotation
    
       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 TileEntityBlocktombe)
               {
                   int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
                   ((TileEntityBlocktombe)tile).setDirection((byte)direction);
               }
           }
       }
    
    }
    
    

    mon TileEntity

    package blocks.blocksdeco;
    
    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 TileEntityBlocktombe extends TileEntity
    {
    private byte direction;
    
       @Override
       public void readFromNBT(NBTTagCompound compound)
       {
           super.readFromNBT(compound);
           this.direction = compound.getByte("Direction");
       }
    
       @Override
       public void writeToNBT(NBTTagCompound compound)
       {
           super.writeToNBT(compound);
           compound.setByte("Direction", this.direction);
       }
    
       public byte getDirection()
       {
           return direction;
       }
    
       public void setDirection(byte direction)
       {
           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);
       }
    }
    
    

    Mon tile Entity renderer

    
    package blocks.blocksdeco;
    
    import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ResourceLocation;
    
    import org.lwjgl.opengl.GL11;
    
    import blocks.modele.Tombe;
    
    public class TileEntityBlocktombeSpecialRenderer extends TileEntitySpecialRenderer
    {
    public static Tombe model = new Tombe();
    public static ResourceLocation texture = new ResourceLocation("TutoMod:textures/blocks/tombe.png");
    
    @Override
    public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialRenderTick)
    {
    this.renderTileEntityBlocktombeAt((TileEntityBlocktombe)tile, x, y, z, partialRenderTick);
    }
    
    public void renderTileEntityBlocktombeAt(TileEntityBlocktombe tile, double x, double y, double z, float partialRenderTick)
    {
    if(tile.getDirection() == 0)
    {
    GL11.glPushMatrix();
    GL11.glTranslated(x + 0.5D, y + 1.8D, z + 0.5D);
    GL11.glRotated(180, 0.0F, 0.0F, 1.0F);
    GL11.glRotatef(90F * 2, 0.0F, 1.0F, 0.0F);
    GL11.glScalef(1.2F, 1.2F, 1.2F);
    this.bindTexture(texture);
    model.renderAll();
    GL11.glPopMatrix();
    }
    if(tile.getDirection() == 1)
    {
    GL11.glPushMatrix();
    GL11.glTranslated(x + 0.5D, y + 1.8D, z + 0.5D);
    GL11.glRotated(180, 0.0F, 0.0F, 1.0F);
    GL11.glRotatef(90F * 1, 0.0F, 1.0F, 0.0F);
    GL11.glScalef(1.2F, 1.2F, 1.2F);
    this.bindTexture(texture);
    model.renderAll();
    GL11.glPopMatrix();
    }
    if(tile.getDirection() == 2)
    {
    GL11.glPushMatrix();
    GL11.glTranslated(x + 0.5D, y + 1.8D, z + 0.5D);
    GL11.glRotated(180, 0.0F, 0.0F, 1.0F);
    GL11.glRotatef(90F * 2, 0.0F, 1.0F, 0.0F);
    GL11.glScalef(1.2F, 1.2F, 1.2F);
    this.bindTexture(texture);
    model.renderAll();
    GL11.glPopMatrix();
    }
    if(tile.getDirection() == 3)
    {
    GL11.glPushMatrix();
    GL11.glTranslated(x + 0.5D, y + 1.8D, z + 0.5D);
    GL11.glRotated(180, 0.0F, 0.0F, 1.0F);
    GL11.glRotatef(90F * 1, 0.0F, 1.0F, 0.0F);
    GL11.glScalef(1.2F, 1.2F, 1.2F);
    this.bindTexture(texture);
    model.renderAll();
    GL11.glPopMatrix();
    }
    }
    //Rendu 3D d'un block TECHNE
    
    public TileEntityBlocktombeSpecialRenderer()
       {
           this.func_147497_a(TileEntityRendererDispatcher.instance);
       }
    }
    
    

    Voila je ne comprend pas d'ou vient le crash il ne ce produit que quand je touche le bloc en multijoueur si personne ne passe dessus tout fonctionne.

    Merci de votre aide.


  • Correcteurs

    Je ne le vois pas, mais selon le crash report tu fais appel à GuiScreen sur le serveur mais cette classe n'existe pas côté serveur.



  • Mieux comme ceci 😃

    
    @SideOnly(SIDE.CLIENT)
    public int getRenderType()
       {
           return Clientproxy.tesrRenderId;
       }
    
    

    N'oublier pas d' importer l'annotation SideOnly.

    La méthode getRenderType() n'est à appeler que sur le côté Client, donc fais bien attention la prochaine fois 🙂


  • Correcteurs

    Effectivement je cherchais, mais tu as trouvé avant moi 😛


  • Administrateurs

    Il a sûrement mit un truc en rapport avec GuiScreen dans le constructeur de son ClientProxy. Le serveur essaye de charger la classe ClientProxy et donc il crash.
    Julot10085 a donné la bonne solution.



  • robin, pas mal de personnes font cette erreur, y compris moi au début. En fait sur ton tuto, tu as oublié de mettre l'annotation. Si tu pouvais l'éditer quand t'auras le temps 😃



  • Ah oui exact pfff je suis vraiment désolé erreur de ….. j'avais pas fait attention que le new getRenderType() que j'avais codé ce lancé aussi coté serveur Merci beaucoup ça parait tellement logique quand on voie son erreur ...


  • Administrateurs

    Je vois ça, je viens de l'ajouter.


  • Correcteurs

    C'est vrai que j'avais eu la même mauvaise surprise qui avait été résolu tout aussi simplement.

    Une bonne chose de faite.