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

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

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

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

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

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