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