Création d’un ItemStack

Si vous voulez créer vos propres items, vous devrez suivre plusieurs étapes. Nous allons explorer un exemple basique et créer une épée en diamant enchantée.

Pour créer un ItemStack, nous avons besoin dans un premier temps d’utiliser le builder lié à la méthode ItemStack#builder(). Dedans, on peux spécifié des donnés comme l”ItemType ou la quantité de celui ci. Dans notre exemple, nous allons créer une épée en diamant qui contient des enchantements, un nom custom, ainsi que la propriété d’être indestructible. Si vous voulez une épée simple sans aucune donnés supplémentaires, voici ci que vous avez besoin de faire :

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

public ItemStack generateSword() {
    ItemStack superMegaAwesomeSword = ItemStack.builder()
        .itemType(ItemTypes.DIAMOND_SWORD).build();
    return superMegaAwesomeSword;
}

La création d’un item basic est terminée. Maintenant c’est une épée en diamant normale que nous avons créé, mais si nous voulions lui donner quelque chose de plus intéressant ? Que pensez vous d’enchanter et de nommer notre épée ? Nous pouvons utiliser le EnchantmentData pour donner à notre épée quelques enchantements. L’exemple suivant donne à notre épée tous les enchantements du jeu, au niveau 1000. Soyez sûrs d’inclure tout ça avant return superMegaAwesomeSword;.

import java.util.List;
import java.util.stream.Collectors;

import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.manipulator.mutable.item.EnchantmentData;
import org.spongepowered.api.data.meta.ItemEnchantment
import org.spongepowered.api.item.Enchantment;

EnchantmentData enchantmentData = superMegaAwesomeSword
    .getOrCreate(EnchantmentData.class).get();
final List<Enchantment> enchantments = Sponge.getRegistry()
    .getAllOf(Enchantment.class).stream().collect(Collectors.toList());

for (Enchantment enchantment : enchantments) {
    enchantmentData.set(enchantmentData.enchantments()
        .add(new ItemEnchantment(enchantment, 1000)));
}
superMegaAwesomeSword.offer(enchantmentData);

Maintenant disons que nous voulons donner à notre épée superpuissante un nom cool. Ici, nous pouvons directement offrir une clé à l”ItemStack. En utilisant cette clé, nous pouvons changer le nom de l”ItemStack à « SUPER MEGA AWESOME Diamond Sword »

import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.format.TextColors;

superMegaAwesomeSword.offer(Keys.DISPLAY_NAME, Text.of(
    TextColors.BLUE, "SUPER ",
    TextColors.GOLD, "MEGA ",
    TextColors.DARK_AQUA, "AWESOME ",
    TextColors.AQUA, "Diamond Sword"));

Finalement, pour rendre l’épée incassable, nous pouvons utiliser les clés à nouveau :

superMegaAwesomeSword.offer(Keys.UNBREAKABLE, true);

Et voilà. Vous avez maintenant une épée entièrement enchantée, incassable, et magnifiquement nommée, que vous pouvez donner à vos joueurs.

Faire apparaître l’Item

Bien sûr nous pouvons simplement mettre l’épée dans l’inventaire d’un joueur, mais si nous voulions la jeter dans le monde ouvert et faire apparaître l’item ? C’est là où l’invocation d’entités entre en jeu. Puisque la représentation graphique d’un ItemStack en jeu est un Item, nous pouvons le faire apparaître de la même façon qu’une Entity normale. Le EntityType va simplement être EntityTypes#ITEM et nous devrons spécifier que l”Entity va représenter notre ItemStack. Cela peut être fait à l’aide de la clé Keys#REPRESENTED_ITEM. Un exemple est illustré ci-dessous :

import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.EntityTypes;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.entity.spawn.EntitySpawnCause;
import org.spongepowered.api.event.cause.entity.spawn.SpawnTypes;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import org.spongepowered.api.world.extent.Extent;

import java.util.Optional;

public void spawnItem(ItemStack superMegaAwesomeSword, Location<World> spawnLocation) {
    Extent extent = spawnLocation.getExtent();
    Optional<Entity> optional = extent
        .createEntity(EntityTypes.ITEM, spawnLocation.getPosition());
    if (optional.isPresent()) {
        Entity item = optional.get();
        item.offer(Keys.REPRESENTED_ITEM, superMegaAwesomeSword.createSnapshot());
        extent.spawnEntity(item, Cause.source(EntitySpawnCause.builder()
            .entity(item).type(SpawnTypes.PLUGIN).build()).build());
    }
}

Créer un ItemStack depuis un Bloc

Un ItemStack pour un bloc peut être créé à l’aide de la méthode ItemStack.Builder#itemType(ItemType) de la même façon que les items normaux, mais et si nous voulions créer un ItemStack depuis un BlockState ? Pour créer un ItemStack depuis un BlockState, vous devrez utiliser la méthode ItemStack.Builder#fromBlockState(BlockState) dans le builder d”ItemStack. Un exemple est illustré ci-dessous :

import org.spongepowered.api.block.BlockState;

public ItemStack createStack(BlockState state) {
    return ItemStack.builder().fromBlockState(state).build();
}