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;
}
Creating the basic item is done. Now this is a normal diamond sword that we created, but what if we wanted something more interesting? What about enchanting and naming our sword? We can use Keys#APPLIED_ENCHANTMENTS to give our sword some enchantments. The following example will give our sword every enchantment in the game, to level 1000.
import java.util.List;
import java.util.stream.Collectors;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.meta.ItemEnchantment
import org.spongepowered.api.item.Enchantment;
public void withThousandEnchantmentLevel(ItemStack superMegaAwesomeSword){
List<Enchantment> enchantments = RegistryTypes
.ENCHANTMENT_TYPE
.get()
.stream()
.filter(type -> type.canBeAppliedToStack(superMegaAwesomeSword))
.map(type -> Enchantment.of(type, 1000))
.collect(Collectors.toList());
superMegaAwesomeSword.offer(Keys.APPLIED_ENCHANTMENTS);
}
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 net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor;
import org.spongepowered.api.data.Keys;
import org.spongepowered.api.item.ItemTypes;
superMegaAwesomeSword.offer(Keys.DISPLAY_NAME, TextComponent.ofChildren(
Component.text("SUPER ", NamedTextColor.BLUE),
Component.text("MEGA ", NamedTextColor.GOLD),
Component.text("AWESOME ", NamedTextColor.DARK_AQUA),
ItemTypes.DIAMOND_SWORD.get().asComponent().color(NamedTextColor.AQUA));
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 et 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.CauseStackManager.StackFrame;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
import org.spongepowered.api.world.server.ServerWorld;
import java.util.Optional;
public void spawnItem(ItemStack superMegaAwesomeSword, ServerLocation spawnLocation) {
ServerWorld world = spawnLocation.world();
Item item = world.createEntity(EntityTypes.ITEM, spawnLocation.getPosition());
item.offer(Keys.REPRESENTED_ITEM, superMegaAwesomeSword.createSnapshot());
try (StackFrame frame = Sponge.server().causeStackManager().pushCauseFrame()) {
frame.addContext(EventContextKeys.SPAWN_TYPE, SpawnTypes.PLACEMENT);
word.spawnEntity(item);
}
}
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();
}