Multiple walls texturing // Textures de plusieurs murets



  • Bonsoir,
    Après des heures de recherches (actuellement 8h..) je n'arrive pas à définir les différentes textures sur le "wall"
    J'ai essayé en vain plusieurs méthodes notamment trouvées sur ce forum, celui anglophone ou autre recherches google mais rien ne m'aide, à vrai dire je suis débutant et donc je fais avec les moyens du bord malgré tout je m'en sors jusqu'ici
    Je n'arrive donc pas à différencier les deux wall que j'ai nommé:
    block_faintlightgreystonewall
    block_smallstonebrickwall

    package com.mod.trillium.blocks;
    
    import java.util.List;
    
    import com.mod.trillium.init.BlockMod;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockWall;
    import net.minecraft.block.material.Material;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    
    public class BlockWallMod extends BlockWall {
    
    public BlockWallMod(Block p_i45435_1_)
    {
    super(p_i45435_1_);
    }
    
    @Override
    public boolean canConnectWallTo(IBlockAccess par1, int par2, int par3, int par4)
        {
    
    Block block = par1.getBlock(par2, par3, par4);
    int meta = par1.getBlockMetadata(par2, par3, par4);
    //int meta = par1.getBlockMetadata(par2, par3, par4);
    if(block==BlockMod.block_faintlightgreystonewall || block==BlockMod.block_smallstonebrickwall){
    return true;
    }
    
            return block != this && block != Blocks.fence_gate ? (block.getMaterial().isOpaque() && block.renderAsNormalBlock() ? block.getMaterial() != Material.gourd : false) : true;
        }
    
    public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, List p_149666_3_)
    {
        p_149666_3_.add(new ItemStack(p_149666_1_, 1, 0));
    }
    public boolean canPlaceTorchOnTop(World world, int x, int y, int z) {
    return true;
    }
    }
    

    Voilà ma class principale nommée BlockWallMod.java

            block_smallstonebrickwall = new BlockWallMod(block_smallstonebrick).setBlockName("block_smallstonebrickwall").setCreativeTab(TrilliumMod.tabWalls);
    
            block_faintlightgreystonewall = new BlockWallMod(block_faintlightgreystone).setBlockName("block_faintlightgreystonewall").setCreativeTab(TrilliumMod.tabWalls);
    

    Voici un extrait des blocs avec leur texture définie comme étant celle du bloc,
    je pense vous avoir donné les éléments permettant de m'éclairer, cependant si ce n'est le cas j'ajouterai ce qu'il faut, merci de m'aider en tant que débutant, j'accepte toutes vos remarques

    Bonne soirée



  • Bonjour, je ne vois nulle part de ".setTextureName(Mod.ID + ":un nom");" dans l'extrait de ta classe principale.

    EDIT: Avait pas fait gaffe au constructeur "spécial", je regarde le code de BlockWall.

    EDIT 2 : Il faut toujours regarder le code pas logique de Minecraft.
    Le block passe dans le constructeur ne changera pas la texture du mur, juste sa résistance etc… Il faut donc que tu crées une variable de type Block dans ton block wall, sa valeur sera la block passé dans le constructeur. Ensuite il faut implémenter la fonction getIcon (commence à taper son nom puis CTRL+clic pour l'avoir), et mettre return tavariable.getBlockTextureFromSide(side); (side équivaut au premier paramètre de la fonction).

    Écrit sur portable c'est long [emoji14]



  • Voilà, j'ai lu votre message il y a un petit temps et je cherche depuis, maintenant je n'ai toujours pas trouvé la solution … je ne vois pas comment créer la variable du block (je suis vraiment dans mes tous débuts)..et les murets sont pas faciles 😞

    public BlockWallMod(Block p_i45435_1_)
    {
    super(p_i45435_1_);
    }
    
    @SideOnly(Side.CLIENT)
        public IIcon getIcon(int side)
        {
            return BlockMod.variable.getBlockTextureFromSide(side);
        }
    
    

    Merci d'avoir pris le temps de me répondre en tous cas!
    Je vais me reposer mais je chercherai encore un peu, j'ai toujours trouvé ce que j'avais besoin par mes soins jusqu'ici mais je vous remercie vraiment pour votre investissement, bonne soirée !



  • Je vous donnerai ce code mais complété pour que ça marche ce midi, même en étant débutant je pense que vous le comprendrez 😉



  • Enfait j'y arrive mais alors tous les murets ont la même texture, ce qui, logiquement, ne m'intéresse pas, et oui, je n'arrive pas à ""créer"", mais je comprends ce que je fais, sinon j'aurais déjà baissé les bras depuis longtemps ^^ 
    Merci à vous, vraiment !



  • 
    private final Block textureBlock; //Le block qui servira de texture au muret, j'ai mis un final car sa valeur sera toujours fixe
    public BlockWallMod(Block p_i45435_1_)
    {
    super(p_i45435_1_);
    this.textureBlock = p_i45435_1_; //On fait correspondre au textureBlock le block passé au constructeur
    }
    
    @SideOnly(Side.CLIENT)
    @Override //Indique qu'on remplace la méthode de la classe parente, utile pour voir quand son nom ou ses paramètres changent (quand on met Minecraft à jour par exemple)
       public IIcon getIcon(int side, int meta)
       {
           return textureBlock.getBlockTextureFromSide(side); //Et on retourne la bonne texture
       }
    
    

    Avec ce code, chaque muret aura la texture du block passé au constructeur, et tu connaîtras un peu le "final"et le "@Override" 🙂



  • Me revoilà, mon problème n'étant pas encore résolu, donc soit je n'ai vraiment pas compris (à mon avis c'est ça^^) 
    soit j'ai peut-être mal formulé mon souci, donc je vais le mettre en image :
    https://www.noelshack.com/2017-11-1489751984-murets.png

    En fait, ce que j'ai compris c'est que le 'return' va appliquer la texture à tous les murets que je vais créer, or j'essaie justement de les différencier car je veux en créer un bon gros nombre (à mon avis plus de 100) et je ne vois pas comment faire pour dire: ""Cette texture va avec ce muret""

    Enfin voilà, je pense que je me perds un peu dans mes idées mais j'ai 'quasiment' tout essayé (je vais pas dire tout sinon j'aurais trouvé la solution ^^) et c'est vraiment une class qui me rend fou

    Ceci dit, encore une fois un grand merci pour votre soutien !



  • Ça j'ai compris mais avec ce que j'ai donné, comme la variable textureBlock est spécifique à chaque wall que tu instanciés dans ta classe principale, chaque mur aura la texture du block que tu veux, celui que tu mets dans la classe principale.



  • Autant pour moi, j'ai cru que je devais encore remplacer "textureBlock", tout fonctionne, merci beaucoup ! 😄

    Pour éviter des heures de recherches à beaucoup de gens, voici:

    package com.mod.trillium.blocks;
    
    import java.util.List;
    
    import com.mod.trillium.init.BlockMod;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import net.minecraft.block.Block;
    import net.minecraft.block.BlockWall;
    import net.minecraft.block.material.Material;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.init.Blocks;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.IBlockAccess;
    import net.minecraft.world.World;
    
    public class BlockWallMod extends BlockWall {
    
    private final Block textureBlock; //Le block qui servira de texture au muret, j'ai mis un final car sa valeur sera toujours fixe
    public BlockWallMod(Block p_i45435_1_)
    {
    super(p_i45435_1_);
    this.textureBlock = p_i45435_1_; //On fait correspondre au textureBlock le block passé au constructeur
    }
    
    @SideOnly(Side.CLIENT)
    @Override //Indique qu'on remplace la méthode de la classe parente, utile pour voir quand son nom ou ses paramètres changent (quand on met Minecraft à jour par exemple)
      public IIcon getIcon(int side, int meta)
      {
          return textureBlock.getBlockTextureFromSide(side); //Et on retourne la bonne texture
      }
    
    @Override
    public boolean canConnectWallTo(IBlockAccess par1, int par2, int par3, int par4)
        {
    
    Block block = par1.getBlock(par2, par3, par4);
    int meta = par1.getBlockMetadata(par2, par3, par4);
    //int meta = par1.getBlockMetadata(par2, par3, par4);
    if(block==BlockMod.block_blockwall1 || block==BlockMod.block_wall2){ //Pour que vos murets murets se connectent entre eux (ne fonctionne pas avec les murets vanilla)
    return true;
    }
    
            return block != this && block != Blocks.fence_gate ? (block.getMaterial().isOpaque() && block.renderAsNormalBlock() ? block.getMaterial() != Material.gourd : false) : true;
        }
    
    public void getSubBlocks(Item p_149666_1_, CreativeTabs p_149666_2_, List p_149666_3_)
    {
        p_149666_3_.add(new ItemStack(p_149666_1_, 1, 0));   // Evite d'avoir deux fois le bloc dans le creativeTab
    }
    public boolean canPlaceTorchOnTop(World world, int x, int y, int z) { //On peut placer les torches sur le muret
    return true;
    }
    }
    
    

    Voilà, merci à vous !