fix some compile issues

This commit is contained in:
Jake Potrebic 2024-05-02 09:34:23 -07:00
parent 00ecf2f51c
commit b0636ac1f6
No known key found for this signature in database
GPG Key ID: 27CC63F7CBC866C7
2 changed files with 72 additions and 67 deletions

View File

@ -6,41 +6,46 @@ Subject: [PATCH] WIP DataKey API
diff --git a/src/main/java/io/papermc/paper/datakey/DataComponentType.java b/src/main/java/io/papermc/paper/datakey/DataComponentType.java
new file mode 100644
index 0000000000000000000000000000000000000000..fcabc30aaf05c3bc0cc4ef38b5df9978d085fbaf
index 0000000000000000000000000000000000000000..089047983db1e72f7144fd549c592ae8fdeeab38
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/DataComponentType.java
@@ -0,0 +1,20 @@
@@ -0,0 +1,24 @@
+package io.papermc.paper.datakey;
+
+import net.kyori.adventure.key.Key;
+import org.bukkit.Keyed;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+@ApiStatus.NonExtendable
+public interface DataComponentType extends Keyed {
+
+ @NotNull
+ @Override
+ Key key();
+ @NotNull Key key();
+
+ @SuppressWarnings("unused")
+ @ApiStatus.NonExtendable
+ interface Valued<T> extends DataComponentType {
+
+ }
+
+ @ApiStatus.NonExtendable
+ interface NonValued extends DataComponentType {
+
+ }
+}
diff --git a/src/main/java/io/papermc/paper/datakey/DataComponentTypes.java b/src/main/java/io/papermc/paper/datakey/DataComponentTypes.java
new file mode 100644
index 0000000000000000000000000000000000000000..cbb8413356b0991e844ea443607b9561fcf298c6
index 0000000000000000000000000000000000000000..738a79250670edc31ca80a133a007e40eed861df
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/DataComponentTypes.java
@@ -0,0 +1,78 @@
@@ -0,0 +1,79 @@
+package io.papermc.paper.datakey;
+
+import io.papermc.paper.datakey.types.ChargedProjectiles;
+import io.papermc.paper.datakey.types.ItemAttributeModifiers;
+import io.papermc.paper.datakey.types.ItemEnchantments;
+import io.papermc.paper.datakey.types.ItemLore;
+import io.papermc.paper.datakey.types.PotDecorations;
+import io.papermc.paper.datakey.types.Unbreakable;
+import net.kyori.adventure.text.Component;
+import org.bukkit.NamespacedKey;
@ -57,10 +62,10 @@ index 0000000000000000000000000000000000000000..cbb8413356b0991e844ea443607b9561
+ public static final DataComponentType.Valued<Component> ITEM_NAME = valued("item_name");
+ public static final DataComponentType.Valued<ItemLore> LORE = valued("lore");
+ public static final DataComponentType.Valued<ItemRarity> RARITY = valued("rarity");
+ // enchantments
+ public static final DataComponentType.Valued<ItemEnchantments> ENCHANTMENTS = valued("enchantments");
+ // can_place_on
+ // can_break
+ // attribute_modifiers
+ public static final DataComponentType.Valued<ItemAttributeModifiers> ATTRIBUTE_MODIFIERS = valued("attribute_modifiers");
+ // custom_model_data
+ public static final DataComponentType.NonValued HIDE_ADDITIONAL_TOOLTIP = unvalued("hide_additional_tooltip");
+ public static final DataComponentType.NonValued HIDE_TOOLTIP = unvalued("hide_tooltip");
@ -71,7 +76,7 @@ index 0000000000000000000000000000000000000000..cbb8413356b0991e844ea443607b9561
+ // food
+ public static final DataComponentType.NonValued FIRE_RESISTANT = unvalued("fire_resistant");
+ // tool
+ // stored_enchantments
+ public static final DataComponentType.Valued<ItemEnchantments> STORED_ENCHANTMENTS = valued("stored_enchantments");
+ // dyed_color
+ // map_color
+ // map_id
@ -98,7 +103,7 @@ index 0000000000000000000000000000000000000000..cbb8413356b0991e844ea443607b9561
+ // note_block_sound
+ // banner_patterns
+ // base_color
+ public static final DataComponentType.Valued<PotDecorations> POT_DECORATIONS = valued("pot_decorations");
+ // pot decorations
+ // container
+ // block_state
+ // bees
@ -116,7 +121,7 @@ index 0000000000000000000000000000000000000000..cbb8413356b0991e844ea443607b9561
+}
diff --git a/src/main/java/io/papermc/paper/datakey/map/DataComponentMap.java b/src/main/java/io/papermc/paper/datakey/map/DataComponentMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..cfe995362afd1245cd72571dadd2f940409490b7
index 0000000000000000000000000000000000000000..3be38b19b1cf0c5ef89585c7b6610b7cf23d53be
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/map/DataComponentMap.java
@@ -0,0 +1,31 @@
@ -127,6 +132,7 @@ index 0000000000000000000000000000000000000000..cfe995362afd1245cd72571dadd2f940
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import java.util.Set;
+import org.jetbrains.annotations.Unmodifiable;
+
+public interface DataComponentMap {
+
@ -139,7 +145,7 @@ index 0000000000000000000000000000000000000000..cfe995362afd1245cd72571dadd2f940
+ <T> @Nullable T get(DataComponentType.@NotNull Valued<T> type);
+
+ @Contract(value = "_, !null -> !null", pure = true)
+ default <T> @Nullable T getOrDefault(final DataComponentType.@Nullable Valued<? extends T> type, final @Nullable T fallback) {
+ default <T> @Nullable T getOrDefault(final DataComponentType.@NotNull Valued<? extends T> type, final @Nullable T fallback) {
+ final T object = this.get(type);
+ return object != null ? object : fallback;
+ }
@ -148,8 +154,7 @@ index 0000000000000000000000000000000000000000..cfe995362afd1245cd72571dadd2f940
+ boolean has(@NotNull DataComponentType type);
+
+ @Contract(pure = true)
+ Set<DataComponentType> keySet();
+
+ @NotNull @Unmodifiable Set<DataComponentType> keySet();
+}
diff --git a/src/main/java/io/papermc/paper/datakey/map/DataComponentPatchMapBridge.java b/src/main/java/io/papermc/paper/datakey/map/DataComponentPatchMapBridge.java
new file mode 100644
@ -189,7 +194,7 @@ index 0000000000000000000000000000000000000000..5d60b4c1a7f2588838145001865236ce
+}
diff --git a/src/main/java/io/papermc/paper/datakey/map/PatchedDataComponentMap.java b/src/main/java/io/papermc/paper/datakey/map/PatchedDataComponentMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4d2bbb2395cd6bc5a73064d8ae656a103670a29
index 0000000000000000000000000000000000000000..0748f3605321478ff0289fbcc6ae0882f66c1e36
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/map/PatchedDataComponentMap.java
@@ -0,0 +1,59 @@
@ -202,13 +207,11 @@ index 0000000000000000000000000000000000000000..a4d2bbb2395cd6bc5a73064d8ae656a1
+
+public interface PatchedDataComponentMap extends DataComponentMap {
+
+ @NotNull
+ static PatchedDataComponentMap empty() {
+ static @NotNull PatchedDataComponentMap empty() {
+ return DataComponentPatchMapBridge.Holder.bridge().of(DataComponentPatchMapBridge.Holder.bridge().empty());
+ }
+
+ @NotNull
+ static PatchedDataComponentMap of(@NotNull final DataComponentMap map) {
+ static @NotNull PatchedDataComponentMap of(final @NotNull DataComponentMap map) {
+ return DataComponentPatchMapBridge.Holder.bridge().of(map);
+ }
+
@ -245,6 +248,8 @@ index 0000000000000000000000000000000000000000..a4d2bbb2395cd6bc5a73064d8ae656a1
+ */
+ void reset(@NotNull DataComponentType type);
+
+
+
+ @NotNull DataKeyMapPatch asPatch();
+
+ void applyPatch(@NotNull DataKeyMapPatch patch);
@ -537,7 +542,7 @@ index 0000000000000000000000000000000000000000..a54155cacb4052a43395c8599365b50f
+}
diff --git a/src/main/java/io/papermc/paper/datakey/types/Unbreakable.java b/src/main/java/io/papermc/paper/datakey/types/Unbreakable.java
new file mode 100644
index 0000000000000000000000000000000000000000..7121975887128582c8c59190365a7c74663a6648
index 0000000000000000000000000000000000000000..1fe6d7a9a552f9150e8519d8707a4149b0036e4d
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/types/Unbreakable.java
@@ -0,0 +1,27 @@
@ -561,7 +566,7 @@ index 0000000000000000000000000000000000000000..7121975887128582c8c59190365a7c74
+ }
+
+ @ApiStatus.NonExtendable
+ interface Builder extends AbstractShownInTooltip.Builder<Builder> {
+ interface Builder extends ShownInTooltip.Builder<Builder> {
+
+ @Contract(value = "-> new", pure = true)
+ @NotNull Unbreakable build();
@ -607,7 +612,7 @@ index 98a970a6582dca22e719a31559c7becea4725cb2..84708afee2316108babbd64c9c667146
/**
diff --git a/src/main/java/org/bukkit/inventory/ItemStack.java b/src/main/java/org/bukkit/inventory/ItemStack.java
index 84a7bf0936d35bf42b5ed038d295d5c31740f472..6ff3c5150d04b15552286a5f86a54efca4c2fcb6 100644
index 84a7bf0936d35bf42b5ed038d295d5c31740f472..471609fa22f036ba16c7b60ca6f07d30eacf46d2 100644
--- a/src/main/java/org/bukkit/inventory/ItemStack.java
+++ b/src/main/java/org/bukkit/inventory/ItemStack.java
@@ -1,7 +1,6 @@
@ -760,7 +765,7 @@ index 84a7bf0936d35bf42b5ed038d295d5c31740f472..6ff3c5150d04b15552286a5f86a54efc
*/
public boolean hasItemMeta() {
- return !Bukkit.getItemFactory().equals(meta, null);
+ return true; // Paper - every item now has meta!
+ return !Bukkit.getItemFactory().equals(this.getItemMeta(), null); // Paper
}
/**

View File

@ -37,10 +37,10 @@ index 0000000000000000000000000000000000000000..264a8a14d2a778ef4eaa5937342b5978
+}
diff --git a/src/main/java/io/papermc/paper/datakey/ComponentAdapters.java b/src/main/java/io/papermc/paper/datakey/ComponentAdapters.java
new file mode 100644
index 0000000000000000000000000000000000000000..338fbf8b12319bdc52e7874338a6262a370f2d66
index 0000000000000000000000000000000000000000..81cf3fd255e4f2a730c6288c2905f6ee22f6d24a
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/ComponentAdapters.java
@@ -0,0 +1,77 @@
@@ -0,0 +1,78 @@
+package io.papermc.paper.datakey;
+
+import io.papermc.paper.adventure.PaperAdventure;
@ -91,6 +91,7 @@ index 0000000000000000000000000000000000000000..338fbf8b12319bdc52e7874338a6262a
+ registerUntyped(DataComponents.FIRE_RESISTANT);
+ register(DataComponents.CHARGED_PROJECTILES, PaperChargedProjectiles::new);
+ register(DataComponents.ENCHANTMENTS, PaperItemEnchantments::new);
+ register(DataComponents.STORED_ENCHANTMENTS, PaperItemEnchantments::new);
+ register(DataComponents.ATTRIBUTE_MODIFIERS, PaperItemAttributeModifiers::new);
+ }
+
@ -120,10 +121,10 @@ index 0000000000000000000000000000000000000000..338fbf8b12319bdc52e7874338a6262a
+}
diff --git a/src/main/java/io/papermc/paper/datakey/DataComponentPatchBridgeImpl.java b/src/main/java/io/papermc/paper/datakey/DataComponentPatchBridgeImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..af78395dc718a3947ae1001daa48f68fddd135a6
index 0000000000000000000000000000000000000000..fd3cb851ec8504406100abdc5967fef96c87ed47
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/DataComponentPatchBridgeImpl.java
@@ -0,0 +1,57 @@
@@ -0,0 +1,61 @@
+package io.papermc.paper.datakey;
+
+import com.mojang.authlib.GameProfile;
@ -132,11 +133,13 @@ index 0000000000000000000000000000000000000000..af78395dc718a3947ae1001daa48f68f
+import net.minecraft.core.component.DataComponents;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.item.Items;
+import org.bukkit.Material;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.inventory.CraftItemType;
+import org.bukkit.craftbukkit.inventory.CraftMetaItem;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+public class DataComponentPatchBridgeImpl implements io.papermc.paper.datakey.map.DataComponentPatchMapBridge {
+ @Override
@ -151,9 +154,9 @@ index 0000000000000000000000000000000000000000..af78395dc718a3947ae1001daa48f68f
+
+ @Override
+ public DataComponentMap fromItem(final Material material) {
+ final Item item = CraftItemType.bukkitToMinecraft(material);
+ if (item == null) {
+ // Because people can make non-item itemstacks still..
+ final @Nullable Item item = CraftItemType.bukkitToMinecraft(material);
+ if (item == null || item == Items.AIR) {
+ // Because people can make non-item itemstacks still...
+ return this.empty();
+ }
+ return new PaperDataComponentMap(item.components());
@ -164,7 +167,9 @@ index 0000000000000000000000000000000000000000..af78395dc718a3947ae1001daa48f68f
+ final CraftMetaItem.Applicator tag = new CraftMetaItem.Applicator() {
+ @Override
+ public void skullCallback(final GameProfile gameProfile) {
+ this.builder.set(DataComponents.PROFILE, new net.minecraft.world.item.component.ResolvableProfile(gameProfile));
+ // TODO this isn't correct, this is called after resolving the profile, the builder is usually built when this is called
+ // I'm not even sure if we can do anything about this.
+ // this.builder.set(DataComponents.PROFILE, new net.minecraft.world.item.component.ResolvableProfile(gameProfile));
+ }
+ };
+ ((CraftMetaItem) meta).applyToItemPublic(tag);
@ -177,7 +182,7 @@ index 0000000000000000000000000000000000000000..af78395dc718a3947ae1001daa48f68f
+ @Override
+ public ItemMeta toItemMeta(final Material material, final PatchedDataComponentMap map) {
+ final ItemStack stack = new ItemStack(CraftItemType.bukkitToMinecraft(material));
+ stack.restorePatch(((PaperPatchedDataComponentMap) map).patched().asPatch());
+ stack.restorePatch(((PaperPatchedDataComponentMap) map).getHandle().asPatch());
+ return CraftItemStack.getItemMeta(stack, material);
+ }
+}
@ -280,20 +285,20 @@ index 0000000000000000000000000000000000000000..c5f6005b57e77061900b6c1b145f33f3
+}
diff --git a/src/main/java/io/papermc/paper/datakey/PaperDataComponentMap.java b/src/main/java/io/papermc/paper/datakey/PaperDataComponentMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..9480d70d41bd53f8d91b72da8506d2862fb771fd
index 0000000000000000000000000000000000000000..8755afe2ed48aa086842ca6e53c3f6fd3ccc1468
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/PaperDataComponentMap.java
@@ -0,0 +1,46 @@
+package io.papermc.paper.datakey;
+
+import io.papermc.paper.datakey.map.DataComponentMap;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import org.checkerframework.checker.nullness.qual.NonNull;
+import org.checkerframework.checker.nullness.qual.Nullable;
+import org.checkerframework.framework.qual.DefaultQualifier;
+
+@DefaultQualifier(NonNull.class)
+public class PaperDataComponentMap implements DataComponentMap {
+
+ protected final net.minecraft.core.component.DataComponentMap map;
@ -320,7 +325,7 @@ index 0000000000000000000000000000000000000000..9480d70d41bd53f8d91b72da8506d286
+ keys.add(PaperComponentType.minecraftToBukkit(nmsKey));
+ }
+
+ return keys;
+ return Collections.unmodifiableSet(keys);
+ }
+
+ @Override
@ -332,16 +337,15 @@ index 0000000000000000000000000000000000000000..9480d70d41bd53f8d91b72da8506d286
+}
diff --git a/src/main/java/io/papermc/paper/datakey/PaperPatchedDataComponentMap.java b/src/main/java/io/papermc/paper/datakey/PaperPatchedDataComponentMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..4fcb07685f4ad84821332dba390f8d4b2246d0f0
index 0000000000000000000000000000000000000000..85efb3bb71eef28d7f8c025d9c3ff39857abc679
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/PaperPatchedDataComponentMap.java
@@ -0,0 +1,71 @@
@@ -0,0 +1,70 @@
+package io.papermc.paper.datakey;
+
+import io.papermc.paper.datakey.map.PatchedDataComponentMap;
+import io.papermc.paper.datakey.patch.DataKeyMapPatch;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+public class PaperPatchedDataComponentMap extends PaperDataComponentMap implements PatchedDataComponentMap {
+
@ -367,9 +371,9 @@ index 0000000000000000000000000000000000000000..4fcb07685f4ad84821332dba390f8d4b
+ final ComponentAdapter<V, A> adapter = type.getAdapter();
+
+ if (adapter.isValued()) {
+ this.patched().set(type.getHandle(), value == null ? null : adapter.toVanilla(value));
+ this.getHandle().set(type.getHandle(), value == null ? null : adapter.toVanilla(value));
+ } else {
+ this.patched().set(type.getHandle(), adapter.toVanilla(value));
+ this.getHandle().set(type.getHandle(), adapter.toVanilla(value));
+ }
+ }
+
@ -377,33 +381,33 @@ index 0000000000000000000000000000000000000000..4fcb07685f4ad84821332dba390f8d4b
+ public void unset(final DataComponentType type) {
+ @SuppressWarnings("unchecked")
+ final PaperComponentType<?, Object> typeAsImpl = ((PaperComponentType<?, Object>) type);
+ this.patched().remove(typeAsImpl.getHandle());
+ this.getHandle().remove(typeAsImpl.getHandle());
+ }
+
+ @Override
+ public void reset(@NotNull final DataComponentType type) {
+ public void reset(final DataComponentType type) {
+ @SuppressWarnings("unchecked")
+ final PaperComponentType<?, Object> typeAsImpl = (PaperComponentType<?, Object>) type;
+
+ final net.minecraft.core.component.PatchedDataComponentMap map = this.patched();
+ final net.minecraft.core.component.PatchedDataComponentMap map = this.getHandle();
+ map.applyPatch(map.asPatch().forget((forgetType) -> forgetType == typeAsImpl.getHandle())); // Apply patch with type removed
+ }
+
+ @Override
+ public @NotNull DataKeyMapPatch asPatch() {
+ public DataKeyMapPatch asPatch() {
+ return null;
+ }
+
+ @Override
+ public void applyPatch(@NotNull final DataKeyMapPatch patch) {
+ public void applyPatch(final DataKeyMapPatch patch) {
+ }
+
+ @Override
+ public PatchedDataComponentMap copy() {
+ return new PaperPatchedDataComponentMap(this.patched().copy());
+ return new PaperPatchedDataComponentMap(this.getHandle().copy());
+ }
+
+ public net.minecraft.core.component.PatchedDataComponentMap patched() {
+ public net.minecraft.core.component.PatchedDataComponentMap getHandle() {
+ return ((net.minecraft.core.component.PatchedDataComponentMap) this.map);
+ }
+}
@ -427,6 +431,17 @@ index 0000000000000000000000000000000000000000..e6ebc39e96c9eb6f9869cfff258d4e25
+ super(key, type, adapter);
+ }
+}
diff --git a/src/main/java/io/papermc/paper/datakey/package-info.java b/src/main/java/io/papermc/paper/datakey/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0e4e57a278a107c013f15acbc7a149bcc6ed932
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datakey/package-info.java
@@ -0,0 +1,5 @@
+@DefaultQualifier(NonNull.class)
+package io.papermc.paper.datakey;
+
+import org.checkerframework.checker.nullness.qual.NonNull;
+import org.checkerframework.framework.qual.DefaultQualifier;
diff --git a/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridgesImpl.java b/src/main/java/io/papermc/paper/datakey/types/ComponentTypesBridgesImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..10093ab578715d0cbd5e45e56861c831136a3516
@ -1019,16 +1034,15 @@ index 0000000000000000000000000000000000000000..d43e2b2d0e86ed585ba7bfd4e26d6259
\ No newline at end of file
diff --git a/src/test/java/io/papermc/paper/item/ItemStackDataComponentTest.java b/src/test/java/io/papermc/paper/item/ItemStackDataComponentTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..023f0f0cf3b0220b143b43f3484459ac2f853108
index 0000000000000000000000000000000000000000..01122e6b4129375155c9866df04fa163402db1ea
--- /dev/null
+++ b/src/test/java/io/papermc/paper/item/ItemStackDataComponentTest.java
@@ -0,0 +1,127 @@
@@ -0,0 +1,112 @@
+package io.papermc.paper.item;
+
+import io.papermc.paper.datakey.DataComponentType;
+import io.papermc.paper.datakey.DataComponentTypes;
+import io.papermc.paper.datakey.types.ChargedProjectiles;
+import io.papermc.paper.datakey.types.PotDecorations;
+import io.papermc.paper.datakey.types.Unbreakable;
+import org.bukkit.Material;
+import org.bukkit.block.BlockState;
@ -1117,27 +1131,13 @@ index 0000000000000000000000000000000000000000..023f0f0cf3b0220b143b43f3484459ac
+ stack.setData(DataComponentTypes.CHARGED_PROJECTILES, ChargedProjectiles.chargedProjectiles().add(projectile).build());
+
+ CrossbowMeta meta = (CrossbowMeta) stack.getItemMeta();
+ Assertions.assertEquals(meta.getChargedProjectiles().get(0), projectile);
+ Assertions.assertEquals(meta.getChargedProjectiles().getFirst(), projectile);
+
+ stack.removeData(DataComponentTypes.CHARGED_PROJECTILES);
+ meta = (CrossbowMeta) stack.getItemMeta();
+ Assertions.assertTrue(meta.getChargedProjectiles().isEmpty());
+ }
+
+ @Test
+ void testPot() {
+ final ItemStack stack = new ItemStack(Material.DECORATED_POT);
+ stack.setData(DataComponentTypes.POT_DECORATIONS, PotDecorations.potDecorations().back(Material.DANGER_POTTERY_SHERD).build());
+
+ BlockState state = ((BlockStateMeta) stack.getItemMeta()).getBlockState();
+ DecoratedPot decoratedPot = (DecoratedPot) state;
+
+ Assertions.assertEquals(decoratedPot.getSherd(DecoratedPot.Side.BACK), Material.DANGER_POTTERY_SHERD);
+ stack.removeData(DataComponentTypes.POT_DECORATIONS);
+ decoratedPot = (DecoratedPot) ((BlockStateMeta) stack.getItemMeta()).getBlockState();
+ Assertions.assertTrue(decoratedPot.getSherds().values().stream().allMatch((m) -> m == Material.BRICK));
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <T, M> void testWithMeta(final ItemStack stack, final DataComponentType.Valued<T> type, final T value, final Class<M> metaType, final Function<M, T> metaGetter, final BiConsumer<M, T> metaSetter) {
+ stack.setData(type, value);