Menciptakan ItemStack

Peringatan

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

Jika anda ingin membuat item anda sendiri, anda perlu untuk pergi melalui beberapa langkah. Mari kita pergi melalui contoh dasar dan membuat terpesona pedang berlian.

Untuk membuat ItemStack, kita pertama perlu mengambil pembangun dari ItemStack. Ini dilakukan dengan metode ItemStack#builder(). Dalam pembangun, kita menetapkan beberapa hal seperti ItemType atau jumlah item. Pada contoh, kita akan membuat pedang berlian yang berisikan pemikatan, nama pilihan, dan tidak dapat dirusak. Jika anda ingin pedang biasa tanpa data-data yang lain, maka ini semua yang harus anda lakukan:

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;
}

Membuat item dasar telah selesai. Sekarang ini adalah pedang berlian normal yang telah kita buat, tetapi bagaimana jika kita menginginkan sesuatu yang lebih menarik? Bagaimana dengan pemikatan dan penamaan pedang kita? Kita dapat menggunakan EnchantmentData untuk memberikan pedang kita beberapa pemikatan. Contoh berikut memberikan pedang kita pemikatan-pemikatan di dalam permainan, ke tingkat 1000. Pastikan untuk memasukkan semua ini sebelum 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<EnchantmentType> enchantments = Sponge.getRegistry()
    .getAllOf(EnchantmentType.class).stream().collect(Collectors.toList());

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

Sekarang mari katakan kita menginginkan untuk memberikan pedang tangguh kita nama yang keren untuk memulainya. Di sini, kita secara langsung dapat menawarkan kunci ke ItemStack. Dengan menggunakan kunci ini, kita dapat mengubah nama dari ItemStack ke "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.key.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.asComponent().color(NamedTextColor.AQUA));

Akhirnya, untuk membuat pedang bisa dipecahkan, kita dapat menggunakan tombol lagi:

superMegaAwesomeSword.offer(Keys.UNBREAKABLE, true);

Itu saja. Anda sekarang telah sepenuhnya terpesona, dipecahkan, dan indah bernama pedang yang dapat anda berikan kepada pemain.

Penciptaan item

Sure, we can simply put the sword into a player's inventory, but what if we wanted to throw it out into the open world and spawn the item? This is where entity spawning comes into play. Since the in-game graphical representation of an ItemStack is Item, we can spawn it in similarly to a normal Entity. The EntityType will simply be EntityTypes#ITEM and we will need to specify that the Entity will represent our ItemStack. This can be done using the Keys#REPRESENTED_ITEM key. An example is shown below:

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.extent.Extent;

import java.util.Optional;

public void spawnItem(ItemStack superMegaAwesomeSword, Location<World> spawnLocation) {
    Extent extent = spawnLocation.getExtent();
    Entity item = extent.createEntity(EntityTypes.ITEM, spawnLocation.getPosition());
    item.offer(Keys.REPRESENTED_ITEM, superMegaAwesomeSword.createSnapshot());

    try (StackFrame frame = Sponge.getCauseStackManager().pushCauseFrame()) {
        frame.addContext(EventContextKeys.SPAWN_TYPE, SpawnTypes.PLACEMENT);
        extent.spawnEntity(item);
    }
}

Menciptakan ItemStack Dari Blok

Sebuah ItemStack untuk sebuah blok dapat diciptakan dengan menggunakan metode ItemStack.Builder#itemType(ItemType) yang sama dengan item normal, tetapi bagaimana jika kita ingin membuat ItemStack dari BlockState itu sendiri? Untuk membuat sebuah ItemStack dari sebuah BlockState, anda harus menggunakan metode ItemStack.Builder#fromBlockState(BlockState) pada pembangun ItemStack. Contoh seperti berikut:

import org.spongepowered.api.block.BlockState;

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