Skip to content

Création d'outils et de matériaux

Après avoir étudié l'architecture du fichier ModItems au module précédent, nous revenons à la personnalisation avancée des mécaniques de gameplay. Ce module détaille de manière rigoureuse comment concevoir un ensemble complet d'outils de survie (Pioche, Hache, Épée, Pelle et Houe) articulés autour d'un matériau unique, personnalisé et correctement ordonnancé.


1. L'Architecture des Outils de Minecraft en 1.20.1

Dans l'écosystème de Minecraft, un outil n'est pas un objet unique aux propriétés isolées. Son comportement interne est segmenté par deux composants fondamentaux du moteur de jeu:

  • La Classe de l'Outil (ex: PickaxeItem, SwordItem) : Elle définit le comportement applicatif de l'objet (si l'objet est apte à briser la pierre, à infliger de lourds dégâts d'attaque ou à interagir sur la terre pour la labourer).

  • Le Matériau (Tier) : C'est une interface technique qui rassemble l'intégralité des statistiques fondamentales de la gamme (durabilité globale, rapidité intrinsèque d'extraction, dégâts physiques additionnels, enchanterabilité naturelle et l'item de réparation requis à l'enclume).


2. Étape 1: Définition du Matériau Personnalisé

Pour enregistrer une nouvelle gradation de matériaux d'outils, nous devons implémenter l'interface Tier de Minecraft. Pour simplifier ce processus sans implémenter manuellement chaque getter, Forge propose une structure utilitaire nommée ForgeTier couplée au registre ordonné des matériaux.

Nous allons concevoir ici les caractéristiques d'un alliage de milieu/fin de jeu baptisé "Mystique", positionné stratégiquement entre le Fer et le Diamant.

Fichier : src/main/java/net/pseudo/tutorialmod/util/ModTiers.java

java
package net.pseudo.tutorialmod.util;

import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Tier;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraftforge.common.ForgeTier;
import net.minecraftforge.common.TierSortingRegistry;
import net.pseudo.tutorialmod.TutorialMod;
import net.pseudo.tutorialmod.init.ModItems;
import java.util.List;

public class ModTiers {
    public static final Tier MYSTIQUE = new ForgeTier(
        TierSortingRegistry.registerTier(
            2,       // 1. Niveau de récolte (0: Bois/Or, 1: Pierre, 2: Fer, 3: Diamant, 4: Netherite)
            750,     // 2. Durabilité maximale (Nombre d'utilisations avant destruction complète)
            6.5f,    // 3. Vitesse de minage (Multiplicateur d'efficacité face aux blocs cassables)
            2.5f,    // 4. Dégâts d'attaque de base (Valeur ajoutée aux dégâts propres de chaque type d'outil)
            18,      // 5. Enchanterabilité (Probabilité d'obtenir des enchantements de haut niveau)
            null,    // 6. Tag de blocs requis (Laisser null, géré dynamiquement par le registre de tri)
            () -> Ingredient.of(ModItems.LINGOT_MYSTIQUE.get()) // 7. Ingrédient utilisé pour réparer l'outil à l'enclume
        ),
        new ResourceLocation(TutorialMod.MOD_ID, "mystique"), // Identifiant unique du Tier
        List.of(net.minecraft.world.item.Tiers.IRON),         // Liste des Tiers inférieurs (notre outil extrait le Fer)
        List.of(net.minecraft.world.item.Tiers.DIAMOND)       // Liste des Tiers supérieurs (notre outil est inférieur au Diamant)
    );
}

Précision technique sur le TierSortingRegistry : Les versions modernes de Forge s'appuient obligatoirement sur le TierSortingRegistry. Au lieu d'utiliser une simple énumération figée, cette table trie et intercale les matériaux les uns par rapport aux autres dynamiquement au chargement du jeu. Cela assure une compatibilité parfaite si d'autres mods tiers ajoutent des minerais requérant un niveau précis entre le Fer et le Diamant.


3. Étape 2: L'Enregistrement des Outils via DeferredRegister

Une fois notre matériau défini, nous pouvons l'injecter au sein des instances spécifiques d'outils. Chaque outil possède des modificateurs de dégâts et de vitesse d'attaque qui lui sont propres.

Fichier : src/main/java/net/pseudo/tutorialmod/init/ModItems.java (Extrait enrichi)

java
package net.pseudo.tutorialmod.init;

import net.minecraft.world.item.*;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import net.pseudo.tutorialmod.TutorialMod;
import net.pseudo.tutorialmod.util.ModTiers;

public class ModItems {
    public static final DeferredRegister<Item> ITEMS = 
        DeferredRegister.create(ForgeRegistries.ITEMS, TutorialMod.MOD_ID);

    // Élément de base requis pour la réparation
    public static final RegistryObject<Item> LINGOT_MYSTIQUE = ITEMS.register("lingot_mystique",
        () -> new Item(new Item.Properties()));

    // 1. L'ÉPÉE (Dégâts importants, vitesse de rechargement moyenne)
    public static final RegistryObject<SwordItem> EPEE_MYSTIQUE = ITEMS.register("epee_mystique",
        () -> new SwordItem(ModTiers.MYSTIQUE, 3, -2.4f, new Item.Properties()));

    // 2. LA PIOCHE (Dégâts modérés, vitesse de rechargement lente)
    public static final RegistryObject<PickaxeItem> PIOCHE_MYSTIQUE = ITEMS.register("pioche_mystique",
        () -> new PickaxeItem(ModTiers.MYSTIQUE, 1, -2.8f, new Item.Properties()));

    // 3. LA HACHE (Dégâts critiques destructeurs, attaque extrêmement lente)
    public static final RegistryObject<AxeItem> HACHE_MYSTIQUE = ITEMS.register("hache_mystique",
        () -> new AxeItem(ModTiers.MYSTIQUE, 5.0f, 3.0f, new Item.Properties()));

    // 4. LA PELLE (Dégâts mineurs, vitesse de rechargement lente)
    public static final RegistryObject<ShovelItem> PELLE_MYSTIQUE = ITEMS.register("pelle_mystique",
        () -> new ShovelItem(ModTiers.MYSTIQUE, 1.5f, 3.0f, new Item.Properties()));

    // 5. LA HOUE (Dégâts quasi-nuls, vitesse de rechargement très rapide)
    public static final RegistryObject<HoeItem> HOUE_MYSTIQUE = ITEMS.register("houe_mystique",
        () -> new HoeItem(ModTiers.MYSTIQUE, 1, 1.0f, new Item.Properties()));

    public static void register(IEventBus eventBus) {
        ITEMS.register(eventBus);
    }
}

Attention au calcul mathématique des Dégâts Réels : Les dégâts totaux d'une arme affichés dans l'infobulle en jeu répondent à l'équation exacte suivante:

📊 Formule des Dégâts Globaux : Dégâts globaux = Dégâts de base du Tier + Dégâts de l'outil + 1.0 (Dégâts innés des poings du joueur)

⚔️ Application pour notre Épée Mystique : 2.5 (Tier) + 3.0 (Épée) + 1.0 = 6.5 Unités de dégâts (soit 3 cœurs et demi).


4. Étape 3: Fichiers JSON de Modèles d'Objets (Outils 2D)

Comme pour les objets traditionnels, chaque outil doit comporter une déclaration de modèle pour lier son apparence en main au rendu 2D plat de Minecraft. Ces fichiers héritent tous du parent générique item/generated.

Fichier : src/main/resources/assets/tutorialmod/models/item/pioche_mystique.json

json
{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "tutorialmod:item/pioche_mystique"
  }
}

Note : Vous devez dupliquer rigoureusement cette arborescence et ce format JSON pour epee_mystique.json, hache_mystique.json, pelle_mystique.json et houe_mystique.json en ajustant logiquement le chemin de l'identifiant texture de la couche layer0.

Emplacement des textures graphiques :

Vos visuels au format PNG (dimensions standards 16x16 ou 32x32 pixels, sur fond transparent) doivent être déposés précisément dans le répertoire suivant: src/main/resources/assets/tutorialmod/textures/item/


5. Étape 4: Fichier de Langue et Traduction utilisateur

Afin de nommer convenablement vos équipements pour le joueur final, mettez à jour votre fichier de localisation linguistique localisé dans les dossiers d'assets du projet.

Fichier : src/main/resources/assets/tutorialmod/lang/fr_fr.json

json
{
  "item.tutorialmod.lingot_mystique": "Lingot Mystique",
  "item.tutorialmod.epee_mystique": "Épée Mystique",
  "item.tutorialmod.pioche_mystique": "Pioche Mystique",
  "item.tutorialmod.hache_mystique": "Hache Mystique",
  "item.tutorialmod.pelle_mystique": "Pelle Mystique",
  "item.tutorialmod.houe_mystique": "Houe Mystique"
}

6. Le Piège Crucial à Éviter: La Configuration des Tags de Blocs

Si vous testez vos outils dans cette configuration exacte, vos pioches et haches seront fonctionnelles mais elles se comporteront anormalement face à certains matériaux avancés (comme l'Obsidienne ou les Minerais de Diamant) en extrayant le bloc à une vitesse lente, sans rien drop.

C'est parce que Minecraft 1.20.1 orchestre la vitesse d'extraction et les autorisations via son système natif de Tags JSON. Pour qu'un outil soit considéré comme efficace, il doit être inclus dans deux familles distinctes de fichiers de configuration de tags (fichiers qui seront générés par le système automatisé de Data Generation dans le Module 8):

  • Le type d'outil : Votre pioche doit être rattachée au tag de Minecraft #minecraft:mineable/pickaxe pour miner instantanément la pierre.

  • Le niveau d'extraction : Votre pioche possédant un niveau de récolte égal à 2 (équivalent Fer) doit être intégrée dans le tag officiel de Minecraft #minecraft:needs_iron_tool afin d'autoriser le drop d'items précieux.