Menciptakan ItemStack

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

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 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"));

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

Tentu kita dapat memasukkan pedang ke dalam persediaan pemain, tetapi bagaimana jika kita menginginkan untuk membuangnya ke dunia terbuka dan menghasilkan item? Ini dimana entity spawning ikut bermain. Sejak representasi grafis dalam permainan dari ItemStack itu Item, kita dapat menghasilkan Entity dengan cara yang normal. EntityType akan menjadi EntityTypes#ITEM dan kita harus menetapkan bahwa Entity akan mewakili ItemStack kita. Ini dapat diselesaikan dengan menggunakan kunci Keys#REPRESENTED_ITEM. Contoh seperti berikut:

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

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