Appearance
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 (COMMONen blanc,UNCOMMONen jaune,RAREen aqua,EPICen 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 entre0.0F(0%) et1.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 deItemet de surplanter (@Override) les méthodes logiques d'utilisation telles quefinishUsingItem.
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
ItemTieredItem(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
attackDamageModifierattend 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
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.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.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.0Fou-3.1F.
properties: Injection de l'instanceItem.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.
| Classe | Usage principal | Spécificités techniques |
|---|---|---|
TridentItem | Le Trident | Arme hybride gérant nativement le combat rapproché, le lancer à distance, ainsi que les animations et enchantements associés (Impulsion/Riptide, Loyauté/Loyalty). |
BowItem | L'Arc | Gè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. |
CrossbowItem | L'Arbalète | Gè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
Typeaccepte exclusivement :Type.HELMET,Type.CHESTPLATE,Type.LEGGINGS, ouType.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)
}