Skip to content

La charge d'un item


Aujourd'hui, nous allons aborder une mécanique fondamentale de Minecraft : la canalisation (ou "charging time"). C'est le comportement typique de l'Arc, du Trident ou du Bouclier. Nous allons apprendre à forcer le joueur à maintenir le bouton de clic droit enfoncé pour "charger" son objet, à lui attribuer une animation système adaptée, et à manipuler le temps à l'aide de l'unité de mesure interne de Minecraft : le Tick.


1. Le Concept Fondamental de la Canalisation

Pour qu'un objet puisse être chargé ou canalisé, Minecraft doit être informé de deux éléments essentiels:

  • La posture visuelle (L'animation) : Est-ce que le joueur lève son objet comme un bouclier ? Est-ce qu'il l'arme comme un arc ? Est-ce qu'il l'approche de sa bouche?

  • La durée maximale d'utilisation : Pendant combien de temps (au maximum) l'action de charge peut-elle durer si le joueur ne relâche jamais le bouton?

Concept Clé — Le Tick de Minecraft : Dans Minecraft, le temps ne se compte pas en millisecondes dans le code de logique, mais en Ticks. Le moteur de jeu s'actualise exactement 20 fois par seconde.

Par conséquent :

1 seconde = 20 Ticks

Si vous voulez qu'une action de charge maximale dure 3 secondes, votre code devra spécifier une durée de 3 x 20 = 60 Ticks


2. Déclenchement de la Charge ('use')

Pour lancer le processus de canalisation, tout commence comme au Cours 10 dans la méthode use. Cependant, au lieu de simplement exécuter une action et s'arrêter, nous allons demander à Minecraft de lier le joueur à cet objet pour entamer une action continue.

On utilise pour cela la méthode InteractionResultHolder.consume(itemstack) après avoir appelé player.startUsingItem(hand). C'est cet appel système qui va dire au moteur : "Attention, le joueur commence à charger cet objet !".


3. Surcharge des Méthodes de Structure

Pour que le système fonctionne, il faut impérativement surcharger deux méthodes de la classe Item dans notre classe personnalisée:

A. getUseAnimation(ItemStack stack)

Cette méthode indique au moteur graphique quelle posture le modèle 3D du joueur doit adopter. Elle retourne une énumération de type UseAnim. Voici les principales valeurs disponibles en 1.20.1:

Valeur de UseAnimEffet Visuel en Jeu
UseAnim.BOWLe joueur tend ses bras vers l'avant, comme s'il bandait un arc.
UseAnim.BLOCKLe joueur ramène l'objet devant lui pour parer, comme un bouclier.
UseAnim.SPEARLe joueur lève l'objet au-dessus de son épaule, prêt à le lancer (Trident).
UseAnim.EAT / UseAnim.DRINKL'objet monte et descend devant la bouche avec des particules.

B. getUseDuration(ItemStack stack)

Cette méthode doit renvoyer un entier (int) représentant la durée maximale de l'action en Ticks. Pour les objets magiques ou de charge, on utilise généralement une valeur très élevée (par exemple 72000, ce qui équivaut à 1 heure en jeu) afin de s'assurer que le joueur puisse maintenir la charge aussi longtemps qu'il le souhaite sans être interrompu automatiquement par le jeu.

Alerte de débutant : Si vous oubliez de surcharger getUseDuration ou si vous retournez 0, l'animation de charge s'arrêtera instantanément après un millième de seconde, et votre objet refusera de canaliser!


4. Implémentation : La Classe BatonMagiqueItem

Voici le code complet et commenté pas à pas d'un bâton magique qui utilise la canalisation avec une posture d'arc:

java
package com.monmod.item;

import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.UseAnim;
import net.minecraft.world.level.Level;

public class BatonMagiqueItem extends Item {
    
    public BatonMagiqueItem(Properties properties) {
        super(properties);
    }
    
    @Override
    public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
        ItemStack itemstack = player.getItemInHand(hand);
        
        // 1. On informe le système que le joueur commence à utiliser/charger l'objet
        player.startUsingItem(hand);
        
        // 2. On consomme l'action pour bloquer l'affichage de la main et activer le mécanisme continuel
        return InteractionResultHolder.consume(itemstack);
    }
    
    @Override
    public int getUseDuration(ItemStack stack) {
        // On donne une durée arbitrairement longue (72000 ticks = 1 heure)
        // Cela permet au joueur de maintenir le clic droit enfoncé sans coupure automatique
        return 72000;
    }
    
    @Override
    public UseAnim getUseAnimation(ItemStack stack) {
        // On applique l'animation de l'arc (le joueur lève les bras pour canaliser son sort)
        return UseAnim.BOW;
    }
}

5. Qu'est-ce qu'il se passe ensuite ? (Transition vers le Cours 13)

Pour l'instant, notre bâton s'anime parfaitement en jeu lorsque vous faites un clic droit maintenu : le joueur prend la posture de l'arc. Cependant, si vous relâchez le clic droit, il ne se passe rien ! C'est tout à fait normal.

La classe Item possède une troisième méthode cruciale nommée releaseUsing. C'est elle qui intercepte le moment exact où le joueur lâche le bouton de la souris. Elle reçoit en paramètre le temps restant de la charge. C'est grâce à elle (que nous étudierons en détail au Cours 13) que nous pourrons calculer la puissance accumulée.


EXERCICE PRATIQUE DU COURS

Objectif : Le Bouclier d'Énergie Condensée

Créez un item nommé BouclierEnergieItem. Vous devez configurer cet objet pour qu'il respecte les contraintes suivantes:

  1. Il doit utiliser l'architecture déportée apprise au Cours 1.

  2. Lors du clic droit, il doit forcer le joueur à entrer en état de charge (utilisation).

  3. L'animation visuelle en jeu doit être celle d'une parade au bouclier (trouvez la bonne valeur dans le tableau du point 3).

  4. Sa durée maximale d'utilisation continue doit être fixée à exactement 30 secondes (Faites le calcul en Ticks !).