Skip to content

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 un ItemStack (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 toujours Component.translatable afin 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ètre output de type Output. C'est en appelant output.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_BLOCKSBlocs de constructionBlocs pleins, escaliers, dalles, briques, bois.
COLORED_BLOCKSBlocs de couleurLaines, bétons, verres teintés, terres cuites.
NATURALBlocs naturelsTerre, herbe, blocs de minerais bruts, feuillages, œufs.
FUNCTIONALBlocs fonctionnelsLits, torches, coffres, tables de craft, fours, enclumes.
REDSTONE_BLOCKSComposants de RedstonePoudre, répéteurs, pistons, leviers, blocs de redstone.
TOOLS_AND_UTILITIESOutils et utilitairesPioches, pelles, briquets, boussoles, seaux, potions.
COMBATCombatÉpées, haches, armures, arcs, arbalètes, boucliers.
FOOD_AND_DRINKSNourriture et boissonsPommes, viandes, soupes, ingrédients de cuisine directs.
INGREDIENTSIngrédientsLingots, charbon, diamants, plumes, colorants, restes de monstres.
SPAWN_EGGSŒufs d'apparitionTous 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 vos RegistryObject d'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 de displayItems protège votre code contre les problèmes de chargement asynchrone (NullPointerException lors du démarrage).