Grundlegende Verwendung von Gegenständen

Gegenstände werden durch ein ItemStack repräsentiert. Ein ItemStack ist ein Gegenstand aus dem Inventar mit Informationen über die Anzahl der Gegenstände in dieser Ansammlung, den Art des Gegenstandes und weiteren Daten wie der Haltbarkeit. Ein Item ist die grafische Repräsentation eines ItemStacks als Entität in der Welt. Bitte beachte, dass du immer nur eine Kopie und nicht den richtigen ItemStack bekommst und ihn deshalb zurück ins Inventar geben musst, wenn gewünscht.

Überprüfung des Typs eines Gegenstandes

Die Überprüfung des Typs eines Gegenstandes ist sehr einfach. Du musst dafür nur die ItemStack#getItem() Methode aufrufen.

import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;

public boolean isStick(ItemStack stack) {
    ItemType type = stack.getItem();
    return type.equals(ItemTypes.STICK);
}

Siehst du wie einfach das ist? Weil sich Stöcke stapeln lassen, können wir auch herausfinden, wie viele gerade da sind.

Herauszufinden, wie viele Gegenstände in einem ItemStack sind, ist relativ einfach. Die ItemStack#getQuantity() Methode übernimmt das für uns.

Bearbeiten von Gegenstands-Daten

Das Verändern von Daten wie der Haltbarkeit oder dem Beschreibungstext eines Gegenstandes kann erreicht werden, indem Keys verwendet werden. Du musst nur angeben, welcher Schlüssel geändert werden muss:

import org.spongepowered.api.data.key.Keys;

public void setUnbreakable(ItemStack stack) {
    stack.offer(Keys.UNBREAKABLE, true);
}

In diesem Beispiel haben wir angegeben, dass der Keys#UNBREAKABLE Schlüssel, der Schlüssel ist, den wir ändern möchten. Wir setzen dann den Wert auf true, was ausdrückt, dass der Gegenstand niemals zerbrechen wird. Diese Änderungen werden in der offer() Methode des ItemStack zurück in den ItemStack geschrieben.

Verschiedene Schlüssel benötigen verschiedene Werte um ihre Arbeit zu erledigen. Zum Beispiel, um den Beschreibungstext eines Gegenstandes zu ändern, brauchst du eine Liste von Texten anstatt eines Boolean oder sonstigen Wertes. Es ist außerdem wichtig zu prüfen, dass der gegebene Schlüssel tatsächlich auf den Gegenstand angewendet werden kann. Zum Beispiel werden einige Gegenstände keine Haltbarkeit haben oder bereits einen Beschreibungstext haben.

import org.spongepowered.api.text.Text;

import java.util.List;

public void setLore(ItemStack stack, List<Text> itemLore) {
    if (stack.get(Keys.ITEM_LORE).isPresent()) {
        stack.offer(Keys.ITEM_LORE, itemLore);
    }
}

Eigenschaften von Gegenständen

Verschiedene Gegenstände können spezielle Eigenschaften haben. Zum Beispiel können bestimmte Gegenstände dazu verwendet werden, bestimmte Blöcke abzubauen, wie es bei der Diamant-Spitzhacke und Obsidian der Fall ist. Diese Eigenschaften können dazu verwendet werden herauszufinden, wo ein Gegenstand für eine Aktion verwendet werden kann ohne tatsächlichen Typ des Gegenstandes zu überprüfen. Wir können prüfen, ob ein Werkzeug einen Block Obsidian abbauen kann, wenn wir die HarvestingProperty des Gegenstandes überprüfen.

import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.data.property.item.HarvestingProperty;

import java.util.Optional;

public boolean canMineObsidian(ItemStack stack) {
    Optional<HarvestingProperty> optional =
        stack.getProperty(HarvestingProperty.class);

    if (optional.isPresent()) {
        HarvestingProperty property = optional.get();
        return property.getValue().contains(BlockTypes.OBSIDIAN);
    }
    return false;
}

Dieser Code überprüft, ob der Gegenstand eine HarvestingProperty hat, wie beispielsweise die Spitzhacke. Wenn diese vorhanden ist, kann man damit überprüft werden, ob dieser Gegenstand dazu verwendet werden kann, Obsidian zu ernten, ohne dafür den Typ des Gegenstandes zu überprüfen. Dies ist praktisch für den Fall, dass ein Mod oder ein Minecraft Update ein neues Werkzeug hinzufügt, welches die Fähigkeit besitzt Obsidian abzubauen.

Vergleichen von Gegenständen

Die ItemStack Klasse hat eine praktische Methode zum Vergleichen von zwei ItemStacks. Durch die Verwendung der ItemStack#equalTo(ItemStack) Methode auf einem bereits existierendem ItemStack können wir überprüfen, ob beide ItemStacks ‚gleich‘ sind. Dies ist dann der Fall, wenn die Anzahl, der ItemType und die Daten identisch sind. Das folgende Beispiel zeigt dies:

public boolean isEqual(ItemStack stack1, ItemStack stack2) {
    return stack1.equalTo(stack2);
}