Personnalise ton bloc



  • Sommaire

    Introduction

    Bonjour à tous ! Aujourd'hui on se retrouve pour un petit tutoriel qui va vous apprendre à personnaliser votre bloc pour en faire ce que vous voulez ! Chaque section est indépendante vous pouvez donc regarder uniquement ce qui vous intéresse !

    Pré-requis

    Créer un bloc basique

    Code

    Tout va se passer dans la classe de votre bloc je vous met ce que vous devez avoir avec des noms différents si vous avez bien suivi le pré-requis ci-dessus

    public class CopperBlocks extends Block{
        public static final String NAME = "copper_block";
    
        public CopperBlocks(Material material)
        {
            super(material);
    
            SimpleoresBlocks.setBlockName(this, NAME);
            setResistance(5.0F);
            setHardness(3.0F);
            setCreativeTab(ModSimpleores.blocksTab);
        }
    }
    

    Un bloc orientable :

    Pour créer un bloc orientable nous allons utiliser la propriété facing pour déterminer la direction du bloc. Cette propriété est utilisé pour des bloc comme le four ou bien le coffre
    Dans votre classe du bloc il faut mettre les propriété suivante

        //initialisation de la propriété
        @Override
        protected BlockStateContainer createBlockState()
        {
            return new BlockStateContainer(this, new IProperty[] {FACING});
        }
    
        public IBlockState getStateFromMeta(int meta)
        {
            EnumFacing enumfacing = EnumFacing.getFront(meta);
    
            if (enumfacing.getAxis() == EnumFacing.Axis.Y)
            {
                enumfacing = EnumFacing.NORTH;
            }
    
            return this.getDefaultState().withProperty(FACING, enumfacing);
        }
    
        public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
        {
            return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING)));
        }
    
        public int getMetaFromState(IBlockState state)
        {
            return ((EnumFacing)state.getValue(FACING)).getIndex();
        }
        //permet d'upadate la propriété en fonction du placement du joueur
        public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
        {
            return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing().getOpposite());
        }
    

    Et voici a quoi doit ressembler votre fichier json blockstates

    {
        "variants": {
            "facing=north": { "model": "modid:votrebloc" },
            "facing=south": { "model": "modid:votrebloc", "y": 180 },
            "facing=west":  { "model": "modid:votrebloc", "y": 270 },
            "facing=east":  { "model": "modid:votebloc", "y": 90 }
        }
    }
    

    Félicitations vous avez créer un bloc orientable

    Un minerai :

    Si vous voulez créer un minerai type diamant, lapis-lazuli la démarche est très simple tout d'abord changer l'héritage de la classe de votre Block de extends Block a extends BlockOre. Cela permettra à l'enchatement fortune de s'appliquer sur votre bloc

    Ensuite pour que votre bloc loote autre chose que le bloc en question comme avec le diamant ajoutez ceci

        public Item getItemDropped(IBlockState state, Random rand, int fortune)
        {
            return tonitem;
        }
    

    Si votre classe est commune a plusieurs bloc vous pouvez-mettre ceci pour que chaque bloc droppe un item particulier

        public Item getItemDropped(IBlockState state, Random rand, int fortune)
        {
            return this == Block1? item1 : (this == Block2 ? Item2 : Item.getItemFromBlock(this));
        }
    

    Si vous voulez que votre bloc droppe plusieurs items c'est cette fonction qu'il faut utiliser

        public int quantityDropped(Random random)
        {
            nombrededrop;
        }
    

    Ensuite vous pouvez aussi rajouter un bruit à votre minerai pour la finition pour ce faire ajouter ceci dans votre constructeur

        setSoundType(SoundType.BLOC);
    

    Toujours dans votre constructeur vous pouvez choisir avec quel outil et quel doit être le niveau de cette outil pour que votre bloc puisse être récupérer

        setHarvestLevel("ToolClass",int);
    

    ToolClass corespond a la classe de l'outil vous pouvez mettre "pickaxe" pour la pioche ou bien "axe" pour la hache. Le nombre entier représente le niveau de l'outil, 0 pour le bois, 1 pour la pierre, 2 pour le fer, et 3 pour le diamant

    La fonction suivante va servir a drop de l'xp quand vous aller casser votre bloc

        public int getExpDrop(IBlockState state, IBlockAccess world, BlockPos pos, int fortune)
        {
            return int;
        }
    

    L'int est le nombre de points d'xp a drop lors du cassage du bloc

    Si vous voulez utilisé votre minerai comme base de beacon ajouter simplement ceci

        public boolean isBeaconBase(IBlockAccess worldObj, BlockPos pos, BlockPos beacon)
        {
            return true;
        }
    

    Un bloc translucide et lumineux :

    Vous voulez que votre bloc soit translucide comme le verre ? Il suffit d'ajouter cette petite fonction dans la classe de votre bloc

    public boolean isTranslucent()
    {
        return true;
    }
    

    Pour ajuster l'opacité de votre bloc vous pouvez aussi utiliser la fonction ci-dessous a mettre dans votre constructeur

    setLightOpacity(int);
    

    Plus le nombre est bas moins il laissera passer la lumière
    sur l'image ci-dessous l'opacité du bloc rouge est a 0 est celle du bloc orange a 15 une torche est située sous les deux blocs

    Pour rendre votre bloc lumineux cela se joue encore dans le constructeur ajouter la fonction

        setLightLevel(float); 
    

    plus votre nombre sera haut plus il emettra de la lumière dans l'image ci-dessous la lumonisité du bloc rouge est a 2 est celle du bloc orange a 0

    Un bloc type gravier :

    Pour que votre bloc soit soumis à la gravité il suffit de changer l'héritage de votre bloc de extends Block a extends BlockFalling

    Quelques interactions avec votre bloc :

    Par exemple si vous voulez effectuer certaines actions lorsque votre bloc est détruit par les joueurs vous pouvez utiliser le constructeur

        public void onBlockDestroyedByPlayer(World worldIn, BlockPos pos, IBlockState state)
        {
        }
    

    Celui-ci sert lorsque le bloc est détruit lors d'une explosion

        public void onBlockDestroyedByExplosion(World worldIn, BlockPos pos, Explosion explosionIn)
    
        {
        }
    

    Toujours dans les explosions le constructeur suivant permet d'autoriser ou non le drop du bloc lorsqu'il est détruit par une explosion

        public boolean canDropFromExplosion(Explosion explosionIn)
        {
            return true;
        }
    

    Pour ajouter une fonction lorsque l'on fait clique droit sur votre bloc (utilisé notamment pour ouvrir les guis) c'est le constructeur suivant qu'il faut utilisé

        public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
        {
            return false;
        }
    

    mettez ce que vous voulez faire a la place du false
    Pour avoir une réaction lorsque une entité marche sur votre bloc utilisé ceci

        public void onEntityWalk(World worldIn, BlockPos pos, Entity entityIn)
        {
        }
    

    Quelques propriétés bonus :

    Vous pouvez aussi choisir si votre bloc pourra bruler ou non

        public boolean isBurning(IBlockAccess world, BlockPos pos)
        {
            return false;
        }
    

    Et la vitesse a laquelle celui-ci va brûler

        public int getFlammability(IBlockAccess world, BlockPos pos, EnumFacing face)
        {
            return int (entre 1 et 300);
        }
    

    plus le nombre est grand plus le bloc ce consumera vite

    Et si on peux poser un bloc par-dessus comme avec l'eau ou la lave

        public boolean isReplaceable(IBlockAccess worldIn, BlockPos pos)
        {
        }
    
    

    Si vous voulez que votre bloc puisse conduire la redstone ajouter ceci

        public boolean canConnectRedstone(IBlockState state, IBlockAccess world, BlockPos pos, @Nullable EnumFacing side)
        {
            return true;
        }
    

    Pour pouvoir ajouter une torche sur votre utilisé ceci

        public boolean canPlaceTorchOnTop(IBlockState state, IBlockAccess world, BlockPos pos)
        {
            return true;
        }
    

    Résultat

    J'espère que ce tutoriel vous aura été utile si vous avez des questions ou des remarques n'hésitez pas a me laisser un commentaire! Je compléterai ce tutoriel si besoin avec vos retours !

    Crédits

    Rédaction :

    • Aypristyle


    Ce tutoriel de Aypristyle publié sur Minecraft Forge France est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International

    Retour vers le sommaire des tutoriels



  • Super tutoriel . Mais pour l'option de la base du beacon ça marche de ton coté ?



  • Chez moi ça a fonctionné il m'a bien demandé de choisir mon booster si ça ne fonctionne pas chez toi essaye avec ce code (c'est le code que j'ai utilisé pour ajouter plusieurs bloc comme base de beacon)

     public boolean isBeaconBase(IBlockAccess worldObj, BlockPos pos, BlockPos beacon)
        {
            return this == tonpackage.taclassebloc.bloc 
         }
    

    Pour moi ça a donné

    public boolean isBeaconBase(IBlockAccess worldObj, BlockPos pos, BlockPos beacon)
       {
           return this == fr.priya.simpleores.blocks.SimpleoresBlocks.AMNETHYSTE_BLOCK;
       }
    


  • Sympa le tuto 🙂