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
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é cecipublic 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 -
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