ItemStack oluşturma

Kendi eşyalarınızı yaratmak istiyorsanız, birkaç adım geçmeniz gerekiyor. Şimdi temel bir örnek verelim ve büyülü bir elmas kılıcı oluşturalım.

Bir ItemStack oluşturmak için öncelikle yapıcıyı ItemStack’den almamız gerekiyor. Bu, ItemStack#builder() yöntemi ile yapılır. Oluşturucuda, ItemType veya öğe miktarı gibi şeyleri belirtebiliriz. Örneğimizde, büyü özel adını içeren ve kırılmaz olan bir elmas kılıcı oluşturacağız. Başka bir veri olmadan basit bir kılıç istiyorsanız, o zaman yapmanız gereken tek şey:

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

Temel eşyayı yaratma işlemi tamam. Şimdi bu, yarattığımız normal bir elmas kılıcımızdı, ama biz daha ilginç bir şey istediysek ne olacaktı? Kılıcımızı büyülemek ve adlandırmak nasıl olacak? Kılıcımızı büyülemek için EnchantmentData komutunu kullanabilirsiniz. Aşağıdaki örnek, oyunda bulunan her büyüyü kılıcımıza 1000 düzeyine vereceğiz. Bunların tümünü superMegaAwesomeSword;` dönmeden önce eklediğinizden emin olun.

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

Şimdi de, aşırı güçlü kılıcına onunla birlikte gelişmesi için güzel bir isim vermek istedik diyelim. Burada, doğrudan ItemStack için bir anahtar sunabiliriz. Bu tuşu kullanarak, ItemStack ismini “SUPER MEGA AWESOME Diamond Sword” olarak değiştirebiliriz

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

Son olarak, kılıcı kırılmaz yapmak için, tuşları tekrar kullanabiliriz:

superMegaAwesomeSword.offer(Keys.UNBREAKABLE, true);

Bu kadar. Artık oyuncularınıza verebileceğiniz tamamen büyüleyici, kırılmaz ve güzel bir şekile sahip kılıç var.

Öğe’yi yumurtlamak

Elbette kılıcı bir oyuncunun envanterine koyabiliriz, ancak onu açık dünyaya atmak ve eşyayı yumurtlamak istiyorsak? İşte burada entity spawning devreye giriyor. Bir ItemStack ‘in oyun içi grafik gösterimi Item olduğundan, bunu normal Entity gibi benzer şekilde oluşturabiliriz. EntityType basitçe EntityTypes#ITEM olacaktır ve Entity ItemStack birimimizi temsil etmesini belirtmek zorundayız. Bu, Keys#REPRESENTED_ITEM tuşunu kullanarak yapılabilir. Aşağıda bir örnek gösterilmiştir:

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

Bir Blok Üzerinden ItemStack Oluşturma

Bir blok için ItemStack ItemStack.Builder#itemType(ItemType) yöntemi kullanılarak oluşturulabilir. normal öğelere benzer şekilde, ancak a’dan bir ItemStack yaratmak istediysek ne olur? javadoc:BlockState’in kendisi mi? Bir BlockState öğesinden bir ItemStack yaratmak için, ItemStack yapıcı üzerinde ItemStack.Builder#fromBlockState(BlockState) yöntemi kullanılmalıdır. Buna bir örnek aşağıda gösterilmiştir:

import org.spongepowered.api.block.BlockState;

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