Skip to content

ModItems


1. L'enregistrement dans ModItems

Les Propriétés Spécifiques de la Classe Item.Properties

Dans Minecraft, la configuration de base de tout objet se fait par l'intermédiaire de l'instanciation de la classe interne Item.Properties. Elle permet de définir le comportement fondamental de l'objet dans le jeu par chaînage de méthodes.

java
package com.votreNomDeMod.votredomaine.item;

import com.votreNomDeMod.votredomaine.VotreClassePrincipaleDuMod;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ArmorMaterials;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Rarity;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

public class ModItems {
    // 1. Création du registre pour les Items
    public static final DeferredRegister<Item> ITEMS = 
            DeferredRegister.create(ForgeRegistries.ITEMS, VotreClassePrincipaleDuMod.MOD_ID);

    // ==========================================
    // EXEMPLES D'ITEMS GÉNÉRAUX
    // ==========================================

    // Un item simple empilable par 64
    public static final RegistryObject<Item> RESSOURCE_SIMPLE = ITEMS.register("ressource_simple",
            () -> new Item(new Item.Properties()));

    // Un artefact rare, non réparable et résistant au feu/lave
    public static final RegistryObject<Item> ARTEFACT_MAGIQUE = ITEMS.register("artefact_magique",
            () -> new Item(new Item.Properties()
                    .stacksTo(1) 
                    .rarity(Rarity.EPIC) 
                    .fireResistant() 
                    .setNoRepair() 
            ));

    // 2. Méthode d'initialisation à appeler dans le constructeur de votre classe principale
    public static void register(IEventBus eventBus) {
        ITEMS.register(eventBus);
    }
}

Liste exhaustive des méthodes de configuration que l'on met dans les propriétés (Forge 1.20.1)

  • stacksTo(int maxStackSize) : Définit la taille maximale de la pile dans l'inventaire (ex: 64 pour les blocs, 16 pour les perles de l'Ender, 1 pour les outils).
  • durability(int maxDamage) (ou defaultDurability) : Attribue une durabilité maximale à l'objet. Dès qu'un dommage est subi, l'item s'use jusqu'à sa destruction.
  • setNoRepair() : Empêche purement et simplement l'objet d'être réparé dans une enclume ou une meule (Grindstone), que ce soit en y combinant un autre item du même type ou son matériau d'origine.
  • craftRemainder(Item item) : Définit un "résidu de fabrication". Lorsqu'un joueur utilise cet objet dans une grille de craft, cet objet ne disparaît pas complètement mais se transforme en l'item spécifié (ex: un seau de lait laisse un seau vide).
  • rarity(Rarity rarity) : Change la couleur du nom de l'objet à l'écran (COMMON en blanc, UNCOMMON en jaune, RARE en aqua, EPIC en violet).
  • food(FoodProperties foodProperties) : Associe des propriétés de nourriture à l'objet, lui permettant d'être consommé par le joueur ou des entités selon la configuration du Builder.
  • fireResistant() : Rend l'objet totalement immunisé au feu et à la lave lorsqu'il est lâché au sol (mécanique identique aux objets en Netherite). L'objet flottera sur la lave au lieu de brûler.
  • requiredFeatures(FeatureFlag... flags) : Lie l'objet à un Feature Flag spécifique du moteur de Minecraft (comme les fonctionnalités expérimentales). L'objet n'existera au sein du jeu que si ce flag est explicitement activé lors de la création du monde.

💡 **Focus Pédagogique — setNoRepair()** Cette méthode est particulièrement recommandée pour la conception d'objets magiques, d'artefacts uniques obtenus sur des Boss, ou d'items événementiels exclusifs que le joueur doit consommer avec parcimonie sans pouvoir restaurer leur intégrité.


2. L'enregistrement de nourriture

Pour faire d'un objet un aliment consommable, on lui passe une instance de FoodProperties générée à l'aide d'un patron de conception de type Builder.

java
// Un super aliment qui donne Régénération, se mange vite, et plaît aux loups
public static final RegistryObject<Item> SUPER_POMME = ITEMS.register("super_pomme",
        () -> new Item.Properties().food(new FoodProperties.Builder()
                .nutrition(4)                                    // Restaure 2 gigots
                .saturationMod(0.3F)                             // Ratio de saturation
                .alwaysEat()                                     // Peut être mangé même si rassasié
                .meat()                                          // Considéré comme de la viande (loups)
                .fast()                                          // Vitesse de consommation doublée
                .effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 100, 0), 1.0F) // Effet garanti
                .build()
        ));

Détail des paramètres et formules sous-jacentes

  • nutrition(int value) : Détermine le nombre de points de faim restaurés. Chaque unité correspond à un demi-gigot (la valeur 4 restaure donc visuellement 2 gigots complets).
  • saturationMod(float value) : Multiplicateur de saturation. Il régit le temps pendant lequel le joueur restera rassasié avant que sa barre de faim ne baisse de nouveau.

La formule interne et cachée du jeu pour calculer la valeur de saturation ajoutée est : Saturation = Nutrition x SaturationMod x 2

  • alwaysEat() : Force l'action de manger. Par défaut, un joueur ne peut consommer d'aliment si sa jauge de faim est pleine. Activer cette option permet de passer outre (ex: Pomme dorée, Chorus fruit).
  • meat() : Marque l'item comme étant de la viande. Cela permet l'interaction native avec les loups (chiens) apprivoisés pour les nourrir, les soigner ou déclencher la reproduction.
  • fast() : Divise par deux le temps de l'action de consommation. L'animation système passe de 32 ticks standards à seulement 16 ticks (soit 0,8 seconde, comme le varech séché).
  • effect(Supplier<MobEffectInstance> effect, float probability) : Applique un effet de potion (ex: MobEffects.POISON, MobEffects.MOVEMENT_SPEED). Le second argument représente la probabilité d'application comprise entre 0.0F (0%) et 1.0F (100%). Les appels peuvent être chaînés pour cumuler plusieurs effets distincts sur un unique aliment.
  • build() : Permet de finir la configuration de la nourriture et donc de dire les propriétés de la nourriture sont terminées.

⚠️ Cas particulier — Soupes et Boissons Si l'item doit laisser un contenant résiduel dans la main du joueur (comme un bol vide après une soupe ou une fiole en verre après une potion), cela ne se gère pas via les FoodProperties. Il est impératif de créer une classe personnalisée héritant de Item et de surplanter (@Override) les méthodes logiques d'utilisation telles que finishUsingItem.


3. Architecture des Classes d'Armes et d'Outils

Pour concevoir un objet orienté combat ou récolte, l'utilisation exclusive d'Item.Properties est insuffisante. Il convient d'hériter des classes spécialisées du moteur. Minecraft organise ses outils autour de la super-classe commune DiggerItem.

Arbre hiérarchique des classes de base de Minecraft

  • Item
  • TieredItem (Possède un niveau de matériau / Tier)
  • SwordItem (Gestion de l'épée)
  • DiggerItem (Outils de destruction / récolte de blocs)
  • PickaxeItem (La pioche)
  • AxeItem (La hache)
  • ShovelItem (La pelle)
  • HoeItem (La houe)

Signatures exactes des constructeurs

java
new SwordItem(Tier tier, int attackDamageModifier, float attackSpeedModifier, Item.Properties properties)
new PickaxeItem(Tier tier, int attackDamageModifier, float attackSpeedModifier, Item.Properties properties)
new AxeItem(Tier tier, float attackDamageModifier, float attackSpeedModifier, Item.Properties properties)
new ShovelItem(Tier tier, float attackDamageModifier, float attackSpeedModifier, Item.Properties properties)
new HoeItem(Tier tier, int attackDamageModifier, float attackSpeedModifier, Item.Properties properties)

🛑 Alerte Compilation & Typage Notez attentivement la subtilité introduite par Mojang : le paramètre attackDamageModifier attend un type entier (int) pour l'Épée, la Pioche et la Houe, tandis qu'il exige un nombre à virgule flottante (float, ex: 1.5F) pour la Hache et la Pelle !

Détail des 4 paramètres requis

  1. Tier (Le niveau de l'outil) : Objet encapsulant les statistiques matérielles communes (vitesse de minage, durabilité globale, niveau d'extraction requis). Vous pouvez exploiter les types de base (Tiers.IRON, Tiers.DIAMOND, Tiers.NETHERITE) ou injecter votre propre instance personnalisée.
  2. attackDamageModifier : Modificateur de dégâts numériques qui vient s'ajouter algébriquement à la valeur de dégâts native définie par le Tier choisi. Exemple : Si le Tier de base inflige 2 points de dégâts et que la valeur renseignée est 3, l'arme infligera un total combiné de 5 points de dégâts.
  3. attackSpeedModifier : Valeur flottante négative modifiant la vitesse d'attaque par défaut du joueur (qui s'élève à 4.0 par défaut).
  • Pour une épée standard : valeur classique de -2.4F (vitesse en jeu : 4.0 - 2.4 = 1.6).
  • Pour une hache standard (plus lourde) : valeur habituelle de -3.0F ou -3.1F.
  1. properties : Injection de l'instance Item.Properties étudiée plus haut afin d'assigner une rareté ou une résistance aux flammes.
  • Attention : Ne définissez pas la durabilité via durability() ici, celle-ci étant prioritairement héritée du paramètre Tier.

Exemple d'enregistrement d'une Épée dans le Registre Forge

java
public static final RegistryObject<Item> MON_EPEE = ITEMS.register("mon_epee",
    () -> new SwordItem(Tiers.DIAMOND, 3, -2.4F, new Item.Properties().rarity(Rarity.RARE))
);

4. Classes Spéciales d'Armes à Distance

Il existe d'autres armes natives ne dépendant pas du système de calcul par Tier classique.

ClasseUsage principalSpécificités techniques
TridentItemLe TridentArme hybride gérant nativement le combat rapproché, le lancer à distance, ainsi que les animations et enchantements associés (Impulsion/Riptide, Loyauté/Loyalty).
BowItemL'ArcGère la mise sous tension de la corde, la détection et consommation des flèches adéquates dans l'inventaire, ainsi que la trajectoire des projectiles.
CrossbowItemL'ArbalèteGère le chargement persistant de l'arme, le tir multiple et l'utilisation de fusées de feux d'artifice comme munitions.
java
new TridentItem(Item.Properties properties)
new BowItem(Item.Properties properties)
new CrossbowItem(Item.Properties properties)

Note sur le Trident : Ses dégâts et sa durabilité sont fixés directement en dur dans la classe native. Pour les altérer, il convient d'utiliser des modificateurs d'attributs via la méthode attributes().


5. Autres Classes Spéciales d'Items (Hors Armes)

Pour assurer l'exhaustivité de la base de connaissances, voici les structures d'items possédant des constructeurs et cycles de vie propres :

BlockItem

Associe directement un objet à un bloc de l'environnement, permettant l'action de placement au sol par le joueur.

java
new BlockItem(Block block, Item.Properties properties)

ArmorItem

Gère l'attribution et les textures des pièces d'équipement de protection.

java
new ArmorItem(ArmorMaterial material, ArmorItem.Type type, Item.Properties properties)

📌 Le paramètre Type accepte exclusivement : Type.HELMET, Type.CHESTPLATE, Type.LEGGINGS, ou Type.BOOTS.

FuelItem / Gestion des combustibles (Spécificité Forge)

Pour enregistrer un item agissant comme combustible dans un four, l'approche standard sous Forge 1.20.1 consiste à instancier une classe personnalisée étendant Item, puis à y surplanter la méthode suivante afin de retourner la durée de combustion mesurée en ticks :

java
@Override
public int getBurnTime(ItemStack itemStack, @Nullable RecipeType<?> recipeType) {
    return 1600; // Exemple : 1600 ticks = 80 secondes (durée d'un charbon)
}