Appearance
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) ouAttributes.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ération | Explication mathématique | Cas d'usage type |
|---|---|---|
Operation.ADDITION | Ajoute ou soustrait directement la valeur numérique brute. | Ajouter des points d'armure (+2 armure) ou des cœurs (+8 HP). |
Operation.MULTIPLY_BASE | Prend la valeur de base et y applique un pourcentage multiplicateur. | Modifier la vitesse de course (+0.20D pour ajouter +20% de vitesse). |
Operation.MULTIPLY_TOTAL | Multiplie 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
Créez un item nommé
DagueTraqueurItem.Configurez cet objet pour qu'il accorde ses bonus exclusivement lorsqu'il est tenu dans la MAIN PRINCIPALE (
MAINHAND).Les modificateurs passifs à appliquer doivent être :
Un bonus de vitesse de déplacement de +15% (
Attributes.MOVEMENT_SPEEDavec l'opérationMULTIPLY_BASEet une valeur de0.15D).Un bonus d'armure de +3 points d'armure (
Attributes.ARMORavec l'opérationADDITIONet une valeur de3.0D).
- Générez deux UUID fixes et distincts pour ces deux modificateurs afin d'éviter tout conflit de registre.