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;
}
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);
}
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 Key
s setzen können wir den Namen des ItemStack
s auf „SUPER MEGA AWESOME Diamond Sword“ ändern
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));
Und schließlich, um das Schwert unzerbrechlich zu machen, können wir wieder Key
s 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
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);
}
}
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();
}