Utilisation Basique des Items

Les Items sont représentés à travers un ItemStack. Un ItemStack est un item d’inventaire avec des informations comme le nombre d’items dans le stack, le type de l’item, et des données additionnelles comme la durabilité. Un Item est la représentation graphique d’un ItemStack en tant qu’entité. Soyez conscients que vous obtiendrez toujours une copie et non l”ItemStack actuel et donc, vous devrez le définir à nouveau dans l’inventaire si désiré.

Vérifier le type d’un objet

Vérifier le type d’un item est très simple. Vous devez simplement appeler la méthode ItemStack#getItem().

import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;

public boolean isStick(ItemStack stack) {
    ItemType type = stack.getItem();
    return type.equals(ItemTypes.STICK);
}

Vous voyez à quel point c’est simple ? Parce que les bâtons peuvent s’empiler, nous pouvons aussi savoir combien il y en a.

Obtenir la quantité d’objets dans un ItemStack est relativement facile. La méthode ItemStack#getQuantity() fournie par l”ItemStack le fera pour nous.

Modifier les données d’un ItemStack

Manipuler les données telles que la durabilité ou la connaissance d’un objet peut être accompli par l’utilisation simple de clés. Vous avez juste besoin de spécifier la clé qui a besoin d’être changée:

import org.spongepowered.api.data.key.Keys;

public void setUnbreakable(ItemStack stack) {
    stack.offer(Keys.UNBREAKABLE, true);
}

Dans cet exemple, nous avons spécifié que la clé Keys#UNBREAKABLE est la clé que nous voulions changer. nous avons ensuite défini la valeur à true pour signifier que l’objet ne se cassera jamais. Tout ceci est passé en paramètre à la méthode offer() de l”ItemStack pour modifier à son tour l”ItemStack.

Différentes clés requerront différentes valeurs basées sur leur emploi. Par exemple, pour changer la connaissance d’un objet, on aurait besoin de spécifier une List de Text plutôt qu’un booléen ou une autre valeur. Il est également important d’effectuer des vérifications pour voir si une clé peut effectivement être utilisée sur un objet. Par exemple, certains objet pourraient ne pas avoir de durabilité, ou pourraient déjà avoir une connaissance associée à l’objet.

import org.spongepowered.api.text.Text;

import java.util.List;

public void setLore(ItemStack stack, List<Text> itemLore) {
    if (stack.get(Keys.ITEM_LORE).isPresent()) {
        stack.offer(Keys.ITEM_LORE, itemLore);
    }
}

Propriétés d’un objet

Certains items peuvent contenir des propriétés spécifiques. Par exemple, certains items peuvent miner des blocs spécifiques, comme les pioches en diamant avec l’obsidienne. Les propriétés sont utilisées pour déterminer si un item peut effectuer une action sans réellement vérifier le type de l’item. Nous pouvons vérifier si un item peut miner de l’obsidienne en utilisant la HarvestingProperty de cet item.

import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.data.property.item.HarvestingProperty;

import java.util.Optional;

public boolean canMineObsidian(ItemStack stack) {
    Optional<HarvestingProperty> optional =
        stack.getProperty(HarvestingProperty.class);

    if (optional.isPresent()) {
        HarvestingProperty property = optional.get();
        return property.getValue().contains(BlockTypes.OBSIDIAN);
    }
    return false;
}

Ce code va vérifier si l’item a une HarvestingProperty, comme une pioche. Si elle est présente, il va retourner si cet item peut ramasser de l’obsidienne sans avoir le besoin de vérifier le type de l’item. C’est utile dans le cas où un mod ou une mise à jour de Minecraft ajoute un nouvel outil avec la capacité de miner de l’obsidienne.

Comparer des ItemStacks

La classe ItemStack contient une méthode propre pour comparer deux ItemStacks. En utilisant la méthode ItemStack#equalTo(ItemStack) avec un ItemStack déjà existant, nous pouvons vérifier si les deux ItemStacks sont “égaux”. Pour cela, ils doivent partager la même taille de stack, le même ItemType, et les mêmes données. Un exemple est illustré ci-dessous :

public boolean isEqual(ItemStack stack1, ItemStack stack2) {
    return stack1.equalTo(stack2);
}