Block XRay



  • Bonjour, c'est encore moi 😛
    Je reviens vers vous car j'ai deux blocs qui posent problème :

    • Mon purificateur, qui est un block container, qui n'a une texture que dans l'inventaire.
      Mon blockstate :

      {    "variants": {        "normal":{ "model": "elementalmod:purifier" }    }}

    • Mon modele (block) :
      {    "parent": "block/cube_bottom_top",    "textures": {        "side": "elementalmod:blocks/purifier_side",        "top": "elementalmod:blocks/purifier_top",        "bottom": "elementalmod:blocks/purifier_bottom"    }}

    • Mon modèle (item) :
      { "parent": "elementalmod:block/purifier", "display": { "thirdperson": { "rotation": [10, -45, 170], "translation": [0, 1.5, -2.75], "scale": [0.375, 0.375, 0.375] } }}

    • Et enfin, mon Purifier.java :```java
      public class PurifierBlock extends BlockContainer {    protected PurifierBlock(Material material) {        super(material);        this.setUnlocalizedName("purifier");        this.setCreativeTab(CreativeTabs.tabDecorations);        this.setResistance(50.0F);        this.setHardness(10.0F);        this.setHarvestLevel("pickaxe", 1);    }        public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX,             float hitY, float hitZ) {        if(!world.isRemote) {            player.openGui(ModElemental.instance, 0, world, pos.getX(), pos.getY(), pos.getZ());        }        return true;            }    @Override    public TileEntity createNewTileEntity(World worldIn, int meta) {        return new PurifierTileEntity();    }        public boolean hasTileEntity(IBlockState state) {        return true;    }    public void breakBlock(World world, BlockPos pos, IBlockState state)    {        TileEntity tileentity = world.getTileEntity(pos);        if (tileentity instanceof IInventory)        {            IInventory inv = (IInventory)tileentity;            for (int i1 = 0; i1 < inv.getSizeInventory(); ++i1)            {                ItemStack itemstack = inv.getStackInSlot(i1);                if (itemstack != null)                {                    float f = world.rand.nextFloat() * 0.8F + 0.1F;                    float f1 = world.rand.nextFloat() * 0.8F + 0.1F;                    EntityItem entityitem;                    for (float f2 = world.rand.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; world.spawnEntityInWorld(entityitem))                    {                        int j1 = world.rand.nextInt(21) + 10;                        if (j1 > itemstack.stackSize)                        {                            j1 = itemstack.stackSize;                        }                        itemstack.stackSize -= j1;                        entityitem = new EntityItem(world, (double)((float)pos.getX() + f), (double)((float)pos.getY() + f1), (double)((float)pos.getZ() + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage()));                        float f3 = 0.05F;                        entityitem.motionX = (double)((float)world.rand.nextGaussian() * f3);                        entityitem.motionY = (double)((float)world.rand.nextGaussian() * f3 + 0.2F);                        entityitem.motionZ = (double)((float)world.rand.nextGaussian() * f3);                        if (itemstack.hasTagCompound())                        {                            entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());                        }                    }                }            }        }        super.breakBlock(world, pos, state);    }}

      
      
    • Mon deuxième problème, c'est un bloc qui a de la transparence. J'ai copié le code de BlockGlass, et le seul problème, c'est que l'on peut voir a travers les blocs adjacents.
      Code :```java
      public class SelenitBlock extends Block {    protected SelenitBlock(Material material) {        super(material);        this.setUnlocalizedName("selenitBlock");        this.setCreativeTab(CreativeTabs.tabBlock);        this.setResistance(8.0F);        this.setHardness(12.0F);        this.setHarvestLevel("pickaxe", 1);    }        /public boolean isOpaque() {        return false;    }        public boolean isTranslucent() {        return true;    }/        @SideOnly(Side.CLIENT)    public EnumWorldBlockLayer getBlockLayer()    {        return EnumWorldBlockLayer.CUTOUT;    }    public boolean isFullCube()    {        return false;    }}

      Désolé, mais l'éditeur a retiré tous les retours a la ligne…et toutes les balises... :@ :@ :@


  • Il me semble que :

    public boolean isOpaque()
    {
    return false;
    }
    public boolean isTranslucent()
    {
    return true;
    }
    Permette de corriger ça, essaye de les mettre



  • Je les ai testé seul mais je n'ai pas testé de mettre les deux en même temps… Je vais voir ça 🙂


  • Rédacteurs

    Override la fonction getRenderType et retourne 3 (pour le container)



  • @'bodri':

    Override la fonction getRenderType et retourne 3 (pour le container)

    Pour le purificateur ou pour le Selenit ?


  • Rédacteurs

    Le purificateur

    
    @Override
    public int getRenderType()
    {
    return 3;
    }
    
    


  • Je teste ça tout de suite 🙂
    PS : arrêtez d'aller plus vite que mon ordinateur 😄

    EDIT : Merci beaucoup, le purificateur fonctionne enfin totalement 😄
    Le Selenit a cependant toujours le même problème…


  • Rédacteurs

    Essai d'extends le Selenit à BlockBreakable et de mettre ces fonctions :

    
    @SideOnly(Side.CLIENT)
    public EnumWorldBlockLayer getBlockLayer()
    {
    return EnumWorldBlockLayer.CUTOUT;
    }
    
    public boolean isFullCube()
    {
    return false;
    }
    
    

  • Correcteurs

    Tu peux aussi essayer de mettre le code ci-dessous à la place de isTranslucent:

    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    


  • Et n oublie pas de rajouter l annotation
    @SideOnly(SIDE.CLIENT)
    Au dessus de ta methode getRenderType()
    Sinon c est le crash assure une fois le mod sur serveur !



  • Merci, je vais tester tout ça.
    EDIT : voilà ! Ça fonctionne ! Mais ce serait possible de faire une nuance entre coloré et transparent ? Dans la main, ca l'est, mais une fois posé c'est tout transparent avec des grilles totalement opaques.  :s


  • Rédacteurs

    Screenshot ? Pas tout compris



  • Voilà un screenshot :
    0_1537564376338_2015-11-09_16.49.15.png
    Le bloc en main est translucide alors que une fois posé, il est transparent 😕
    J'aimerais que, une fois posé il est translucide.



  • UP ! J'aimerais bien que mon block soit translucide une fois posé ! J'espère que c'est possible, car le bloc de verre ne le fait même pas, alors je ne vois pas où chercher…



  • Qu'appelles tu translucide ? Tu veux qu'il y est une légère transparence ?

    EDIT : envoi les json au passage


  • Rédacteurs

    Tu peux peut-être aussi essayer de retourner EnumWorldBlockLayer.TRANSLUCENT dans la fonction getBlockLayer()



  • @'bodri':

    Tu peux peut-être aussi essayer de retourner EnumWorldBlockLayer.TRANSLUCENT dans la fonction getBlockLayer()

    C'est bon ça fonctionne ! Merci !