Problème avec la rotation des blocs



  • [size=smallBonjour, j'ai commencé à programmer il y a pas si longtemps mais je me suis récemment heurté à un problème.]

    [size=smallLorsque je pose le bloc Tesr que j'ai crée, il garde tout le temps la même direction, j'ai pourtant suivis plusieurs tutoriels afin de savoir comment orienter le bloc mais rien.]
    [size=smallJ'ai aussi tenter de créer un item pour lui faire faire une rotation mais ForgeDirection ne fonctionne pas ;(]
    [size=smallje voulais donc savoir comment je peux faire.]

    [size=smallmerci de votre aide :)]

    package renderer;
    
    import org.lwjgl.opengl.GL11;
    
    import com.vitesse.Reference;
    import com.vitesse.tileentity.TileEntityBlockTesr;
    
    import models.ModelBlockTesr;
    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 TileEntityBlockTesrSpecialRenderer extends TileEntitySpecialRenderer
    {
       public static ModelBlockTesr model = new ModelBlockTesr();
       public static ResourceLocation texture = new ResourceLocation(Reference.MOD_ID + ":textures/models/blocks/blockTesr.png");
    
       public void renderTileEntity()
       {
           this.func_147497_a(TileEntityRendererDispatcher.instance);
       }
    
       @Override
       public void renderTileEntityAt(TileEntity entity, double x, double y, double z, float partialRenderTick)
       {
           this.renderTileEntityBlockTesrAt((TileEntityBlockTesr)entity, x, y, z, partialRenderTick);
       }
    
       private void renderTileEntityBlockTesrAt(TileEntityBlockTesr tile, double x, double y, double z, float partialRenderTick)
       {
           GL11.glPushMatrix();
           GL11.glTranslated(x - -1D, y + 0D, z + 0D);
           GL11.glRotatef(180F, 0F, 0F, 1F);
           GL11.glRotatef(90F * tile.getDirection(), 0F, 1F, 0F);
           this.bindTexture(texture);
           model.renderAll();
           GL11.glPopMatrix();
       }
    }
    
    package com.vitesse.init;
    
    import com.vitesse.proxy.ClientProxy;
    import com.vitesse.tileentity.TileEntityBlockTesr;
    
    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.World;
    
    public class BlockTesr extends Block
    {
    
       public BlockTesr(Material p_i45394_1_)
       {
           super(p_i45394_1_);
       }
    
       @Override
       public TileEntity createTileEntity(World world, int metadata)
       {
           return new TileEntityBlockTesr();
       }
    
       @Override
       public boolean hasTileEntity(int metadata)
       {
           return true;
       }
    
       public boolean isOpaqueCube()
       {
           return false;
       }
    
       public boolean renderAsNormalBlock()
       {
           return false;
       }
    
       public int getRenderType()
       {
           return ClientProxy.renderTesr;
       }
    
       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 TileEntityBlockTesr)
               {
                   int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
                   ((TileEntityBlockTesr)tile).setDirection((byte)direction);
               }
           }
       }
    }
    
    package com.vitesse.tileentity;
    
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.item.ItemStack;
    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;
    import net.minecraft.util.MathHelper;
    import net.minecraft.world.World;
    
    public class TileEntityBlockTesr extends TileEntity
    {
       private byte direction;
    
       @Override
       public void readFromNBT(NBTTagCompound compound)
       {
           super.readFromNBT(compound);
           this.direction = compound.getByte("Direction");
       }
    
       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 coumpound = new NBTTagCompound();
           this.writeToNBT(coumpound);
           return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 0, coumpound);
       }
    
       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);
       }
    
       public TileEntity createTileEntity(World world, int metadata)
       {
           return new TileEntityBlockTesr();
       }
    }
    
    package renderer;
    
    import org.lwjgl.opengl.GL11;
    
    import com.vitesse.init.BlockMod;
    import com.vitesse.proxy.ClientProxy;
    
    import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
    import net.minecraft.block.Block;
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.renderer.RenderBlocks;
    import net.minecraft.world.IBlockAccess;
    
    public class TesrRendererInventory implements ISimpleBlockRenderingHandler
    {
    
       @Override
       public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer)
       {
            if (block == BlockMod.blockTesr && metadata == 0)
            {
                GL11.glPushMatrix();
                GL11.glRotatef(180F, 0F, 0F, 1F);
                GL11.glTranslatef(0F, -1F, 0F);
                Minecraft.getMinecraft().getTextureManager().bindTexture(TileEntityBlockTesrSpecialRenderer.texture);
                TileEntityBlockTesrSpecialRenderer.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.renderTesr;
       }
    }
    

  • Administrateurs

    Salut,
    À première vu je ne vois pas de soucis, vérifies que la fonction onBlockPlacedBy est bien appelé quand tu poses le bloc.



  • Salut, merci de la réponse ^^^
    A priori elle n'a pas l'air de se faire appeler, même en changeant sa position dans le code ça ne donne rien, je ne comprends toujours pas d'où provient le problème .


  • Administrateurs

    Vérifies le nom et les arguments de la fonction dans la classe bloc.
    Tu peux aussi mettre un @Override dessus pour être sûr que la fonction est la bonne.



  • J'ai tout vérifié, rien de suspect 😕

    C'est un modèle Tesr donc je dois bien le faire avec les TileEntity comme je l'ai fais ?


  • Administrateurs

    Oui.
    Ajouter le @Override au dessus de la fonction ne fait pas d'erreur ?



  • Non, quand j'ajoute le override aucune erreur


  • Administrateurs

    Essaies de retirer la condition if(stack.getItemDamage() == 0)



  • Merci de tes aides, mais ça ne donne toujours rien 😕


  • Administrateurs

    Tu as essayé de mettre System.out.println("quelque chose"); dans la fonction pour voir si cela apparait dans la console quand tu poses le bloc ?



  • Ah oui, en effet, rien ne se passe, la fonction n'est pas appelée, je ne sais pas pourquoi 😕


  • Administrateurs

    Tu as mis un @Override au dessus ?



  • Oui 😕

    
    public class BlockTesr extends Block
    {
    
    public BlockTesr(Material p_i45394_1_)
    {
    super(p_i45394_1_);
    }
    
    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
    {
    System.out.println("1");
    TileEntity tile = world.getTileEntity(x, y, z);
    if (tile instanceof TileEntityBlockTesr)
    {
    int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
    ((TileEntityBlockTesr)tile).setDirection((byte)direction);
    System.out.println("2");
    }
    }
    
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityBlockTesr();
    }
    
    @Override
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public int getRenderType()
    {
    return ClientProxy.renderTesr;
    }
    }
    
    

  • Administrateurs

    Tu as surement mis la mauvaise classe sur la déclaration de ton bloc.



  • Malheureusement, j'ai bien mis les bonnes classes sur la déclaration du bloc, donc le problème n'a pas l'air de venir de là 😕


  • Administrateurs

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


  • Administrateurs

    Bon ce n'est pas étonnant que ça ne fonctionne pas …
    Tu as deux classes BlockTesr, une qui contient la fonction onBlockPlacedBy (celle dans le package com.vitesse.init) et une autre qui ne l'a pas (celle dans com.vitesse.blocks).
    Et ton bloc utilise celle la classe com.vitesse.blocks.BlockTesr donc celle qui n'a pas la fonction.



  • Ah oui en effet, merci énormément de ton aide ^^



  • N'oublie pas de sélectionner la réponse qui t'as le + aidée.