Bloc container haut de deux blocs



  • Bonjour,
    J'essaie actuellement de créer un bloc qui pourrait s’apparenter au bloc coffre, mais sur deux blocs de haut (un peu comme un double coffre renversé, je ne sais pas si je suis très clair).
    J'aimerais que lorsque deux de ces blocs soient posés l'un sur l'autre, leur model change (je passe par la méthode TESR avec Techne pour le model) et que j'ai accès au même contenu en cliquant sur n'importe lequel de ces deux blocs. Exactement comme pour le double coffre en fait.

    Mon bloc :

    
    public class WardrobeBlock extends BlockContainer {
    
            //Treat it like a normal block here. The Block Bounds are a good idea - the first three are X Y and Z of the botton-left corner,
            //And the second three are the top-right corner.
            public WardrobeBlock() {
                    super(Material.wood);
                    this.setCreativeTab(CreativeTabs.tabDecorations);
                    this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
                    this.setStepSound(soundTypeWood);
                    this.setUnlocalizedName("wardrobe");
                    this.setHardness(2.0F);
                    this.setResistance(5.0F);
            }
    
            public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase living, ItemStack stack)
            {
                if(stack.getItemDamage() == 0)
                {
                    TileEntity tile = world.getTileEntity(pos);
                    TileEntity tileDown = world.getTileEntity(pos.down());
                    if(tile instanceof TileEntityWardrobe)
                    {
                        int direction = MathHelper.floor_double((double)(living.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
                        if(world.getBlockState(pos.down()) == this.getDefaultState()){
                            ((TileEntityWardrobe)tile).setDirection(((TileEntityWardrobe)tileDown).getDirection());
                        }
                        else{
                            ((TileEntityWardrobe)tile).setDirection((byte)direction);
                        }
                    }
                }
    
                TileEntity tile = world.getTileEntity(pos);
                if(tile instanceof TileEntityWardrobe)
                {
                    if(stack.hasDisplayName())
                    {
                        ((TileEntityWardrobe)tile).setCustomName(stack.getDisplayName());
                    }
                }
            }
    
            public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ)
            {
                if(worldIn.isRemote)
                {
                    return true;
                }
                else
                {
                    playerIn.openGui(ModScrollcraft.instance, 0, worldIn, pos.getX(), pos.getY(), pos.getZ());
                    return true;
                }
            }
    
            public void breakBlock(World worldIn, BlockPos pos, IBlockState state)
            {
                TileEntity tileentity = worldIn.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 = worldIn.rand.nextFloat() * 0.8F + 0.1F;
                            float f1 = worldIn.rand.nextFloat() * 0.8F + 0.1F;
                            EntityItem entityitem;
    
                            for(float f2 = worldIn.rand.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; worldIn.spawnEntityInWorld(entityitem))
                            {
                                int j1 = worldIn.rand.nextInt(21) + 10;
    
                                if(j1 > itemstack.stackSize)
                                {
                                    j1 = itemstack.stackSize;
                                }
    
                                itemstack.stackSize -= j1;
                                entityitem = new EntityItem(worldIn, (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)worldIn.rand.nextGaussian() * f3);
                                entityitem.motionY = (double)((float)worldIn.rand.nextGaussian() * f3 + 0.2F);
                                entityitem.motionZ = (double)((float)worldIn.rand.nextGaussian() * f3);
    
                                if(itemstack.hasTagCompound())
                                {
                                    entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
                                }
                            }
                        }
                    }
                    worldIn.updateComparatorOutputLevel(pos, this);
                }
                super.breakBlock(worldIn, pos, state);        
            }
    
            @Override
            public TileEntity createNewTileEntity(World world, int metadata)
            {
                return new TileEntityWardrobe();
            }
    
            public boolean isOpaqueCube()
            {
                return false;
            }
    
            public boolean renderAsNormalBlock()
            {
                return false;
            }
    
            public int getRenderType()
            {
                return -1;
            }
    
            public Item getItemDropped(IBlockState state, Random rand, int fortune)
            {
                return Item.getItemFromBlock(this);
            }
    
            public int quantityDropped(Random random)
            {
                return 1;
            }
    }
    
    

    Merci d'avance 😉



  • Il faut bien différencier le rendu de la collision, minecraft gère le rendu de chaque bloc à part, donc le coffre de droite s'occupe du rendu du côté droit, mais tu peux faire le rendu de tout le model depuis un des 2 bloc.

    Le plus difficile est la synchronisation entre les 2, je te conseille de te faire une bonne API pour çà, car le code de Minecraft est assez brouillon, donc fait ton propre code plutôt.



  • Donc tu me conseille de ne changer que le rendu d'un des deux blocs ? Du coup le rendu du second serait une sorte de bloc invisible ?

    Une idée de comment synchroniser les deux ? Parce que je vois pas du tout comment faire 😕



  • Pour le rendu, tu as 2 possibilités :

    • faire le rendu sur un seul des blocs (simple mais bugué lorsque le joueur ne regarde pas le bloc qui fait le rendu)
    • faire un rendu différent par bloc, plus complexe

    La synchronisation dépend de ce que tu veux faire. Est-ce que tu veux faire un ensemble comme la porte (un bloc en pose 2), ou comme le coffre (une version petit et une version grand)



  • Je pensais faire une version petite et une grande version, comme pour le coffre en fait.



  • Pour le rendu, vu que t'es en 1.8, je sais pas trop comment faire. Pour la collision : tu veux une hitbox custom ?



  • La hitbox pourrait me permettre de viser le bloc du dessous en regardant celui du dessus ?



  • Non, désolé.



  • Ok bah je vais réfléchir à ce que je peux faire alors…

    Merci quand même !