Changer le model suivant un bloc



  • Bonjour,
    j'aimerai que mon block change de model suivant si un bloc est placé à un certain endroit.
    Pas sur une de ces faces directes, mais sur un bloc en diagonales de mon autre bloc.
    En clair, lorsque je pose un autre bloc en bas à droite de mon premier bloc, celui ci change de fichier model afin de prendre une autre forme.

    Merci d'avance pour votre aide qui m'est toujours plus précieuse.


  • Moddeurs confirmés Rédacteurs Administrateurs

    C'est super simple, c'est juste des conditions.
    Dans ta fonction qui fait le rendu, tu as :
    this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
    Il suffit juste de créer plusieurs modèles

    Exemple :

    if(world.getBlockId((int)x, (int)y - 1, (int)z) == ClassePrincipale.monBlock.blockId)
    {
    this.model1.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
    //il y a un bloc en dessous
    }
    else if(world.getBlockId((int)x, (int)y + 1, (int)z) == ClassePrincipale.monBlock.blockId)
    {
    this.model2.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
    //il y a un bloc au dessus
    }
    

    etc …


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    @Sugarshy : On dirait que tu veux faire un système MultiBlock, ou je me trompe?



  • Merci, c'est deja beaucoup mieux ^^
    mais il me fais une erreur au niveau du world…
    mon TileEntitySupportRender:

    package landcast.common;
    
    import net.minecraft.block.Block;
    import net.minecraft.client.renderer.OpenGlHelper;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.entity.Entity;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ResourceLocation;
    import net.minecraft.world.World;
    
    import org.lwjgl.opengl.GL11;
    
    public class TileEntitySupportRender extends TileEntitySpecialRenderer
    {
    
    private final ModelSupport model1;
    private final ModelSupport2 model2;
    protected static final ResourceLocation texture = new ResourceLocation("landcast:textures/blocks/Support.png");
    
    public TileEntitySupportRender()
    {
    this.model1 = new ModelSupport();
    this.model2 = new ModelSupport2();
    }
    
    private void adjustRotatePivotViaMeta(World world, int x, int y, int z)
    {
    int meta = world.getBlockMetadata(x, y, z);
    GL11.glPushMatrix();
    GL11.glRotatef(meta * (-90), 0.0F, 0.0F, 1.0F);
    GL11.glPopMatrix();
    
    }
    
    @Override
    public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float scale)
    {
    this.renderTileEntityAtSupport((TileEntitySupport)tileentity, x, y, z, scale);
    
    }
    
    public void renderTileEntityAtSupport(TileEntitySupport tileentity, double x, double y, double z, float scale)
    {
    GL11.glPushMatrix();
    GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F);
    this.bindTexture(texture);
    GL11.glPushMatrix();
    GL11.glRotatef(180F, 180.0F, 0.0F, 1.0F);
    GL11.glRotatef(90F * tileentity.getBlockMetadata(), 0.0F, 1.0F, 0.0F);
    if(world.getBlockId((int)x, (int)y - 1, (int)z) == Base.Support.blockID)
    {
    this.model2.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
    //il y a un bloc en dessous
    }
    
    GL11.glPopMatrix();
    GL11.glPopMatrix();
    
    }
    
    private void adjustLightFixture(World world, int i, int j, int k, Block block)
    {
    Tessellator tess = Tessellator.instance;
    float brightness = block.getBlockBrightness(world, i, j, k);
    int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
    int modulousModifier = skyLight % 65536;
    int divModifier = skyLight / 65536;
    tess.setColorOpaque_F(brightness, brightness, brightness);
    OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)modulousModifier, divModifier);
    }
    }
    

    De plus, il risque de'y avoir un probleme au niveau de l'emplacement, car mon bloc utilise une rotation suivant l'angle ou l'on le pose, se qui veut dire que la fonction que tu m'as passé cherchera toujours sous le meme angle, et non pas selon l'angle où je le pose.

    Mon Block:

    package landcast.common;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.creativetab.CreativeTabs;
    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 BlockSupport extends Block
    {
    public BlockSupport(int id)
    {
    super(id, Material.wood);
    this.setCreativeTab(CreativeTabs.tabBlock);
    }
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntitySupport();
    
    }
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public int getRenderType()
    {
    return -1;
    }
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack)
    {
    int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
    world.setBlockMetadataWithNotify(x, y, z, direction, 2);
    
    }
    
    }
    ```___
    @'Superloup10':
    
    > @Sugarshy : On dirait que tu veux faire un système MultiBlock, ou je me trompe?
    
    Tu te trompe ^^ J'ai un bloc qui me sert de support t qui se tourne dans une certaine position suivant comment je le pose, et je voudrai que la forme du support s'adapte aux blocs environnants ;)

  • Moddeurs confirmés Rédacteurs Administrateurs

    tileentity.worldObj à la place de world.
    Ensuite concernant la direction, faut que tu check en fonction du metadata comme tu utilise le metadata pour la direction.
    Et pour information, c'est ce code :
    GL11.glRotatef(90F * tileentity.getBlockMetadata(), 0.0F, 1.0F, 0.0F);
    qui change la direction.



  • Oki, merci ^^


Log in to reply