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