From 9bc147178d62a722fb74b9157e9545a4aea72d4b Mon Sep 17 00:00:00 2001
From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
Date: Sun, 24 Nov 2024 20:12:08 +0100
Subject: [PATCH 01/13] Fix painting variant builder (#11660)
---
...ntroduce-registry-entry-and-builders.patch | 81 +++++++++----------
patches/api/0495-DataComponent-API.patch | 4 +-
.../0992-Registry-Modification-API.patch | 30 ++++---
...0993-Add-registry-entry-and-builders.patch | 77 +++++-------------
patches/server/1035-DataComponent-API.patch | 10 +--
patches/server/1071-Expanded-Art-API.patch | 40 +++------
6 files changed, 92 insertions(+), 150 deletions(-)
diff --git a/patches/api/0472-Introduce-registry-entry-and-builders.patch b/patches/api/0472-Introduce-registry-entry-and-builders.patch
index 631eaf3f55..9220cd4bb6 100644
--- a/patches/api/0472-Introduce-registry-entry-and-builders.patch
+++ b/patches/api/0472-Introduce-registry-entry-and-builders.patch
@@ -24,10 +24,10 @@ index 647f6a1ec1f9d3c203b41f90a99bfd415bf67366..9b39e33514b15a9d07104e2ad826d0da
* Built-in registry for cat variants.
diff --git a/src/main/java/io/papermc/paper/registry/data/EnchantmentRegistryEntry.java b/src/main/java/io/papermc/paper/registry/data/EnchantmentRegistryEntry.java
new file mode 100644
-index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a428bdc5ad9
+index 0000000000000000000000000000000000000000..f092077453cb13dd8d849550896c2ef1cfa81b7a
--- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/data/EnchantmentRegistryEntry.java
-@@ -0,0 +1,332 @@
+@@ -0,0 +1,331 @@
+package io.papermc.paper.registry.data;
+
+import io.papermc.paper.registry.RegistryBuilder;
@@ -177,7 +177,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * sharpness enchantment.
+ *
+ * @param description the description component.
-+ * @return this builder.
++ * @return this builder instance.
+ */
+ @Contract(value = "_ -> this", mutates = "this")
+ Builder description(Component description);
@@ -191,7 +191,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * {@link io.papermc.paper.registry.keys.tags.ItemTypeTagKeys#ENCHANTABLE_SWORD}.
+ *
+ * @param supportedItems the registry key set representing the supported items.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see RegistrySet#keySet(RegistryKey, TypedKey[])
+ * @see io.papermc.paper.registry.event.RegistryFreezeEvent#getOrCreateTag(TagKey)
+ */
@@ -212,7 +212,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * which enchantments can even show up in an enchantment table.
+ *
+ * @param primaryItems the registry key set representing the primary items.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see RegistrySet#keySet(RegistryKey, TypedKey[])
+ * @see io.papermc.paper.registry.event.RegistryFreezeEvent#getOrCreateTag(TagKey)
+ */
@@ -223,7 +223,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * Configures the weight of this enchantment used by the weighted random when selecting enchantments.
+ *
+ * @param weight the weight value.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see https://minecraft.wiki/w/Enchanting for examplary weights.
+ */
+ @Contract(value = "_ -> this", mutates = "this")
@@ -233,7 +233,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * Configures the maximum level this enchantment can have when applied.
+ *
+ * @param maxLevel the maximum level.
-+ * @return this builder.
++ * @return this builder instance.
+ */
+ @Contract(value = "_ -> this", mutates = "this")
+ Builder maxLevel(@Range(from = 1, to = 255) int maxLevel);
@@ -244,7 +244,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * Note that a cost is not directly related to the consumed xp.
+ *
+ * @param minimumCost the enchantment cost.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see https://minecraft.wiki/w/Enchanting/Levels for
+ * examplary costs.
+ */
@@ -257,7 +257,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * Note that a cost is not directly related to the consumed xp.
+ *
+ * @param maximumCost the enchantment cost.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see https://minecraft.wiki/w/Enchanting/Levels for
+ * examplary costs.
+ */
@@ -272,7 +272,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ *
+ *
+ * @param anvilCost the anvil cost of this enchantment
-+ * @return this builder.
++ * @return this builder instance.
+ * @see Enchantment#getAnvilCost()
+ */
+ @Contract(value = "_ -> this", mutates = "this")
@@ -285,7 +285,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * groups, the enchantment's effects, like attribute modifiers, will not activate.
+ *
+ * @param activeSlots a list of equipment slot groups.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see Enchantment#getActiveSlotGroups()
+ */
+ @Contract(value = "_ -> this", mutates = "this")
@@ -300,7 +300,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * groups, the enchantment's effects, like attribute modifiers, will not activate.
+ *
+ * @param activeSlots a list of equipment slot groups.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see Enchantment#getActiveSlotGroups()
+ */
+ @Contract(value = "_ -> this", mutates = "this")
@@ -315,7 +315,7 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ * Defaults to an empty set allowing this enchantment to be applied regardless of other enchantments.
+ *
+ * @param exclusiveWith a registry set of enchantments exclusive to this one.
-+ * @return this builder.
++ * @return this builder instance.
+ * @see RegistrySet#keySet(RegistryKey, TypedKey[])
+ * @see io.papermc.paper.registry.event.RegistryFreezeEvent#getOrCreateTag(TagKey)
+ */
@@ -358,7 +358,6 @@ index 0000000000000000000000000000000000000000..d0d19a4bb2ba0e92710861b106777a42
+ return new Impl(baseCost, additionalPerLevelCost);
+ }
+ }
-+
+}
diff --git a/src/main/java/io/papermc/paper/registry/data/GameEventRegistryEntry.java b/src/main/java/io/papermc/paper/registry/data/GameEventRegistryEntry.java
new file mode 100644
@@ -417,10 +416,10 @@ index 0000000000000000000000000000000000000000..980fe12b75258b51cc2498590cadb9de
+}
diff --git a/src/main/java/io/papermc/paper/registry/data/PaintingVariantRegistryEntry.java b/src/main/java/io/papermc/paper/registry/data/PaintingVariantRegistryEntry.java
new file mode 100644
-index 0000000000000000000000000000000000000000..b8d133afa82da1b5b9e7a18e1c332ae3aefea50d
+index 0000000000000000000000000000000000000000..4e2c99acd7dc307981ba8e33a62835f0f29fd73e
--- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/data/PaintingVariantRegistryEntry.java
-@@ -0,0 +1,135 @@
+@@ -0,0 +1,131 @@
+package io.papermc.paper.registry.data;
+
+import io.papermc.paper.registry.RegistryBuilder;
@@ -443,27 +442,25 @@ index 0000000000000000000000000000000000000000..b8d133afa82da1b5b9e7a18e1c332ae3
+public interface PaintingVariantRegistryEntry {
+
+ /**
-+ * Provides the width of this variant in blocks.
++ * Provides the width of this painting in blocks.
+ *
-+ * @return the width
++ * @return the width.
+ * @see Art#getBlockWidth()
+ */
-+ @Range(from = 1, to = 16)
-+ int width();
++ @Range(from = 1, to = 16) int width();
+
+ /**
-+ * Provides the height of this variant in blocks.
++ * Provides the height of this painting in blocks.
+ *
-+ * @return the height
++ * @return the height.
+ * @see Art#getBlockHeight()
+ */
-+ @Range(from = 1, to = 16)
-+ int height();
++ @Range(from = 1, to = 16) int height();
+
+ /**
+ * Provides the title of the painting visible in the creative inventory.
+ *
-+ * @return the title
++ * @return the title.
+ * @see Art#title()
+ */
+ @Nullable Component title();
@@ -471,15 +468,15 @@ index 0000000000000000000000000000000000000000..b8d133afa82da1b5b9e7a18e1c332ae3
+ /**
+ * Provides the author of the painting visible in the creative inventory.
+ *
-+ * @return the author
++ * @return the author.
+ * @see Art#author()
+ */
+ @Nullable Component author();
+
+ /**
-+ * Provides the assetId of the variant, which is the location of the sprite to use.
++ * Provides the asset id of the painting, which is the location of the sprite to use.
+ *
-+ * @return the asset id
++ * @return the asset id.
+ * @see Art#assetId()
+ */
+ Key assetId();
@@ -501,30 +498,30 @@ index 0000000000000000000000000000000000000000..b8d133afa82da1b5b9e7a18e1c332ae3
+ /**
+ * Sets the width of the painting in blocks.
+ *
-+ * @param width the width in blocks
-+ * @return this builder instance
++ * @param width the width in blocks.
++ * @return this builder instance.
+ * @see PaintingVariantRegistryEntry#width()
+ * @see Art#getBlockWidth()
+ */
+ @Contract(value = "_ -> this", mutates = "this")
-+ Builder width(@Range(from = 0, to = 16) int width);
++ Builder width(@Range(from = 1, to = 16) int width);
+
+ /**
+ * Sets the height of the painting in blocks.
+ *
-+ * @param height the height in blocks
-+ * @return this builder instance
++ * @param height the height in blocks.
++ * @return this builder instance.
+ * @see PaintingVariantRegistryEntry#height()
+ * @see Art#getBlockHeight()
+ */
+ @Contract(value = "_ -> this", mutates = "this")
-+ Builder height(@Range(from = 0, to = 16) int height);
++ Builder height(@Range(from = 1, to = 16) int height);
+
+ /**
+ * Sets the title of the painting.
+ *
-+ * @param title the title
-+ * @return this builder instance
++ * @param title the title.
++ * @return this builder instance.
+ * @see PaintingVariantRegistryEntry#title()
+ * @see Art#title()
+ */
@@ -534,8 +531,8 @@ index 0000000000000000000000000000000000000000..b8d133afa82da1b5b9e7a18e1c332ae3
+ /**
+ * Sets the author of the painting.
+ *
-+ * @param author the author
-+ * @return this builder instance
++ * @param author the author.
++ * @return this builder instance.
+ * @see PaintingVariantRegistryEntry#author()
+ * @see Art#author()
+ */
@@ -543,18 +540,16 @@ index 0000000000000000000000000000000000000000..b8d133afa82da1b5b9e7a18e1c332ae3
+ Builder author(@Nullable Component author);
+
+ /**
-+ * Sets the assetId of the variant, which is the location of the sprite to use.
++ * Sets the asset id of the painting, which is the location of the sprite to use.
+ *
-+ * @param assetId the asset id
-+ * @return this builder instance
++ * @param assetId the asset id.
++ * @return this builder instance.
+ * @see PaintingVariantRegistryEntry#assetId()
+ * @see Art#assetId()
+ */
+ @Contract(value = "_ -> this", mutates = "this")
+ Builder assetId(Key assetId);
-+
+ }
-+
+}
diff --git a/src/main/java/io/papermc/paper/registry/data/package-info.java b/src/main/java/io/papermc/paper/registry/data/package-info.java
new file mode 100644
diff --git a/patches/api/0495-DataComponent-API.patch b/patches/api/0495-DataComponent-API.patch
index 5f86c0b8e6..8f469a9141 100644
--- a/patches/api/0495-DataComponent-API.patch
+++ b/patches/api/0495-DataComponent-API.patch
@@ -3561,7 +3561,7 @@ index 0000000000000000000000000000000000000000..979bc05009b84b6fcdb59938cceace35
+}
diff --git a/src/main/java/io/papermc/paper/datacomponent/item/consumable/ConsumableTypesBridge.java b/src/main/java/io/papermc/paper/datacomponent/item/consumable/ConsumableTypesBridge.java
new file mode 100644
-index 0000000000000000000000000000000000000000..a845ccfc21f101f0632249745bbd8b334f85e72c
+index 0000000000000000000000000000000000000000..e632221f36d0f355b4750071c7d8ccdd84b040a9
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datacomponent/item/consumable/ConsumableTypesBridge.java
@@ -0,0 +1,32 @@
@@ -3589,7 +3589,7 @@ index 0000000000000000000000000000000000000000..a845ccfc21f101f0632249745bbd8b33
+
+ ConsumeEffect.ApplyStatusEffects applyStatusEffects(List effectList, float probability);
+
-+ ConsumeEffect.RemoveStatusEffects removeStatusEffects(RegistryKeySet potionEffectTypeTagKey);
++ ConsumeEffect.RemoveStatusEffects removeStatusEffects(RegistryKeySet effectTypes);
+
+ ConsumeEffect.ClearAllStatusEffects clearAllStatusEffects();
+
diff --git a/patches/server/0992-Registry-Modification-API.patch b/patches/server/0992-Registry-Modification-API.patch
index 73fc9c9d38..d79be5372f 100644
--- a/patches/server/0992-Registry-Modification-API.patch
+++ b/patches/server/0992-Registry-Modification-API.patch
@@ -1406,21 +1406,24 @@ index 0000000000000000000000000000000000000000..8bee1a5ed877a04e4d027593df1f42ce
+io.papermc.paper.registry.event.RegistryEventTypeProviderImpl
diff --git a/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java b/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
new file mode 100644
-index 0000000000000000000000000000000000000000..ceef7b5864deb1d7c6aa5630febe86ba9427bdc4
+index 0000000000000000000000000000000000000000..f2f1dfe4277ce1e84a9494bee285badc958c8d3f
--- /dev/null
+++ b/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
-@@ -0,0 +1,36 @@
+@@ -0,0 +1,44 @@
+package io.papermc.paper.registry;
+
+import io.papermc.paper.registry.data.util.Conversions;
-+import java.util.List;
++import io.papermc.paper.registry.entry.RegistryEntry;
++import io.papermc.paper.registry.entry.RegistryEntryInfo;
++import io.papermc.paper.registry.legacy.DelayedRegistryEntry;
+import java.util.Map;
++import java.util.stream.Stream;
+import net.minecraft.core.Registry;
+import net.minecraft.resources.RegistryOps;
+import net.minecraft.resources.ResourceKey;
++import org.bukkit.Keyed;
+import org.bukkit.support.RegistryHelper;
+import org.bukkit.support.environment.AllFeatures;
-+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
@@ -1430,18 +1433,23 @@ index 0000000000000000000000000000000000000000..ceef7b5864deb1d7c6aa5630febe86ba
+@AllFeatures
+class RegistryBuilderTest {
+
-+ static List registries() {
-+ return List.of(
-+ );
++ static Stream registries() {
++ return PaperRegistries.REGISTRY_ENTRIES.stream()
++ .map(RegistryBuilderTest::possiblyUnwrap)
++ .filter(RegistryEntry.BuilderHolder.class::isInstance)
++ .map(Arguments::arguments);
++ }
++
++ private static RegistryEntryInfo possiblyUnwrap(final RegistryEntryInfo entry) {
++ return entry instanceof final DelayedRegistryEntry delayed ? delayed.delegate() : entry;
+ }
+
-+ @Disabled
+ @ParameterizedTest
+ @MethodSource("registries")
-+ void testEquality(final ResourceKey extends Registry> resourceKey, final PaperRegistryBuilder.Filler filler) {
-+ final Registry registry = RegistryHelper.getRegistry().lookupOrThrow(resourceKey);
++ void testEquality(final RegistryEntry.BuilderHolder registryEntry) {
++ final Registry registry = RegistryHelper.getRegistry().lookupOrThrow(registryEntry.mcKey());
+ for (final Map.Entry, M> entry : registry.entrySet()) {
-+ final M built = filler.fill(new Conversions(new RegistryOps.HolderLookupAdapter(RegistryHelper.getRegistry())), PaperRegistries.fromNms(entry.getKey()), entry.getValue()).build();
++ final M built = registryEntry.fillBuilder(new Conversions(new RegistryOps.HolderLookupAdapter(RegistryHelper.getRegistry())), PaperRegistries.fromNms(entry.getKey()), entry.getValue()).build();
+ assertEquals(entry.getValue(), built);
+ }
+ }
diff --git a/patches/server/0993-Add-registry-entry-and-builders.patch b/patches/server/0993-Add-registry-entry-and-builders.patch
index 4c2d2a81a2..6320aa8569 100644
--- a/patches/server/0993-Add-registry-entry-and-builders.patch
+++ b/patches/server/0993-Add-registry-entry-and-builders.patch
@@ -283,7 +283,7 @@ index 0000000000000000000000000000000000000000..481f5f0cfae1fada3bc3f873fb7e04c3
+}
diff --git a/src/main/java/io/papermc/paper/registry/data/PaperGameEventRegistryEntry.java b/src/main/java/io/papermc/paper/registry/data/PaperGameEventRegistryEntry.java
new file mode 100644
-index 0000000000000000000000000000000000000000..18f9463ae23ba2d9c65ffb7531a87c925a5a8d6f
+index 0000000000000000000000000000000000000000..a96609223ed1e0500f8a4b868e309c0fc82bbc31
--- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/data/PaperGameEventRegistryEntry.java
@@ -0,0 +1,57 @@
@@ -309,11 +309,11 @@ index 0000000000000000000000000000000000000000..18f9463ae23ba2d9c65ffb7531a87c92
+ public PaperGameEventRegistryEntry(
+ final Conversions ignoredConversions,
+ final io.papermc.paper.registry.TypedKey ignoredKey,
-+ final @Nullable GameEvent nms
++ final @Nullable GameEvent internal
+ ) {
-+ if (nms == null) return;
++ if (internal == null) return;
+
-+ this.range = OptionalInt.of(nms.notificationRadius());
++ this.range = OptionalInt.of(internal.notificationRadius());
+ }
+
+ @Override
@@ -327,9 +327,9 @@ index 0000000000000000000000000000000000000000..18f9463ae23ba2d9c65ffb7531a87c92
+ public PaperBuilder(
+ final Conversions conversions,
+ final io.papermc.paper.registry.TypedKey key,
-+ final @Nullable GameEvent nms
++ final @Nullable GameEvent internal
+ ) {
-+ super(conversions, key, nms);
++ super(conversions, key, internal);
+ }
+
+ @Override
@@ -346,7 +346,7 @@ index 0000000000000000000000000000000000000000..18f9463ae23ba2d9c65ffb7531a87c92
+}
diff --git a/src/main/java/io/papermc/paper/registry/data/PaperPaintingVariantRegistryEntry.java b/src/main/java/io/papermc/paper/registry/data/PaperPaintingVariantRegistryEntry.java
new file mode 100644
-index 0000000000000000000000000000000000000000..21cb8c28c0027b4b2446279f6cf9dbedfc8945d5
+index 0000000000000000000000000000000000000000..68b3d747f759f615a3c942de3f4d7a0fe856cd84
--- /dev/null
+++ b/src/main/java/io/papermc/paper/registry/data/PaperPaintingVariantRegistryEntry.java
@@ -0,0 +1,120 @@
@@ -385,16 +385,16 @@ index 0000000000000000000000000000000000000000..21cb8c28c0027b4b2446279f6cf9dbed
+ public PaperPaintingVariantRegistryEntry(
+ final Conversions conversions,
+ final TypedKey ignoredKey,
-+ final @Nullable PaintingVariant nms
++ final @Nullable PaintingVariant internal
+ ) {
+ this.conversions = conversions;
-+ if(nms == null) return;
++ if (internal == null) return;
+
-+ this.width = OptionalInt.of(nms.width());
-+ this.height = OptionalInt.of(nms.height());
-+ this.title = nms.title().orElse(null);
-+ this.author = nms.title().orElse(null);
-+ this.assetId = nms.assetId();
++ this.width = OptionalInt.of(internal.width());
++ this.height = OptionalInt.of(internal.height());
++ this.title = internal.title().orElse(null);
++ this.author = internal.author().orElse(null);
++ this.assetId = internal.assetId();
+ }
+
+ @Override
@@ -424,18 +424,18 @@ index 0000000000000000000000000000000000000000..21cb8c28c0027b4b2446279f6cf9dbed
+
+ public static final class PaperBuilder extends PaperPaintingVariantRegistryEntry implements PaintingVariantRegistryEntry.Builder, PaperRegistryBuilder {
+
-+ public PaperBuilder(final Conversions conversions, final TypedKey key, final @Nullable PaintingVariant nms) {
-+ super(conversions, key, nms);
++ public PaperBuilder(final Conversions conversions, final TypedKey key, final @Nullable PaintingVariant internal) {
++ super(conversions, key, internal);
+ }
+
+ @Override
-+ public Builder width(@Range(from = 0, to = 16) final int width) {
++ public Builder width(final @Range(from = 1, to = 16) int width) {
+ this.width = OptionalInt.of(asArgumentRange(width, "width", 1, 16));
+ return this;
+ }
+
+ @Override
-+ public Builder height(@Range(from = 0, to = 16) final int height) {
++ public Builder height(final @Range(from = 1, to = 16) int height) {
+ this.height = OptionalInt.of(asArgumentRange(height, "height", 1, 16));
+ return this;
+ }
@@ -573,44 +573,3 @@ index ac9b4328cd55a68664a3f71186bc9a7be7cd9658..ea9fe1f8b1a1685ea975eba0ca418a83
@NotNull
@Override
public NamespacedKey getKey() {
-diff --git a/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java b/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
-index ceef7b5864deb1d7c6aa5630febe86ba9427bdc4..4d4632da6bf1bde85115dde2e2f7e353bd392176 100644
---- a/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
-+++ b/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
-@@ -1,11 +1,16 @@
- package io.papermc.paper.registry;
-
-+import io.papermc.paper.registry.data.PaperEnchantmentRegistryEntry;
-+import io.papermc.paper.registry.data.PaperGameEventRegistryEntry;
- import io.papermc.paper.registry.data.util.Conversions;
- import java.util.List;
- import java.util.Map;
- import net.minecraft.core.Registry;
-+import net.minecraft.core.registries.Registries;
- import net.minecraft.resources.RegistryOps;
- import net.minecraft.resources.ResourceKey;
-+import net.minecraft.world.item.enchantment.Enchantment;
-+import net.minecraft.world.level.gameevent.GameEvent;
- import org.bukkit.support.RegistryHelper;
- import org.bukkit.support.environment.AllFeatures;
- import org.junit.jupiter.api.Disabled;
-@@ -14,16 +19,18 @@ import org.junit.jupiter.params.provider.Arguments;
- import org.junit.jupiter.params.provider.MethodSource;
-
- import static org.junit.jupiter.api.Assertions.assertEquals;
-+import static org.junit.jupiter.params.provider.Arguments.arguments;
-
- @AllFeatures
- class RegistryBuilderTest {
-
- static List registries() {
- return List.of(
-+ arguments(Registries.ENCHANTMENT, (PaperRegistryBuilder.Filler) PaperEnchantmentRegistryEntry.PaperBuilder::new),
-+ arguments(Registries.GAME_EVENT, (PaperRegistryBuilder.Filler) PaperGameEventRegistryEntry.PaperBuilder::new)
- );
- }
-
-- @Disabled
- @ParameterizedTest
- @MethodSource("registries")
- void testEquality(final ResourceKey extends Registry> resourceKey, final PaperRegistryBuilder.Filler filler) {
diff --git a/patches/server/1035-DataComponent-API.patch b/patches/server/1035-DataComponent-API.patch
index 1b469c83f7..91ad0459a6 100644
--- a/patches/server/1035-DataComponent-API.patch
+++ b/patches/server/1035-DataComponent-API.patch
@@ -1484,7 +1484,7 @@ index 0000000000000000000000000000000000000000..2a043bb9001048f66d3a6aa8cb896b35
+}
diff --git a/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java b/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java
new file mode 100644
-index 0000000000000000000000000000000000000000..c7e40bd15b7063f155b2065927e8201f80fb6d0e
+index 0000000000000000000000000000000000000000..e6315cd0ebd46f874284c32da9cc03eb77f0677f
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java
@@ -0,0 +1,75 @@
@@ -1533,7 +1533,7 @@ index 0000000000000000000000000000000000000000..c7e40bd15b7063f155b2065927e8201f
+ static final class BuilderImpl implements ItemAdventurePredicate.Builder {
+
+ private final List predicates = new ObjectArrayList<>();
-+ private boolean showInTooltip = net.minecraft.world.item.component.ItemAttributeModifiers.EMPTY.showInTooltip();
++ private boolean showInTooltip = true;
+
+ @Override
+ public ItemAdventurePredicate.Builder addPredicate(final BlockPredicate predicate) {
@@ -3311,7 +3311,7 @@ index 0000000000000000000000000000000000000000..037a6695bdb8ee6e3c119fa79000c4ea
+}
diff --git a/src/main/java/io/papermc/paper/datacomponent/item/consumable/ConsumableTypesBridgeImpl.java b/src/main/java/io/papermc/paper/datacomponent/item/consumable/ConsumableTypesBridgeImpl.java
new file mode 100644
-index 0000000000000000000000000000000000000000..e11e7b36c0b0b499a6149c44ca2ad9f331d1b863
+index 0000000000000000000000000000000000000000..eab1883d691e0d0034b7959c8130a6240c3f529c
--- /dev/null
+++ b/src/main/java/io/papermc/paper/datacomponent/item/consumable/ConsumableTypesBridgeImpl.java
@@ -0,0 +1,64 @@
@@ -3349,10 +3349,10 @@ index 0000000000000000000000000000000000000000..e11e7b36c0b0b499a6149c44ca2ad9f3
+ }
+
+ @Override
-+ public ConsumeEffect.RemoveStatusEffects removeStatusEffects(final RegistryKeySet potionEffectTypeTagKey) {
++ public ConsumeEffect.RemoveStatusEffects removeStatusEffects(final RegistryKeySet effectTypes) {
+ return new PaperRemoveStatusEffects(
+ new net.minecraft.world.item.consume_effects.RemoveStatusEffectsConsumeEffect(
-+ PaperRegistrySets.convertToNms(Registries.MOB_EFFECT, BuiltInRegistries.BUILT_IN_CONVERSIONS.lookup(), potionEffectTypeTagKey)
++ PaperRegistrySets.convertToNms(Registries.MOB_EFFECT, BuiltInRegistries.BUILT_IN_CONVERSIONS.lookup(), effectTypes)
+ )
+ );
+ }
diff --git a/patches/server/1071-Expanded-Art-API.patch b/patches/server/1071-Expanded-Art-API.patch
index a088282574..56e4179720 100644
--- a/patches/server/1071-Expanded-Art-API.patch
+++ b/patches/server/1071-Expanded-Art-API.patch
@@ -5,48 +5,28 @@ Subject: [PATCH] Expanded Art API
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java
-index 40af940193d0df66bbcdcf5f46132e304016a4d7..932118f5e5bfc765c852acaf21f9721d8fa5fb6a 100644
+index 40af940193d0df66bbcdcf5f46132e304016a4d7..9d73954282104a6e315c1840feb7d6034d27cfbe 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java
-@@ -42,6 +42,9 @@ public class CraftArt implements Art, Handleable {
-
- private final NamespacedKey key;
- private final PaintingVariant paintingVariant;
-+ private final net.kyori.adventure.text.@org.jspecify.annotations.Nullable Component adventureTitle; // Paper - name and author components, assetId key
-+ private final net.kyori.adventure.text.@org.jspecify.annotations.Nullable Component adventureAuthor; // Paper - name and author components, assetId key
-+ private final net.kyori.adventure.key.@org.jspecify.annotations.NonNull Key adventureAssetId; // Paper - name and author components, assetId key
- private final String name;
- private final int ordinal;
-
-@@ -58,6 +61,9 @@ public class CraftArt implements Art, Handleable {
- this.name = key.toString();
- }
- this.ordinal = CraftArt.count++;
-+ this.adventureTitle = paintingVariant.title().map(io.papermc.paper.adventure.PaperAdventure::asAdventure).orElse(null); // Paper - name and author components, assetId key
-+ this.adventureAuthor = paintingVariant.author().map(io.papermc.paper.adventure.PaperAdventure::asAdventure).orElse(null); // Paper - name and author components, assetId key
-+ this.adventureAssetId = io.papermc.paper.adventure.PaperAdventure.asAdventure(paintingVariant.assetId()); // Paper - name and author components, assetId key
- }
-
- @Override
-@@ -75,6 +81,22 @@ public class CraftArt implements Art, Handleable {
+@@ -75,6 +75,22 @@ public class CraftArt implements Art, Handleable {
return this.paintingVariant.height();
}
-+ // Paper start - name and author components, assetId key
++ // Paper start - Expand Art API
+ @Override
-+ public net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component title() {
-+ return this.adventureTitle;
++ public net.kyori.adventure.text.Component title() {
++ return this.paintingVariant.title().map(io.papermc.paper.adventure.PaperAdventure::asAdventure).orElse(null);
+ }
+
+ @Override
-+ public net.kyori.adventure.text.@org.jetbrains.annotations.Nullable Component author() {
-+ return this.adventureAuthor;
++ public net.kyori.adventure.text.Component author() {
++ return this.paintingVariant.author().map(io.papermc.paper.adventure.PaperAdventure::asAdventure).orElse(null);
+ }
+
-+ public net.kyori.adventure.key.@org.jspecify.annotations.NonNull Key assetId() {
-+ return this.adventureAssetId;
++ public net.kyori.adventure.key.Key assetId() {
++ return io.papermc.paper.adventure.PaperAdventure.asAdventure(this.paintingVariant.assetId());
+ }
-+ // Paper end - name and author components, assetId key
++ // Paper end - Expand Art API
+
@Override
public int getId() {
From cf956ac8d29c20858248019049c5c73ecacc0857 Mon Sep 17 00:00:00 2001
From: Jake Potrebic
Date: Sun, 24 Nov 2024 13:32:52 -0800
Subject: [PATCH 02/13] Add all missing TagKey constants files (#11661)
---
.../keys/tags/BannerPatternTagKeys.java | 120 ++
.../registry/keys/tags/BiomeTagKeys.java | 533 +++++++
.../registry/keys/tags/BlockTypeTagKeys.java | 1348 +++++++++++++++++
.../registry/keys/tags/CatVariantTagKeys.java | 57 +
.../registry/keys/tags/DamageTypeTagKeys.java | 274 ++++
.../registry/keys/tags/FluidTagKeys.java | 57 +
.../registry/keys/tags/GameEventTagKeys.java | 78 +
.../registry/keys/tags/InstrumentTagKeys.java | 64 +
.../keys/tags/PaintingVariantTagKeys.java | 50 +
.../registry/keys/tags/StructureTagKeys.java | 198 +++
.../java/io/papermc/generator/Generators.java | 13 +-
11 files changed, 2791 insertions(+), 1 deletion(-)
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BannerPatternTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BiomeTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BlockTypeTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/CatVariantTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/DamageTypeTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/FluidTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/GameEventTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/InstrumentTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/PaintingVariantTagKeys.java
create mode 100644 paper-api-generator/generated/io/papermc/paper/registry/keys/tags/StructureTagKeys.java
diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BannerPatternTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BannerPatternTagKeys.java
new file mode 100644
index 0000000000..766dd79c0c
--- /dev/null
+++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BannerPatternTagKeys.java
@@ -0,0 +1,120 @@
+package io.papermc.paper.registry.keys.tags;
+
+import static net.kyori.adventure.key.Key.key;
+
+import io.papermc.paper.generated.GeneratedFrom;
+import io.papermc.paper.registry.RegistryKey;
+import io.papermc.paper.registry.tag.TagKey;
+import net.kyori.adventure.key.Key;
+import org.bukkit.block.banner.PatternType;
+import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+
+/**
+ * Vanilla keys for {@link RegistryKey#BANNER_PATTERN}.
+ *
+ * @apiNote The fields provided here are a direct representation of
+ * what is available from the vanilla game source. They may be
+ * changed (including removals) on any Minecraft version
+ * bump, so cross-version compatibility is not provided on the
+ * same level as it is on most of the other API.
+ */
+@SuppressWarnings({
+ "unused",
+ "SpellCheckingInspection"
+})
+@GeneratedFrom("1.21.3")
+@NullMarked
+@ApiStatus.Experimental
+public final class BannerPatternTagKeys {
+ /**
+ * {@code #minecraft:no_item_required}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey NO_ITEM_REQUIRED = create(key("no_item_required"));
+
+ /**
+ * {@code #minecraft:pattern_item/bordure_indented}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_BORDURE_INDENTED = create(key("pattern_item/bordure_indented"));
+
+ /**
+ * {@code #minecraft:pattern_item/creeper}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_CREEPER = create(key("pattern_item/creeper"));
+
+ /**
+ * {@code #minecraft:pattern_item/field_masoned}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_FIELD_MASONED = create(key("pattern_item/field_masoned"));
+
+ /**
+ * {@code #minecraft:pattern_item/flow}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_FLOW = create(key("pattern_item/flow"));
+
+ /**
+ * {@code #minecraft:pattern_item/flower}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_FLOWER = create(key("pattern_item/flower"));
+
+ /**
+ * {@code #minecraft:pattern_item/globe}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_GLOBE = create(key("pattern_item/globe"));
+
+ /**
+ * {@code #minecraft:pattern_item/guster}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_GUSTER = create(key("pattern_item/guster"));
+
+ /**
+ * {@code #minecraft:pattern_item/mojang}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_MOJANG = create(key("pattern_item/mojang"));
+
+ /**
+ * {@code #minecraft:pattern_item/piglin}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_PIGLIN = create(key("pattern_item/piglin"));
+
+ /**
+ * {@code #minecraft:pattern_item/skull}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PATTERN_ITEM_SKULL = create(key("pattern_item/skull"));
+
+ private BannerPatternTagKeys() {
+ }
+
+ /**
+ * Creates a tag key for {@link PatternType} in the registry {@code minecraft:banner_pattern}.
+ *
+ * @param key the tag key's key
+ * @return a new tag key
+ */
+ @ApiStatus.Experimental
+ public static TagKey create(final Key key) {
+ return TagKey.create(RegistryKey.BANNER_PATTERN, key);
+ }
+}
diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BiomeTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BiomeTagKeys.java
new file mode 100644
index 0000000000..d1aea0f7f8
--- /dev/null
+++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BiomeTagKeys.java
@@ -0,0 +1,533 @@
+package io.papermc.paper.registry.keys.tags;
+
+import static net.kyori.adventure.key.Key.key;
+
+import io.papermc.paper.generated.GeneratedFrom;
+import io.papermc.paper.registry.RegistryKey;
+import io.papermc.paper.registry.tag.TagKey;
+import net.kyori.adventure.key.Key;
+import org.bukkit.block.Biome;
+import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+
+/**
+ * Vanilla keys for {@link RegistryKey#BIOME}.
+ *
+ * @apiNote The fields provided here are a direct representation of
+ * what is available from the vanilla game source. They may be
+ * changed (including removals) on any Minecraft version
+ * bump, so cross-version compatibility is not provided on the
+ * same level as it is on most of the other API.
+ */
+@SuppressWarnings({
+ "unused",
+ "SpellCheckingInspection"
+})
+@GeneratedFrom("1.21.3")
+@NullMarked
+@ApiStatus.Experimental
+public final class BiomeTagKeys {
+ /**
+ * {@code #minecraft:allows_surface_slime_spawns}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ALLOWS_SURFACE_SLIME_SPAWNS = create(key("allows_surface_slime_spawns"));
+
+ /**
+ * {@code #minecraft:allows_tropical_fish_spawns_at_any_height}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ALLOWS_TROPICAL_FISH_SPAWNS_AT_ANY_HEIGHT = create(key("allows_tropical_fish_spawns_at_any_height"));
+
+ /**
+ * {@code #minecraft:has_closer_water_fog}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_CLOSER_WATER_FOG = create(key("has_closer_water_fog"));
+
+ /**
+ * {@code #minecraft:has_structure/ancient_city}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_ANCIENT_CITY = create(key("has_structure/ancient_city"));
+
+ /**
+ * {@code #minecraft:has_structure/bastion_remnant}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_BASTION_REMNANT = create(key("has_structure/bastion_remnant"));
+
+ /**
+ * {@code #minecraft:has_structure/buried_treasure}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_BURIED_TREASURE = create(key("has_structure/buried_treasure"));
+
+ /**
+ * {@code #minecraft:has_structure/desert_pyramid}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_DESERT_PYRAMID = create(key("has_structure/desert_pyramid"));
+
+ /**
+ * {@code #minecraft:has_structure/end_city}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_END_CITY = create(key("has_structure/end_city"));
+
+ /**
+ * {@code #minecraft:has_structure/igloo}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_IGLOO = create(key("has_structure/igloo"));
+
+ /**
+ * {@code #minecraft:has_structure/jungle_temple}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_JUNGLE_TEMPLE = create(key("has_structure/jungle_temple"));
+
+ /**
+ * {@code #minecraft:has_structure/mineshaft}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_MINESHAFT = create(key("has_structure/mineshaft"));
+
+ /**
+ * {@code #minecraft:has_structure/mineshaft_mesa}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_MINESHAFT_MESA = create(key("has_structure/mineshaft_mesa"));
+
+ /**
+ * {@code #minecraft:has_structure/nether_fortress}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_NETHER_FORTRESS = create(key("has_structure/nether_fortress"));
+
+ /**
+ * {@code #minecraft:has_structure/nether_fossil}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_NETHER_FOSSIL = create(key("has_structure/nether_fossil"));
+
+ /**
+ * {@code #minecraft:has_structure/ocean_monument}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_OCEAN_MONUMENT = create(key("has_structure/ocean_monument"));
+
+ /**
+ * {@code #minecraft:has_structure/ocean_ruin_cold}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_OCEAN_RUIN_COLD = create(key("has_structure/ocean_ruin_cold"));
+
+ /**
+ * {@code #minecraft:has_structure/ocean_ruin_warm}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_OCEAN_RUIN_WARM = create(key("has_structure/ocean_ruin_warm"));
+
+ /**
+ * {@code #minecraft:has_structure/pillager_outpost}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_PILLAGER_OUTPOST = create(key("has_structure/pillager_outpost"));
+
+ /**
+ * {@code #minecraft:has_structure/ruined_portal_desert}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_RUINED_PORTAL_DESERT = create(key("has_structure/ruined_portal_desert"));
+
+ /**
+ * {@code #minecraft:has_structure/ruined_portal_jungle}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_RUINED_PORTAL_JUNGLE = create(key("has_structure/ruined_portal_jungle"));
+
+ /**
+ * {@code #minecraft:has_structure/ruined_portal_mountain}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_RUINED_PORTAL_MOUNTAIN = create(key("has_structure/ruined_portal_mountain"));
+
+ /**
+ * {@code #minecraft:has_structure/ruined_portal_nether}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_RUINED_PORTAL_NETHER = create(key("has_structure/ruined_portal_nether"));
+
+ /**
+ * {@code #minecraft:has_structure/ruined_portal_ocean}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_RUINED_PORTAL_OCEAN = create(key("has_structure/ruined_portal_ocean"));
+
+ /**
+ * {@code #minecraft:has_structure/ruined_portal_standard}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_RUINED_PORTAL_STANDARD = create(key("has_structure/ruined_portal_standard"));
+
+ /**
+ * {@code #minecraft:has_structure/ruined_portal_swamp}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_RUINED_PORTAL_SWAMP = create(key("has_structure/ruined_portal_swamp"));
+
+ /**
+ * {@code #minecraft:has_structure/shipwreck}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_SHIPWRECK = create(key("has_structure/shipwreck"));
+
+ /**
+ * {@code #minecraft:has_structure/shipwreck_beached}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_SHIPWRECK_BEACHED = create(key("has_structure/shipwreck_beached"));
+
+ /**
+ * {@code #minecraft:has_structure/stronghold}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_STRONGHOLD = create(key("has_structure/stronghold"));
+
+ /**
+ * {@code #minecraft:has_structure/swamp_hut}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_SWAMP_HUT = create(key("has_structure/swamp_hut"));
+
+ /**
+ * {@code #minecraft:has_structure/trail_ruins}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_TRAIL_RUINS = create(key("has_structure/trail_ruins"));
+
+ /**
+ * {@code #minecraft:has_structure/trial_chambers}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_TRIAL_CHAMBERS = create(key("has_structure/trial_chambers"));
+
+ /**
+ * {@code #minecraft:has_structure/village_desert}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_VILLAGE_DESERT = create(key("has_structure/village_desert"));
+
+ /**
+ * {@code #minecraft:has_structure/village_plains}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_VILLAGE_PLAINS = create(key("has_structure/village_plains"));
+
+ /**
+ * {@code #minecraft:has_structure/village_savanna}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_VILLAGE_SAVANNA = create(key("has_structure/village_savanna"));
+
+ /**
+ * {@code #minecraft:has_structure/village_snowy}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_VILLAGE_SNOWY = create(key("has_structure/village_snowy"));
+
+ /**
+ * {@code #minecraft:has_structure/village_taiga}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_VILLAGE_TAIGA = create(key("has_structure/village_taiga"));
+
+ /**
+ * {@code #minecraft:has_structure/woodland_mansion}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HAS_STRUCTURE_WOODLAND_MANSION = create(key("has_structure/woodland_mansion"));
+
+ /**
+ * {@code #minecraft:increased_fire_burnout}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INCREASED_FIRE_BURNOUT = create(key("increased_fire_burnout"));
+
+ /**
+ * {@code #minecraft:is_badlands}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_BADLANDS = create(key("is_badlands"));
+
+ /**
+ * {@code #minecraft:is_beach}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_BEACH = create(key("is_beach"));
+
+ /**
+ * {@code #minecraft:is_deep_ocean}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_DEEP_OCEAN = create(key("is_deep_ocean"));
+
+ /**
+ * {@code #minecraft:is_end}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_END = create(key("is_end"));
+
+ /**
+ * {@code #minecraft:is_forest}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_FOREST = create(key("is_forest"));
+
+ /**
+ * {@code #minecraft:is_hill}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_HILL = create(key("is_hill"));
+
+ /**
+ * {@code #minecraft:is_jungle}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_JUNGLE = create(key("is_jungle"));
+
+ /**
+ * {@code #minecraft:is_mountain}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_MOUNTAIN = create(key("is_mountain"));
+
+ /**
+ * {@code #minecraft:is_nether}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_NETHER = create(key("is_nether"));
+
+ /**
+ * {@code #minecraft:is_ocean}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_OCEAN = create(key("is_ocean"));
+
+ /**
+ * {@code #minecraft:is_overworld}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_OVERWORLD = create(key("is_overworld"));
+
+ /**
+ * {@code #minecraft:is_river}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_RIVER = create(key("is_river"));
+
+ /**
+ * {@code #minecraft:is_savanna}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_SAVANNA = create(key("is_savanna"));
+
+ /**
+ * {@code #minecraft:is_taiga}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IS_TAIGA = create(key("is_taiga"));
+
+ /**
+ * {@code #minecraft:mineshaft_blocking}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MINESHAFT_BLOCKING = create(key("mineshaft_blocking"));
+
+ /**
+ * {@code #minecraft:more_frequent_drowned_spawns}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MORE_FREQUENT_DROWNED_SPAWNS = create(key("more_frequent_drowned_spawns"));
+
+ /**
+ * {@code #minecraft:plays_underwater_music}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PLAYS_UNDERWATER_MUSIC = create(key("plays_underwater_music"));
+
+ /**
+ * {@code #minecraft:polar_bears_spawn_on_alternate_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey POLAR_BEARS_SPAWN_ON_ALTERNATE_BLOCKS = create(key("polar_bears_spawn_on_alternate_blocks"));
+
+ /**
+ * {@code #minecraft:produces_corals_from_bonemeal}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PRODUCES_CORALS_FROM_BONEMEAL = create(key("produces_corals_from_bonemeal"));
+
+ /**
+ * {@code #minecraft:reduce_water_ambient_spawns}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey REDUCE_WATER_AMBIENT_SPAWNS = create(key("reduce_water_ambient_spawns"));
+
+ /**
+ * {@code #minecraft:required_ocean_monument_surrounding}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey REQUIRED_OCEAN_MONUMENT_SURROUNDING = create(key("required_ocean_monument_surrounding"));
+
+ /**
+ * {@code #minecraft:snow_golem_melts}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey SNOW_GOLEM_MELTS = create(key("snow_golem_melts"));
+
+ /**
+ * {@code #minecraft:spawns_cold_variant_frogs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey SPAWNS_COLD_VARIANT_FROGS = create(key("spawns_cold_variant_frogs"));
+
+ /**
+ * {@code #minecraft:spawns_gold_rabbits}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey SPAWNS_GOLD_RABBITS = create(key("spawns_gold_rabbits"));
+
+ /**
+ * {@code #minecraft:spawns_snow_foxes}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey SPAWNS_SNOW_FOXES = create(key("spawns_snow_foxes"));
+
+ /**
+ * {@code #minecraft:spawns_warm_variant_frogs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey SPAWNS_WARM_VARIANT_FROGS = create(key("spawns_warm_variant_frogs"));
+
+ /**
+ * {@code #minecraft:spawns_white_rabbits}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey SPAWNS_WHITE_RABBITS = create(key("spawns_white_rabbits"));
+
+ /**
+ * {@code #minecraft:stronghold_biased_to}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey STRONGHOLD_BIASED_TO = create(key("stronghold_biased_to"));
+
+ /**
+ * {@code #minecraft:water_on_map_outlines}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey WATER_ON_MAP_OUTLINES = create(key("water_on_map_outlines"));
+
+ /**
+ * {@code #minecraft:without_patrol_spawns}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey WITHOUT_PATROL_SPAWNS = create(key("without_patrol_spawns"));
+
+ /**
+ * {@code #minecraft:without_wandering_trader_spawns}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey WITHOUT_WANDERING_TRADER_SPAWNS = create(key("without_wandering_trader_spawns"));
+
+ /**
+ * {@code #minecraft:without_zombie_sieges}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey WITHOUT_ZOMBIE_SIEGES = create(key("without_zombie_sieges"));
+
+ private BiomeTagKeys() {
+ }
+
+ /**
+ * Creates a tag key for {@link Biome} in the registry {@code minecraft:worldgen/biome}.
+ *
+ * @param key the tag key's key
+ * @return a new tag key
+ */
+ @ApiStatus.Experimental
+ public static TagKey create(final Key key) {
+ return TagKey.create(RegistryKey.BIOME, key);
+ }
+}
diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BlockTypeTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BlockTypeTagKeys.java
new file mode 100644
index 0000000000..dcf9dddf97
--- /dev/null
+++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/BlockTypeTagKeys.java
@@ -0,0 +1,1348 @@
+package io.papermc.paper.registry.keys.tags;
+
+import static net.kyori.adventure.key.Key.key;
+
+import io.papermc.paper.generated.GeneratedFrom;
+import io.papermc.paper.registry.RegistryKey;
+import io.papermc.paper.registry.tag.TagKey;
+import net.kyori.adventure.key.Key;
+import org.bukkit.MinecraftExperimental;
+import org.bukkit.block.BlockType;
+import org.jetbrains.annotations.ApiStatus;
+import org.jspecify.annotations.NullMarked;
+
+/**
+ * Vanilla keys for {@link RegistryKey#BLOCK}.
+ *
+ * @apiNote The fields provided here are a direct representation of
+ * what is available from the vanilla game source. They may be
+ * changed (including removals) on any Minecraft version
+ * bump, so cross-version compatibility is not provided on the
+ * same level as it is on most of the other API.
+ */
+@SuppressWarnings({
+ "unused",
+ "SpellCheckingInspection"
+})
+@GeneratedFrom("1.21.3")
+@NullMarked
+@ApiStatus.Experimental
+public final class BlockTypeTagKeys {
+ /**
+ * {@code #minecraft:acacia_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ACACIA_LOGS = create(key("acacia_logs"));
+
+ /**
+ * {@code #minecraft:air}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey AIR = create(key("air"));
+
+ /**
+ * {@code #minecraft:all_hanging_signs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ALL_HANGING_SIGNS = create(key("all_hanging_signs"));
+
+ /**
+ * {@code #minecraft:all_signs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ALL_SIGNS = create(key("all_signs"));
+
+ /**
+ * {@code #minecraft:ancient_city_replaceable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ANCIENT_CITY_REPLACEABLE = create(key("ancient_city_replaceable"));
+
+ /**
+ * {@code #minecraft:animals_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ANIMALS_SPAWNABLE_ON = create(key("animals_spawnable_on"));
+
+ /**
+ * {@code #minecraft:anvil}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ANVIL = create(key("anvil"));
+
+ /**
+ * {@code #minecraft:armadillo_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ARMADILLO_SPAWNABLE_ON = create(key("armadillo_spawnable_on"));
+
+ /**
+ * {@code #minecraft:axolotls_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey AXOLOTLS_SPAWNABLE_ON = create(key("axolotls_spawnable_on"));
+
+ /**
+ * {@code #minecraft:azalea_grows_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey AZALEA_GROWS_ON = create(key("azalea_grows_on"));
+
+ /**
+ * {@code #minecraft:azalea_root_replaceable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey AZALEA_ROOT_REPLACEABLE = create(key("azalea_root_replaceable"));
+
+ /**
+ * {@code #minecraft:badlands_terracotta}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BADLANDS_TERRACOTTA = create(key("badlands_terracotta"));
+
+ /**
+ * {@code #minecraft:bamboo_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BAMBOO_BLOCKS = create(key("bamboo_blocks"));
+
+ /**
+ * {@code #minecraft:bamboo_plantable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BAMBOO_PLANTABLE_ON = create(key("bamboo_plantable_on"));
+
+ /**
+ * {@code #minecraft:banners}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BANNERS = create(key("banners"));
+
+ /**
+ * {@code #minecraft:base_stone_nether}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BASE_STONE_NETHER = create(key("base_stone_nether"));
+
+ /**
+ * {@code #minecraft:base_stone_overworld}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BASE_STONE_OVERWORLD = create(key("base_stone_overworld"));
+
+ /**
+ * {@code #minecraft:bats_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BATS_SPAWNABLE_ON = create(key("bats_spawnable_on"));
+
+ /**
+ * {@code #minecraft:beacon_base_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BEACON_BASE_BLOCKS = create(key("beacon_base_blocks"));
+
+ /**
+ * {@code #minecraft:beds}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BEDS = create(key("beds"));
+
+ /**
+ * {@code #minecraft:bee_growables}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BEE_GROWABLES = create(key("bee_growables"));
+
+ /**
+ * {@code #minecraft:beehives}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BEEHIVES = create(key("beehives"));
+
+ /**
+ * {@code #minecraft:big_dripleaf_placeable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BIG_DRIPLEAF_PLACEABLE = create(key("big_dripleaf_placeable"));
+
+ /**
+ * {@code #minecraft:birch_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BIRCH_LOGS = create(key("birch_logs"));
+
+ /**
+ * {@code #minecraft:blocks_wind_charge_explosions}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BLOCKS_WIND_CHARGE_EXPLOSIONS = create(key("blocks_wind_charge_explosions"));
+
+ /**
+ * {@code #minecraft:buttons}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey BUTTONS = create(key("buttons"));
+
+ /**
+ * {@code #minecraft:camel_sand_step_sound_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CAMEL_SAND_STEP_SOUND_BLOCKS = create(key("camel_sand_step_sound_blocks"));
+
+ /**
+ * {@code #minecraft:campfires}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CAMPFIRES = create(key("campfires"));
+
+ /**
+ * {@code #minecraft:candle_cakes}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CANDLE_CAKES = create(key("candle_cakes"));
+
+ /**
+ * {@code #minecraft:candles}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CANDLES = create(key("candles"));
+
+ /**
+ * {@code #minecraft:cauldrons}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CAULDRONS = create(key("cauldrons"));
+
+ /**
+ * {@code #minecraft:cave_vines}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CAVE_VINES = create(key("cave_vines"));
+
+ /**
+ * {@code #minecraft:ceiling_hanging_signs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CEILING_HANGING_SIGNS = create(key("ceiling_hanging_signs"));
+
+ /**
+ * {@code #minecraft:cherry_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CHERRY_LOGS = create(key("cherry_logs"));
+
+ /**
+ * {@code #minecraft:climbable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CLIMBABLE = create(key("climbable"));
+
+ /**
+ * {@code #minecraft:coal_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey COAL_ORES = create(key("coal_ores"));
+
+ /**
+ * {@code #minecraft:combination_step_sound_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey COMBINATION_STEP_SOUND_BLOCKS = create(key("combination_step_sound_blocks"));
+
+ /**
+ * {@code #minecraft:completes_find_tree_tutorial}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey COMPLETES_FIND_TREE_TUTORIAL = create(key("completes_find_tree_tutorial"));
+
+ /**
+ * {@code #minecraft:concrete_powder}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CONCRETE_POWDER = create(key("concrete_powder"));
+
+ /**
+ * {@code #minecraft:convertable_to_mud}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CONVERTABLE_TO_MUD = create(key("convertable_to_mud"));
+
+ /**
+ * {@code #minecraft:copper_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey COPPER_ORES = create(key("copper_ores"));
+
+ /**
+ * {@code #minecraft:coral_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CORAL_BLOCKS = create(key("coral_blocks"));
+
+ /**
+ * {@code #minecraft:coral_plants}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CORAL_PLANTS = create(key("coral_plants"));
+
+ /**
+ * {@code #minecraft:corals}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CORALS = create(key("corals"));
+
+ /**
+ * {@code #minecraft:crimson_stems}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CRIMSON_STEMS = create(key("crimson_stems"));
+
+ /**
+ * {@code #minecraft:crops}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CROPS = create(key("crops"));
+
+ /**
+ * {@code #minecraft:crystal_sound_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey CRYSTAL_SOUND_BLOCKS = create(key("crystal_sound_blocks"));
+
+ /**
+ * {@code #minecraft:dampens_vibrations}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DAMPENS_VIBRATIONS = create(key("dampens_vibrations"));
+
+ /**
+ * {@code #minecraft:dark_oak_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DARK_OAK_LOGS = create(key("dark_oak_logs"));
+
+ /**
+ * {@code #minecraft:dead_bush_may_place_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DEAD_BUSH_MAY_PLACE_ON = create(key("dead_bush_may_place_on"));
+
+ /**
+ * {@code #minecraft:deepslate_ore_replaceables}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DEEPSLATE_ORE_REPLACEABLES = create(key("deepslate_ore_replaceables"));
+
+ /**
+ * {@code #minecraft:diamond_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DIAMOND_ORES = create(key("diamond_ores"));
+
+ /**
+ * {@code #minecraft:dirt}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DIRT = create(key("dirt"));
+
+ /**
+ * {@code #minecraft:does_not_block_hoppers}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DOES_NOT_BLOCK_HOPPERS = create(key("does_not_block_hoppers"));
+
+ /**
+ * {@code #minecraft:doors}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DOORS = create(key("doors"));
+
+ /**
+ * {@code #minecraft:dragon_immune}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DRAGON_IMMUNE = create(key("dragon_immune"));
+
+ /**
+ * {@code #minecraft:dragon_transparent}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DRAGON_TRANSPARENT = create(key("dragon_transparent"));
+
+ /**
+ * {@code #minecraft:dripstone_replaceable_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey DRIPSTONE_REPLACEABLE_BLOCKS = create(key("dripstone_replaceable_blocks"));
+
+ /**
+ * {@code #minecraft:emerald_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey EMERALD_ORES = create(key("emerald_ores"));
+
+ /**
+ * {@code #minecraft:enchantment_power_provider}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ENCHANTMENT_POWER_PROVIDER = create(key("enchantment_power_provider"));
+
+ /**
+ * {@code #minecraft:enchantment_power_transmitter}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ENCHANTMENT_POWER_TRANSMITTER = create(key("enchantment_power_transmitter"));
+
+ /**
+ * {@code #minecraft:enderman_holdable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ENDERMAN_HOLDABLE = create(key("enderman_holdable"));
+
+ /**
+ * {@code #minecraft:fall_damage_resetting}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FALL_DAMAGE_RESETTING = create(key("fall_damage_resetting"));
+
+ /**
+ * {@code #minecraft:features_cannot_replace}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FEATURES_CANNOT_REPLACE = create(key("features_cannot_replace"));
+
+ /**
+ * {@code #minecraft:fence_gates}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FENCE_GATES = create(key("fence_gates"));
+
+ /**
+ * {@code #minecraft:fences}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FENCES = create(key("fences"));
+
+ /**
+ * {@code #minecraft:fire}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FIRE = create(key("fire"));
+
+ /**
+ * {@code #minecraft:flower_pots}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FLOWER_POTS = create(key("flower_pots"));
+
+ /**
+ * {@code #minecraft:flowers}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FLOWERS = create(key("flowers"));
+
+ /**
+ * {@code #minecraft:foxes_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FOXES_SPAWNABLE_ON = create(key("foxes_spawnable_on"));
+
+ /**
+ * {@code #minecraft:frog_prefer_jump_to}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FROG_PREFER_JUMP_TO = create(key("frog_prefer_jump_to"));
+
+ /**
+ * {@code #minecraft:frogs_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey FROGS_SPAWNABLE_ON = create(key("frogs_spawnable_on"));
+
+ /**
+ * {@code #minecraft:geode_invalid_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey GEODE_INVALID_BLOCKS = create(key("geode_invalid_blocks"));
+
+ /**
+ * {@code #minecraft:goats_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey GOATS_SPAWNABLE_ON = create(key("goats_spawnable_on"));
+
+ /**
+ * {@code #minecraft:gold_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey GOLD_ORES = create(key("gold_ores"));
+
+ /**
+ * {@code #minecraft:guarded_by_piglins}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey GUARDED_BY_PIGLINS = create(key("guarded_by_piglins"));
+
+ /**
+ * {@code #minecraft:hoglin_repellents}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey HOGLIN_REPELLENTS = create(key("hoglin_repellents"));
+
+ /**
+ * {@code #minecraft:ice}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey ICE = create(key("ice"));
+
+ /**
+ * {@code #minecraft:impermeable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IMPERMEABLE = create(key("impermeable"));
+
+ /**
+ * {@code #minecraft:incorrect_for_diamond_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INCORRECT_FOR_DIAMOND_TOOL = create(key("incorrect_for_diamond_tool"));
+
+ /**
+ * {@code #minecraft:incorrect_for_gold_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INCORRECT_FOR_GOLD_TOOL = create(key("incorrect_for_gold_tool"));
+
+ /**
+ * {@code #minecraft:incorrect_for_iron_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INCORRECT_FOR_IRON_TOOL = create(key("incorrect_for_iron_tool"));
+
+ /**
+ * {@code #minecraft:incorrect_for_netherite_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INCORRECT_FOR_NETHERITE_TOOL = create(key("incorrect_for_netherite_tool"));
+
+ /**
+ * {@code #minecraft:incorrect_for_stone_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INCORRECT_FOR_STONE_TOOL = create(key("incorrect_for_stone_tool"));
+
+ /**
+ * {@code #minecraft:incorrect_for_wooden_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INCORRECT_FOR_WOODEN_TOOL = create(key("incorrect_for_wooden_tool"));
+
+ /**
+ * {@code #minecraft:infiniburn_end}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INFINIBURN_END = create(key("infiniburn_end"));
+
+ /**
+ * {@code #minecraft:infiniburn_nether}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INFINIBURN_NETHER = create(key("infiniburn_nether"));
+
+ /**
+ * {@code #minecraft:infiniburn_overworld}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INFINIBURN_OVERWORLD = create(key("infiniburn_overworld"));
+
+ /**
+ * {@code #minecraft:inside_step_sound_blocks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INSIDE_STEP_SOUND_BLOCKS = create(key("inside_step_sound_blocks"));
+
+ /**
+ * {@code #minecraft:invalid_spawn_inside}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey INVALID_SPAWN_INSIDE = create(key("invalid_spawn_inside"));
+
+ /**
+ * {@code #minecraft:iron_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey IRON_ORES = create(key("iron_ores"));
+
+ /**
+ * {@code #minecraft:jungle_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey JUNGLE_LOGS = create(key("jungle_logs"));
+
+ /**
+ * {@code #minecraft:lapis_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey LAPIS_ORES = create(key("lapis_ores"));
+
+ /**
+ * {@code #minecraft:lava_pool_stone_cannot_replace}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey LAVA_POOL_STONE_CANNOT_REPLACE = create(key("lava_pool_stone_cannot_replace"));
+
+ /**
+ * {@code #minecraft:leaves}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey LEAVES = create(key("leaves"));
+
+ /**
+ * {@code #minecraft:logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey LOGS = create(key("logs"));
+
+ /**
+ * {@code #minecraft:logs_that_burn}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey LOGS_THAT_BURN = create(key("logs_that_burn"));
+
+ /**
+ * {@code #minecraft:lush_ground_replaceable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey LUSH_GROUND_REPLACEABLE = create(key("lush_ground_replaceable"));
+
+ /**
+ * {@code #minecraft:maintains_farmland}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MAINTAINS_FARMLAND = create(key("maintains_farmland"));
+
+ /**
+ * {@code #minecraft:mangrove_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MANGROVE_LOGS = create(key("mangrove_logs"));
+
+ /**
+ * {@code #minecraft:mangrove_logs_can_grow_through}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MANGROVE_LOGS_CAN_GROW_THROUGH = create(key("mangrove_logs_can_grow_through"));
+
+ /**
+ * {@code #minecraft:mangrove_roots_can_grow_through}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MANGROVE_ROOTS_CAN_GROW_THROUGH = create(key("mangrove_roots_can_grow_through"));
+
+ /**
+ * {@code #minecraft:mineable/axe}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MINEABLE_AXE = create(key("mineable/axe"));
+
+ /**
+ * {@code #minecraft:mineable/hoe}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MINEABLE_HOE = create(key("mineable/hoe"));
+
+ /**
+ * {@code #minecraft:mineable/pickaxe}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MINEABLE_PICKAXE = create(key("mineable/pickaxe"));
+
+ /**
+ * {@code #minecraft:mineable/shovel}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MINEABLE_SHOVEL = create(key("mineable/shovel"));
+
+ /**
+ * {@code #minecraft:mob_interactable_doors}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MOB_INTERACTABLE_DOORS = create(key("mob_interactable_doors"));
+
+ /**
+ * {@code #minecraft:mooshrooms_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MOOSHROOMS_SPAWNABLE_ON = create(key("mooshrooms_spawnable_on"));
+
+ /**
+ * {@code #minecraft:moss_replaceable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MOSS_REPLACEABLE = create(key("moss_replaceable"));
+
+ /**
+ * {@code #minecraft:mushroom_grow_block}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey MUSHROOM_GROW_BLOCK = create(key("mushroom_grow_block"));
+
+ /**
+ * {@code #minecraft:needs_diamond_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey NEEDS_DIAMOND_TOOL = create(key("needs_diamond_tool"));
+
+ /**
+ * {@code #minecraft:needs_iron_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey NEEDS_IRON_TOOL = create(key("needs_iron_tool"));
+
+ /**
+ * {@code #minecraft:needs_stone_tool}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey NEEDS_STONE_TOOL = create(key("needs_stone_tool"));
+
+ /**
+ * {@code #minecraft:nether_carver_replaceables}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey NETHER_CARVER_REPLACEABLES = create(key("nether_carver_replaceables"));
+
+ /**
+ * {@code #minecraft:nylium}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey NYLIUM = create(key("nylium"));
+
+ /**
+ * {@code #minecraft:oak_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey OAK_LOGS = create(key("oak_logs"));
+
+ /**
+ * {@code #minecraft:occludes_vibration_signals}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey OCCLUDES_VIBRATION_SIGNALS = create(key("occludes_vibration_signals"));
+
+ /**
+ * {@code #minecraft:overworld_carver_replaceables}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey OVERWORLD_CARVER_REPLACEABLES = create(key("overworld_carver_replaceables"));
+
+ /**
+ * {@code #minecraft:overworld_natural_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey OVERWORLD_NATURAL_LOGS = create(key("overworld_natural_logs"));
+
+ /**
+ * {@code #minecraft:pale_oak_logs}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ @ApiStatus.Experimental
+ @MinecraftExperimental(MinecraftExperimental.Requires.WINTER_DROP)
+ public static final TagKey PALE_OAK_LOGS = create(key("pale_oak_logs"));
+
+ /**
+ * {@code #minecraft:parrots_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PARROTS_SPAWNABLE_ON = create(key("parrots_spawnable_on"));
+
+ /**
+ * {@code #minecraft:piglin_repellents}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PIGLIN_REPELLENTS = create(key("piglin_repellents"));
+
+ /**
+ * {@code #minecraft:planks}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PLANKS = create(key("planks"));
+
+ /**
+ * {@code #minecraft:polar_bears_spawnable_on_alternate}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey POLAR_BEARS_SPAWNABLE_ON_ALTERNATE = create(key("polar_bears_spawnable_on_alternate"));
+
+ /**
+ * {@code #minecraft:portals}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PORTALS = create(key("portals"));
+
+ /**
+ * {@code #minecraft:pressure_plates}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PRESSURE_PLATES = create(key("pressure_plates"));
+
+ /**
+ * {@code #minecraft:prevent_mob_spawning_inside}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey PREVENT_MOB_SPAWNING_INSIDE = create(key("prevent_mob_spawning_inside"));
+
+ /**
+ * {@code #minecraft:rabbits_spawnable_on}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey RABBITS_SPAWNABLE_ON = create(key("rabbits_spawnable_on"));
+
+ /**
+ * {@code #minecraft:rails}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey RAILS = create(key("rails"));
+
+ /**
+ * {@code #minecraft:redstone_ores}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey REDSTONE_ORES = create(key("redstone_ores"));
+
+ /**
+ * {@code #minecraft:replaceable}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey REPLACEABLE = create(key("replaceable"));
+
+ /**
+ * {@code #minecraft:replaceable_by_trees}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey REPLACEABLE_BY_TREES = create(key("replaceable_by_trees"));
+
+ /**
+ * {@code #minecraft:sand}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey SAND = create(key("sand"));
+
+ /**
+ * {@code #minecraft:saplings}
+ *
+ * @apiNote This field is version-dependant and may be removed in future Minecraft versions
+ */
+ public static final TagKey