Skip to content

L'application d'attribut d'un item

Bienvenue dans ce cours. Jusqu'à présent, pour accorder des bonus à un joueur (comme de la vitesse ou de la force), nous avons utilisé des effets de potions temporaires injectés via la nourriture ou via des actions de clic droit.

Aujourd'hui, nous allons aborder une méthode beaucoup plus propre, native et élégante : le système d'Attributs (Attributes). Nous allons apprendre à coder un objet qui modifie instantanément et passivement les statistiques du joueur (Vitesse de course, Points de vie maximaux, Armure) uniquement lorsqu'il tient l'objet en main, à l'image des outils en Netherite ou des armes personnalisées.


1. Le concept fondamental : Attributs vs Modificateurs

Pour comprendre ce système, il faut assimiler le fonctionnement mathématique interne de Minecraft:

  • L'Attribut (Attribute) : C'est la statistique brute ou la variable système d'une créature. Exemple : Attributes.MAX_HEALTH (la vie max) ou Attributes.MOVEMENT_SPEED (la vitesse).

  • Le Modificateur d'Attribut (AttributeModifier) : C'est l'altération mathématique que votre objet va brancher sur l'attribut. Il est défini par trois éléments clés : un identifiant unique (UUID), un nom descriptif, une valeur numérique, et une opération (Addition, Multiplication, etc.).

Règle d'or technique : L'obligation des UUID fixes Chaque modificateur d'attribut lié à un item doit posséder un identifiant universel unique (UUID) figé dans le code. Si vous générez un UUID aléatoire à chaque tic de jeu, Minecraft va empiler des milliers de modificateurs identiques, ce qui fera instantanément planter le jeu ou grimper les statistiques à l'infini. Nous devons utiliser un UUID fixe créé via un générateur en ligne ou défini de manière statique.


2. Les Slots d'Équipement (EquipmentSlot)

Pour éviter la triche (par exemple, recevoir des bonus simplement en laissant l'objet n'importe où dans l'inventaire général), Minecraft nous force à spécifier dans quel emplacement l'item doit se situer pour activer son pouvoir. Pour un outil ou un artefact magique classique, nous ciblons généralement:

  • EquipmentSlot.MAINHAND : Main principale uniquement.

  • EquipmentSlot.OFFHAND : Main secondaire (bouclier) uniquement.


3. Structure du Code : Implémentation de getDefaultAttributeModifiers

Pour injecter nos attributs passifs, nous devons surcharger la méthode système getDefaultAttributeModifiers(EquipmentSlot slot).

Créons un item nommé AmuletteVitaliteItem. Lorsqu'il est tenu dans la main secondaire (OFFHAND), il confère au joueur 4 cœurs supplémentaires (8.0 points de vie max) et réduit sa vitesse de déplacement de 10% (malus d'équilibre).

java
package com.monmod.items;

import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import java.util.UUID;

public class AmuletteVitaliteItem extends Item {
    // 1. Déclaration des UUID uniques et fixes pour nos modificateurs
    private static final UUID HP_MODIFIER_UUID = UUID.fromString("a1b2c3d4-e5f6-7a8b-9c8d-e9f0a1b2c3d4");
    private static final UUID SPEED_MODIFIER_UUID = UUID.fromString("f9e8d7c6-b5a4-3f2e-1d0c-9b8a7f6e5d4c");
    
    // 2. Stockage des modificateurs
    private final Multimap<Attribute, AttributeModifier> defaultModifiers;

    public AmuletteVitaliteItem(Properties properties) {
        super(properties);
        
        // 3. Construction de la map des modificateurs de statistiques
        ImmutableMultimap.Builder<Attribute, AttributeModifier> builder = ImmutableMultimap.builder();
        
        // Ajout de +8.0 HP (4 cœurs). Operation.ADDITION signifie qu'on additionne directement
        builder.put(Attributes.MAX_HEALTH, new AttributeModifier(HP_MODIFIER_UUID, "Amulet HP", 8.0D, AttributeModifier.Operation.ADDITION));
        
        // Retrait de 10% de vitesse. MULTIPLY_BASE multiplie la valeur de base du joueur
        builder.put(Attributes.MOVEMENT_SPEED, new AttributeModifier(SPEED_MODIFIER_UUID, "Amulet Speed Malus", -0.10D, AttributeModifier.Operation.MULTIPLY_BASE));
        
        this.defaultModifiers = builder.build();
    }

    @Override
    public Multimap<Attribute, AttributeModifier> getDefaultAttributeModifiers(EquipmentSlot slot) {
        // 4. Restriction technique : Les attributs ne s'activent QUE dans la main secondaire
        if (slot == EquipmentSlot.OFFHAND) {
            return this.defaultModifiers;
        }
        // Si l'item est ailleurs (main principale, inventaire), on renvoie les modificateurs par défaut
        return super.getDefaultAttributeModifiers(slot);
    }
}

[Note : Les parties manquantes ou tronquées du code source original ont été complétées pour assurer la validité syntaxique de la structure de l'item].

Le Piège de la Vie Maximale (Désynchronisation visuelle) Lorsque vous augmentez la vie maximale d'un joueur via un attribut, Minecraft ajoute instantanément des "cœurs vides" grisés sur l'interface du joueur. C'est tout à fait normal ! L'attribut augmente la capacité maximale, mais ne soigne pas automatiquement le joueur. Pour remplir ces nouveaux cœurs, le joueur devra manger ou recevoir un effet de régénération.


4. Les différentes Opérations Mathématiques

Lors de la création d'un AttributeModifier, le dernier paramètre détermine le comportement du calcul:

Type d'OpérationExplication mathématiqueCas d'usage type
Operation.ADDITIONAjoute ou soustrait directement la valeur numérique brute.Ajouter des points d'armure (+2 armure) ou des cœurs (+8 HP).
Operation.MULTIPLY_BASEPrend la valeur de base et y applique un pourcentage multiplicateur.Modifier la vitesse de course (+0.20D pour ajouter +20% de vitesse).
Operation.MULTIPLY_TOTALMultiplie la valeur finale après que toutes les autres additions ont eu lieu.Créer des modificateurs de fin de calcul très puissants (ex : doubler la statistique globale).

Exercice Pratique Obligatoire

Appliquez ces notions complexes pour réaliser l'exercice suivant:

Objectif : La Dague du Traqueur Léger

  1. Créez un item nommé DagueTraqueurItem.

  2. Configurez cet objet pour qu'il accorde ses bonus exclusivement lorsqu'il est tenu dans la MAIN PRINCIPALE (MAINHAND).

  3. Les modificateurs passifs à appliquer doivent être :

  • Un bonus de vitesse de déplacement de +15% (Attributes.MOVEMENT_SPEED avec l'opération MULTIPLY_BASE et une valeur de 0.15D).

  • Un bonus d'armure de +3 points d'armure (Attributes.ARMOR avec l'opération ADDITION et une valeur de 3.0D).

  1. Générez deux UUID fixes et distincts pour ces deux modificateurs afin d'éviter tout conflit de registre.