Appearance
Création d'un bloc
Ce module est dédié à la création de blocs physiques traditionnels (pleins et cubiques) en 1.20.1 (hors BlockEntities / Machines qui requièrent un traitement à part).
Ajouter un bloc dans Minecraft est légèrement plus subtil qu'un simple objet : un bloc possède une existence physique dans le monde (sous forme de Block), mais requiert aussi un objet associé (un BlockItem) pour pouvoir être tenu dans la main du joueur et placé.
1. La Double Obligation : Block et BlockItem
Pour chaque structure minérale ou décorative que vous inventez, vous devez effectuer une double action dans votre code:
Enregistrer le bloc sous le registre des Blocs (pour gérer sa dureté, sa résistance aux explosions, son bruit de pas).
Enregistrer ce même élément sous le registre des Items sous forme de
BlockItem(pour qu'il existe dans l'inventaire).
Afin d'automatiser proprement cela sans dupliquer notre code, nous allons créer une méthode utilitaire dans notre nouvelle classe déportée.
2. Création de la Classe d'Initialisation : ModBlocks.java
Créez le fichier ModBlocks.java dans votre package d'initialisation (src/main/java/net/pseudo/tutorialmod/init/ModBlocks.java). Ce fichier utilise également le registre de la classe ModItems construite au module précédent.
java
package net.pseudo.tutorialmod.init;
import net.pseudo.tutorialmod.TutorialMod;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import java.util.function.Supplier;
public class ModBlocks {
// 1. Déclaration du registre déporté spécifique aux Blocs
public static final DeferredRegister<Block> BLOCKS =
DeferredRegister.create(ForgeRegistries.BLOCKS, TutorialMod.MOD_ID);
// 2. ENREGISTREMENT D'UN BLOC STANDARD (Ex: Minerai ou bloc de construction)
public static final RegistryObject<Block> BLOC_MYSTIQUE = registerBlock("bloc_mystique",
() -> new Block(BlockBehaviour.Properties.of()
.mapColor(MapColor.COLOR_PURPLE) // Couleur sur la carte (Cartographie)
.strength(4.0f, 6.0f) // Dureté (temps de minage) et Résistance aux explosions
.sound(SoundType.AMETHYST) // Bruitages (quand on marche, pose ou casse)
.requiresCorrectToolForDrops() // Oblige l'usage d'un outil adapté (ex: pioche) pour le récupérer
));
// 3. ENREGISTREMENT D'UN BLOC LUMINEUX (Ex: Une lanterne ou un minerai actif)
public static final RegistryObject<Block> LANTERNE_MYSTIQUE = registerBlock("lanterne_mystique",
() -> new Block(BlockBehaviour.Properties.of()
.mapColor(MapColor.GOLD)
.strength(1.5f, 1.5f)
.sound(SoundType.GLASS)
.lightLevel(state -> 15) // Émet de la lumière (Maximum = 15, équivalent à de la Glowstone)
));
// 4. MÉTHODE UTILITAIRE DE SÉCURITÉ (La Magie du Modding Propre)
// Cette fonction enregistre AUTOMATIQUEMENT le bloc ET son BlockItem associé dans l'inventaire
private static <T extends Block> RegistryObject<T> registerBlock(String name, Supplier<T> block) {
// A. Enregistrement du bloc physique
RegistryObject<T> toReturn = BLOCKS.register(name, block);
// B. Enregistrement de l'item correspondant qui appelle le bloc physique
ModItems.ITEMS.register(name, () -> new BlockItem(toReturn.get(), new Item.Properties()));
return toReturn;
}
// 5. ENREGISTREMENT CENTRALISÉ AU BUS
public static void register(IEventBus eventBus) {
BLOCKS.register(eventBus);
}
}3. Activation dans la Classe Principale
Comme pour les objets, insérez l'activation de vos blocs dans le constructeur de votre classe principale TutorialMod.java:
java
// Dans le constructeur de votre classe principale TutorialMod.java :
ModBlocks.register(modEventBus);4. L'Enfer des Assets pour les Blocs (Chaîne de Rendu Tripartite)
Pour un objet, 1 modèle JSON et 1 texture suffisaient. Pour un Bloc, Minecraft exige 3 configurations JSON distinctes pour l'afficher à l'écran sans bug graphique.
Fichier 1 : Le Blockstate (L'état du bloc)
Il indique au jeu quel modèle 3D charger selon l'état du bloc (s'il est activé, orienté, etc.). Pour un bloc fixe standard, on pointe directement vers notre modèle unique.
Fichier à créer : src/main/resources/assets/tutorialmod/blockstates/bloc_mystique.json
json
{
"variants": {
"": { "model": "tutorialmod:block/bloc_mystique" }
}
}Fichier 2 : Le Modèle du Bloc (Block Model)
Il définit la géométrie du bloc dans le décor. Le parent standard est minecraft:block/cube_all, ce qui signifie que le jeu va appliquer la même image PNG sur les 6 faces du cube.
Fichier à créer : src/main/resources/assets/tutorialmod/models/block/bloc_mystique.json
json
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "tutorialmod:block/bloc_mystique"
}
}Fichier 3 : Le Modèle de l'Objet de Bloc (Item Model)
Il définit l'apparence du bloc lorsqu'il est sous forme d'icône dans votre inventaire ou qu'il flotte au sol. Au lieu de redessiner une image 2D, on dit simplement au jeu d'afficher une miniature 3D de notre modèle de bloc.
Fichier à créer : src/main/resources/assets/tutorialmod/models/item/bloc_mystique.json
json
{
"parent": "tutorialmod:block/bloc_mystique"
}Fichier 4 : La Texture PNG
Placez votre texture carrée (16x16 pixels) dans le sous-dossier dédié aux blocs:
src/main/resources/assets/tutorialmod/textures/block/bloc_mystique.png
5. Fichier de Langue (Mise à jour de fr_fr.json)
Ouvrez votre fichier de langue vu au module 3 et ajoutez-y la clé de traduction pour vos nouveaux blocs. Attention, le préfixe change : ce n'est plus item, mais block.
json
{
"item.tutorialmod.lingot_mystique": "Lingot Mystique",
"block.tutorialmod.bloc_mystique": "Bloc Mystique Brute",
"block.tutorialmod.lanterne_mystique": "Lanterne Magique Flamboyante"
}⚠️ Rappel Crucial pour le Mode Survie : Le Drop des Blocs En 1.20.1, si vous cassez votre bloc personnalisé en mode survie, il ne donnera rien (aucun drop) et disparaîtra à jamais par défaut. Pour corriger cela, le jeu utilise un système de configurations de données appelé les Loot Tables. Nous aborderons la génération automatique de ces fichiers de données dans un prochain module dédié au Datagen.