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

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

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

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

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