From 848d22728cc6e1eb454e412319e6053db3692cef Mon Sep 17 00:00:00 2001 From: Siroshun09 Date: Wed, 20 Nov 2024 05:15:16 +0900 Subject: [PATCH] refactor(versions): use DataComponent API for creating default items --- .../common/item/DefaultPotionItems.java | 88 ------------------- .../box/version/common/item/ItemSources.java | 57 +++++++----- .../version/paper_1_21_2/Paper_1_21_2.java | 16 +--- 3 files changed, 38 insertions(+), 123 deletions(-) delete mode 100644 versions/common/src/main/java/net/okocraft/box/version/common/item/DefaultPotionItems.java diff --git a/versions/common/src/main/java/net/okocraft/box/version/common/item/DefaultPotionItems.java b/versions/common/src/main/java/net/okocraft/box/version/common/item/DefaultPotionItems.java deleted file mode 100644 index 3db7e469d4..0000000000 --- a/versions/common/src/main/java/net/okocraft/box/version/common/item/DefaultPotionItems.java +++ /dev/null @@ -1,88 +0,0 @@ -package net.okocraft.box.version.common.item; - -import net.okocraft.box.api.util.ItemNameGenerator; -import net.okocraft.box.storage.api.model.item.provider.DefaultItem; -import org.bukkit.Material; -import org.bukkit.Registry; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.PotionType; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import java.util.Spliterator; -import java.util.function.Consumer; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -final class DefaultPotionItems { - - @Contract("_ -> new") - static @NotNull Stream stream(@NotNull Registry registry) { - return StreamSupport.stream(new PotionItemSpliterator(registry.stream().toArray(PotionType[]::new)), false); - } - - private DefaultPotionItems() { - throw new UnsupportedOperationException(); - } - - private static final class PotionItemSpliterator implements Spliterator { - - private static final Material[] ITEMS = {Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION, Material.TIPPED_ARROW}; - - private final PotionType[] potionTypes; - private final long size; - - private int potionTypeIndex = 0; - private int itemIndex = 0; - - private PotionItemSpliterator(@NotNull PotionType[] potionTypes) { - this.potionTypes = potionTypes; - this.size = (long) ITEMS.length * potionTypes.length; - } - - @Override - public boolean tryAdvance(Consumer action) { - var item = ITEMS[this.itemIndex]; - var potionType = this.potionTypes[this.potionTypeIndex]; - boolean hasNext; - - if (++this.itemIndex == ITEMS.length) { - if (++this.potionTypeIndex == this.potionTypes.length) { - hasNext = false; - } else { - this.itemIndex = 0; - hasNext = true; - } - } else { - hasNext = true; - } - - action.accept(createPotion(item, potionType)); - - return hasNext; - } - - @Override - public Spliterator trySplit() { - return null; - } - - @Override - public long estimateSize() { - return this.size; - } - - @Override - public int characteristics() { - return NONNULL | SIZED | ORDERED; - } - - private static @NotNull DefaultItem createPotion(@NotNull Material material, @NotNull PotionType type) { - var name = ItemNameGenerator.keys(material, type); - var potion = new ItemStack(material); - potion.editMeta(PotionMeta.class, meta -> meta.setBasePotionType(type)); - return new DefaultItem(name, potion); - } - } -} diff --git a/versions/common/src/main/java/net/okocraft/box/version/common/item/ItemSources.java b/versions/common/src/main/java/net/okocraft/box/version/common/item/ItemSources.java index 7dcecb32b7..f38c655994 100644 --- a/versions/common/src/main/java/net/okocraft/box/version/common/item/ItemSources.java +++ b/versions/common/src/main/java/net/okocraft/box/version/common/item/ItemSources.java @@ -1,18 +1,20 @@ package net.okocraft.box.version.common.item; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.Fireworks; +import io.papermc.paper.datacomponent.item.ItemEnchantments; +import io.papermc.paper.datacomponent.item.OminousBottleAmplifier; +import io.papermc.paper.datacomponent.item.PotionContents; +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; import net.okocraft.box.api.util.ItemNameGenerator; import net.okocraft.box.storage.api.model.item.provider.DefaultItem; import org.bukkit.Bukkit; +import org.bukkit.Keyed; import org.bukkit.Material; -import org.bukkit.MusicInstrument; import org.bukkit.Registry; -import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemType; -import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import org.bukkit.inventory.meta.FireworkMeta; -import org.bukkit.inventory.meta.MusicInstrumentMeta; -import org.bukkit.inventory.meta.OminousBottleMeta; import org.bukkit.potion.PotionType; import org.jetbrains.annotations.NotNull; @@ -24,27 +26,35 @@ public final class ItemSources { @SuppressWarnings("deprecation") - public static @NotNull Stream itemTypes(@NotNull Registry registry) { + public static @NotNull Stream itemTypes() { var world = Bukkit.getWorlds().getFirst(); var excludedTypes = Set.of(ItemType.AIR, ItemType.GOAT_HORN, ItemType.FIREWORK_ROCKET, ItemType.OMINOUS_BOTTLE); - return registry.stream() + return registry(RegistryKey.ITEM).stream() .filter(Predicate.not(excludedTypes::contains)) .filter(world::isEnabled) .map(type -> new DefaultItem(ItemNameGenerator.key(type), ItemStack.of(type.asMaterial(), 1))); // FIXME: remove asMaterial in the future } - public static @NotNull Stream potions(@NotNull Registry registry) { - return DefaultPotionItems.stream(registry); + public static @NotNull Stream potions() { + return registry(RegistryKey.POTION).stream().flatMap(ItemSources::createItemsForPotionType); } - public static @NotNull Stream enchantedBooks(Registry registry) { - return registry.stream() + private static @NotNull Stream createItemsForPotionType(@NotNull PotionType potionType) { + return Stream.of(Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION, Material.TIPPED_ARROW) + .map(itemType -> { + var name = ItemNameGenerator.keys(itemType, potionType); + var item = ItemStack.of(itemType, 1); + item.setData(DataComponentTypes.POTION_CONTENTS, PotionContents.potionContents().potion(potionType)); + return new DefaultItem(name, item); + }); + } + + public static @NotNull Stream enchantedBooks() { + return registry(RegistryKey.ENCHANTMENT).stream() .map(enchantment -> { var name = ItemNameGenerator.keys(Material.ENCHANTED_BOOK, enchantment); - var book = new ItemStack(Material.ENCHANTED_BOOK); - book.editMeta(EnchantmentStorageMeta.class, meta -> meta.addStoredEnchant(enchantment, enchantment.getMaxLevel(), false)); - + book.setData(DataComponentTypes.STORED_ENCHANTMENTS, ItemEnchantments.itemEnchantments().add(enchantment, enchantment.getMaxLevel())); return new DefaultItem(name, book); }); } @@ -53,18 +63,16 @@ public final class ItemSources { return IntStream.of(1, 2, 3).mapToObj(power -> { var name = ItemNameGenerator.key(Material.FIREWORK_ROCKET) + "_" + power; var firework = new ItemStack(Material.FIREWORK_ROCKET); - firework.editMeta(FireworkMeta.class, meta -> meta.setPower(power)); - + firework.setData(DataComponentTypes.FIREWORKS, Fireworks.fireworks().flightDuration(power)); return new DefaultItem(name, firework); }); } - public static @NotNull Stream goatHorns(@NotNull Registry registry) { - return registry.stream() - .map(instrument -> { + public static @NotNull Stream goatHorns() { + return registry(RegistryKey.INSTRUMENT).stream().map(instrument -> { var name = ItemNameGenerator.key(instrument); var goatHorn = new ItemStack(Material.GOAT_HORN); - goatHorn.editMeta(MusicInstrumentMeta.class, meta -> meta.setInstrument(instrument)); + goatHorn.setData(DataComponentTypes.INSTRUMENT, instrument); return new DefaultItem(name, goatHorn); }); } @@ -73,12 +81,15 @@ public final class ItemSources { return IntStream.rangeClosed(1, 5).mapToObj(level -> { var name = ItemNameGenerator.key(Material.OMINOUS_BOTTLE) + "_" + level; var bottle = new ItemStack(Material.OMINOUS_BOTTLE); - bottle.editMeta(OminousBottleMeta.class, meta -> meta.setAmplifier(level - 1)); - + bottle.setData(DataComponentTypes.OMINOUS_BOTTLE_AMPLIFIER, OminousBottleAmplifier.amplifier(level - 1)); return new DefaultItem(name, bottle); }); } + private static @NotNull Registry registry(@NotNull RegistryKey key) { + return RegistryAccess.registryAccess().getRegistry(key); + } + public static class Merger { private Stream current; diff --git a/versions/paper-1_21_2/src/main/java/net/okocraft/box/version/paper_1_21_2/Paper_1_21_2.java b/versions/paper-1_21_2/src/main/java/net/okocraft/box/version/paper_1_21_2/Paper_1_21_2.java index c3f2319e0c..b4061ee4ca 100644 --- a/versions/paper-1_21_2/src/main/java/net/okocraft/box/version/paper_1_21_2/Paper_1_21_2.java +++ b/versions/paper-1_21_2/src/main/java/net/okocraft/box/version/paper_1_21_2/Paper_1_21_2.java @@ -1,13 +1,9 @@ package net.okocraft.box.version.paper_1_21_2; -import io.papermc.paper.registry.RegistryAccess; -import io.papermc.paper.registry.RegistryKey; import net.okocraft.box.ap.annotation.version.VersionSpecific; import net.okocraft.box.api.util.MCDataVersion; import net.okocraft.box.storage.api.model.item.provider.DefaultItem; import net.okocraft.box.version.common.item.ItemSources; -import org.bukkit.Keyed; -import org.bukkit.Registry; import org.jetbrains.annotations.NotNull; import java.util.stream.Stream; @@ -21,19 +17,15 @@ public final class Paper_1_21_2 { @VersionSpecific.DefaultItemSource public static @NotNull Stream defaultItems() { return new ItemSources.Merger() - .append(ItemSources.itemTypes(registry(RegistryKey.ITEM))) - .append(ItemSources.potions(registry(RegistryKey.POTION))) - .append(ItemSources.enchantedBooks(registry(RegistryKey.ENCHANTMENT))) + .append(ItemSources.itemTypes()) + .append(ItemSources.potions()) + .append(ItemSources.enchantedBooks()) .append(ItemSources.fireworks()) - .append(ItemSources.goatHorns(registry(RegistryKey.INSTRUMENT))) + .append(ItemSources.goatHorns()) .append(ItemSources.ominousBottles()) .result(); } - private static @NotNull Registry registry(@NotNull RegistryKey key) { - return RegistryAccess.registryAccess().getRegistry(key); - } - private Paper_1_21_2() { throw new UnsupportedOperationException(); }