Ein ItemStack erstellen

Wenn du deine eigenen Gegenstände erstellen möchtest, musst du einige Schritte durchführen. Lass uns gemeinsam durch ein einfaches Beispiel gehen, um ein verzaubertes Diamant-Schwert zu erstellen.

Um einen ItemStack zu erstellen, müssen wir uns zuallererst einen Builder vom ItemStack holen. Dies können wir mit Hilfe der ItemStack#builder() Methode. Im Builder können wir diverse Sachen angeben, wie zum Beispiel den ItemType oder die Anzahl des Gegenstände. In unserem Beispiel wäre dies ein einzelnes Diamant-Schwert, dass eine Verzauberung und einen speziellen Namen hat sowie unzerbrechlich ist. Wenn du ein einfaches Schwert ohne andere Daten haben willst, ist alles was du tun musst das Folgende:

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

Wir haben den grundlegenden Gegenstand erstellt. Nun, dass ist ein ganz gewöhnliches Diamant-Schwert, aber was ist, wenn wir etwas aufregenderes wollen? Wir wäre es zum Beispiel, wenn wir unser Schwert verzaubern und benennen möchten? Wir können EnchantmentData verwenden um unserem Schwert ein paar Verzauberungen hinzuzufügen. Das nachfolgende Beispiel wird unserem Schwert alle, im Spiel verfügbaren, Verzauberungen auf Stufe 1000 hinzufügen. Stelle sicher, dass du dies hinzufügst, bevor du return superMegaAwesomeSword; aufrufst.

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

Nun, lass uns einmal annehmen, dass wir unserem übertriebenem Schwert einen coolen Namen geben wollen. In diesem Fall können wir den Wert für den ItemStack direkt einen Key setzen. Mit Hilfe des Keys setzen können wir den Namen des ItemStacks auf „SUPER MEGA AWESOME Diamond Sword“ ändern

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

Und schließlich, um das Schwert unzerbrechlich zu machen, können wir wieder Keys verwenden:

superMegaAwesomeSword.offer(Keys.UNBREAKABLE, true);

Das war alles. Nun hast du ein voll verzaubertes, unzerbrechliches und wunderschön benanntes Schwert, dass du deinen Spielern geben kannst.

Den Gegenstand spawnen

Natürlich könnten wir das Schwert auch einfach in das Inventar des Spielers packen, aber was wäre, wenn wir es einfach in die weite Welt werfen und als Gegenstand spawnen lassen wollen? Hier kommt das Spawnen von Entitäten in Spiel. Da die graphische Darstellung eines ItemStacks ein Item ist, können wir es ähnlich zu normalen Entity spawnen. Der EntityType ist einfach EntityTypes#ITEM und wir müssen angeben, dass die Entity unseren ItemStack repräsentiert. Dies können wir mit Hilfe von des Keys#REPRESENTED_ITEM Schlüssels tun, wie im diesem Beispiel gezeigt wird:

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

Einen Gegenstand anhand eines Blockes erstellen

Ein ItemStack für einen Block kann durch die Methode ItemStack.Builder#itemType(ItemType) erstellt werden, ähnlich zu normalen Gegenständen. Aber was ist, wenn wir einen ItemStack erstellen wollen, der dem aktuellen BlockState selbst entspricht? Um einen ItemStack anhand eines BlockState zu erstellen, musst du die Methode ItemStack.Builder#fromBlockState(BlockState) verwenden, die der ItemStack-Builder bereitstellt. Ein Beispiel dafür wird hier drunter gezeigt:

import org.spongepowered.api.block.BlockState;

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