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 ItemStack
s 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
Checking the type of the item is very simple. You just need to call the ItemStack#type() method.
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.type();
return type.equals(ItemTypes.STICK.get());
}
Siehst du wie einfach das ist? Weil sich Stöcke stapeln lassen, können wir auch herausfinden, wie viele gerade da sind.
Getting the number of items in an ItemStack
is relatively easy. The ItemStack#quantity() method will
handle this for us.
Bearbeiten von Gegenstands-Daten
Das Verändern von Daten wie der Haltbarkeit oder dem Beschreibungstext eines Gegenstandes kann erreicht werden, indem Key
s 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.
Different keys will require different values based on their job. For example, to change the lore of an item, one would
need to specify a List
of Component rather than a boolean or other value. It is also important to perform
checks to see if the key can actually apply to the item. For example, some items might not have durability or may
already have lore applied to the item.
import net.kyori.adventure.text.Component;
import java.util.List;
public void setLore(ItemStack stack, List<Component> itemLore) {
if (stack.get(Keys.ITEM_LORE).isPresent()) {
stack.offer(Keys.ITEM_LORE, itemLore);
}
}
Bemerkung
Almost all API methods that return an ItemStack
only return a copy of it, so modifying it does not have any
impact on the real stack (e.g. in an inventory). You have to explicitly set it for your changes to persist.
Eigenschaften von Gegenständen
Certain items may hold specific properties. For example, certain items can mine specific blocks, such as a diamond pickaxe to obsidian. Properties are used for determining if an item can cause an action without actually checking up the type of the item. We can check if an item can mine obsidian by using the Keys#CAN_HARVEST of that item.
import org.spongepowered.api.block.BlockTypes;
public boolean canMineObsidian(ItemStack stack) {
List<BlockType> canHarvest =
stack.get(Keys.CAN_HARVEST).orElse(Collections.emptyList());
return canHarvest.contains(BlockTypes.OBSIDIAN.get());
}
This code will check to see if the item has a assigned key of CAN_HARVEST
, such as a pickaxe,
if it doesn’t then it uses an empty array. It will then return if obsidian is contained within the list of blocks the
item can harvest. This is useful in the event that a mod or a Minecraft update adds a new tool with the capabilities of
mining obsidian.
Vergleichen von Gegenständen
Die ItemStack
Klasse hat eine praktische Methode zum Vergleichen von zwei ItemStack
s. Durch die Verwendung der ItemStack#equalTo(ItemStack) Methode auf einem bereits existierendem ItemStack
können wir überprüfen, ob beide ItemStack
s ‚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);
}