Les escaliers
-
Sommaire
Introduction
Dans ce tutoriel, nous allons apprendre à créer des escaliers en utilisant un bloc pré-existant, qu’il soit dans un mod ou dans Vanilla.
Pré-requis
Code
Pour créer un escalier, nous allons modifier la classe contenant tous vos blocs, la classe contenant tous vos items, la classe d’enregistrement des items et des blocs et créer une classe pour notre escalier.
Nous créerons également cinq fichiers json : 3 modèles de bloc, 1 blockstate et 1 modèle d’item.
Ce travail peut vous paraître impressionnant, mais vous verrez que ce n’est au final que de petites parties dans de nombreux fichiers.La classe des blocs :
La classe des blocs ne nécessite pas beaucoup de modifications. Nous allons simplement ajouter cette ligne :
public static final Block STAIRS = new TutorialStairs(Blocks.IRON_BLOCK.getDefaultState());
Vous devriez comprendre facilement toute la partie avant le =, mais vous rencontrez peut-être des difficultés à comprendre la suite.
La classe que nous allons créer ensuite héritera de la classe BlockStairs et son constructeur prend en paramètre un IBlockState.
Pour trouver quel IBlockState utilisé, nous récupérons le bloc que nous souhaitons utiliser pour créer notre escalier et récupérons son état. Ici, nous voulons l’état par défaut du bloc de fer Vanilla, nous utilisons donc Blocks.IRON_BLOCK.getDefaultState(). Nous pourrions créer des escaliers avec un bloc de notre mod.Nous en avons terminé pour cette classe.
La classe de l’escalier :
Nous allons créer la classe de notre escalier. Elle doit hériter de BlockStairs, que vous trouverez dans le package net.minecraft.block. Voici le constructeur que nous allons utiliser :
public TutorialStairs(IBlockState modelState) { super(modelState); TutorialBlocks.setBlockName(this, NAME); }
Vous devez avoir déjà défini NAME comme pour un bloc simple. Nous ne faisons donc rien que de créer un constructeur avec un IBlockState que l’on passe au constructeur parent.
Vous pouvez modifier la classe comme vous le souhaitez tant que vous conservez ces lignes.La classe de l’escalier n’était pas compliquée, si ?
La classe des items :
La classe des items n’est pas plus compliquée que les deux autres classes.
Pour déclarer l’item :public static final Item BLOCK_TUTORIAL_STAIRS = new ItemBlock(TutorialBlocks.STAIRS).setRegistryName(TutorialBlocks.STAIRS.getRegistryName());
Vous devriez reconnaître cette ligne, elle est identique que celle que nous avons écrite pour créer un item simple.
Placez-vous ensuite dans votre fonction registerItemsModels() et enregistrez le modèle de votre item :
registerModel(BLOCK_TUTORIAL_STAIRS, 0);
N’oubliez pas d’aller dans votre RegisteringHandler et d’enregistrer à la fois l’item et le bloc dans les fonctions appropriées.
Normalement, votre escalier est fonctionnel. Il faut maintenant lui attribuer un modèle et une texture.Les ressources :
Les ressources sont probablement le point le plus important de ce tutoriel. Ce sont elles qui décident de l’affichage correct de votre escalier. Si elles sont mal définies, vous pourriez avoir des problèmes.
Nous allons commencer par aller dans le dossier des blockstates et créer un fichier tutorial_stairs.json (le nom sera différent selon votre NAME.
{ "variants": { "facing=east,half=bottom,shape=straight": { "model": "tutorial:tutorial_stairs" }, "facing=west,half=bottom,shape=straight": { "model": "tutorial:tutorial_stairs", "y": 180, "uvlock": true }, "facing=south,half=bottom,shape=straight": { "model": "tutorial:tutorial_stairs", "y": 90, "uvlock": true }, "facing=north,half=bottom,shape=straight": { "model": "tutorial:tutorial_stairs", "y": 270, "uvlock": true }, "facing=east,half=bottom,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs" }, "facing=west,half=bottom,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs", "y": 180, "uvlock": true }, "facing=south,half=bottom,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs", "y": 90, "uvlock": true }, "facing=north,half=bottom,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs", "y": 270, "uvlock": true }, "facing=east,half=bottom,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs", "y": 270, "uvlock": true }, "facing=west,half=bottom,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs", "y": 90, "uvlock": true }, "facing=south,half=bottom,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs" }, "facing=north,half=bottom,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs", "y": 180, "uvlock": true }, "facing=east,half=bottom,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs" }, "facing=west,half=bottom,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs", "y": 180, "uvlock": true }, "facing=south,half=bottom,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs", "y": 90, "uvlock": true }, "facing=north,half=bottom,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs", "y": 270, "uvlock": true }, "facing=east,half=bottom,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs", "y": 270, "uvlock": true }, "facing=west,half=bottom,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs", "y": 90, "uvlock": true }, "facing=south,half=bottom,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs" }, "facing=north,half=bottom,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs", "y": 180, "uvlock": true }, "facing=east,half=top,shape=straight": { "model": "tutorial:tutorial_stairs", "x": 180, "uvlock": true }, "facing=west,half=top,shape=straight": { "model": "tutorial:tutorial_stairs", "x": 180, "y": 180, "uvlock": true }, "facing=south,half=top,shape=straight": { "model": "tutorial:tutorial_stairs", "x": 180, "y": 90, "uvlock": true }, "facing=north,half=top,shape=straight": { "model": "tutorial:tutorial_stairs", "x": 180, "y": 270, "uvlock": true }, "facing=east,half=top,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "y": 90, "uvlock": true }, "facing=west,half=top,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "y": 270, "uvlock": true }, "facing=south,half=top,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "y": 180, "uvlock": true }, "facing=north,half=top,shape=outer_right": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "uvlock": true }, "facing=east,half=top,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "uvlock": true }, "facing=west,half=top,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "y": 180, "uvlock": true }, "facing=south,half=top,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "y": 90, "uvlock": true }, "facing=north,half=top,shape=outer_left": { "model": "tutorial:tutorial_outer_stairs", "x": 180, "y": 270, "uvlock": true }, "facing=east,half=top,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "y": 90, "uvlock": true }, "facing=west,half=top,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "y": 270, "uvlock": true }, "facing=south,half=top,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "y": 180, "uvlock": true }, "facing=north,half=top,shape=inner_right": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "uvlock": true }, "facing=east,half=top,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "uvlock": true }, "facing=west,half=top,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "y": 180, "uvlock": true }, "facing=south,half=top,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "y": 90, "uvlock": true }, "facing=north,half=top,shape=inner_left": { "model": "tutorial:tutorial_inner_stairs", "x": 180, "y": 270, "uvlock": true } } }
Le code ici est long mais n’est pas compliqué. Pour le comprendre, vous devez tout d’abord savoir quelque chose sur les escaliers. Chaque bloc d’escalier utilise les 16 métadonnées autorisées pour les blocs. La raison est simple : chaque position d’escalier utilise une métadonnée. Nous avons donc 8 positions avec la base en bas, et 8 positions avec la base en haut (les 4 positions “normales” et les 4 positions dans un coin). Pour chaque coin et pour une position “normale”, nous allons définir un modèle différent par direction. Ce qui veut dire que chaque coin aura 1 modèle orienté de 4 façons différentes et la version normale a également 1 modèle et 4 orientations différentes. Les coins sont regroupés par groupes de deux, ce qui nous fait au total 3 modèles, et 4x5 = 20 lignes. Les 20 dernières lignes sont identiques mais gèrent la rotation pour les positions vers le haut.
Ce que vous devez savoir, c’est que toutes ces lignes permettent de gérer toutes les positions des escaliers. Si vous le souhaitez, vous pouvez mettre un modèle différent pour chaque position, et changer la texture à chaque fois. Vous pourrez mieux comprendre comment ces lignes fonctionnent.
Comme vous pouvez le voir, nous allons par la suite avoir besoin de 3 modèles : tutorial_stairs.json, tutorial_outer_stairs.json et tutorial_inner_stairs.json.
Nous allons les créer tous trois très simplement.
tutorial_stairs.json :
{ "parent": "block/stairs", "textures": { "bottom": "blocks/iron_block", "top": "blocks/iron_block", "side": "blocks/iron_block" } }
tutorial_inner_stairs.json :
{ "parent": "block/inner_stairs", "textures": { "bottom": "blocks/iron_block", "top": "blocks/iron_block", "side": "blocks/iron_block" } }
tutorial_outer_stairs.json :
{ "parent": "block/outer_stairs", "textures": { "bottom": "blocks/iron_block", "top": "blocks/iron_block", "side": "blocks/iron_block" } }
Pour chacun des modèles, nous utilisons un parent différent, tous définis par défaut dans Minecraft.
Vous pouvez varier les textures selon leur position sur l’escalier. Personnellement, je préfère avoir une harmonie et j’ai décidé d’utiliser la texture de base du bloc de fer de Minecraft. Vous pouvez cependant décider d’utiliser un autre bloc comme référence. Par exemple :{ "parent": "block/stairs", "textures": { "bottom": "tutorial:blocks/tutorial", "top": "tutorial:blocks/tutorial", "side": "tutorial:blocks/tutorial" } }
Ce code utilise la texture tutorial.png de notre mod. Attention, vous ne devez pas utiliser le nom du modèle de votre bloc, mais bien celui de la texture !
Et enfin, nous devons nous rendre dans le modèle de l’item et créer un fichier tutorial_stairs.json (le nom peut également changer selon ce que vous avez décidé de mettre mais vous êtes désormais assez autonome pour le changer sans mon intervention maintenant, non ?).
{ "parent": "tutorial:block/tutorial_stairs" }
Rien de plus simple. Vous avez désormais créé votre escalier !
Dans vos fichiers de langue, vous devez ajouter une ligne comme celle-ci :
tile.tutorial.tutorial_stairs.name=Tutorial Stairs
Vous pouvez ouvrir le jeu, tout s’affiche correctement !
Résultat
De beaux escaliers en fer :
Crédits
Rédaction :
Correction :
- Toutoune1008
Ce tutoriel de 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 -
Bonjour tout d’abord très bon tutoriel j’aimerai juste savoir comment fait-on lorsque le bloc que l’on veut en parent est un metadata d’un autre bloc ? (Pour par exemple faire des escaliers en diorite, granite, andésite…
-
Il faut que tu ailles chercher dans la class du block en question, pour chercher la IProperty qui correspond à la variante du block (en général, il s’appelle VARIENTE) et tu fait ça pour créer l’instance de ton block d’escalier :
public static final Block STAIRS = new TutorialStairs(Blocks.NOM_DU_BLOCK.getDefaultState()**.withProperty(LaClassDuBlock.LA_IPROPERTY, laValeur)**);
Donc par exemple pour le différentes laines, c’est comme ça :
public static final Block STAIRS_WOOL_RED = new TutorialStairs(Blocks.WOOL.getDefaultState().withProperty(BlockColored.COLOR, EnumDyeColor.RED));
-
Merci de ton aide LeBossMax2 je viens d’essayer ta technique et elle ne fonctionne pas chez moi (je suis bien en 1.11) j’ai l’erreur suivante dans Eclipse
The method withProperty(IProperty<t>, V) in the type IBlockState is not applicable for the arguments (PropertyEnum<enumdyecolor>, EnumDyeColor, String) ```</enumdyecolor></t>
-
Merci cela fonctionne j’ai juste une dernière petite question pour ajouter une recette avec comme input des blocs avec des métadata (ex laines diorite comment fait-on ?)
J’ai essayer de rajouter le metadata après le bloc précéder d’un virgule ou avec deux points mais cela n’a pas fonctionner -
new ItemStack(block, quantité, metadata) à mettre à la place de bloc.
(mets 1 pour la quantité) -
Merci beaucoup tout fonctionne
-
-
-