Appearance
Fiches de Cours Professionnelles : Modding Minecraft
GESTION ET ENREGISTREMENT DES ONGLETS CRÉATIFS FORGE 1.20.1
1. Le Nouveau Paradigme des Onglets Créatifs (Post-1.19.3)
Depuis les récentes mises à jour de Minecraft, l'attribution d'un onglet créatif à un objet ne se fait plus du tout au moment de l'instanciation de l'item. La méthode historique .tab(CreativeModeTab.TAB_MISC) dans Item.Properties a été purement et simplement supprimée.
Désormais, les onglets créatifs sont traités comme des registres autonomes indépendants. Ce ne sont plus les objets qui déclarent leur onglet, ce sont les onglets qui agissent comme des conteneurs et acceptent une liste d'objets, ou le moddeur qui injecte ses objets dans les onglets Vanilla de base par le biais d'un événement dédié.
2. Enregistrement d'un Onglet Créatif Personnalisé (Custom Tab)
Pour créer un onglet propre à votre mod contenant tous vos blocs et vos objets, vous devez déclarer un DeferredRegister basé sur la clé système Registries.CREATIVE_MODE_TAB.
Structure de code standard :
java
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TABS =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MonMod.MODID);
public static final RegistryObject<CreativeModeTab> MON_ONGLET =
CREATIVE_MODE_TABS.register("mon_onglet", () -> CreativeModeTab.builder()
.icon(() -> new ItemStack(ModItems.MON_ITEM.get())) // L'icône affichée de l'onglet
.title(Component.translatable("creativetab.mon_onglet")) // Clé de traduction (Lang)
.displayItems((parameters, output) -> {
output.accept(ModItems.MON_ITEM.get()); // Ajout d'un item custom
output.accept(ModBlocks.MON_BLOC.get()); // Ajout d'un bloc custom
output.accept(Items.DIAMOND); // Il est possible d'ajouter des items Vanilla
})
.build()
);Détail des méthodes du Builder :
icon(Supplier<ItemStack> icon): Spécifie l'objet qui servira d'icône visuelle sur l'onglet en haut de l'interface graphique. Cela requiert unItemStack(vous pouvez y appliquer des NBT si l'icône doit être enchantée ou colorée).title(Component title): Gère le nom affiché de l'onglet lors du survol de la souris. Utilisez toujoursComponent.translatableafin de renseigner proprement les fichiers de langues (fr_fr.json,en_us.json).displayItems(DisplayItemsGenerator generator): L'élément central. C'est une fonction lambda qui expose un paramètreoutputde typeOutput. C'est en appelantoutput.accept(ItemLike)que vous déterminez précisément quels objets apparaissent dans l'onglet, ainsi que leur ordre d'affichage exact de haut en bas.
Note d'organisation : L'ordre dans lequel vous écrivez les lignes
output.accept(...)est scrupuleusement respecté par le jeu. Mettez toujours les blocs complets en premier, puis les dalles/escaliers dérivés, et enfin les outils et composants de craft.
3. Injection d'Objets dans les Onglets Vanilla de Minecraft
Si votre mod ajoute par exemple une nouvelle épée ou un nouvel aliment, il est de coutume, en plus ou à la place d'un onglet custom, de placer ces objets directement dans les onglets natifs de Minecraft (Combat, Nourriture, etc.) pour simplifier l'expérience utilisateur.
Cela s'effectue sur le Bus d'événements du Mod (Mod Event Bus) via l'événement BuildCreativeModeTabContentsEvent.
Exemple d'implémentation dans la classe principale du Mod :
java
@Mod(MonMod.MODID)
public class MonMod {
public static final String MODID = "monmod";
public MonMod() {
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
// Enregistrement de l'écouteur d'événement pour les onglets créatifs
modEventBus.addListener(this::addCreativeContents);
}
private void addCreativeContents(BuildCreativeModeTabContentsEvent event) {
// 1. Vérification de l'onglet cible ici l'onglet COMBAT de Minecraft
if (event.getTabKey() == CreativeModeTabs.COMBAT) {
// 2. Injection de notre arme personnalisée
event.accept(ModItems.MON_EPEE.get());
}
// 3. Exemple alternatif : injecter dans l'onglet des INGRÉDIENTS
if (event.getTabKey() == CreativeModeTabs.INGREDIENTS) {
event.accept(ModItems.MON_LINGOT.get());
}
}
}4. Liste des Clés d'Onglets Vanilla Majeurs (Creative Mode Tabs)
Voici le tableau des correspondances exactes des clés d'onglets fournies par la classe native CreativeModeTabs à utiliser pour vos filtres event.getTabKey():
Clé de Registre (CreativeModeTabs.*) | Nom de l'onglet en jeu (FR) | Usage standard attendu |
|---|---|---|
BUILDING_BLOCKS | Blocs de construction | Blocs pleins, escaliers, dalles, briques, bois. |
COLORED_BLOCKS | Blocs de couleur | Laines, bétons, verres teintés, terres cuites. |
NATURAL | Blocs naturels | Terre, herbe, blocs de minerais bruts, feuillages, œufs. |
FUNCTIONAL | Blocs fonctionnels | Lits, torches, coffres, tables de craft, fours, enclumes. |
REDSTONE_BLOCKS | Composants de Redstone | Poudre, répéteurs, pistons, leviers, blocs de redstone. |
TOOLS_AND_UTILITIES | Outils et utilitaires | Pioches, pelles, briquets, boussoles, seaux, potions. |
COMBAT | Combat | Épées, haches, armures, arcs, arbalètes, boucliers. |
FOOD_AND_DRINKS | Nourriture et boissons | Pommes, viandes, soupes, ingrédients de cuisine directs. |
INGREDIENTS | Ingrédients | Lingots, charbon, diamants, plumes, colorants, restes de monstres. |
SPAWN_EGGS | Œufs d'apparition | Tous les œufs d'apparition de créatures. |
⚠️ Erreur fréquente de cycle de vie (Crash de compilation) : Ne faites jamais d'appels directs à
.get()sur vosRegistryObjectd'items à l'intérieur de l'initialisation du builder de l'onglet si celui-ci est exécuté trop tôt. L'utilisation des expressions lambdas() -> new ItemStack(...)et du paramètre dynamique dedisplayItemsprotège votre code contre les problèmes de chargement asynchrone (NullPointerExceptionlors du démarrage).