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> 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> 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 SAPLINGS = create(key("saplings")); + + /** + * {@code #minecraft:sculk_replaceable} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SCULK_REPLACEABLE = create(key("sculk_replaceable")); + + /** + * {@code #minecraft:sculk_replaceable_world_gen} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SCULK_REPLACEABLE_WORLD_GEN = create(key("sculk_replaceable_world_gen")); + + /** + * {@code #minecraft:shulker_boxes} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SHULKER_BOXES = create(key("shulker_boxes")); + + /** + * {@code #minecraft:signs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SIGNS = create(key("signs")); + + /** + * {@code #minecraft:slabs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SLABS = create(key("slabs")); + + /** + * {@code #minecraft:small_dripleaf_placeable} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SMALL_DRIPLEAF_PLACEABLE = create(key("small_dripleaf_placeable")); + + /** + * {@code #minecraft:small_flowers} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SMALL_FLOWERS = create(key("small_flowers")); + + /** + * {@code #minecraft:smelts_to_glass} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SMELTS_TO_GLASS = create(key("smelts_to_glass")); + + /** + * {@code #minecraft:snaps_goat_horn} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SNAPS_GOAT_HORN = create(key("snaps_goat_horn")); + + /** + * {@code #minecraft:sniffer_diggable_block} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SNIFFER_DIGGABLE_BLOCK = create(key("sniffer_diggable_block")); + + /** + * {@code #minecraft:sniffer_egg_hatch_boost} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SNIFFER_EGG_HATCH_BOOST = create(key("sniffer_egg_hatch_boost")); + + /** + * {@code #minecraft:snow} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SNOW = create(key("snow")); + + /** + * {@code #minecraft:snow_layer_can_survive_on} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SNOW_LAYER_CAN_SURVIVE_ON = create(key("snow_layer_can_survive_on")); + + /** + * {@code #minecraft:snow_layer_cannot_survive_on} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SNOW_LAYER_CANNOT_SURVIVE_ON = create(key("snow_layer_cannot_survive_on")); + + /** + * {@code #minecraft:soul_fire_base_blocks} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SOUL_FIRE_BASE_BLOCKS = create(key("soul_fire_base_blocks")); + + /** + * {@code #minecraft:soul_speed_blocks} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SOUL_SPEED_BLOCKS = create(key("soul_speed_blocks")); + + /** + * {@code #minecraft:spruce_logs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SPRUCE_LOGS = create(key("spruce_logs")); + + /** + * {@code #minecraft:stairs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey STAIRS = create(key("stairs")); + + /** + * {@code #minecraft:standing_signs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey STANDING_SIGNS = create(key("standing_signs")); + + /** + * {@code #minecraft:stone_bricks} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey STONE_BRICKS = create(key("stone_bricks")); + + /** + * {@code #minecraft:stone_buttons} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey STONE_BUTTONS = create(key("stone_buttons")); + + /** + * {@code #minecraft:stone_ore_replaceables} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey STONE_ORE_REPLACEABLES = create(key("stone_ore_replaceables")); + + /** + * {@code #minecraft:stone_pressure_plates} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey STONE_PRESSURE_PLATES = create(key("stone_pressure_plates")); + + /** + * {@code #minecraft:strider_warm_blocks} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey STRIDER_WARM_BLOCKS = create(key("strider_warm_blocks")); + + /** + * {@code #minecraft:sword_efficient} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SWORD_EFFICIENT = create(key("sword_efficient")); + + /** + * {@code #minecraft:tall_flowers} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey TALL_FLOWERS = create(key("tall_flowers")); + + /** + * {@code #minecraft:terracotta} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey TERRACOTTA = create(key("terracotta")); + + /** + * {@code #minecraft:trail_ruins_replaceable} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey TRAIL_RUINS_REPLACEABLE = create(key("trail_ruins_replaceable")); + + /** + * {@code #minecraft:trapdoors} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey TRAPDOORS = create(key("trapdoors")); + + /** + * {@code #minecraft:underwater_bonemeals} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey UNDERWATER_BONEMEALS = create(key("underwater_bonemeals")); + + /** + * {@code #minecraft:unstable_bottom_center} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey UNSTABLE_BOTTOM_CENTER = create(key("unstable_bottom_center")); + + /** + * {@code #minecraft:valid_spawn} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey VALID_SPAWN = create(key("valid_spawn")); + + /** + * {@code #minecraft:vibration_resonators} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey VIBRATION_RESONATORS = create(key("vibration_resonators")); + + /** + * {@code #minecraft:wall_corals} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WALL_CORALS = create(key("wall_corals")); + + /** + * {@code #minecraft:wall_hanging_signs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WALL_HANGING_SIGNS = create(key("wall_hanging_signs")); + + /** + * {@code #minecraft:wall_post_override} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WALL_POST_OVERRIDE = create(key("wall_post_override")); + + /** + * {@code #minecraft:wall_signs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WALL_SIGNS = create(key("wall_signs")); + + /** + * {@code #minecraft:walls} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WALLS = create(key("walls")); + + /** + * {@code #minecraft:warped_stems} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WARPED_STEMS = create(key("warped_stems")); + + /** + * {@code #minecraft:wart_blocks} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WART_BLOCKS = create(key("wart_blocks")); + + /** + * {@code #minecraft:wither_immune} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WITHER_IMMUNE = create(key("wither_immune")); + + /** + * {@code #minecraft:wither_summon_base_blocks} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WITHER_SUMMON_BASE_BLOCKS = create(key("wither_summon_base_blocks")); + + /** + * {@code #minecraft:wolves_spawnable_on} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOLVES_SPAWNABLE_ON = create(key("wolves_spawnable_on")); + + /** + * {@code #minecraft:wooden_buttons} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOODEN_BUTTONS = create(key("wooden_buttons")); + + /** + * {@code #minecraft:wooden_doors} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOODEN_DOORS = create(key("wooden_doors")); + + /** + * {@code #minecraft:wooden_fences} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOODEN_FENCES = create(key("wooden_fences")); + + /** + * {@code #minecraft:wooden_pressure_plates} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOODEN_PRESSURE_PLATES = create(key("wooden_pressure_plates")); + + /** + * {@code #minecraft:wooden_slabs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOODEN_SLABS = create(key("wooden_slabs")); + + /** + * {@code #minecraft:wooden_stairs} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOODEN_STAIRS = create(key("wooden_stairs")); + + /** + * {@code #minecraft:wooden_trapdoors} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOODEN_TRAPDOORS = create(key("wooden_trapdoors")); + + /** + * {@code #minecraft:wool} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOOL = create(key("wool")); + + /** + * {@code #minecraft:wool_carpets} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WOOL_CARPETS = create(key("wool_carpets")); + + private BlockTypeTagKeys() { + } + + /** + * Creates a tag key for {@link BlockType} in the registry {@code minecraft:block}. + * + * @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.BLOCK, key); + } +} diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/CatVariantTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/CatVariantTagKeys.java new file mode 100644 index 0000000000..2557a4a3f1 --- /dev/null +++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/CatVariantTagKeys.java @@ -0,0 +1,57 @@ +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.entity.Cat; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Vanilla keys for {@link RegistryKey#CAT_VARIANT}. + * + * @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 CatVariantTagKeys { + /** + * {@code #minecraft:default_spawns} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey DEFAULT_SPAWNS = create(key("default_spawns")); + + /** + * {@code #minecraft:full_moon_spawns} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey FULL_MOON_SPAWNS = create(key("full_moon_spawns")); + + private CatVariantTagKeys() { + } + + /** + * Creates a tag key for {@link Cat.Type} in the registry {@code minecraft:cat_variant}. + * + * @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.CAT_VARIANT, key); + } +} diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/DamageTypeTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/DamageTypeTagKeys.java new file mode 100644 index 0000000000..084d2832b5 --- /dev/null +++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/DamageTypeTagKeys.java @@ -0,0 +1,274 @@ +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.damage.DamageType; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Vanilla keys for {@link RegistryKey#DAMAGE_TYPE}. + * + * @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 DamageTypeTagKeys { + /** + * {@code #minecraft:always_hurts_ender_dragons} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ALWAYS_HURTS_ENDER_DRAGONS = create(key("always_hurts_ender_dragons")); + + /** + * {@code #minecraft:always_kills_armor_stands} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ALWAYS_KILLS_ARMOR_STANDS = create(key("always_kills_armor_stands")); + + /** + * {@code #minecraft:always_most_significant_fall} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ALWAYS_MOST_SIGNIFICANT_FALL = create(key("always_most_significant_fall")); + + /** + * {@code #minecraft:always_triggers_silverfish} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ALWAYS_TRIGGERS_SILVERFISH = create(key("always_triggers_silverfish")); + + /** + * {@code #minecraft:avoids_guardian_thorns} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey AVOIDS_GUARDIAN_THORNS = create(key("avoids_guardian_thorns")); + + /** + * {@code #minecraft:burn_from_stepping} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BURN_FROM_STEPPING = create(key("burn_from_stepping")); + + /** + * {@code #minecraft:burns_armor_stands} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BURNS_ARMOR_STANDS = create(key("burns_armor_stands")); + + /** + * {@code #minecraft:bypasses_armor} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BYPASSES_ARMOR = create(key("bypasses_armor")); + + /** + * {@code #minecraft:bypasses_effects} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BYPASSES_EFFECTS = create(key("bypasses_effects")); + + /** + * {@code #minecraft:bypasses_enchantments} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BYPASSES_ENCHANTMENTS = create(key("bypasses_enchantments")); + + /** + * {@code #minecraft:bypasses_invulnerability} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BYPASSES_INVULNERABILITY = create(key("bypasses_invulnerability")); + + /** + * {@code #minecraft:bypasses_resistance} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BYPASSES_RESISTANCE = create(key("bypasses_resistance")); + + /** + * {@code #minecraft:bypasses_shield} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BYPASSES_SHIELD = create(key("bypasses_shield")); + + /** + * {@code #minecraft:bypasses_wolf_armor} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey BYPASSES_WOLF_ARMOR = create(key("bypasses_wolf_armor")); + + /** + * {@code #minecraft:can_break_armor_stand} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey CAN_BREAK_ARMOR_STAND = create(key("can_break_armor_stand")); + + /** + * {@code #minecraft:damages_helmet} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey DAMAGES_HELMET = create(key("damages_helmet")); + + /** + * {@code #minecraft:ignites_armor_stands} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IGNITES_ARMOR_STANDS = create(key("ignites_armor_stands")); + + /** + * {@code #minecraft:is_drowning} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_DROWNING = create(key("is_drowning")); + + /** + * {@code #minecraft:is_explosion} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_EXPLOSION = create(key("is_explosion")); + + /** + * {@code #minecraft:is_fall} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_FALL = create(key("is_fall")); + + /** + * {@code #minecraft:is_fire} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_FIRE = create(key("is_fire")); + + /** + * {@code #minecraft:is_freezing} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_FREEZING = create(key("is_freezing")); + + /** + * {@code #minecraft:is_lightning} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_LIGHTNING = create(key("is_lightning")); + + /** + * {@code #minecraft:is_player_attack} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_PLAYER_ATTACK = create(key("is_player_attack")); + + /** + * {@code #minecraft:is_projectile} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IS_PROJECTILE = create(key("is_projectile")); + + /** + * {@code #minecraft:mace_smash} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey MACE_SMASH = create(key("mace_smash")); + + /** + * {@code #minecraft:no_anger} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey NO_ANGER = create(key("no_anger")); + + /** + * {@code #minecraft:no_impact} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey NO_IMPACT = create(key("no_impact")); + + /** + * {@code #minecraft:no_knockback} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey NO_KNOCKBACK = create(key("no_knockback")); + + /** + * {@code #minecraft:panic_causes} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey PANIC_CAUSES = create(key("panic_causes")); + + /** + * {@code #minecraft:panic_environmental_causes} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey PANIC_ENVIRONMENTAL_CAUSES = create(key("panic_environmental_causes")); + + /** + * {@code #minecraft:witch_resistant_to} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WITCH_RESISTANT_TO = create(key("witch_resistant_to")); + + /** + * {@code #minecraft:wither_immune_to} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WITHER_IMMUNE_TO = create(key("wither_immune_to")); + + private DamageTypeTagKeys() { + } + + /** + * Creates a tag key for {@link DamageType} in the registry {@code minecraft:damage_type}. + * + * @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.DAMAGE_TYPE, key); + } +} diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/FluidTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/FluidTagKeys.java new file mode 100644 index 0000000000..5574a7813a --- /dev/null +++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/FluidTagKeys.java @@ -0,0 +1,57 @@ +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.Fluid; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Vanilla keys for {@link RegistryKey#FLUID}. + * + * @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 FluidTagKeys { + /** + * {@code #minecraft:lava} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey LAVA = create(key("lava")); + + /** + * {@code #minecraft:water} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WATER = create(key("water")); + + private FluidTagKeys() { + } + + /** + * Creates a tag key for {@link Fluid} in the registry {@code minecraft:fluid}. + * + * @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.FLUID, key); + } +} diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/GameEventTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/GameEventTagKeys.java new file mode 100644 index 0000000000..06209e840b --- /dev/null +++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/GameEventTagKeys.java @@ -0,0 +1,78 @@ +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.GameEvent; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Vanilla keys for {@link RegistryKey#GAME_EVENT}. + * + * @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 GameEventTagKeys { + /** + * {@code #minecraft:allay_can_listen} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ALLAY_CAN_LISTEN = create(key("allay_can_listen")); + + /** + * {@code #minecraft:ignore_vibrations_sneaking} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey IGNORE_VIBRATIONS_SNEAKING = create(key("ignore_vibrations_sneaking")); + + /** + * {@code #minecraft:shrieker_can_listen} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SHRIEKER_CAN_LISTEN = create(key("shrieker_can_listen")); + + /** + * {@code #minecraft:vibrations} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey VIBRATIONS = create(key("vibrations")); + + /** + * {@code #minecraft:warden_can_listen} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey WARDEN_CAN_LISTEN = create(key("warden_can_listen")); + + private GameEventTagKeys() { + } + + /** + * Creates a tag key for {@link GameEvent} in the registry {@code minecraft:game_event}. + * + * @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.GAME_EVENT, key); + } +} diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/InstrumentTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/InstrumentTagKeys.java new file mode 100644 index 0000000000..5a74738058 --- /dev/null +++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/InstrumentTagKeys.java @@ -0,0 +1,64 @@ +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.MusicInstrument; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Vanilla keys for {@link RegistryKey#INSTRUMENT}. + * + * @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 InstrumentTagKeys { + /** + * {@code #minecraft:goat_horns} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey GOAT_HORNS = create(key("goat_horns")); + + /** + * {@code #minecraft:regular_goat_horns} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey REGULAR_GOAT_HORNS = create(key("regular_goat_horns")); + + /** + * {@code #minecraft:screaming_goat_horns} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SCREAMING_GOAT_HORNS = create(key("screaming_goat_horns")); + + private InstrumentTagKeys() { + } + + /** + * Creates a tag key for {@link MusicInstrument} in the registry {@code minecraft:instrument}. + * + * @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.INSTRUMENT, key); + } +} diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/PaintingVariantTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/PaintingVariantTagKeys.java new file mode 100644 index 0000000000..4ca9f37200 --- /dev/null +++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/PaintingVariantTagKeys.java @@ -0,0 +1,50 @@ +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.Art; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Vanilla keys for {@link RegistryKey#PAINTING_VARIANT}. + * + * @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 PaintingVariantTagKeys { + /** + * {@code #minecraft:placeable} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey PLACEABLE = create(key("placeable")); + + private PaintingVariantTagKeys() { + } + + /** + * Creates a tag key for {@link Art} in the registry {@code minecraft:painting_variant}. + * + * @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.PAINTING_VARIANT, key); + } +} diff --git a/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/StructureTagKeys.java b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/StructureTagKeys.java new file mode 100644 index 0000000000..7c98210107 --- /dev/null +++ b/paper-api-generator/generated/io/papermc/paper/registry/keys/tags/StructureTagKeys.java @@ -0,0 +1,198 @@ +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.generator.structure.Structure; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Vanilla keys for {@link RegistryKey#STRUCTURE}. + * + * @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 StructureTagKeys { + /** + * {@code #minecraft:cats_spawn_as_black} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey CATS_SPAWN_AS_BLACK = create(key("cats_spawn_as_black")); + + /** + * {@code #minecraft:cats_spawn_in} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey CATS_SPAWN_IN = create(key("cats_spawn_in")); + + /** + * {@code #minecraft:dolphin_located} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey DOLPHIN_LOCATED = create(key("dolphin_located")); + + /** + * {@code #minecraft:eye_of_ender_located} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey EYE_OF_ENDER_LOCATED = create(key("eye_of_ender_located")); + + /** + * {@code #minecraft:mineshaft} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey MINESHAFT = create(key("mineshaft")); + + /** + * {@code #minecraft:ocean_ruin} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey OCEAN_RUIN = create(key("ocean_ruin")); + + /** + * {@code #minecraft:on_desert_village_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + @ApiStatus.Experimental + @MinecraftExperimental(MinecraftExperimental.Requires.TRADE_REBALANCE) + public static final TagKey ON_DESERT_VILLAGE_MAPS = create(key("on_desert_village_maps")); + + /** + * {@code #minecraft:on_jungle_explorer_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + @ApiStatus.Experimental + @MinecraftExperimental(MinecraftExperimental.Requires.TRADE_REBALANCE) + public static final TagKey ON_JUNGLE_EXPLORER_MAPS = create(key("on_jungle_explorer_maps")); + + /** + * {@code #minecraft:on_ocean_explorer_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ON_OCEAN_EXPLORER_MAPS = create(key("on_ocean_explorer_maps")); + + /** + * {@code #minecraft:on_plains_village_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + @ApiStatus.Experimental + @MinecraftExperimental(MinecraftExperimental.Requires.TRADE_REBALANCE) + public static final TagKey ON_PLAINS_VILLAGE_MAPS = create(key("on_plains_village_maps")); + + /** + * {@code #minecraft:on_savanna_village_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + @ApiStatus.Experimental + @MinecraftExperimental(MinecraftExperimental.Requires.TRADE_REBALANCE) + public static final TagKey ON_SAVANNA_VILLAGE_MAPS = create(key("on_savanna_village_maps")); + + /** + * {@code #minecraft:on_snowy_village_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + @ApiStatus.Experimental + @MinecraftExperimental(MinecraftExperimental.Requires.TRADE_REBALANCE) + public static final TagKey ON_SNOWY_VILLAGE_MAPS = create(key("on_snowy_village_maps")); + + /** + * {@code #minecraft:on_swamp_explorer_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + @ApiStatus.Experimental + @MinecraftExperimental(MinecraftExperimental.Requires.TRADE_REBALANCE) + public static final TagKey ON_SWAMP_EXPLORER_MAPS = create(key("on_swamp_explorer_maps")); + + /** + * {@code #minecraft:on_taiga_village_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + @ApiStatus.Experimental + @MinecraftExperimental(MinecraftExperimental.Requires.TRADE_REBALANCE) + public static final TagKey ON_TAIGA_VILLAGE_MAPS = create(key("on_taiga_village_maps")); + + /** + * {@code #minecraft:on_treasure_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ON_TREASURE_MAPS = create(key("on_treasure_maps")); + + /** + * {@code #minecraft:on_trial_chambers_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ON_TRIAL_CHAMBERS_MAPS = create(key("on_trial_chambers_maps")); + + /** + * {@code #minecraft:on_woodland_explorer_maps} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey ON_WOODLAND_EXPLORER_MAPS = create(key("on_woodland_explorer_maps")); + + /** + * {@code #minecraft:ruined_portal} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey RUINED_PORTAL = create(key("ruined_portal")); + + /** + * {@code #minecraft:shipwreck} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey SHIPWRECK = create(key("shipwreck")); + + /** + * {@code #minecraft:village} + * + * @apiNote This field is version-dependant and may be removed in future Minecraft versions + */ + public static final TagKey VILLAGE = create(key("village")); + + private StructureTagKeys() { + } + + /** + * Creates a tag key for {@link Structure} in the registry {@code minecraft:worldgen/structure}. + * + * @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.STRUCTURE, key); + } +} diff --git a/paper-api-generator/src/main/java/io/papermc/generator/Generators.java b/paper-api-generator/src/main/java/io/papermc/generator/Generators.java index a33d52a696..73e4f70825 100644 --- a/paper-api-generator/src/main/java/io/papermc/generator/Generators.java +++ b/paper-api-generator/src/main/java/io/papermc/generator/Generators.java @@ -66,8 +66,19 @@ public interface Generators { simpleKey("InstrumentKeys", MusicInstrument.class, Registries.INSTRUMENT, RegistryKey.INSTRUMENT, true), // tags - simpleTagKey("EnchantmentTagKeys", Enchantment.class, Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT), + simpleTagKey("GameEventTagKeys", GameEvent.class, Registries.GAME_EVENT, RegistryKey.GAME_EVENT), + simpleTagKey("BlockTypeTagKeys", BlockType.class, Registries.BLOCK, RegistryKey.BLOCK), simpleTagKey("ItemTypeTagKeys", ItemType.class, Registries.ITEM, RegistryKey.ITEM), + simpleTagKey("CatVariantTagKeys", Cat.Type.class, Registries.CAT_VARIANT, RegistryKey.CAT_VARIANT), + simpleTagKey("FluidTagKeys", Fluid.class, Registries.FLUID, RegistryKey.FLUID), + + simpleTagKey("BiomeTagKeys", Biome.class, Registries.BIOME, RegistryKey.BIOME), + simpleTagKey("StructureTagKeys", Structure.class, Registries.STRUCTURE, RegistryKey.STRUCTURE), + simpleTagKey("DamageTypeTagKeys", DamageType.class, Registries.DAMAGE_TYPE, RegistryKey.DAMAGE_TYPE), + simpleTagKey("EnchantmentTagKeys", Enchantment.class, Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT), + simpleTagKey("BannerPatternTagKeys", PatternType.class, Registries.BANNER_PATTERN, RegistryKey.BANNER_PATTERN), + simpleTagKey("PaintingVariantTagKeys", Art.class, Registries.PAINTING_VARIANT, RegistryKey.PAINTING_VARIANT), + simpleTagKey("InstrumentTagKeys", MusicInstrument.class, Registries.INSTRUMENT, RegistryKey.INSTRUMENT), new MobGoalGenerator("VanillaGoal", "com.destroystokyo.paper.entity.ai") }; From 5b53cb404dd798b4346593cf4b65b41b7762ce7e Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Sun, 24 Nov 2024 19:26:32 -0800 Subject: [PATCH 03/13] [ci skip] use more jspecify in server --- ...gistryAccess-for-managing-Registries.patch | 91 +++++----- .../0992-Registry-Modification-API.patch | 157 +++++++++--------- ...0993-Add-registry-entry-and-builders.patch | 58 +++---- patches/server/1035-DataComponent-API.patch | 4 +- 4 files changed, 148 insertions(+), 162 deletions(-) diff --git a/patches/server/0466-Add-RegistryAccess-for-managing-Registries.patch b/patches/server/0466-Add-RegistryAccess-for-managing-Registries.patch index 24764d91ee..721db48bdb 100644 --- a/patches/server/0466-Add-RegistryAccess-for-managing-Registries.patch +++ b/patches/server/0466-Add-RegistryAccess-for-managing-Registries.patch @@ -12,10 +12,10 @@ public net.minecraft.server.RegistryLayer STATIC_ACCESS diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistries.java b/src/main/java/io/papermc/paper/registry/PaperRegistries.java new file mode 100644 -index 0000000000000000000000000000000000000000..2f22f46f80b80be43a2cc1cd8afb51f4d1fd0e91 +index 0000000000000000000000000000000000000000..cd8a6a4c2a63029f8f859765088c227bbd456813 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/PaperRegistries.java -@@ -0,0 +1,157 @@ +@@ -0,0 +1,154 @@ +package io.papermc.paper.registry; + +import com.google.common.base.Preconditions; @@ -81,14 +81,11 @@ index 0000000000000000000000000000000000000000..2f22f46f80b80be43a2cc1cd8afb51f4 +import org.bukkit.inventory.meta.trim.TrimPattern; +import org.bukkit.map.MapCursor; +import org.bukkit.potion.PotionEffectType; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; -+import org.checkerframework.framework.qual.DefaultQualifier; ++import org.jspecify.annotations.Nullable; + +import static io.papermc.paper.registry.entry.RegistryEntry.apiOnly; +import static io.papermc.paper.registry.entry.RegistryEntry.entry; + -+@DefaultQualifier(NonNull.class) +public final class PaperRegistries { + + static final List> REGISTRY_ENTRIES; @@ -175,10 +172,10 @@ index 0000000000000000000000000000000000000000..2f22f46f80b80be43a2cc1cd8afb51f4 +} diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java b/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java new file mode 100644 -index 0000000000000000000000000000000000000000..35b6a7c5bac9640332a833bd3627f2bcb1bbf2f3 +index 0000000000000000000000000000000000000000..4bf7915867dbe762ef0b070d67d5f7b7d1ee4f03 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java -@@ -0,0 +1,127 @@ +@@ -0,0 +1,122 @@ +package io.papermc.paper.registry; + +import io.papermc.paper.registry.entry.ApiRegistryEntry; @@ -194,14 +191,9 @@ index 0000000000000000000000000000000000000000..35b6a7c5bac9640332a833bd3627f2bc +import net.minecraft.resources.ResourceKey; +import org.bukkit.Keyed; +import org.bukkit.Registry; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; -+import org.checkerframework.framework.qual.DefaultQualifier; +import org.jetbrains.annotations.VisibleForTesting; ++import org.jspecify.annotations.Nullable; + -+import static java.util.Objects.requireNonNull; -+ -+@DefaultQualifier(NonNull.class) +public class PaperRegistryAccess implements RegistryAccess { + + // We store the API registries in a memoized supplier, so they can be created on-demand. @@ -224,14 +216,14 @@ index 0000000000000000000000000000000000000000..35b6a7c5bac9640332a833bd3627f2bc + @Deprecated(forRemoval = true) + @Override + public @Nullable Registry getRegistry(final Class type) { -+ final @Nullable RegistryKey registryKey = byType(type); ++ final RegistryKey registryKey = byType(type); + // If our mapping from Class -> RegistryKey did not contain the passed type it was either a completely invalid type or a registry + // that merely exists as a SimpleRegistry in the org.bukkit.Registry type. We cannot return a registry for these, return null + // as per method contract in Bukkit#getRegistry. + if (registryKey == null) return null; + -+ final @Nullable RegistryEntry entry = PaperRegistries.getEntry(registryKey); -+ final @Nullable RegistryHolder registry = (RegistryHolder) this.registries.get(registryKey); ++ final RegistryEntry entry = PaperRegistries.getEntry(registryKey); ++ final RegistryHolder registry = (RegistryHolder) this.registries.get(registryKey); + if (registry != null) { + // if the registry exists, return right away. Since this is the "legacy" method, we return DelayedRegistry + // for the non-builtin Registry instances stored as fields in Registry. @@ -352,10 +344,10 @@ index 0000000000000000000000000000000000000000..6d134ace042758da722960cbcb48e525 +} diff --git a/src/main/java/io/papermc/paper/registry/RegistryHolder.java b/src/main/java/io/papermc/paper/registry/RegistryHolder.java new file mode 100644 -index 0000000000000000000000000000000000000000..a31bdd9f02fe75a87fceb2ebe8c36b3232a561cc +index 0000000000000000000000000000000000000000..1b52d4bc868e1e5f84c8416301e193bb9cd315b2 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/RegistryHolder.java -@@ -0,0 +1,47 @@ +@@ -0,0 +1,44 @@ +package io.papermc.paper.registry; + +import com.google.common.base.Suppliers; @@ -364,10 +356,7 @@ index 0000000000000000000000000000000000000000..a31bdd9f02fe75a87fceb2ebe8c36b32 +import java.util.function.Supplier; +import org.bukkit.Keyed; +import org.bukkit.Registry; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; + -+@DefaultQualifier(NonNull.class) +public interface RegistryHolder { + + Registry get(); @@ -471,10 +460,10 @@ index 0000000000000000000000000000000000000000..ceb217dbbb84e8bd51365dd47bf91971 +} diff --git a/src/main/java/io/papermc/paper/registry/entry/CraftRegistryEntry.java b/src/main/java/io/papermc/paper/registry/entry/CraftRegistryEntry.java new file mode 100644 -index 0000000000000000000000000000000000000000..9bb4aa926978f117901c9f99c45a6862a1d5ce30 +index 0000000000000000000000000000000000000000..45cbc425da64f0bd3290600869ad425d9e6e912b --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/entry/CraftRegistryEntry.java -@@ -0,0 +1,51 @@ +@@ -0,0 +1,48 @@ +package io.papermc.paper.registry.entry; + +import com.google.common.base.Preconditions; @@ -487,10 +476,7 @@ index 0000000000000000000000000000000000000000..9bb4aa926978f117901c9f99c45a6862 +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.util.ApiVersion; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; + -+@DefaultQualifier(NonNull.class) +public class CraftRegistryEntry extends BaseRegistryEntry { // TODO remove Keyed + + private static final BiFunction EMPTY = (namespacedKey, apiVersion) -> namespacedKey; @@ -528,10 +514,10 @@ index 0000000000000000000000000000000000000000..9bb4aa926978f117901c9f99c45a6862 +} diff --git a/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java b/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java new file mode 100644 -index 0000000000000000000000000000000000000000..15991bf13894d850f360a520d1815711d25973ec +index 0000000000000000000000000000000000000000..2889d87f0989ae5744cd4c1e57240830aa574155 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java -@@ -0,0 +1,51 @@ +@@ -0,0 +1,48 @@ +package io.papermc.paper.registry.entry; + +import io.papermc.paper.registry.RegistryHolder; @@ -544,10 +530,7 @@ index 0000000000000000000000000000000000000000..15991bf13894d850f360a520d1815711 +import org.bukkit.Keyed; +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.util.ApiVersion; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; + -+@DefaultQualifier(NonNull.class) +public interface RegistryEntry extends RegistryEntryInfo { // TODO remove Keyed + + RegistryHolder createRegistryHolder(Registry nmsRegistry); @@ -603,34 +586,29 @@ index 0000000000000000000000000000000000000000..0ae855e80fc9fddfc1feb33c7a974820 +} diff --git a/src/main/java/io/papermc/paper/registry/entry/package-info.java b/src/main/java/io/papermc/paper/registry/entry/package-info.java new file mode 100644 -index 0000000000000000000000000000000000000000..e4c94d6860e0f5b643cde1ded20b5503c02a4866 +index 0000000000000000000000000000000000000000..f04e93aa5ca41ce1cf3b152f827911fdf0dd10cb --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/entry/package-info.java -@@ -0,0 +1,5 @@ -+@DefaultQualifier(NonNull.class) +@@ -0,0 +1,4 @@ ++@NullMarked +package io.papermc.paper.registry.entry; + -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; ++import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java b/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java new file mode 100644 -index 0000000000000000000000000000000000000000..9400fed345344a0a8e4fb301cca6a1867adf625b +index 0000000000000000000000000000000000000000..ca829b162d4369f845e59b62bb8779fd83fe2ef3 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java -@@ -0,0 +1,61 @@ +@@ -0,0 +1,57 @@ +package io.papermc.paper.registry.legacy; + +import java.util.Iterator; +import java.util.function.Supplier; +import java.util.stream.Stream; -+import net.kyori.adventure.key.Key; +import org.bukkit.Keyed; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; -+import org.bukkit.craftbukkit.CraftRegistry; -+import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; -+import org.jetbrains.annotations.NotNull; ++import org.jspecify.annotations.Nullable; + +/** + * This is to support the now-deprecated fields in {@link Registry} for @@ -638,7 +616,7 @@ index 0000000000000000000000000000000000000000..9400fed345344a0a8e4fb301cca6a186 + */ +public final class DelayedRegistry> implements Registry { + -+ private @MonotonicNonNull Supplier delegate; ++ private @Nullable Supplier delegate; + + public void load(final Supplier registry) { + if (this.delegate != null) { @@ -660,7 +638,7 @@ index 0000000000000000000000000000000000000000..9400fed345344a0a8e4fb301cca6a186 + } + + @Override -+ public @NotNull T getOrThrow(@NotNull final NamespacedKey key) { ++ public T getOrThrow(final NamespacedKey key) { + return this.delegate().getOrThrow(key); + } + @@ -675,7 +653,7 @@ index 0000000000000000000000000000000000000000..9400fed345344a0a8e4fb301cca6a186 + } + + @Override -+ public NamespacedKey getKey(final T value) { ++ public @Nullable NamespacedKey getKey(final T value) { + return this.delegate().getKey(value); + } +} @@ -752,15 +730,24 @@ index 0000000000000000000000000000000000000000..83870816cd4c54f94a3c603ffe41c11e +} diff --git a/src/main/java/io/papermc/paper/registry/legacy/package-info.java b/src/main/java/io/papermc/paper/registry/legacy/package-info.java new file mode 100644 -index 0000000000000000000000000000000000000000..4396982af55872fafbfeaf8161ad6f392726c773 +index 0000000000000000000000000000000000000000..063a8d7a7313d5d685d51df54d9502d72266da49 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/legacy/package-info.java -@@ -0,0 +1,5 @@ -+@DefaultQualifier(NonNull.class) +@@ -0,0 +1,4 @@ ++@NullMarked +package io.papermc.paper.registry.legacy; + -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; ++import org.jspecify.annotations.NullMarked; +diff --git a/src/main/java/io/papermc/paper/registry/package-info.java b/src/main/java/io/papermc/paper/registry/package-info.java +new file mode 100644 +index 0000000000000000000000000000000000000000..ca07ef31161e938d48214992b34cafb712a51513 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/registry/package-info.java +@@ -0,0 +1,4 @@ ++@NullMarked ++package io.papermc.paper.registry; ++ ++import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/net/minecraft/core/registries/BuiltInRegistries.java b/src/main/java/net/minecraft/core/registries/BuiltInRegistries.java index 3f72e30b57fb2a4231e22a2234729408c1240af4..4638ba98dbbdb0f880337347be85a6e0fbed2191 100644 --- a/src/main/java/net/minecraft/core/registries/BuiltInRegistries.java diff --git a/patches/server/0992-Registry-Modification-API.patch b/patches/server/0992-Registry-Modification-API.patch index d79be5372f..f498936e5f 100644 --- a/patches/server/0992-Registry-Modification-API.patch +++ b/patches/server/0992-Registry-Modification-API.patch @@ -11,7 +11,7 @@ public net.minecraft.resources.RegistryOps lookupProvider public net.minecraft.resources.RegistryOps$HolderLookupAdapter diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistries.java b/src/main/java/io/papermc/paper/registry/PaperRegistries.java -index 2f22f46f80b80be43a2cc1cd8afb51f4d1fd0e91..3ec2aa5da045b62809afd2c13fc9ae74189dbdad 100644 +index cd8a6a4c2a63029f8f859765088c227bbd456813..86c9f87cdb41c0d1ccc2a61b501f969cfaae47bc 100644 --- a/src/main/java/io/papermc/paper/registry/PaperRegistries.java +++ b/src/main/java/io/papermc/paper/registry/PaperRegistries.java @@ -3,6 +3,7 @@ package io.papermc.paper.registry; @@ -22,15 +22,15 @@ index 2f22f46f80b80be43a2cc1cd8afb51f4d1fd0e91..3ec2aa5da045b62809afd2c13fc9ae74 import java.util.Collections; import java.util.IdentityHashMap; import java.util.List; -@@ -69,6 +70,7 @@ import org.checkerframework.framework.qual.DefaultQualifier; +@@ -67,6 +68,7 @@ import org.jspecify.annotations.Nullable; import static io.papermc.paper.registry.entry.RegistryEntry.apiOnly; import static io.papermc.paper.registry.entry.RegistryEntry.entry; +import static io.papermc.paper.registry.entry.RegistryEntry.writable; - @DefaultQualifier(NonNull.class) public final class PaperRegistries { -@@ -152,6 +154,15 @@ public final class PaperRegistries { + +@@ -149,6 +151,15 @@ public final class PaperRegistries { return ResourceKey.create((ResourceKey>) PaperRegistries.registryToNms(typedKey.registryKey()), PaperAdventure.asVanilla(typedKey.key())); } @@ -47,10 +47,10 @@ index 2f22f46f80b80be43a2cc1cd8afb51f4d1fd0e91..3ec2aa5da045b62809afd2c13fc9ae74 } } diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java b/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java -index 35b6a7c5bac9640332a833bd3627f2bcb1bbf2f3..1026b9c04f94ed73049b980822a2eafdbacea7fd 100644 +index 4bf7915867dbe762ef0b070d67d5f7b7d1ee4f03..ed071ed34e16812f133102b0d66a5201a94639f2 100644 --- a/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java +++ b/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java -@@ -83,6 +83,14 @@ public class PaperRegistryAccess implements RegistryAccess { +@@ -78,6 +78,14 @@ public class PaperRegistryAccess implements RegistryAccess { return possiblyUnwrap(registryHolder.get()); } @@ -67,15 +67,14 @@ index 35b6a7c5bac9640332a833bd3627f2bcb1bbf2f3..1026b9c04f94ed73049b980822a2eafd return delayedRegistry.delegate(); diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java b/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java new file mode 100644 -index 0000000000000000000000000000000000000000..528c6ee1739d92f766f3904acd7fc5734c93388a +index 0000000000000000000000000000000000000000..69e63689083207de2f409557d4a9a17f8ad7ae3e --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java -@@ -0,0 +1,26 @@ +@@ -0,0 +1,25 @@ +package io.papermc.paper.registry; + +import io.papermc.paper.registry.data.util.Conversions; -+import net.minecraft.resources.RegistryOps; -+import org.checkerframework.checker.nullness.qual.Nullable; ++import org.jspecify.annotations.Nullable; + +public interface PaperRegistryBuilder extends RegistryBuilder { + @@ -99,7 +98,7 @@ index 0000000000000000000000000000000000000000..528c6ee1739d92f766f3904acd7fc573 +} diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java b/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java new file mode 100644 -index 0000000000000000000000000000000000000000..69e946173407eb05b18a2b19b0d45cbb3213570b +index 0000000000000000000000000000000000000000..60d9b806a09bb103e36ce1f932a5a34ef408770a --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java @@ -0,0 +1,183 @@ @@ -133,8 +132,8 @@ index 0000000000000000000000000000000000000000..69e946173407eb05b18a2b19b0d45cbb +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; -+import org.checkerframework.checker.nullness.qual.Nullable; +import org.intellij.lang.annotations.Subst; ++import org.jspecify.annotations.Nullable; + +public class PaperRegistryListenerManager { + @@ -201,7 +200,7 @@ index 0000000000000000000000000000000000000000..69e946173407eb05b18a2b19b0d45cbb + final Conversions conversions + ) { + Preconditions.checkState(LaunchEntryPointHandler.INSTANCE.hasEntered(Entrypoint.BOOTSTRAPPER), registry.key() + " tried to run modification listeners before bootstrappers have been called"); // verify that bootstrappers have been called -+ final @Nullable RegistryEntryInfo entry = PaperRegistries.getEntry(registry.key()); ++ final RegistryEntryInfo entry = PaperRegistries.getEntry(registry.key()); + if (!RegistryEntry.Modifiable.isModifiable(entry) || !this.valueAddEventTypes.hasHandlers(entry.apiKey())) { + return registerMethod.register((WritableRegistry) registry, key, nms, registrationInfo); + } @@ -262,7 +261,7 @@ index 0000000000000000000000000000000000000000..69e946173407eb05b18a2b19b0d45cbb + } + + public > void runFreezeListeners(final ResourceKey> resourceKey, final Conversions conversions) { -+ final @Nullable RegistryEntryInfo entry = PaperRegistries.getEntry(resourceKey); ++ final RegistryEntryInfo entry = PaperRegistries.getEntry(resourceKey); + if (!RegistryEntry.Addable.isAddable(entry) || !this.freezeEventTypes.hasHandlers(entry.apiKey())) { + return; + } @@ -320,7 +319,7 @@ index 6d134ace042758da722960cbcb48e52508dafd61..cc39bc68d29055ef6429f08f975412bd } diff --git a/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java b/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java new file mode 100644 -index 0000000000000000000000000000000000000000..78317c7ab42a666f19634593a8f3b696700764c8 +index 0000000000000000000000000000000000000000..ef91352d442d9ddd666af6bde9a186ce15e5aa04 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java @@ -0,0 +1,92 @@ @@ -341,7 +340,7 @@ index 0000000000000000000000000000000000000000..78317c7ab42a666f19634593a8f3b696 +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.CraftRegistry; +import org.bukkit.craftbukkit.util.ApiVersion; -+import org.checkerframework.checker.nullness.qual.Nullable; ++import org.jspecify.annotations.Nullable; + +public class WritableCraftRegistry> extends CraftRegistry { + @@ -418,22 +417,19 @@ index 0000000000000000000000000000000000000000..78317c7ab42a666f19634593a8f3b696 +} diff --git a/src/main/java/io/papermc/paper/registry/data/util/Conversions.java b/src/main/java/io/papermc/paper/registry/data/util/Conversions.java new file mode 100644 -index 0000000000000000000000000000000000000000..eda5cc7d45ef59ccc1c9c7e027c1f044f1dcc86b +index 0000000000000000000000000000000000000000..1e9a0143bc3b70dfc5e129a0fe849ff3e01447ab --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/data/util/Conversions.java -@@ -0,0 +1,36 @@ +@@ -0,0 +1,33 @@ +package io.papermc.paper.registry.data.util; + +import com.mojang.serialization.JavaOps; +import io.papermc.paper.adventure.WrapperAwareSerializer; +import net.kyori.adventure.text.Component; +import net.minecraft.resources.RegistryOps; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; -+import org.checkerframework.framework.qual.DefaultQualifier; +import org.jetbrains.annotations.Contract; ++import org.jspecify.annotations.Nullable; + -+@DefaultQualifier(NonNull.class) +public class Conversions { + + private final RegistryOps.RegistryInfoLookup lookup; @@ -458,6 +454,16 @@ index 0000000000000000000000000000000000000000..eda5cc7d45ef59ccc1c9c7e027c1f044 + return vanilla == null ? Component.empty() : this.serializer.deserialize(vanilla); + } +} +diff --git a/src/main/java/io/papermc/paper/registry/data/util/package-info.java b/src/main/java/io/papermc/paper/registry/data/util/package-info.java +new file mode 100644 +index 0000000000000000000000000000000000000000..5b88be976c7773459ce1b6daf58d7ea7c806f21b +--- /dev/null ++++ b/src/main/java/io/papermc/paper/registry/data/util/package-info.java +@@ -0,0 +1,4 @@ ++@NullMarked ++package io.papermc.paper.registry.data.util; ++ ++import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/papermc/paper/registry/entry/AddableRegistryEntry.java b/src/main/java/io/papermc/paper/registry/entry/AddableRegistryEntry.java new file mode 100644 index 0000000000000000000000000000000000000000..aeec9b3ae2911f041d000b3db72f37974020ba60 @@ -547,7 +553,7 @@ index 0000000000000000000000000000000000000000..515a995e3862f8e7cb93d149315ea32e + } +} diff --git a/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java b/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java -index 15991bf13894d850f360a520d1815711d25973ec..f2e919705301cb23ed1938ca3c1976378249172c 100644 +index 2889d87f0989ae5744cd4c1e57240830aa574155..9494bcf82101340e04559d850570698947b7a9ff 100644 --- a/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java +++ b/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java @@ -1,7 +1,13 @@ @@ -564,15 +570,15 @@ index 15991bf13894d850f360a520d1815711d25973ec..f2e919705301cb23ed1938ca3c197637 import io.papermc.paper.registry.legacy.DelayedRegistryEntry; import java.util.function.BiFunction; import java.util.function.Supplier; -@@ -11,6 +17,7 @@ import org.bukkit.Keyed; +@@ -10,6 +16,7 @@ import net.minecraft.resources.ResourceKey; + import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.util.ApiVersion; - import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; - import org.checkerframework.framework.qual.DefaultQualifier; ++import org.jspecify.annotations.Nullable; - @DefaultQualifier(NonNull.class) -@@ -32,6 +39,65 @@ public interface RegistryEntry extends RegistryEntryInfo extends RegistryEntryInfo { // TODO remove Keyed + +@@ -29,6 +36,65 @@ public interface RegistryEntry extends RegistryEntryInfo(this); } @@ -638,7 +644,7 @@ index 15991bf13894d850f360a520d1815711d25973ec..f2e919705301cb23ed1938ca3c197637 static RegistryEntry entry( final ResourceKey> mcKey, final RegistryKey apiKey, -@@ -48,4 +114,24 @@ public interface RegistryEntry extends RegistryEntryInfo extends RegistryEntryInfo(mcKey, apiKey, apiRegistrySupplier); } @@ -693,10 +699,10 @@ index 0000000000000000000000000000000000000000..562accce731630327d116afd1c9d559d +} diff --git a/src/main/java/io/papermc/paper/registry/event/RegistryEntryAddEventImpl.java b/src/main/java/io/papermc/paper/registry/event/RegistryEntryAddEventImpl.java new file mode 100644 -index 0000000000000000000000000000000000000000..cc9c8fd313f530777af80ad79e03903f3f8f9829 +index 0000000000000000000000000000000000000000..332829c65ef45966dffcf5f1c59422a801179759 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/event/RegistryEntryAddEventImpl.java -@@ -0,0 +1,30 @@ +@@ -0,0 +1,29 @@ +package io.papermc.paper.registry.event; + +import io.papermc.paper.plugin.lifecycle.event.PaperLifecycleEvent; @@ -711,7 +717,6 @@ index 0000000000000000000000000000000000000000..cc9c8fd313f530777af80ad79e03903f +import net.minecraft.core.HolderSet; +import net.minecraft.resources.RegistryOps; +import org.bukkit.Keyed; -+import org.checkerframework.checker.nullness.qual.NonNull; + +public record RegistryEntryAddEventImpl>( + TypedKey key, @@ -721,7 +726,7 @@ index 0000000000000000000000000000000000000000..cc9c8fd313f530777af80ad79e03903f +) implements RegistryEntryAddEvent, PaperLifecycleEvent { + + @Override -+ public @NonNull Tag getOrCreateTag(final TagKey tagKey) { ++ public Tag getOrCreateTag(final TagKey tagKey) { + final RegistryOps.RegistryInfo registryInfo = this.conversions.lookup().lookup(PaperRegistries.registryToNms(tagKey.registryKey())).orElseThrow(); + final HolderSet.Named tagSet = registryInfo.getter().getOrThrow(PaperRegistries.toNms(tagKey)); + return new NamedRegistryKeySetImpl<>(tagKey, tagSet); @@ -810,10 +815,10 @@ index 0000000000000000000000000000000000000000..34c842ffa355e3c8001dd7b8551bcb49 +} diff --git a/src/main/java/io/papermc/paper/registry/event/RegistryFreezeEventImpl.java b/src/main/java/io/papermc/paper/registry/event/RegistryFreezeEventImpl.java new file mode 100644 -index 0000000000000000000000000000000000000000..63957d2509e68ccc6eb2fd9ecaa35bfad7b71b81 +index 0000000000000000000000000000000000000000..1b45802f9afc97fd59c6dc77964dedea1016cd6c --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/event/RegistryFreezeEventImpl.java -@@ -0,0 +1,28 @@ +@@ -0,0 +1,27 @@ +package io.papermc.paper.registry.event; + +import io.papermc.paper.plugin.lifecycle.event.PaperLifecycleEvent; @@ -827,7 +832,6 @@ index 0000000000000000000000000000000000000000..63957d2509e68ccc6eb2fd9ecaa35bfa +import net.minecraft.core.HolderSet; +import net.minecraft.resources.RegistryOps; +import org.bukkit.Keyed; -+import org.checkerframework.checker.nullness.qual.NonNull; + +public record RegistryFreezeEventImpl>( + RegistryKey registryKey, @@ -836,7 +840,7 @@ index 0000000000000000000000000000000000000000..63957d2509e68ccc6eb2fd9ecaa35bfa +) implements RegistryFreezeEvent, PaperLifecycleEvent { + + @Override -+ public @NonNull Tag getOrCreateTag(final TagKey tagKey) { ++ public Tag getOrCreateTag(final TagKey tagKey) { + final RegistryOps.RegistryInfo registryInfo = this.conversions.lookup().lookup(PaperRegistries.registryToNms(tagKey.registryKey())).orElseThrow(); + final HolderSet.Named tagSet = registryInfo.getter().getOrThrow(PaperRegistries.toNms(tagKey)); + return new NamedRegistryKeySetImpl<>(tagKey, tagSet); @@ -844,15 +848,14 @@ index 0000000000000000000000000000000000000000..63957d2509e68ccc6eb2fd9ecaa35bfa +} diff --git a/src/main/java/io/papermc/paper/registry/event/package-info.java b/src/main/java/io/papermc/paper/registry/event/package-info.java new file mode 100644 -index 0000000000000000000000000000000000000000..14d2d9766b8dee763f220c397aba3ad432d02aaa +index 0000000000000000000000000000000000000000..1d20e0d940ae498b96fe33f6176c140f816921f1 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/event/package-info.java -@@ -0,0 +1,5 @@ -+@DefaultQualifier(NonNull.class) +@@ -0,0 +1,4 @@ ++@NullMarked +package io.papermc.paper.registry.event; + -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; ++import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/papermc/paper/registry/event/type/RegistryEntryAddEventTypeImpl.java b/src/main/java/io/papermc/paper/registry/event/type/RegistryEntryAddEventTypeImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..fbf853bf1cbb3c7bbef531afe185818b9454299b @@ -898,7 +901,7 @@ index 0000000000000000000000000000000000000000..fbf853bf1cbb3c7bbef531afe185818b +} diff --git a/src/main/java/io/papermc/paper/registry/event/type/RegistryEntryAddHandlerConfiguration.java b/src/main/java/io/papermc/paper/registry/event/type/RegistryEntryAddHandlerConfiguration.java new file mode 100644 -index 0000000000000000000000000000000000000000..548f5bf979e88708e98d04dfe22ccaa300c91ddd +index 0000000000000000000000000000000000000000..3cc0f7688f61c5fdbd98d0134741c98a8b9748b9 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/event/type/RegistryEntryAddHandlerConfiguration.java @@ -0,0 +1,42 @@ @@ -912,8 +915,8 @@ index 0000000000000000000000000000000000000000..548f5bf979e88708e98d04dfe22ccaa3 +import io.papermc.paper.registry.TypedKey; +import io.papermc.paper.registry.event.RegistryEntryAddEvent; +import java.util.function.Predicate; -+import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.Contract; ++import org.jspecify.annotations.Nullable; + +public class RegistryEntryAddHandlerConfiguration> extends PrioritizedLifecycleEventHandlerConfigurationImpl> implements RegistryEntryAddConfiguration { + @@ -968,8 +971,18 @@ index 0000000000000000000000000000000000000000..7ee77022198bf5f9f88c6a1917a1da30 + return false; // only runs once + } +} +diff --git a/src/main/java/io/papermc/paper/registry/event/type/package-info.java b/src/main/java/io/papermc/paper/registry/event/type/package-info.java +new file mode 100644 +index 0000000000000000000000000000000000000000..f9f63926a5aaf84e0d23bac3422c5800683e37f9 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/registry/event/type/package-info.java +@@ -0,0 +1,4 @@ ++@NullMarked ++package io.papermc.paper.registry.event.type; ++ ++import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java b/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java -index 9400fed345344a0a8e4fb301cca6a1867adf625b..0cdc92acd3ebb6efb10e1b66419cc05618301581 100644 +index ca829b162d4369f845e59b62bb8779fd83fe2ef3..2de5aa3f0f17b29a6cf9d81ebda81aed7295c1f1 100644 --- a/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java +++ b/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java @@ -1,5 +1,7 @@ @@ -980,16 +993,8 @@ index 9400fed345344a0a8e4fb301cca6a1867adf625b..0cdc92acd3ebb6efb10e1b66419cc056 import java.util.Iterator; import java.util.function.Supplier; import java.util.stream.Stream; -@@ -7,7 +9,6 @@ import net.kyori.adventure.key.Key; - import org.bukkit.Keyed; - import org.bukkit.NamespacedKey; - import org.bukkit.Registry; --import org.bukkit.craftbukkit.CraftRegistry; - import org.checkerframework.checker.nullness.qual.MonotonicNonNull; - import org.checkerframework.checker.nullness.qual.Nullable; - import org.jetbrains.annotations.NotNull; -@@ -58,4 +59,14 @@ public final class DelayedRegistry> imple - public NamespacedKey getKey(final T value) { +@@ -54,4 +56,14 @@ public final class DelayedRegistry> imple + public @Nullable NamespacedKey getKey(final T value) { return this.delegate().getKey(value); } + @@ -1003,23 +1008,12 @@ index 9400fed345344a0a8e4fb301cca6a1867adf625b..0cdc92acd3ebb6efb10e1b66419cc056 + return this.delegate().getTag(key); + } } -diff --git a/src/main/java/io/papermc/paper/registry/package-info.java b/src/main/java/io/papermc/paper/registry/package-info.java -new file mode 100644 -index 0000000000000000000000000000000000000000..0b80179ff90e085568d7ceafd9b17511789dc99b ---- /dev/null -+++ b/src/main/java/io/papermc/paper/registry/package-info.java -@@ -0,0 +1,5 @@ -+@DefaultQualifier(NonNull.class) -+package io.papermc.paper.registry; -+ -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; diff --git a/src/main/java/io/papermc/paper/registry/set/NamedRegistryKeySetImpl.java b/src/main/java/io/papermc/paper/registry/set/NamedRegistryKeySetImpl.java new file mode 100644 -index 0000000000000000000000000000000000000000..e8c2c18a1ed5cd587266bd415170610781531a12 +index 0000000000000000000000000000000000000000..7b15640c2f10c72f2612ab2270adc5689dfd9e5a --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/set/NamedRegistryKeySetImpl.java -@@ -0,0 +1,76 @@ +@@ -0,0 +1,74 @@ +package io.papermc.paper.registry.set; + +import com.google.common.collect.ImmutableList; @@ -1039,12 +1033,10 @@ index 0000000000000000000000000000000000000000..e8c2c18a1ed5cd587266bd4151706107 +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; -+import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Unmodifiable; ++import org.jspecify.annotations.NullMarked; + -+@DefaultQualifier(NonNull.class) ++@NullMarked +public record NamedRegistryKeySetImpl( // TODO remove Keyed + TagKey tagKey, + HolderSet.Named namedSet @@ -1091,17 +1083,17 @@ index 0000000000000000000000000000000000000000..e8c2c18a1ed5cd587266bd4151706107 + } + + @Override -+ public @NotNull NamespacedKey getKey() { ++ public NamespacedKey getKey() { + final Key key = this.tagKey().key(); + return new NamespacedKey(key.namespace(), key.value()); + } +} diff --git a/src/main/java/io/papermc/paper/registry/set/PaperRegistrySets.java b/src/main/java/io/papermc/paper/registry/set/PaperRegistrySets.java new file mode 100644 -index 0000000000000000000000000000000000000000..f09ce9c8547ef05153847245746473dd9a8acbe6 +index 0000000000000000000000000000000000000000..cb92f53cf9d139828acd016499470212a198b722 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/set/PaperRegistrySets.java -@@ -0,0 +1,48 @@ +@@ -0,0 +1,45 @@ +package io.papermc.paper.registry.set; + +import io.papermc.paper.registry.PaperRegistries; @@ -1115,10 +1107,7 @@ index 0000000000000000000000000000000000000000..f09ce9c8547ef05153847245746473dd +import net.minecraft.resources.RegistryOps; +import net.minecraft.resources.ResourceKey; +import org.bukkit.Keyed; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.framework.qual.DefaultQualifier; + -+@DefaultQualifier(NonNull.class) +public final class PaperRegistrySets { + + public static HolderSet convertToNms(final ResourceKey> resourceKey, final RegistryOps.RegistryInfoLookup lookup, final RegistryKeySet registryKeySet) { // TODO remove Keyed @@ -1150,6 +1139,16 @@ index 0000000000000000000000000000000000000000..f09ce9c8547ef05153847245746473dd + private PaperRegistrySets() { + } +} +diff --git a/src/main/java/io/papermc/paper/registry/set/package-info.java b/src/main/java/io/papermc/paper/registry/set/package-info.java +new file mode 100644 +index 0000000000000000000000000000000000000000..516b072428dcc8a28d13bcc990493cf4c22ad948 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/registry/set/package-info.java +@@ -0,0 +1,4 @@ ++@NullMarked ++package io.papermc.paper.registry.set; ++ ++import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/net/minecraft/core/MappedRegistry.java b/src/main/java/net/minecraft/core/MappedRegistry.java index 71e04e5c1bc0722abf8ca2e0738bd60b6d7ae21c..063630c1ffcce099139c59d598fc5a210e21f640 100644 --- a/src/main/java/net/minecraft/core/MappedRegistry.java diff --git a/patches/server/0993-Add-registry-entry-and-builders.patch b/patches/server/0993-Add-registry-entry-and-builders.patch index 6320aa8569..36bfa68a40 100644 --- a/patches/server/0993-Add-registry-entry-and-builders.patch +++ b/patches/server/0993-Add-registry-entry-and-builders.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Add registry entry and builders Feature patch diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistries.java b/src/main/java/io/papermc/paper/registry/PaperRegistries.java -index 3ec2aa5da045b62809afd2c13fc9ae74189dbdad..31d660bbbe62cd2c26715e8d90fef58b8e024e34 100644 +index 86c9f87cdb41c0d1ccc2a61b501f969cfaae47bc..fd024576e70e0c121c1477a0b7777af18159b7c4 100644 --- a/src/main/java/io/papermc/paper/registry/PaperRegistries.java +++ b/src/main/java/io/papermc/paper/registry/PaperRegistries.java @@ -2,6 +2,9 @@ package io.papermc.paper.registry; @@ -19,7 +19,7 @@ index 3ec2aa5da045b62809afd2c13fc9ae74189dbdad..31d660bbbe62cd2c26715e8d90fef58b import io.papermc.paper.registry.entry.RegistryEntry; import io.papermc.paper.registry.tag.TagKey; import java.util.Collections; -@@ -81,7 +84,7 @@ public final class PaperRegistries { +@@ -78,7 +81,7 @@ public final class PaperRegistries { static { REGISTRY_ENTRIES = List.of( // built-ins @@ -28,7 +28,7 @@ index 3ec2aa5da045b62809afd2c13fc9ae74189dbdad..31d660bbbe62cd2c26715e8d90fef58b entry(Registries.STRUCTURE_TYPE, RegistryKey.STRUCTURE_TYPE, StructureType.class, CraftStructureType::new), entry(Registries.MOB_EFFECT, RegistryKey.MOB_EFFECT, PotionEffectType.class, CraftPotionEffectType::new), entry(Registries.BLOCK, RegistryKey.BLOCK, BlockType.class, CraftBlockType::new), -@@ -103,10 +106,10 @@ public final class PaperRegistries { +@@ -100,10 +103,10 @@ public final class PaperRegistries { entry(Registries.TRIM_PATTERN, RegistryKey.TRIM_PATTERN, TrimPattern.class, CraftTrimPattern::new).delayed(), entry(Registries.DAMAGE_TYPE, RegistryKey.DAMAGE_TYPE, DamageType.class, CraftDamageType::new).delayed(), entry(Registries.WOLF_VARIANT, RegistryKey.WOLF_VARIANT, Wolf.Variant.class, CraftWolf.CraftVariant::new).delayed(), @@ -43,10 +43,10 @@ index 3ec2aa5da045b62809afd2c13fc9ae74189dbdad..31d660bbbe62cd2c26715e8d90fef58b // api-only diff --git a/src/main/java/io/papermc/paper/registry/data/PaperEnchantmentRegistryEntry.java b/src/main/java/io/papermc/paper/registry/data/PaperEnchantmentRegistryEntry.java new file mode 100644 -index 0000000000000000000000000000000000000000..481f5f0cfae1fada3bc3f873fb7e04c3086ea9bf +index 0000000000000000000000000000000000000000..1b1c6838452d3001070a5d43cc49e3a09de7153d --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/data/PaperEnchantmentRegistryEntry.java -@@ -0,0 +1,234 @@ +@@ -0,0 +1,230 @@ +package io.papermc.paper.registry.data; + +import com.google.common.base.Preconditions; @@ -72,31 +72,27 @@ index 0000000000000000000000000000000000000000..481f5f0cfae1fada3bc3f873fb7e04c3 +import net.minecraft.world.item.enchantment.Enchantment; +import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.inventory.ItemType; -+import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; -+import org.checkerframework.framework.qual.DefaultQualifier; +import org.jetbrains.annotations.Range; ++import org.jspecify.annotations.Nullable; + +import static io.papermc.paper.registry.data.util.Checks.asArgument; +import static io.papermc.paper.registry.data.util.Checks.asArgumentMin; +import static io.papermc.paper.registry.data.util.Checks.asConfigured; + -+@DefaultQualifier(NonNull.class) +public class PaperEnchantmentRegistryEntry implements EnchantmentRegistryEntry { + + // Top level -+ protected @MonotonicNonNull Component description; ++ protected @Nullable Component description; + + // Definition -+ protected @MonotonicNonNull HolderSet supportedItems; ++ protected @Nullable HolderSet supportedItems; + protected @Nullable HolderSet primaryItems; + protected OptionalInt weight = OptionalInt.empty(); + protected OptionalInt maxLevel = OptionalInt.empty(); -+ protected Enchantment.@MonotonicNonNull Cost minimumCost; -+ protected Enchantment.@MonotonicNonNull Cost maximumCost; ++ protected Enchantment.@Nullable Cost minimumCost; ++ protected Enchantment.@Nullable Cost maximumCost; + protected OptionalInt anvilCost = OptionalInt.empty(); -+ protected @MonotonicNonNull List activeSlots; ++ protected @Nullable List activeSlots; + + // Exclusive + protected HolderSet exclusiveWith = HolderSet.empty(); // Paper added default to empty. @@ -165,13 +161,13 @@ index 0000000000000000000000000000000000000000..481f5f0cfae1fada3bc3f873fb7e04c3 + + @Override + public EnchantmentCost minimumCost() { -+ final Enchantment.@MonotonicNonNull Cost cost = asConfigured(this.minimumCost, "minimumCost"); ++ final Enchantment.Cost cost = asConfigured(this.minimumCost, "minimumCost"); + return EnchantmentRegistryEntry.EnchantmentCost.of(cost.base(), cost.perLevelAboveFirst()); + } + + @Override + public EnchantmentCost maximumCost() { -+ final Enchantment.@MonotonicNonNull Cost cost = asConfigured(this.maximumCost, "maximumCost"); ++ final Enchantment.Cost cost = asConfigured(this.maximumCost, "maximumCost"); + return EnchantmentRegistryEntry.EnchantmentCost.of(cost.base(), cost.perLevelAboveFirst()); + } + @@ -283,25 +279,22 @@ 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..a96609223ed1e0500f8a4b868e309c0fc82bbc31 +index 0000000000000000000000000000000000000000..2100e8aca6f7ae7b90545bd3f4d4b800dba65daa --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/data/PaperGameEventRegistryEntry.java -@@ -0,0 +1,57 @@ +@@ -0,0 +1,54 @@ +package io.papermc.paper.registry.data; + +import io.papermc.paper.registry.PaperRegistryBuilder; +import io.papermc.paper.registry.data.util.Conversions; +import java.util.OptionalInt; +import net.minecraft.world.level.gameevent.GameEvent; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; -+import org.checkerframework.framework.qual.DefaultQualifier; +import org.jetbrains.annotations.Range; ++import org.jspecify.annotations.Nullable; + +import static io.papermc.paper.registry.data.util.Checks.asArgumentMin; +import static io.papermc.paper.registry.data.util.Checks.asConfigured; + -+@DefaultQualifier(NonNull.class) +public class PaperGameEventRegistryEntry implements GameEventRegistryEntry { + + protected OptionalInt range = OptionalInt.empty(); @@ -470,20 +463,27 @@ index 0000000000000000000000000000000000000000..68b3d747f759f615a3c942de3f4d7a0f + } + } +} +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 +index 0000000000000000000000000000000000000000..cfcf814eb527e6b82a2319f28df43b085ca5c168 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/registry/data/package-info.java +@@ -0,0 +1,4 @@ ++@NullMarked ++package io.papermc.paper.registry.data; ++ ++import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/papermc/paper/registry/data/util/Checks.java b/src/main/java/io/papermc/paper/registry/data/util/Checks.java new file mode 100644 -index 0000000000000000000000000000000000000000..3241a94731fe8163876614efdcf30f8b551535af +index 0000000000000000000000000000000000000000..9d61fad3989540b77734e57935104696e3c2b5b8 --- /dev/null +++ b/src/main/java/io/papermc/paper/registry/data/util/Checks.java -@@ -0,0 +1,48 @@ +@@ -0,0 +1,45 @@ +package io.papermc.paper.registry.data.util; + +import java.util.OptionalInt; -+import org.checkerframework.checker.nullness.qual.NonNull; -+import org.checkerframework.checker.nullness.qual.Nullable; -+import org.checkerframework.framework.qual.DefaultQualifier; ++import org.jspecify.annotations.Nullable; + -+@DefaultQualifier(NonNull.class) +public final class Checks { + + public static T asConfigured(final @Nullable T value, final String field) { diff --git a/patches/server/1035-DataComponent-API.patch b/patches/server/1035-DataComponent-API.patch index 91ad0459a6..b2cf36195b 100644 --- a/patches/server/1035-DataComponent-API.patch +++ b/patches/server/1035-DataComponent-API.patch @@ -3589,7 +3589,7 @@ index 0000000000000000000000000000000000000000..62aa1061c35d5358e6dec16a52574b42 + +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistries.java b/src/main/java/io/papermc/paper/registry/PaperRegistries.java -index 31d660bbbe62cd2c26715e8d90fef58b8e024e34..7e5d1d4f563dfd4beef9cd73b3670714c96bacaf 100644 +index fd024576e70e0c121c1477a0b7777af18159b7c4..b81d0d906789ef2ff3759395821316462aacf323 100644 --- a/src/main/java/io/papermc/paper/registry/PaperRegistries.java +++ b/src/main/java/io/papermc/paper/registry/PaperRegistries.java @@ -2,6 +2,8 @@ package io.papermc.paper.registry; @@ -3601,7 +3601,7 @@ index 31d660bbbe62cd2c26715e8d90fef58b8e024e34..7e5d1d4f563dfd4beef9cd73b3670714 import io.papermc.paper.registry.data.PaperEnchantmentRegistryEntry; import io.papermc.paper.registry.data.PaperGameEventRegistryEntry; import io.papermc.paper.registry.data.PaperPaintingVariantRegistryEntry; -@@ -98,6 +100,7 @@ public final class PaperRegistries { +@@ -95,6 +97,7 @@ public final class PaperRegistries { entry(Registries.ATTRIBUTE, RegistryKey.ATTRIBUTE, Attribute.class, CraftAttribute::new), entry(Registries.FLUID, RegistryKey.FLUID, Fluid.class, CraftFluid::new), entry(Registries.SOUND_EVENT, RegistryKey.SOUND_EVENT, Sound.class, CraftSound::new), From a63013cf48e46e2ec056c7ace60e018ec9be208e Mon Sep 17 00:00:00 2001 From: Glicz <67753196+GliczDev@users.noreply.github.com> Date: Mon, 25 Nov 2024 11:18:05 +0100 Subject: [PATCH 04/13] [ci skip] fix compile issues caused by 5b53cb4 (#11664) --- .../server/0992-Registry-Modification-API.patch | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/patches/server/0992-Registry-Modification-API.patch b/patches/server/0992-Registry-Modification-API.patch index f498936e5f..aa674ef8dc 100644 --- a/patches/server/0992-Registry-Modification-API.patch +++ b/patches/server/0992-Registry-Modification-API.patch @@ -982,10 +982,10 @@ index 0000000000000000000000000000000000000000..f9f63926a5aaf84e0d23bac3422c5800 + +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java b/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java -index ca829b162d4369f845e59b62bb8779fd83fe2ef3..2de5aa3f0f17b29a6cf9d81ebda81aed7295c1f1 100644 +index ca829b162d4369f845e59b62bb8779fd83fe2ef3..fdc475f2b112ba88ff1d89cb0c4eaa465b2d034c 100644 --- a/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java +++ b/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistry.java -@@ -1,5 +1,7 @@ +@@ -1,11 +1,14 @@ package io.papermc.paper.registry.legacy; +import io.papermc.paper.registry.tag.Tag; @@ -993,7 +993,14 @@ index ca829b162d4369f845e59b62bb8779fd83fe2ef3..2de5aa3f0f17b29a6cf9d81ebda81aed import java.util.Iterator; import java.util.function.Supplier; import java.util.stream.Stream; -@@ -54,4 +56,14 @@ public final class DelayedRegistry> imple + import org.bukkit.Keyed; + import org.bukkit.NamespacedKey; + import org.bukkit.Registry; ++import org.jspecify.annotations.NonNull; + import org.jspecify.annotations.Nullable; + + /** +@@ -54,4 +57,14 @@ public final class DelayedRegistry> imple public @Nullable NamespacedKey getKey(final T value) { return this.delegate().getKey(value); } @@ -1004,7 +1011,7 @@ index ca829b162d4369f845e59b62bb8779fd83fe2ef3..2de5aa3f0f17b29a6cf9d81ebda81aed + } + + @Override -+ public @NotNull Tag getTag(final TagKey key) { ++ public @NonNull Tag getTag(final TagKey key) { + return this.delegate().getTag(key); + } } From cd9e697b52574c418e1bf5f08db88d87f1ae5bef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 16:03:18 +0000 Subject: [PATCH 05/13] Bump dawidd6/action-download-artifact from 3 to 6 in /.github/workflows (#11666) Bumps [dawidd6/action-download-artifact](https://github.com/dawidd6/action-download-artifact) from 3 to 6. - [Release notes](https://github.com/dawidd6/action-download-artifact/releases) - [Commits](https://github.com/dawidd6/action-download-artifact/compare/v3...v6) --- updated-dependencies: - dependency-name: dawidd6/action-download-artifact dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/test_results.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_results.yml b/.github/workflows/test_results.yml index 03589c3912..f3c63cf8fb 100644 --- a/.github/workflows/test_results.yml +++ b/.github/workflows/test_results.yml @@ -18,7 +18,7 @@ jobs: actions: read steps: - name: Download and Extract Artifacts - uses: dawidd6/action-download-artifact@v3 + uses: dawidd6/action-download-artifact@v6 with: run_id: ${{ github.event.workflow_run.id }} path: artifacts From 280b49778389310dc2b6836ddf6aa84406168aea Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 25 Nov 2024 10:13:34 -0800 Subject: [PATCH 06/13] Change MinecraftServer#pluginsBlockingSleep to be Set A plugin should not be allowed to be added twice or more, as this would require two or more remove calls to unset the pause block. --- patches/server/0488-Improve-ServerGUI.patch | 647 +++++++++--------- ...-API-to-allow-disallow-tick-sleeping.patch | 4 +- 2 files changed, 326 insertions(+), 325 deletions(-) diff --git a/patches/server/0488-Improve-ServerGUI.patch b/patches/server/0488-Improve-ServerGUI.patch index 8dde1d1a9b..48a151cd82 100644 --- a/patches/server/0488-Improve-ServerGUI.patch +++ b/patches/server/0488-Improve-ServerGUI.patch @@ -102,329 +102,330 @@ new file mode 100644 index 0000000000000000000000000000000000000000..8b924977b7886df9ab8790b1e4ff9b1c04a2af45 GIT binary patch literal 16900 -zcmaicV|1Ng^k&Q(Hn!T>_Kj`Zc4OO48rwD-Gw*(Xv_UIGaL4*?7e3`t5-R2lSh^xqd84Cs4}W^FDQn9zijsF13M{zVR~<`0dB -z;hww3Rk_uLO*yyZ^N(arMN#SjFcHEi60E_fZug`IjtJ^LVtno=lKj+Jze{_WszRIN1X*HUTCH>C_wc;+D)6YYT -z*RWmTUi`Puu_Uwkj6-qwu_Ue*kO&$%=o%J?6*rej_Ock3znkGIb6 -zWm&yS2Z9LS7slFgUx+?ilDgQBdj7`ruw|IVzJ@wV{&tD)G@SPTMW@9Wl5lcsuU~6` -z7raw|%Or|@Pnlh`7!!rA1H$`p;zz}+92Tp2bFmKDAL`nrC>)<{qBHso -zvJ6|o^vMxL?frh4XZ`3WdH7s_NI0p@{EElbnX*!yp;Vtx&K&w$&to`sW -z79>enm;xWhu;ZKKIN}-h!eBKZM6j$9~*Q(SlE*i_bHS0o#tPY -z5-j+ww|x>h9%`RLUixM!e%f0qVAe5GH83X6?!#^_j-M@lO@*-aD%NMF2;Hg^Wgh@}elrPA3o_&(- -zeNyws4es~%;K1o+pfG(Z!G-nFWzl7)ejRNxY?M~uI=I&MYuz@4>GLH*ptjlQJ`LYr -z*KIIVzBhKHIDwe`X2hc@gsdjzXxX%b<_#kc$vIHFi2)-XM1=fs(`g?0)M{lcJXwp< -zBgIdDXM&n-=+_%;1a?sE$oeN{r%w=8tFfAlQopAk -z%wrVN=r>)oZ0w7^M~Xi~qp6lEaABgF(ck7V3Un;@cg|ODuD7@fw~OZ;^TQV -z$&4AiUj}-4;o`6JV$Y4C2G -z8hVweUdzl78hWzD|&J_)oRr2JdJP -zA&lca);^P(q@hQb9-kqNXVo9An7Q3NoAtyRQw-@JUDD$oluryjE -z3{zzbZhStP-K;xw@Yxf-B=4h(p=4f`k8p2DH$>qQLPR!szD!2|vJ}J`C6=EoRwG^+ -z;`ZDv1SGVO+?IqSxpxSM^_V~@2E+~dZQdl+oz;TP1MX+XXwugMy?Z5AoZ7#R33Y@T -zM)w4;9L0szO3>6i#4fV3q49@wu&`zcvQ!d8!m*dpn&7pp0Y=;QbiyOzhC7)Ki7tDt -zXaIqysWqx53ZgHlO)|YRDG**$7&F{0a8VEECY`3;yx)F>2;4Xr&gC;Iqiqx;orWkF -z8xk0Ty-mK&z`^~Fbs#S;;Qd@1ZFJh4R`+H>Wx$xgn>^oka;w9~QfR>rS7lYHG?D#o -z6Jo`Qg_-DP -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 -zw1mJ8tVoSO-(}absB6M8b$Zqe)Ok0$OkaA#I -z48@e8TAlv;PmB6dbP|{7<%qt@Ea>I;PRL4)=M`_G!A40Y$Xy1Mum)I0#!3<77H4)u -zI6c{)TUsy&o^*@2H9Bp>QJA#S8$`zN?+@z^IIQL|VxYEQfVw~Oc}Wq!FS`G2T=aDu -z-DMYe(1$x=331oN(i#yV%?Q)lcY`}FpGRp*74@@$fX%pE+dAGOh5QRhJ&mcaXOhk4 -zLi_pirw^Zws;d9n^#IE8T1ypZDX|crNABquU?iL2;Ql%4Vg5cNBt}OJdbLKnEi|`g2q%v70%eM&7 -z5gdFefu8Ix3n54MC -zW40SGT11ajrrm5AI24T?-2$|VMsU%VX}AMmt>Pr~B}#An{>%QG>_1FQYV^)CExzx2 -z&7E_9c!fpiCLci|F3H*eM2DQQRtQp4>V2RP=KX3ZVw#OXuFxj$VDmM&HQD{*dc7301976VQyI69%EFvxxn>qC&Lo-`%ImvM -zCv>AXKPcD26Z_;m`1pw)uF6Mp=RnShU^yM81!?jbl!v#-kSa#RLhSOG0?yp1YB6Jr -zW=GrO|0zIRSHiH?DYiO+$EpdMkwz#4I6V(J12-W0+dAo4J*?nDQrFI<*}a92Y%1bU -z`RC_4tyg7>R(8{ -zA8*g?PWv##WoF+p0bJe>whg#+(1_+A+)9HS$|n?k;(r=Le*vR;57rn)2& -zEkD8KBSZm#3Drt?t!*#s#>0+yUNysIKRg=t`KSOcSHieiUP0z8F_$tZ(ciPnq_o~@ -z%-{zhbs{i7 -zt~8q8%WO|MF(FE_ye*bl_-@NcA!S9$IMb6x0`e_oNF!hy5a)H^H)5)t(}ek4a1Nc~FF4@f;5aO%aB&3O%B8NuMWWCzYb`d> -zQ-&3)G|5M|pzcLy>pA(p=?3&XKn+v0^`HNsS?M0eb+60BxF|&Y{?>MI^x``)Vp}1V -z;<0N$BUc(0=p=y>zD3k_I~ -zMC>T|rn!T!wN%lqT@ -z&Afsj|04$m&CH2M?F|6yeqb+e`&JWTP^~~z(;c>5;z6RuFKe)%3j|YzeZB9c)5E08 -zvX9?L9%?PT7Vu(RAIXR}s*=I*@Qp<*vA{&7B2uwdBH$_I`33U5di9weG|3 -zx-Iy`1L`R>G-q<+w-{f5qc<7ls}^cT4Y^Qi+meHXFIDgqkt0wpdBZGY?LB+q9&o`T -zd18L5%R+44Ml^UNbEw58BXP#{+I#J1$;VGO`#6Grd<=RWgP+T+ktE6H^>C;%(}szj -zK;wt^oW!yG4Fz=zm4zKw@$Wdo`VJm=879kp$F&$uMP_qiKSB4L@SV)g55F9Rb=3ocrK>iqIRR9n!X0Do*Ldi{9M&^sg&T_TZz~>`tbXc$p%%BI% -z#MahUA?U0t#2ZA4_41*w&52#TXU^_G4)$#uGOnpIb{Gs?Bge_xP|beH;cUSBec^gk -zu;a`And#3j5LZ)LALL9lQ0{$A?tzx&K6M(;#M))7n&`7KTkT>KvjI7O4?mTa;X`81yn7WAir6 -z^Dv#2{~#3{X=5gyP*2v`3yoLJl)--n2rC2}*3n8(L~4ohHzT6QbyEu{!K3q#&p9Lp -z?3#RrZR0JWoh5V%Au%m2?uSB&RO!i99khjDd#7P;NaxJ<_f>mYXQOtXqBZifoWn1d5WC&hmG;&Gv(>!l)|)selJ-m-pz9Og@*rA -z%Xl~n+gHI_Rjy513U_dEaq-~ZLm%H7RpVbREoW=Zu*D?n%JFyy6(v}{RCOy -z>_wu--o5bv-4rRuWG0oN3a2+(f)C6nR0%>9HdI1mB`d{jE6Q4vSf>>{@~N-bGMc6~ -zn=1MB2?XIjZuOC!s@-pN5{60UUw-L4f1L-3Ohud?4)I$4Y&#w^A*ij(1$$3|Vskv} -z#YKCOBnHKh5QN8fd|k)wI{^HZj_1!`{L&>R(m@P^tYk*J)5>eCrio9{j>kWLDCGrM -z*O<)utCbjQiH>aHzD!~>SNyzV|B?uyizaR*!v`(g6N5ks=aSqWHk#wzbQOx2Ehc(>s -zfl`oSK+EzLOKDeK?n#pu;5qF1g-8bXyN##%K`x2R14CxOh8w&P-kz4U}>3Q=A& -zwAa>sCXe?|fR^Y+S9_jW;=!_GK`1Bc2HY6Y)*s}A##+#}239~LV&Q~wL&4n_6^@vW -z;nGUYJ$5-C#kJr2EtD&Ty$t-H)#GyT->}39LWB1gdo%LwqR8{YbRBL*-FCEc5iY{; -z#TpZ~y8yolNKuWi&enqz%<*)Y)j#ff)9q1ezkI|N7|zr3b=T|b>+m?)d% -zKJ;1@L~w8ZQn0MxZS*{ew-;Ohn^Jl!+U{m|QvgB~tai**t#d>0E=CMjN*SZ+36QnO -z4NrSN!Cd>9SLf?=!Hjh+ek}c}ND_U`vvi9(MS>7nGZ*lPm%4(7(bhfuTHod8y%;N{YO_KMV}N<7D)x5snD;XG -zzCOH#WK2$4mAvQWFCCZW#F8TRInJ+=$6eR`V~dES6+!6-=6lkVCHyCW^Bb-$@=b%3 -zi%hxQwAp^EOp|zR61~UikJsM89qE@P3@X5J>+K)hO6K`Z$80UqhLV&|mVt3wQ#G4H -zi4>T}s*jr9pkN+B@=LbuMW8^kzEFQde*yOdnXiUws9u#OD8dYzm?0F`qCm7pBCNNz -zOJB@PR!5?2&9Zw_Jg~i=TwmStKiYq1_@$ -zZKB*^u}y2o({7rV#Nl+8$2T5 -zthMF3X`+*;4Q-~&-*4NzrU=7>#}h=jB}<^tsAch7Ac~Vq;V7 -ziknpCHOP}_P8F&VE%6e`WG~EVa?$ra`knKZrYWbIZ_w@4vO+{B!(Pb&!YhY8pCfe= -zjxF8x>Zh3;#gw`fu})grVJcf=Ohg_Xc9m?(57$!NXQ#N%;Q{V}EjtmA$m<@Ie2(h2j9T2Xq=0<2R#daW&$ -z85=lCIqjn+?h$SF4u|?#DOOKg9>2c{9GSdlh{<(WR;Mb+bxH>u95roevUiqSmcdG* -zEL`{Qv+mA#hjLxuC*l?ROBgDsPYkDNU%;m09$2^ni=SVA=kS_) -z_h->URCbhQr89T-a-Gg9Dk?P`CT8-=f%@A28AYMmma&Ks#DNDsr^|eI%nHBQ0Nps* -z<{@u^G-9krSD|^{Vm?_nRkW_T!;E*n95To#4sxn;9FH2W%&T043S^Vg_Bk^^&J9*H -z=-^Zd6GYUG(CMkA?hy<&4Tc5fn4$3ys+ZiGw!07qHH1zPDzAJY;{8Oj#B1-LTAZ>D -zKqX)c%j0#o|H%z2zdkxYKaV6<&nEMgP`q%2&v+2dsa++rFeWoOnf$VkCAY6|8|kw{ -zdwe(maC?oeGlx#HVClH?)W&QZ`+=l3PIeQ%9cb~nWxJ9)YD|MPt`v?0-3bMcbZ<2Z -zG7xSnH{QoOr#C@?R{C$168|JMfCxcPAVuEhewgQpYO@AfbP3Fw+|Vi7h~L@$6ydj5 -zyf7_h9Rp$0Gii0mkT9xddqw>hIVCXV203~$D~swIj_)TV=zX)@-tK6Hb66mM;EywH -zsMV;{!i^8fvae3b)iz7_f6$4yU2i-b%Bh|o@eU2$RD^G(AtWlyl0^8dxd<9 -zCi_xU0%&wFugtmc%-uOk=xMY?lR%{7BQRZ~b8}1<=DQI)v2*#3|70VNVV*?SK4O}0 -z-HEICfCoyTwy@{F=Ac>4KISQEgQLDcj|>j}hzn(*RSn -zZw&u6!^Z2~7ae&u`+{IHYm_vxJJ@RRZ!LoCjQ2ecK6E;AqeyJZxfuAC -zaFBgBIQO4DawgA~vN)BCS%`;S38kn@9kWOTMq)$V$+z&4nDQvH*{(1#N58$C)v2#; -zJW|ch#FaXRBNNj6mX)HNV{_ScADWB7#Jn(Th}B15lvrI|-2fj-=SL1AY -zQrI&y#`tyxRIyenc$G7)m}|d;5&h;8q8?ap1~7v{vEXIAhojO|^XI$6=K!f+>;5yx -zJJXiq*Z?mW;Ak{?4<=)9$$a@6Q*=1_%}Nx&bGA3oqS%{I)k3y{#DALAzrPw)h(FU -zj}8a8Xte($dBpT -z_ZLeg50aO#zhmy?M*+dS#c4NyP>CZSyS+OOi>@2;)lr;&A$)(OEO;kV+bz6O57by -zyW>9>Ij2^Du|A83(r~$46%S7?Ancv(6R -zJK?TL+k$9p$KMJgY}hdrTzyS}0it==hvU?8YM**7M}l@-W{&s26~NM6 -z#U8(RCX-=6Lw%{$D&=aKSfE%aJ<__RASP1DaZcJPva<-yi3NH#t$OuNk6wlp&CD~1 -zanJ|7AhF;l{a^)Qhr_9Bo;2ZG8=}0whx#r7zZ6W`Fs5 -zJEbvhZVJVsORu$w4Y1HyT1E4?Vka&kS*mSpBuKM>OAT~3W;g7KLGzfQWF~QJ1)H6S -zFCOXwP_auqzKSygLBPB}EH;Q1gXb@Wm*lZWfM<8NWGZM_*$8Ze)0+^IpqCyco5T+P -z>!edzc-RMsx%H6~4%a*u{&6!V2Xf)f8oOKEEtBAhvI#TkSv+Ago-TMSQ(2q}=S0FP -zL(1v}1vp6Ya1@zfO!}Dq3ke|~@mmFXu2dHEQWpO$6X$;c8V@V*w>NACSkmSKF-THX -zXc85Wu2(uhx0b@}vaeA-YhO(oJ!8ZlugSxzOn{tnI7h@dCB`UVE~EEY_ww_|qDlb| -zQh0>qvDy{uar91x0J$!N&ch{3*B*?y730`NAZJT0IXU?T1Oo1Zc+QnB&!+ZYLh%_v -zV;)6DQs1sEzvoxu0r{lou-yG%CgwotYzFK>vqr!e>KRehvaz@y)fTge`_wgV2*|2H -zVl|vbxEx$3ymn~uGqN65%FYqJ<_)*Uqs49;KY2h*(Xa?Tk7AFfl-xf>irJoUyL*;0 -z19&1GQV*5Ni~#kTnaq0ymCiLjk_=0q&=&|cG{r57n*6NwV6zJl5K*ED&DsZy8iEL_rr -zgsLXr6cN9-S7dCo0TeKI3ByoGNNBIG{4b4m4=LB^FstU0B?!6TBZ1v~zn%e*Xk=B) -z@_rySE6iHcIxSfbe^sRAkjZKFfR!7A5uNa|Q%HSV{);)`X_I$=Rz#g9)RV -zjIuDE+A6IDHt@Noy^%sCnU|?kL3tCMU12QN7688MFeYr;%^{CT)BqX<4rY8gFNo(^2<+x6~@> -z0Y;8%xJK3sk3si!JoTyNPRqf>i>%mkw_b{g-~}-aAljQww_S1L53kdn=uMDZM5$#ndk -z&22o*u=b&^trc3UMGkzzrL*~$;t?gd{w8WCC+z$)6{fY`v4CL%;?|JZtR3}&oLz8* -zT?G#HsX)xAYvWho@h=pJpzsjcWp0%LD4s08onG)Nb4)MY=8K^XfVvcKVvP||0{idF -zr>Wx=dX&);ID@-|u5Y#BAa0c8rW_t)Xfo4c@By|jKCCPsr7DjJ6t;eTIrmF;CpM`~(ysWB=S@seY-cC;IYp7eGp3%$l} -z)oc?3jDrN<0qs>+yfj#>o^%eHp8`K^wUK{qUM_Xl#K;;VHK+>&$DqLQV1~BoxLuBrt&0}DAhEKn_^ER` -zz-29QNvC|8F%an87xNYKcn*LCu89T8nVkc&?~&O83)5GbY)slt*#=)i7s;A_C=2r7N7+fk`X1KngTDCyUEafq@X5m_z1=DeiD@Q38P{+Ou8AdwgrjC5 -zajlbj!7Ae^jZ~9GGnmvF%|dV*Siz7~1$lG}zFHP5%BV8TD09lQN!w79WRZ;`=PM(z -z0;YT`0PcRb5SM~SQ_OKjwTc~?W_G_IPe||U$;Um2U%fe+7X>%Nvy!xcXUbbT1miw0 -z=$X7_W&m0ay!h~`ae>C68mu@al*ia7R0saqO=sn$tE@ww372nWLhU^>%{WE>Eoln8 -zaeH(5Zly+xlW1Z@B{Z2HqS52V*oh`BC}k&quf19RS}N6$l#0qGWzl9DQkZ@85(#UMH4E) -z!&hPrOmR$HRF*}2C{e3A#U3h9d)gN68^|>O9=TO4Ga~u#5kl0}_*QP9IxEl~Ce;Vj -zS3zvyQ+p-TKYiV8z>J$akDBH=i$W7}&)8|aN%_17$7$H|;eKWRKgAtrMwoyE;#kJp -z>iJ{R+d4p$2q2;Y5EBQ7>@E&mk*MzVW>!EDsQ9Pd1Icl|=0d^U2HU!hP6MLe0bwp2 -zA=U!|OQM?{{^8dU?o^&w|I~Y5fw~zw)IT&*mzBRUy1Ljo^-=Z`fvN|N_JgxG~k*Hc%03VftQZkoi*AD{-11-bt2%}_=-R;7ZY`jOzsFyAEWb! -zVJNLPL#@4|8iv-c@m4Lu!^Uc7?VOsDWty>@T6^QN67|~9P?w&boWVpR2)d)gI@s*$ -zT0uPct)H#x^_Y(_q2El&g2<(pF8niAzCde(;c)XAp3awn@Z)3{qMO$l1?#O_cXL+a -zB+yS96Q;w{xIBw9%-h2xp$%a(D0`Noi$$31BbukCM_lu$4sG_+rWsH9U`eD0eY3t3 -z@`vkyB5OW$_NhyNPE(&_JPvYO1XVd%SiaJPVza|ZguGogD*p`OzJ!Odk4wR7o=G7; -zQFEN*_9WQcO`Vliy5G@VCnZ;Qb~fJ44e1$o^Tw=L_lA;Z-8Dw0CC}X_m5Q_J*xP61 -z2tVQGAnU9PA@k;{9QL{c=-~c_joC`W*8qxTI)7}foE-)SU;g6SD;S1P5oGCta0DrC -zGXz?khB$Fn{Ycwuk%t&RTyJ!Mz8mnC0U+AYu}PkaA-t-gE*25%;RVKNKyWz!scpu6 -zZDKFBX5S4#lCQK!Ip%UxMsP%cC4T!8d`;mo#M{(B)h;Ilk3UVA`-O^+JuQDuUnt-K -z=jEH2NuzvVs7mGT0rJ;Nz54;;pVk-{O`o<8h5~yAG9cx)%sJ+#d0-B8j!9{+{>1@9 -zYiz-m^g@6wE8^*umZD0JhIN!|&Ok-?2XhJ@B|oI&FfS^$rs90JhlZBoJW`e5b9j^- -zWO>uD9oB-o4QKEBn$akVeT1MeUX-s%#m~lPXZR!_h7SU~%Y_rx{QlrO`$o+{oUb!PIS+x5N -z+{O+YLa6?IE1#&A?RMZ&J}!O!vj>Os^y>J_BMi^Cu8;>FP)!5eagStg`4k8`f<9)s -zLv>uniXJHc5tD}2a*xO+UycHT8lGykAS#tq7H&?$Q|yXO#aH{77;M;}%#Rn*u_i#Q#=kFoCjB -zxM)O)sW@_wx=K{lJ|iyESH0iv9Nr111eP3eEA!SenTb%U12{RS*7qj0=;%^Kd#QiJ -ziYTEU=jFY{zWsSqmqmw<7L@5T1o7NxWhht`9gu$(b|QZnjVAE)D;lyC=>~hv=8piE3T9#-QVKCSaq-q&xr*zuRbfKtru+;Kkp5Si5+<6{tz}rp -zigZWmiiYYR#xdxCbhhJz=wN$k9zPcR8H;AJErv2><3*Bm51h&CEJlpT9yo5`1`w{pnaAJ%0k=ISmg0E -zo$J6^H1-w0!^WV5w|yx36dtal`WN}DGpD-gqYjDTfjIaLtR}xxCDSo6v=}KHRM^9@ -z&T;nw5x5ee(K3%Z3QQF%sMId_cIRpr&3g$f><9ZoX7X_c7g4f{y)mf(?;`TLI@jLv -z?N)ryzDJ)LsBZU+VnRH0X1E}KJ!}%#n_-hEY9w -z`8(=7Fd9^wGY;{_ggJK@ZR?yW!1!^^d;F^x%}=DG(7K8XMm$L~K*Np|t>vZmA5%Y| -zINrWxnZFq_J7&ksTGEluekfNRCX$8u^xk+?w8Q1iII^7LA8Wc=uh=>E34C14fN(+~ -zjb&LKSzG|ur8^cG=n*d|U)DK;5`-D7c>o{;1qb8{cYdL5^ll*Y29ag^ZWs(}{Dq?& -z7Vt6fu%BVSoqvD;RYW!I!KS^e-kCz_2@FvAByt<`2mpvxlE{aWp)% -z7->KZs4&!M+Z9|_;(QrbPRGNC2zLU&;bq*v@zaDlNR7 -zR!OB(0w7?XvMI3w1tc_A&fY$=RO&K>9q)K{?KeL9#X2nl`k!ouFF)XFC@Tui*%L4~ -zwNvTu3}=K5TH;uDS!^k3d+!l_hx$f?(hkYU(6NBYx@mz*Y6dZ7D@JF^5^p{aiT5zv -z;Xjc--#|sw407DGZz<4^FBXBq5F)zwTQ|65$~FTfyft2wOiY&QG(ydKoz#wa?YKny -z)9C@EX0c#XN}}K5dNFdMNo^+Os>0sS^c;E5Ky4zm)q;>J{J+z3sdUj)7tN@@gZSf7 -zJ|wiD$oI`e{Xe-gDV9P_(x}i7AaPVJn&m~NMi(84-RGbXy6@{lY?h66ze7!6Ee=i! -zInre-6PCHrI9+8v4+)Zge*esLVEy0*)t)o|)801Zf98hgQ=EZH2bpZ=)5NN_2yjw# -zP8Ewr(5WN{8DJpt*e!|G(gvZ5Pxywag$Agdns%%4+IH>|FMw9b -zKb<-v)*Cb*Ao~hb;B*`Ee&trZYBi`{$ru%gmKbuXcPNb3lD3H3Jimki7;BEFp{bxX -zFJ7Rk<~$d5(AGs1%w=$DDrj&3=?C4wX`U{m8^^=Z8R3YTB_A>ZAOkmldWl -zwo0ZyTNCB`dfUZA+chm*()HWtA2!JQ3>g${8%Vr% -zasf==&095e)fG}M%iIsk{PaQ>2|D59ppz^2pExvb9Ou9EI^`kN!0aXr*u3p0ex0b4 -z=AnHH#@v>`#o*LjN-yB0^^l)H2Nm=yD3|>1aNigv$f`s680kxF8B%d>SUG)YF0R~W -z$TI5rvll2~&q4RSwu3})*@1!~z4l}@NsY#MwV(2Y=hbLZh-ce*Eq3<#rZ -zxra}au9h@`-JaCDeW|)St?N40z`g~4rjZ?xu=?#W;cJyHNPXCV2DuxD%N1A2hAlFH -zwTJm(6XPn#dA&{dq>&yd{5Lp=pa<%$*em=~TdQ%rn_v#5`>I!IS>M^uNpl#N|wC@HMBcRTMT#SL;d7 -z<(&BuA6dLkkx|8fWw@PXzCeCBgDx@HJs@)L+j8y~gZ)7)${p-|O7{G? -z&|M6FI|A*^d_U+Of-3`+w(c~-YsQby|NH)g|G7xv|Nek^|Jex)g~z+)I0xPC0460S -LFIp>X81%mY^Bg|U +zcmaf)RZtymu&!}kXmDLfg1h^|-QC?ixG&s2I0Sch5AG1$U4m2?7EFMOsQs1p)$M^xuU52LS<5tyS|A0z!B~T1;5Y)8HZp +zUh9YE!*I`C!>au1!lt}?^7%)ymXa9F0E8%U6cA@Hs@r2|t2YjT?MMEK&sF!xR;P(1 +zJxFf8OgT_&`%_^18f74-j~9B>_v*F_4QG7P$=~I&{g0k-!dKZ;dhG_Yv84aKQ7`JU +zJ^ehid=1+b=_P#o97{5v??~H!^zyIS&U_=f-+Z&XS28Q#IuJUNE}ApzE+z8$!_(s%I3_!)=jTdGmXzz2p&3&czvSwVkj_PR|SM`xDjT-m<)@wFKtJ!fY +z+A9f&c$RQF&Z%Ui9@S9nRjlxMs@)Z5_OxNu^|5JS^tNFPeEv!Mp+fj^Yc}Scf482J +z_jv2_UYgabd?1AMePOH(|ApkUIjM`|sON7?4||4r>}#l#)Nj}LPNV67U-a5cAqgk9 +z4hA)b1i?G`_{?Is2NgH3=G*Y_oV4G*#y>w?4I7fSpx2h|vD&hsqdFVmofnVkNpM8o +zEDOkF7WVse0CrXXeH^X&Y+X5Ugeg(@8XVq_7ngH%kQ4q8to@(w`VD%+t{VjBlZzMA{89 +z;%$e2aiD==VT$}%!%lBbY3xicyog$jB!Djxd7vpR6bXArR{Oqv(5MfWsJg3Yy +zcUpf*M1f-z9ik)^?H|-}` +zxbJl0Xc<(adaW`;Xc^eA&$kJ4EZWH)dOO+mFzw;MBfNjA5<1ZP>E3RWzD|&L1WdK! +z2k&T-AdM3|);yD$reQ{x9G{_#6R5f}9%tdjf-W#_wS$qa(*X;ot*Gkja`g1Q_eN^= +z`0%;Ho3r-6zU-m(+)f%v8KxzXfn20UBXua$j&hd^L+a{0lv^F@IS92IL#!_sffCl2&zHVp_~j(J1np!W5n69+~xPAJ6}_zBa%4jtFt9W +z{@f*=wRJ|ZitBopGm@A{J`xa&M +z)PY`TF0^X2?f!}827nOWNuI-}Ne-gU_A_rT89Qjihq3d_{Ugx}ge|kRq}v@?<-}sM1htR5<=} +zI1L1)$lG(bP|&c#@>`Np6h0xGHe-S%SWq_O*_rH`M&)M5xj9Un#*HS!PqE5 +zISo-XF(NX8c$<8iK|uH&>qt?Q&-b}D+Tgr7t>MFp&WJTZFnPZ1>|RTVqu7iauEwTX +zVJi3CHpH3>2eq__Ox+k#@Bzl=K|7STdhX7MT{c8Ce71~q9Y&PXH}*iaRuCUgMZj4H +z)QyHub +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 +zAbfu?@{0+Il12eRII46kiNKmt05>iU=h +z$)Irsw!hHw5wf7*gjxln_O`c8!(m4}pSsbqKLIVrd=!}5jW}+WPlzQ;+_e-& +z?Dy<48J&+h3*@LUmFxqzh_g>rb^`iEl)hiDf5($dZZJpaL!%i&d@Buf3+M~(|w0IKfQ +za3X0Srk%nLvE~Ab9|gBtt2_H<(fw_Zha@}t^K>=dbE+8{uYX2|#N=bmI)Wc;T*rwV +zwd5A@i2kamPB6hHF1AG?W!pUo_~vz+3wdlN<%QSGe!5}^qJ59h?#udS@qUf7 +zv-9ZWcl%ZgYEV62Ov?klP4Ypq+COVB +zzbpQbKJ4p#FTFlCeU?M~M)FWg!L^__)A~q8ym6&0c0f4_^d1Qsf;q;YQPHwFTKQaY +z@}^_vfdLrw7oSN5$O~22BEUPFgd#kF2FBsIH_Toz2Nw=v^=tZBu!NT|Lp7qp(fZ&&7q@7C0rFJD6; +z(%|4PztN>6GF#&@{I1tbNIIaALQ8ulFL8_Y1vGk-QMPKSZe0HpMtxgqkoct%kuq`w +z#x-}Cb*!ytPr?%+STtAMUu{{K-N%@g062$UWI7UOQm3=mc9wknbhD2qEj-!b^P +z%oYhuwx~lumz_3B^a7bYyyq-71@Fw*7ULPhNJocwr5CvLRsE<~sh>maF=R1p!hO** +zh+7MfH?17kb@`xEls`270@5OICG>$(UstdYt%lJ^wwiJK8I1@$5SE2?UF-^CtL8@; +zs4{#zGZBM@8f^QW&S9I{2Bl9>kdJkdQs6??R6c{5q%l*?6D-aNSM(>Zc4);q<1&7n +zVSb1AZyvYG&77Xtb`dpP1hGZw+U_-uc%-;be&gSUcbi*hJ9V!?LnI5O4d&1TOrlrE +z11&b|=uC!5&O5GB^zm!T#ncJ-bmy8|`YuXV_zy3)jPFmR0m +zFLy&N`z42~p5XU|+fn|GAIE2AfPi3JbxB>QXQ+7$3m_ug7v}~qfMAh#5*_)0mSKO^ +z)R>_thix1PNC=^T>X5@o5Ik^s!>_0nb%0+Qu?l@fMu||fRMI8(eq@a06~$a6goXp4 +zTc(!CW&GU`Z?7*~C%0!|`Po;Y-B>bq8(=^Pt0w>CW3cOKf|^OmN3o|I)zb~mlpR!VZRWgf3r$DjB6U@% +zJ!v9xOZ<+LBarT*ahaknq^miC#W^ANPQ%<$&RHDpEBCU_M(sbvsugC-mYh-fO{Sw9 +z2eEARzci;On#5;xRA{kHL-zc9^rxh(B6&XXZ*i0bo|+5(tR}B*i$>CjH@i(J`<5N< +zm*!QawcKB`2qVVWN|!2bmCj+qMz_>lyQe41Uc6GYo8|ZmgRouOWH<`fPtitAzEwsVe{gYe@!;OmfY1hA^J^GP2Zh7jc0#tW +zV;K{f-a2?ll{FjAo&kmu**_ByBXvrN+H7%pUgwrk*v>}T<%nfg$(O1#f`vAf;$Wwj +zK4OU>ekZ7*cXG`zK^{1Jk?6U1Z!$nXMaDUqNo}Oc<%5yn3pWZ=j1+|nlh9DXMmgJp +zw$>=#X^n__>Lz7RpGg`FbOM{jMF-I&Mx~Gtq{nwcJ*VwE0OFOdSNksknPO9!AjUy9a^u}; +zl{GfA#HVPd@8C*|vf;gcdLXrJL?MukrGr%c^ +z`dR^O=T^5*G@CU0fpX=d2?dv}l#Z}rvrURI+yrK9#ndWZg69>4-LW#tEa5!`s{Zgq +z8R@zhQOojaXAAXjJW6}a5>uV1LhgG$u5JQ_EBF0C=A-S5S2BuoH^CBy68!ST^VMKp +z5t!x0xnCI*Lk$t%?=aM?bAC5Sk&8&Qiu@hZj7DiJ;6#WZd1Z764c#+#;>O(U9%lfW +z>suxqZ)SVz&lYoFmEAcgM7u2vPU$2e-Hjzv>AJy1PeOk$DMk`K`~^i^seLl#HX2s@ +z&vS?_kECyji(-+eKdk1750r)$2U(RhTgkZT@l<$kC`GSck-TzG(h{pKG1aJhxkqgZ +zItykNw;mTU?xiP8Q;PAKW4yNPGkd;&0<^_8y4rHh6AzZ1@@Og1z$t3+RoVK`LOEWpvj)dqZ+bn-ZI_R@g2TDm +zUOXS$8{AioF8c*Kd%YqEKoqkyqA= +z;h>9H=F|lLAffO3sj^3_YLHV~t7o60Afgf+&g?fx9El~tAP}$YS=MFe#gI{HMPF+3A4XgD2y6V7pZ8*{ +zm8;APEKL9wC2F|aO=CXGJo^TSmQpb}X_X3Im%nsfn-Yr)Ip(;&N*#Ay_m3?ila&Xh +zA6V?kP!$WD1kP``H7hg@QY|w7?54~1UuB*oXqD_ePJg`i3GPV0EM`;%joWPh;8C{7 +zYdmIemNAl|da??P+nTE06i%eXK303w@_~!CLz4QEZFdnUm~0^2U*Dh4GePdBsTQhV +zsihVr6*e(LETK(_Y=c5vXJenfn3=4BLe-LG|E6?ccR#tlx)pG=|6cC;SaBt^!li5R +zcPgX&c2MsDL}~N-O+3=a0$|oiwZm$c)<&SyI4_0A@|JEcP=7FY3^?#Of0zNSfD^&A$%$p{mSW|9&i*6 +zj(_qDpxvBQ=^ptttH-vj$9~Va*80<33lpe5w3*6)d5BABGb>2&T7!J8KM%t$O}n*W +zJo+7yk8gR<_bN{XJ|u{lon5UfZc>HMFjulERk&KL*jqG{qadfz)xhuQcg|aymb_Y? +zVYhel3JJX|M+K*)DQMX1IZ`*_*vfscZkpLiT)9gL=cKs}uA(KzRP<4d8#RxOLcE#D +zJP9@OB>kt#JaeOXaqm4Kc^GYiehxcy4(-(f*^`-a9<3OAl0lXjMU1hK=(Co4O{$8%UM|E#&*;l(B?QsiT24bqlr*B{Z7V`VuFjMMHlGAysOT^==1z=5qZQ_2R +z-1qLb)#p6A6j}B#jg`CWg~=F5uJg4=mk4 +zMbEFlbNEc>OXUCT5piF*6@<3E+@D1YQ`=LOmdxBa$alJ^s;X9Vnwl%91RCi4CyD~~ +zEfY~;r~^+zF4y_)m=yu>0s3+B%|pI?8RS^ct^$kP#XRzE>S#R+#~GhIc~p)Cii4cW +z9H*m(D~n23;e5HIw0*7&$Qv-cSkS?#GB%E4^9a4Zdg>n0VB=s|P>wkUFR@1Py;++p +zX;6LW6tT+67ZSct6f1(Z{;9<&8!$Q%dsr@?heJCLyu$kE{QNwMcpba!S7M2R5q^_F +z1m`x@%z~KAD3f^-kF`7BW3BU>kYEeLw+hLBNDUxD$O}Z7ySX3c +zb)wd!i4k24wW1_C2@tbyw%f-8qhJmP`&caiZ`w$^LAjZS5Sn#m^9yX>OCkC~g$Cc7>RooBAs^cU +zIlTk#)OXQ82-Til1rliQ85sNCA>X3OzZ4b&8XPSua_&2S?i?lbG}vKCBGdB|nXS>g +zJ0*+o--w^syM8BpvQ@ycNTP2WG0U^*#8-MC0N=cB;m&`}!LXiv%vI8XM1O%D865l( +z{g6XRuw=jeOMjz9WK|@yzj!yA9i}KA0|SHG1bi12L)S{x7e=_kAN~FN)m7xbSP^arS9Rd{|t-bdQUEl`8{54zNMvQ +zmVu~1GPeH>P7JxwZV*CX5cIQzmo3E{siDMziZ%E7Tl9Q4KN4`#}D9_*vX?k}pO!=)gn7_4Bb4bJT +zqDaOnV(7U1_j;to@cwADU9mBc-@BdBUmAHSzyI{7YGVPi_y~b*r-e;$%CQnDe?9;8 +zfw~{4mSb>(|FgeRQE<@@i1>JZxfuACaFBgBIQO3(xsqo~Se?tnEhWOPgi|!6k69%H +zBXMEw6q@;gX1q%5b}P&*(QhwjwHm7%kJPg>aV1XSsKm6t<)rE6*j;x$hUQ|hu`kT) +zV+}ADC0AEh_W-HRr1Y}-%^FExK~@Y^t(ANZuuEJ`p#^k<`-MWnN77L2@X=9jV+>R; +zXOQ`#-WMm65hugihkOgXY4OID(WpNU{=B$ZDs8X^hCKKCdranviTkKK>$2J_;-Ga6 +z>WBEX7GD$0K(CoP7J96eYCwj_U5&HrOXJSWm=N0MQ^#7X5>(8zV6XiWLH3_ZhnV9@qF1Eb95#jw+CTK +zcnC_X6?w!ouwb8!t?ZeXbU*`_*tn=L1`tKaPq~o#XH-LT(pdaeEr(+5o7_BF^YP^9 +z=s=xqrRelm)Z^rj$VCV;RnXkG!NaMn=)gAL=kN77LMYwzIqFtY;-;Q!9U{UKkl*Z; +zxmwdAck=k)YYlsT2UM!0spVa*x7IFL)Qt{!?hIJJcZxQPc`eiw~~Oj@Tz_oM0xtx3Lb{5kxu +zyBD?uz>WN#g_E*U&crG80;MCX-DnFuJuz_nIeOw6$6c?&s+F|L2zU?5G!ekeS!llo +zFPgW-3Pcj`}O?5W?ab_h%Gy97f=v~(o +zy&qFFhNcAIGR5-l!~O!ti+&6tBv?y$VCZ!G*COZC^Rd=v3DD{VK&YZV`0rM0q-=5@nOTtcx@ +z-`GfyVTF_)=xoTY-xG)BHAl-#;@k>0Kap5G)B~X77JGh`U;(W#+Xleny2|+?3X~v9 +z@j4(Oa(GxV=hv@n1U4Y(PY6pg$c&Ot;)efq)~zTw>;uHy`pS!hYaNUHxEYhbgRg4R +z+}+}7o`g)4OPEQ|;tiYeawTA$%HmQyClOH{QqjoI$3uxnpv;6|Hoy*8NC^3e-^$N* +zqqby_w*0S5T>t%`@v?z_`@m;FByBE`COSJ7m_~uq^-Bim*HTzq_chCA9jeHpXN(2n +zwRqW7h)`1w=SY~Q#F+#wWc43wU)ql>D-{W#MMi*+Rc<(sqj$1IsI?*Vo~~JX4iGFY +zSjVn{Ia}(<$;mhGkK6li&$laGUX5+PgyS=U#yks+rN3QUeb1{R0P)Mr;duDNP0Yns +zOl80yG--mz(9cLJmrW%6skc}}J*KYlL*%B2MMfm>8W3{uoeA1tCC=;U0l+}4z>%rz1`1Gu3qlk(DUqGWSub-M#qTbUB+d9M069OLgJ6ct8Id?;aM)g-r9s^V6BrQ}Q;SCiP`udh7DC +zQX$nG;n1i3pom{#4@R?{E?z&>^3sL?I2rH<%HigVl9la73e4N^TR>PE}F +zsi3VDlCxI}2NOm!ndIQSbW~gNZ4rN(jki^a>Fbq! +zqTN5 +zzb`nx8&_h%Jrt7lQxR^o;6yE0jUGfj6BHagGKnEIbC?*Yeh-mN_p6 +zlPomN>R(3=k&0Ki-xElR=54S +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 +zqSFt2_caUMO6L4Xk>1Be-C +zNHX4bgVd8eU&h^$7@$FnL%%Qp$e+fZ(4dAotr#y7!RrZ>u)-F!F&*jOE8kA5rqU|| +zkg!kLmDxaol3FWgZ=YGJwHYE#cf7j}8z24RotEJKC)?r64}@x}^89m-1nf0~ +z*_bz@JP+Ml3hd*HWuOR@sNVh74L-Sw?LaYKwKo+rvy}#|aFc!~jT1o|KFR)cI+)Bn +z7Gg?S>|0zfR!%gT?WBBV*!!8j6W>|lJse7F&5>m#;ooWbRQhP@izf8nK?3n;AClTI +z6#M340iQgXluMzeY19}<(0FQ=O$wq@ql-?Y9&<2A-S>4Nw#z1Z-(eOaL`iCMI&1sAHP4i1wfU%}{TH10ti=qYU +zDz0-eM;$$6p`VP-jrsMCM}MB&A!(m3WE#f9F_{oZS)?8^0-?^g11w23S(X*2v9^k* +zKU)$N`g+?WLff<~UDFNP<{vgF`ivNrY!#|!D3|%nvN;axyiKQdEH}n|UAvW!JH2@P +z6TzqIA6}zL<{b4pMQp)4ffz(REKD*y3@}3^xF7ui{>6upo0Tm&dOIrt&>JXx_VQrn +z?-nhZdK!u;m!%$urT+S%i$tA>aj?l1`%j#jH%{|kdYyAos^NAM25jH<6TePW$nes= +z1!HeZ;$v}XEv4u4(RnINU~U}A*?wwCqU9m|k--nxsx^vf5AeRn$pVh?0Mnuc`C!uLu2;Vg{7)wfw`U +zX;*Wa;BHUq-TwcZ=lb=LAJ!W;9=uX-aQwln)6svvPf%SQ<1JdhQIPpzpQJ_KDid+% +z!(xv_|7G`-+M9p4uk#~(Mx)cG<|di_EPs|%wf~Qb+;nQM%q9N4&z7FNB6Z+G+^+MR +zj)|=QD8BER{dSeRdtd$LH*1N?VC!qI+*y}-;)|d!tvt|0N +zm5Vlct%>!zH1~C#{PXnRXO%R17-p8ep7o3QUvcWms)tYH$`9TvKIF>&@BVzZ?VI=h +zpErH+ydwvGOs@R*Hs)&kpXVngrCvTXb;0-d@xj~oPM7_l|L;HY`3dlY6p$IBU;poR +XXyugpZ1#qMfq}u()z4*}Q$iB}^Bg|U literal 0 HcmV?d00001 diff --git a/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch b/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch index 73f6bf3d01..9fb5b54049 100644 --- a/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch +++ b/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch @@ -5,14 +5,14 @@ Subject: [PATCH] API to allow/disallow tick sleeping diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 5d070f036dae6d93f863c55192b557419634456d..663b4ecd520e82aa108d44f2d5c2a20cfc7bc01f 100644 +index 5d070f036dae6d93f863c55192b557419634456d..c26e3a239441376f2694782d4f07943538677c71 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -332,6 +332,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop pluginsBlockingSleep = new ArrayList<>(); // Paper - API to allow/disallow tick sleeping ++ private final Set pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping public static S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); From 4190ee7439204c958e0fb9d013a34233e92fd870 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Mon, 25 Nov 2024 10:43:28 -0800 Subject: [PATCH 07/13] Add Server#isGlobalTickThread This method should be present in Paper, not just in Folia, given that the GlobalRegionScheduler is present. Additonally, add Server#isOwnedByCurrentRegion(World, int, int, int, int) for checking of a rectangle of chunks is owned by the current region. --- ...Folia-scheduler-and-owned-region-API.patch | 68 +++++++++++++++---- ...I-to-check-if-the-server-is-sleeping.patch | 6 +- ...-API-to-allow-disallow-tick-sleeping.patch | 4 +- ...Folia-scheduler-and-owned-region-API.patch | 16 ++++- ...0-Use-correct-seed-on-api-world-load.patch | 4 +- ...-API-for-updating-recipes-on-clients.patch | 10 +-- ...place-methods-with-old-StructureType.patch | 6 +- .../0917-Add-Lifecycle-Event-system.patch | 4 +- .../server/0922-improve-BanList-types.patch | 4 +- .../0955-Brigadier-based-command-API.patch | 14 ++-- patches/server/0978-Anti-Xray.patch | 4 +- .../1038-Moonrise-optimisation-patches.patch | 10 +-- patches/server/1046-Bundle-spark.patch | 8 +-- ...I-to-check-if-the-server-is-sleeping.patch | 4 +- ...-API-to-allow-disallow-tick-sleeping.patch | 4 +- 15 files changed, 110 insertions(+), 56 deletions(-) diff --git a/patches/api/0394-Folia-scheduler-and-owned-region-API.patch b/patches/api/0394-Folia-scheduler-and-owned-region-API.patch index b6b468f860..d464b8041e 100644 --- a/patches/api/0394-Folia-scheduler-and-owned-region-API.patch +++ b/patches/api/0394-Folia-scheduler-and-owned-region-API.patch @@ -18,7 +18,7 @@ the schedulers depending on the result of the ownership check. diff --git a/src/main/java/io/papermc/paper/threadedregions/scheduler/AsyncScheduler.java b/src/main/java/io/papermc/paper/threadedregions/scheduler/AsyncScheduler.java new file mode 100644 -index 0000000000000000000000000000000000000000..d9cdd04660c5e60e494a8fed91ae437e6cb733ed +index 0000000000000000000000000000000000000000..9852e14e68d12ca56b0d57cd6e83e252f47bde72 --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/scheduler/AsyncScheduler.java @@ -0,0 +1,51 @@ @@ -52,7 +52,7 @@ index 0000000000000000000000000000000000000000..d9cdd04660c5e60e494a8fed91ae437e + * @return The {@link ScheduledTask} that represents the scheduled task. + */ + @NotNull ScheduledTask runDelayed(@NotNull Plugin plugin, @NotNull Consumer task, long delay, -+ @NotNull TimeUnit unit); ++ @NotNull TimeUnit unit); + + /** + * Schedules the specified task to be executed asynchronously after the initial delay has passed, @@ -65,7 +65,7 @@ index 0000000000000000000000000000000000000000..d9cdd04660c5e60e494a8fed91ae437e + * @return The {@link ScheduledTask} that represents the scheduled task. + */ + @NotNull ScheduledTask runAtFixedRate(@NotNull Plugin plugin, @NotNull Consumer task, -+ long initialDelay, long period, @NotNull TimeUnit unit); ++ long initialDelay, long period, @NotNull TimeUnit unit); + + /** + * Attempts to cancel all tasks scheduled by the specified plugin. @@ -75,7 +75,7 @@ index 0000000000000000000000000000000000000000..d9cdd04660c5e60e494a8fed91ae437e +} diff --git a/src/main/java/io/papermc/paper/threadedregions/scheduler/EntityScheduler.java b/src/main/java/io/papermc/paper/threadedregions/scheduler/EntityScheduler.java new file mode 100644 -index 0000000000000000000000000000000000000000..9f69e189be8202a0ab1450540f5d12187ba6c987 +index 0000000000000000000000000000000000000000..99e9e20ae01f9b4b8cde585d29c57e27c53c996e --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/scheduler/EntityScheduler.java @@ -0,0 +1,104 @@ @@ -142,7 +142,7 @@ index 0000000000000000000000000000000000000000..9f69e189be8202a0ab1450540f5d1218 + * @return The {@link ScheduledTask} that represents the scheduled task, or {@code null} if the entity has been removed. + */ + @Nullable ScheduledTask run(@NotNull Plugin plugin, @NotNull Consumer task, -+ @Nullable Runnable retired); ++ @Nullable Runnable retired); + + /** + * Schedules a task with the given delay. If the task failed to schedule because the scheduler is retired (entity @@ -161,7 +161,7 @@ index 0000000000000000000000000000000000000000..9f69e189be8202a0ab1450540f5d1218 + * @return The {@link ScheduledTask} that represents the scheduled task, or {@code null} if the entity has been removed. + */ + @Nullable ScheduledTask runDelayed(@NotNull Plugin plugin, @NotNull Consumer task, -+ @Nullable Runnable retired, long delayTicks); ++ @Nullable Runnable retired, long delayTicks); + + /** + * Schedules a repeating task with the given delay and period. If the task failed to schedule because the scheduler @@ -181,11 +181,11 @@ index 0000000000000000000000000000000000000000..9f69e189be8202a0ab1450540f5d1218 + * @return The {@link ScheduledTask} that represents the scheduled task, or {@code null} if the entity has been removed. + */ + @Nullable ScheduledTask runAtFixedRate(@NotNull Plugin plugin, @NotNull Consumer task, -+ @Nullable Runnable retired, long initialDelayTicks, long periodTicks); ++ @Nullable Runnable retired, long initialDelayTicks, long periodTicks); +} diff --git a/src/main/java/io/papermc/paper/threadedregions/scheduler/GlobalRegionScheduler.java b/src/main/java/io/papermc/paper/threadedregions/scheduler/GlobalRegionScheduler.java new file mode 100644 -index 0000000000000000000000000000000000000000..365b53fea8dee09cdc11f4399dea5f00c6ee70e2 +index 0000000000000000000000000000000000000000..57455aca80ecc458b96b44c086cea94ddcecae47 --- /dev/null +++ b/src/main/java/io/papermc/paper/threadedregions/scheduler/GlobalRegionScheduler.java @@ -0,0 +1,58 @@ @@ -239,7 +239,7 @@ index 0000000000000000000000000000000000000000..365b53fea8dee09cdc11f4399dea5f00 + * @return The {@link ScheduledTask} that represents the scheduled task. + */ + @NotNull ScheduledTask runAtFixedRate(@NotNull Plugin plugin, @NotNull Consumer task, -+ long initialDelayTicks, long periodTicks); ++ long initialDelayTicks, long periodTicks); + + /** + * Attempts to cancel all tasks scheduled by the specified plugin. @@ -499,10 +499,10 @@ index 0000000000000000000000000000000000000000..a6b50c9d8af589cc4747e14d343d2045 + } +} diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 7919a001e5b5886a3d0fb64913064bc9607a2102..0f0b5b69a6cf7aac62a9802f2778cce4f08cfb88 100644 +index 7919a001e5b5886a3d0fb64913064bc9607a2102..42beeecad288a7600d4906877932ccd701ed7cc2 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2696,6 +2696,141 @@ public final class Bukkit { +@@ -2696,6 +2696,164 @@ public final class Bukkit { } // Paper end @@ -631,6 +631,21 @@ index 7919a001e5b5886a3d0fb64913064bc9607a2102..0f0b5b69a6cf7aac62a9802f2778cce4 + + /** + * Returns whether the current thread is ticking a region and that the region being ticked ++ * owns the chunks in the rectangle specified by the min and max parameters. ++ * Specifically, this function checks that every chunk with position x in [minChunkX, maxChunkX] and ++ * position z in [minChunkZ, maxChunkZ] is owned by the current ticking region. ++ * @param world Specified world. ++ * @param minChunkX Specified x-coordinate of the minimum chunk position. ++ * @param minChunkZ Specified z-coordinate of the minimum chunk position. ++ * @param maxChunkX Specified x-coordinate of the maximum chunk position. ++ * @param maxChunkZ Specified z-coordinate of the maximum chunk position. ++ */ ++ public static boolean isOwnedByCurrentRegion(@NotNull World world, int minChunkX, int minChunkZ, int maxChunkX, int maxChunkZ) { ++ return server.isOwnedByCurrentRegion(world, minChunkX, minChunkZ, maxChunkX, maxChunkZ); ++ } ++ ++ /** ++ * Returns whether the current thread is ticking a region and that the region being ticked + * owns the specified entity. Note that this function is the only appropriate method of checking + * for ownership of an entity, as retrieving the entity's location is undefined unless the entity is owned + * by the current region. @@ -639,16 +654,24 @@ index 7919a001e5b5886a3d0fb64913064bc9607a2102..0f0b5b69a6cf7aac62a9802f2778cce4 + public static boolean isOwnedByCurrentRegion(@NotNull Entity entity) { + return server.isOwnedByCurrentRegion(entity); + } ++ ++ /** ++ * Returns whether the current thread is ticking the global region. ++ * @see io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler ++ */ ++ public static boolean isGlobalTickThread() { ++ return server.isGlobalTickThread(); ++ } + // Paper end - Folia region threading API + @NotNull public static Server.Spigot spigot() { return server.spigot(); diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 2801f4b27bb77e2d5698f82dd14c4a92d2f4392c..01b1aa2af1aac83ac8b341e7ba2803317373056b 100644 +index 2801f4b27bb77e2d5698f82dd14c4a92d2f4392c..ecfe4f0079038e0a4541ac71ab590ac18108d1d3 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2351,4 +2351,119 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2351,4 +2351,138 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ @NotNull org.bukkit.potion.PotionBrewer getPotionBrewer(); // Paper end @@ -760,12 +783,31 @@ index 2801f4b27bb77e2d5698f82dd14c4a92d2f4392c..01b1aa2af1aac83ac8b341e7ba280331 + + /** + * Returns whether the current thread is ticking a region and that the region being ticked ++ * owns the chunks in the rectangle specified by the min and max parameters. ++ * Specifically, this function checks that every chunk with position x in [minChunkX, maxChunkX] and ++ * position z in [minChunkZ, maxChunkZ] is owned by the current ticking region. ++ * @param world Specified world. ++ * @param minChunkX Specified x-coordinate of the minimum chunk position. ++ * @param minChunkZ Specified z-coordinate of the minimum chunk position. ++ * @param maxChunkX Specified x-coordinate of the maximum chunk position. ++ * @param maxChunkZ Specified z-coordinate of the maximum chunk position. ++ */ ++ boolean isOwnedByCurrentRegion(@NotNull World world, int minChunkX, int minChunkZ, int maxChunkX, int maxChunkZ); ++ ++ /** ++ * Returns whether the current thread is ticking a region and that the region being ticked + * owns the specified entity. Note that this function is the only appropriate method of checking + * for ownership of an entity, as retrieving the entity's location is undefined unless the entity is owned + * by the current region. + * @param entity Specified entity. + */ + boolean isOwnedByCurrentRegion(@NotNull Entity entity); ++ ++ /** ++ * Returns whether the current thread is ticking the global region. ++ * @see io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler ++ */ ++ public boolean isGlobalTickThread(); + // Paper end - Folia region threading API } diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java diff --git a/patches/api/0498-API-to-check-if-the-server-is-sleeping.patch b/patches/api/0498-API-to-check-if-the-server-is-sleeping.patch index 219c527547..554f30ae5a 100644 --- a/patches/api/0498-API-to-check-if-the-server-is-sleeping.patch +++ b/patches/api/0498-API-to-check-if-the-server-is-sleeping.patch @@ -5,12 +5,12 @@ Subject: [PATCH] API to check if the server is sleeping diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index 0b78564256ebc647ebac402e549d86ab6e307c8d..ba366576a571214e67bcc529dc1bca19e1d59ef8 100644 +index dcd2699654c8848b985309f3739b4967515e41c7..7266d29ab6bb246e6daaa643951417123d42abcb 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2572,4 +2572,11 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2591,4 +2591,11 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ - boolean isOwnedByCurrentRegion(@NotNull Entity entity); + public boolean isGlobalTickThread(); // Paper end - Folia region threading API + + // Paper start - API to check if the server is sleeping diff --git a/patches/api/0499-API-to-allow-disallow-tick-sleeping.patch b/patches/api/0499-API-to-allow-disallow-tick-sleeping.patch index a199e4e43d..dc8203d43f 100644 --- a/patches/api/0499-API-to-allow-disallow-tick-sleeping.patch +++ b/patches/api/0499-API-to-allow-disallow-tick-sleeping.patch @@ -5,10 +5,10 @@ Subject: [PATCH] API to allow/disallow tick sleeping diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index ba366576a571214e67bcc529dc1bca19e1d59ef8..f55638eb8b315864052f9fe17ab4846e5e9d8dbb 100644 +index 7266d29ab6bb246e6daaa643951417123d42abcb..a92bd4da6788f1331a4838ab5760baec2dc6e8ec 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2578,5 +2578,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2597,5 +2597,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi * Returns whether the server is sleeping/paused. */ boolean isPaused(); diff --git a/patches/server/0834-Folia-scheduler-and-owned-region-API.patch b/patches/server/0834-Folia-scheduler-and-owned-region-API.patch index edcef4f99f..10b07e7cdb 100644 --- a/patches/server/0834-Folia-scheduler-and-owned-region-API.patch +++ b/patches/server/0834-Folia-scheduler-and-owned-region-API.patch @@ -1249,10 +1249,10 @@ index 4cced854e750ea9057b4a8d686245925e5dc2868..5a2d33b7da60469f27f9782841b0cf87 public void setLevelCallback(EntityInLevelCallback changeListener) { this.levelCallback = changeListener; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 5c907eca23d936ba3095f2d81256775edaa737da..1bf51d4a1ffb6ab56c4023c49725e412f4350197 100644 +index 5c907eca23d936ba3095f2d81256775edaa737da..4c4fa7bbafb075beb0d9c1ef21e3ba2d62b1ae65 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -313,6 +313,76 @@ public final class CraftServer implements Server { +@@ -313,6 +313,88 @@ public final class CraftServer implements Server { private final io.papermc.paper.logging.SysoutCatcher sysoutCatcher = new io.papermc.paper.logging.SysoutCatcher(); // Paper private final io.papermc.paper.potion.PaperPotionBrewer potionBrewer; // Paper - Custom Potion Mixes @@ -1321,9 +1321,21 @@ index 5c907eca23d936ba3095f2d81256775edaa737da..1bf51d4a1ffb6ab56c4023c49725e412 + } + + @Override ++ public final boolean isOwnedByCurrentRegion(World world, int minChunkX, int minChunkZ, int maxChunkX, int maxChunkZ) { ++ return ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor( ++ ((CraftWorld) world).getHandle(), minChunkX, minChunkZ, maxChunkX, maxChunkZ ++ ); ++ } ++ ++ @Override + public final boolean isOwnedByCurrentRegion(Entity entity) { + return ca.spottedleaf.moonrise.common.util.TickThread.isTickThreadFor(((org.bukkit.craftbukkit.entity.CraftEntity) entity).getHandleRaw()); + } ++ ++ @Override ++ public final boolean isGlobalTickThread() { ++ return ca.spottedleaf.moonrise.common.util.TickThread.isTickThread(); ++ } + // Paper end - Folia reagion threading API + static { diff --git a/patches/server/0840-Use-correct-seed-on-api-world-load.patch b/patches/server/0840-Use-correct-seed-on-api-world-load.patch index 298996ee0f..80e41be4af 100644 --- a/patches/server/0840-Use-correct-seed-on-api-world-load.patch +++ b/patches/server/0840-Use-correct-seed-on-api-world-load.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Use correct seed on api world load diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 1bf51d4a1ffb6ab56c4023c49725e412f4350197..d5e8cb8a907385e807c786815cf33f1cd9355f0c 100644 +index 4c4fa7bbafb075beb0d9c1ef21e3ba2d62b1ae65..54b5dee7cfd19ad58e376eee80d3827f1a80cfcd 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1388,7 +1388,7 @@ public final class CraftServer implements Server { +@@ -1400,7 +1400,7 @@ public final class CraftServer implements Server { net.minecraft.server.Main.forceUpgrade(worldSession, DataFixers.getDataFixer(), this.console.options.has("eraseCache"), () -> true, iregistrycustom_dimension, this.console.options.has("recreateRegionFiles")); } diff --git a/patches/server/0843-API-for-updating-recipes-on-clients.patch b/patches/server/0843-API-for-updating-recipes-on-clients.patch index fbced676d0..b9405f1a8f 100644 --- a/patches/server/0843-API-for-updating-recipes-on-clients.patch +++ b/patches/server/0843-API-for-updating-recipes-on-clients.patch @@ -38,10 +38,10 @@ index 3a6e918e9db6397b6f1cff531041655298ce087d..efc12d629b71ba1da664d9ecfd4575be public void reloadRecipes() { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index d5e8cb8a907385e807c786815cf33f1cd9355f0c..8e0d8fafa68d909d1d10c6d6a03cca371c0e6fb3 100644 +index 54b5dee7cfd19ad58e376eee80d3827f1a80cfcd..a755137d8d4b266a648cb2a4f41a5ed00262f121 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1178,6 +1178,18 @@ public final class CraftServer implements Server { +@@ -1190,6 +1190,18 @@ public final class CraftServer implements Server { ReloadCommand.reload(this.console); } @@ -60,7 +60,7 @@ index d5e8cb8a907385e807c786815cf33f1cd9355f0c..8e0d8fafa68d909d1d10c6d6a03cca37 private void loadIcon() { this.icon = new CraftIconCache(null); try { -@@ -1557,6 +1569,13 @@ public final class CraftServer implements Server { +@@ -1569,6 +1581,13 @@ public final class CraftServer implements Server { @Override public boolean addRecipe(Recipe recipe) { @@ -74,7 +74,7 @@ index d5e8cb8a907385e807c786815cf33f1cd9355f0c..8e0d8fafa68d909d1d10c6d6a03cca37 CraftRecipe toAdd; if (recipe instanceof CraftRecipe) { toAdd = (CraftRecipe) recipe; -@@ -1588,6 +1607,11 @@ public final class CraftServer implements Server { +@@ -1600,6 +1619,11 @@ public final class CraftServer implements Server { } } toAdd.addToCraftingManager(); @@ -86,7 +86,7 @@ index d5e8cb8a907385e807c786815cf33f1cd9355f0c..8e0d8fafa68d909d1d10c6d6a03cca37 return true; } -@@ -1768,9 +1792,23 @@ public final class CraftServer implements Server { +@@ -1780,9 +1804,23 @@ public final class CraftServer implements Server { @Override public boolean removeRecipe(NamespacedKey recipeKey) { diff --git a/patches/server/0848-Deprecate-and-replace-methods-with-old-StructureType.patch b/patches/server/0848-Deprecate-and-replace-methods-with-old-StructureType.patch index 2b18283f26..d058ddea87 100644 --- a/patches/server/0848-Deprecate-and-replace-methods-with-old-StructureType.patch +++ b/patches/server/0848-Deprecate-and-replace-methods-with-old-StructureType.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Deprecate and replace methods with old StructureType diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 8e0d8fafa68d909d1d10c6d6a03cca371c0e6fb3..ee79e3374b50ba21620a9685975a0341c15f313b 100644 +index a755137d8d4b266a648cb2a4f41a5ed00262f121..eaea08530ca864158a2fa15dca38ca0c25a49bde 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2007,6 +2007,11 @@ public final class CraftServer implements Server { +@@ -2019,6 +2019,11 @@ public final class CraftServer implements Server { ServerLevel worldServer = ((CraftWorld) world).getHandle(); Location structureLocation = world.locateNearestStructure(location, structureType, radius, findUnexplored); @@ -20,7 +20,7 @@ index 8e0d8fafa68d909d1d10c6d6a03cca371c0e6fb3..ee79e3374b50ba21620a9685975a0341 BlockPos structurePosition = CraftLocation.toBlockPosition(structureLocation); // Create map with trackPlayer = true, unlimitedTracking = true -@@ -2017,6 +2022,31 @@ public final class CraftServer implements Server { +@@ -2029,6 +2034,31 @@ public final class CraftServer implements Server { return CraftItemStack.asBukkitCopy(stack); } diff --git a/patches/server/0917-Add-Lifecycle-Event-system.patch b/patches/server/0917-Add-Lifecycle-Event-system.patch index b1b86fa7e1..cd301c6af8 100644 --- a/patches/server/0917-Add-Lifecycle-Event-system.patch +++ b/patches/server/0917-Add-Lifecycle-Event-system.patch @@ -727,10 +727,10 @@ index 2e96308696e131f3f013469a395e5ddda2c5d529..65a66e484c1c39c5f41d97db52f31c67 } catch (Throwable e) { LOGGER.error("Failed to run bootstrapper for %s. This plugin will not be loaded.".formatted(provider.getSource()), e); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index ee79e3374b50ba21620a9685975a0341c15f313b..7cc96d03472a4cb94e679251f0969995284f7eaa 100644 +index eaea08530ca864158a2fa15dca38ca0c25a49bde..b4a823a62d7088262b7f799c977aec71f8778ff5 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1050,6 +1050,11 @@ public final class CraftServer implements Server { +@@ -1062,6 +1062,11 @@ public final class CraftServer implements Server { @Override public void reload() { diff --git a/patches/server/0922-improve-BanList-types.patch b/patches/server/0922-improve-BanList-types.patch index 4d46a5f1dc..bb669a58a1 100644 --- a/patches/server/0922-improve-BanList-types.patch +++ b/patches/server/0922-improve-BanList-types.patch @@ -5,10 +5,10 @@ Subject: [PATCH] improve BanList types diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 7cc96d03472a4cb94e679251f0969995284f7eaa..54ef70eff81194c85d6433d00382a5909b6d797f 100644 +index b4a823a62d7088262b7f799c977aec71f8778ff5..0d62694e2f9086702eaca7a11799eb90a06ce853 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2260,6 +2260,21 @@ public final class CraftServer implements Server { +@@ -2272,6 +2272,21 @@ public final class CraftServer implements Server { }; } diff --git a/patches/server/0955-Brigadier-based-command-API.patch b/patches/server/0955-Brigadier-based-command-API.patch index 9d2a8822f5..5296fff1c9 100644 --- a/patches/server/0955-Brigadier-based-command-API.patch +++ b/patches/server/0955-Brigadier-based-command-API.patch @@ -2376,7 +2376,7 @@ index c4ffa8519b520e0793af90e149518951d7ffb65b..688916c8fef40d4c81379ad38609a979 // CraftBukkit end diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 54ef70eff81194c85d6433d00382a5909b6d797f..c65a4bb7f1818378a5e571d39a5aabe8ad87d16c 100644 +index 0d62694e2f9086702eaca7a11799eb90a06ce853..338b60f0254d55ac4a0645ca351d0ce736ce0681 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -275,11 +275,11 @@ public final class CraftServer implements Server { @@ -2394,7 +2394,7 @@ index 54ef70eff81194c85d6433d00382a5909b6d797f..c65a4bb7f1818378a5e571d39a5aabe8 private final StructureManager structureManager; protected final DedicatedServer console; protected final DedicatedPlayerList playerList; -@@ -407,6 +407,12 @@ public final class CraftServer implements Server { +@@ -419,6 +419,12 @@ public final class CraftServer implements Server { this.serverLinks = new CraftServerLinks(console); Bukkit.setServer(this); @@ -2407,7 +2407,7 @@ index 54ef70eff81194c85d6433d00382a5909b6d797f..c65a4bb7f1818378a5e571d39a5aabe8 CraftRegistry.setMinecraftRegistry(console.registryAccess()); -@@ -605,48 +611,11 @@ public final class CraftServer implements Server { +@@ -617,48 +623,11 @@ public final class CraftServer implements Server { } private void setVanillaCommands(boolean first) { // Spigot @@ -2458,7 +2458,7 @@ index 54ef70eff81194c85d6433d00382a5909b6d797f..c65a4bb7f1818378a5e571d39a5aabe8 // Refresh commands for (ServerPlayer player : this.getHandle().players) { -@@ -1033,17 +1002,31 @@ public final class CraftServer implements Server { +@@ -1045,17 +1014,31 @@ public final class CraftServer implements Server { return true; } @@ -2500,7 +2500,7 @@ index 54ef70eff81194c85d6433d00382a5909b6d797f..c65a4bb7f1818378a5e571d39a5aabe8 return false; } -@@ -1052,7 +1035,7 @@ public final class CraftServer implements Server { +@@ -1064,7 +1047,7 @@ public final class CraftServer implements Server { public void reload() { // Paper start - lifecycle events if (io.papermc.paper.plugin.lifecycle.event.LifecycleEventRunner.INSTANCE.blocksPluginReloading()) { @@ -2509,7 +2509,7 @@ index 54ef70eff81194c85d6433d00382a5909b6d797f..c65a4bb7f1818378a5e571d39a5aabe8 } // Paper end - lifecycle events org.spigotmc.WatchdogThread.hasStarted = false; // Paper - Disable watchdog early timeout on reload -@@ -1107,8 +1090,9 @@ public final class CraftServer implements Server { +@@ -1119,8 +1102,9 @@ public final class CraftServer implements Server { } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper @@ -2520,7 +2520,7 @@ index 54ef70eff81194c85d6433d00382a5909b6d797f..c65a4bb7f1818378a5e571d39a5aabe8 // Paper start for (Plugin plugin : pluginClone) { entityMetadata.removeAll(plugin); -@@ -1148,6 +1132,12 @@ public final class CraftServer implements Server { +@@ -1160,6 +1144,12 @@ public final class CraftServer implements Server { this.enablePlugins(PluginLoadOrder.STARTUP); this.enablePlugins(PluginLoadOrder.POSTWORLD); if (io.papermc.paper.plugin.PluginInitializerManager.instance().pluginRemapper != null) io.papermc.paper.plugin.PluginInitializerManager.instance().pluginRemapper.pluginsEnabled(); // Paper - Remap plugins diff --git a/patches/server/0978-Anti-Xray.patch b/patches/server/0978-Anti-Xray.patch index 71308aabb0..e2439a6f77 100644 --- a/patches/server/0978-Anti-Xray.patch +++ b/patches/server/0978-Anti-Xray.patch @@ -1599,10 +1599,10 @@ index 5fc9e8e969debb3e15ed474b36a1c48b086d0449..f65cc95ab28e8a3b21eac2b16bd9ebe9 private static final byte[] EMPTY_LIGHT = new byte[2048]; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index c65a4bb7f1818378a5e571d39a5aabe8ad87d16c..758d86865136e5ef58f401f00c5e62fbb8cf25a3 100644 +index 338b60f0254d55ac4a0645ca351d0ce736ce0681..87477ad186b5f692a39f323a618d016b669d8051 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -2702,7 +2702,7 @@ public final class CraftServer implements Server { +@@ -2714,7 +2714,7 @@ public final class CraftServer implements Server { public ChunkGenerator.ChunkData createChunkData(World world) { Preconditions.checkArgument(world != null, "World cannot be null"); ServerLevel handle = ((CraftWorld) world).getHandle(); diff --git a/patches/server/1038-Moonrise-optimisation-patches.patch b/patches/server/1038-Moonrise-optimisation-patches.patch index cdd0ced2cb..d22d5be4dc 100644 --- a/patches/server/1038-Moonrise-optimisation-patches.patch +++ b/patches/server/1038-Moonrise-optimisation-patches.patch @@ -23206,7 +23206,7 @@ index 0000000000000000000000000000000000000000..85950a1aa732ab8c01ad28bec9e0de14 + } +} diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index 46c37c8db8ecf3cc808fcf59f6bee5fe6ca49b75..cbd0f2c6636b8ae332f20a3cb763b06855dfe795 100644 +index 5e9c471ab20b0391e7e41351c65d96745fc8ce4a..9221ce36355eaf8d4456209c57b68486d587c255 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java @@ -219,6 +219,23 @@ public class GlobalConfiguration extends ConfigurationPart { @@ -36027,10 +36027,10 @@ index f65cc95ab28e8a3b21eac2b16bd9ebe97e56e571..0074bc0e7147dc3a8c538e796f14ac9b @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 758d86865136e5ef58f401f00c5e62fbb8cf25a3..6323738fe96c8e815a0835e6d8b03125c36ecf90 100644 +index 87477ad186b5f692a39f323a618d016b669d8051..1df118625aeb57f3353c40f9552f00d2f34fc655 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1432,7 +1432,7 @@ public final class CraftServer implements Server { +@@ -1444,7 +1444,7 @@ public final class CraftServer implements Server { // Paper - Put world into worldlist before initing the world; move up this.getServer().prepareLevels(internal.getChunkSource().chunkMap.progressListener, internal); @@ -36039,7 +36039,7 @@ index 758d86865136e5ef58f401f00c5e62fbb8cf25a3..6323738fe96c8e815a0835e6d8b03125 this.pluginManager.callEvent(new WorldLoadEvent(internal.getWorld())); return internal.getWorld(); -@@ -1477,7 +1477,7 @@ public final class CraftServer implements Server { +@@ -1489,7 +1489,7 @@ public final class CraftServer implements Server { } handle.getChunkSource().close(save); @@ -36048,7 +36048,7 @@ index 758d86865136e5ef58f401f00c5e62fbb8cf25a3..6323738fe96c8e815a0835e6d8b03125 handle.convertable.close(); } catch (Exception ex) { this.getLogger().log(Level.SEVERE, null, ex); -@@ -2515,7 +2515,7 @@ public final class CraftServer implements Server { +@@ -2527,7 +2527,7 @@ public final class CraftServer implements Server { @Override public boolean isPrimaryThread() { diff --git a/patches/server/1046-Bundle-spark.patch b/patches/server/1046-Bundle-spark.patch index 503d8c374f..292946d556 100644 --- a/patches/server/1046-Bundle-spark.patch +++ b/patches/server/1046-Bundle-spark.patch @@ -364,7 +364,7 @@ index c06863578c5d654706d93e73059d89c12ae502a5..17a158ff6ce6520b69a5a0032ba4c054 com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 6323738fe96c8e815a0835e6d8b03125c36ecf90..806e56cb60235a99f468d36a059fdbd54c2d46e3 100644 +index 1df118625aeb57f3353c40f9552f00d2f34fc655..11ff5f3b5cd25f0ad6ca944d59bca8434f8510d8 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -312,6 +312,7 @@ public final class CraftServer implements Server { @@ -375,7 +375,7 @@ index 6323738fe96c8e815a0835e6d8b03125c36ecf90..806e56cb60235a99f468d36a059fdbd5 // Paper start - Folia region threading API private final io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler(); -@@ -477,6 +478,7 @@ public final class CraftServer implements Server { +@@ -489,6 +490,7 @@ public final class CraftServer implements Server { } this.potionBrewer = new io.papermc.paper.potion.PaperPotionBrewer(console); // Paper - custom potion mixes datapackManager = new io.papermc.paper.datapack.PaperDatapackManager(console.getPackRepository()); // Paper @@ -383,7 +383,7 @@ index 6323738fe96c8e815a0835e6d8b03125c36ecf90..806e56cb60235a99f468d36a059fdbd5 } public boolean getCommandBlockOverride(String command) { -@@ -1103,6 +1105,7 @@ public final class CraftServer implements Server { +@@ -1115,6 +1117,7 @@ public final class CraftServer implements Server { this.reloadData(); org.spigotmc.SpigotConfig.registerCommands(); // Spigot io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper @@ -391,7 +391,7 @@ index 6323738fe96c8e815a0835e6d8b03125c36ecf90..806e56cb60235a99f468d36a059fdbd5 this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); -@@ -1131,6 +1134,7 @@ public final class CraftServer implements Server { +@@ -1143,6 +1146,7 @@ public final class CraftServer implements Server { this.loadPlugins(); this.enablePlugins(PluginLoadOrder.STARTUP); this.enablePlugins(PluginLoadOrder.POSTWORLD); diff --git a/patches/server/1068-API-to-check-if-the-server-is-sleeping.patch b/patches/server/1068-API-to-check-if-the-server-is-sleeping.patch index ac432cd932..11e9f2e44b 100644 --- a/patches/server/1068-API-to-check-if-the-server-is-sleeping.patch +++ b/patches/server/1068-API-to-check-if-the-server-is-sleeping.patch @@ -20,10 +20,10 @@ index 64b56abf8900d0424100da460fc68ac964394793..5d070f036dae6d93f863c55192b55741 + // Paper end - API to check if the server is sleeping } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 806e56cb60235a99f468d36a059fdbd54c2d46e3..605662917a7720a6c5134fd1d93aa2d26116b76d 100644 +index 11ff5f3b5cd25f0ad6ca944d59bca8434f8510d8..7afc3d4244c096f78d48338da2eb65c4e834b6f1 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -3246,4 +3246,11 @@ public final class CraftServer implements Server { +@@ -3258,4 +3258,11 @@ public final class CraftServer implements Server { return this.potionBrewer; } // Paper end diff --git a/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch b/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch index 9fb5b54049..751159901c 100644 --- a/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch +++ b/patches/server/1069-API-to-allow-disallow-tick-sleeping.patch @@ -51,10 +51,10 @@ index 5d070f036dae6d93f863c55192b557419634456d..c26e3a239441376f2694782d4f079435 // Paper end - API to check if the server is sleeping } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 605662917a7720a6c5134fd1d93aa2d26116b76d..cac8592e3a2f438fe9ca167a4fdcd65152bbb2de 100644 +index 7afc3d4244c096f78d48338da2eb65c4e834b6f1..ac8af406180bc680d46e8edc3da0fc2e5211345a 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -3252,5 +3252,10 @@ public final class CraftServer implements Server { +@@ -3264,5 +3264,10 @@ public final class CraftServer implements Server { public boolean isPaused() { return this.console.isTickPaused(); } From 5f0932b6c8ac9a3c900075fc40f77b506c63ed82 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Mon, 25 Nov 2024 20:18:47 +0100 Subject: [PATCH 08/13] [ci skip] leaf --- patches/server/0488-Improve-ServerGUI.patch | 647 ++++++++++---------- 1 file changed, 323 insertions(+), 324 deletions(-) diff --git a/patches/server/0488-Improve-ServerGUI.patch b/patches/server/0488-Improve-ServerGUI.patch index 48a151cd82..8dde1d1a9b 100644 --- a/patches/server/0488-Improve-ServerGUI.patch +++ b/patches/server/0488-Improve-ServerGUI.patch @@ -102,330 +102,329 @@ new file mode 100644 index 0000000000000000000000000000000000000000..8b924977b7886df9ab8790b1e4ff9b1c04a2af45 GIT binary patch literal 16900 -zcmaf)RZtymu&!}kXmDLfg1h^|-QC?ixG&s2I0Sch5AG1$U4m2?7EFMOsQs1p)$M^xuU52LS<5tyS|A0z!B~T1;5Y)8HZp -zUh9YE!*I`C!>au1!lt}?^7%)ymXa9F0E8%U6cA@Hs@r2|t2YjT?MMEK&sF!xR;P(1 -zJxFf8OgT_&`%_^18f74-j~9B>_v*F_4QG7P$=~I&{g0k-!dKZ;dhG_Yv84aKQ7`JU -zJ^ehid=1+b=_P#o97{5v??~H!^zyIS&U_=f-+Z&XS28Q#IuJUNE}ApzE+z8$!_(s%I3_!)=jTdGmXzz2p&3&czvSwVkj_PR|SM`xDjT-m<)@wFKtJ!fY -z+A9f&c$RQF&Z%Ui9@S9nRjlxMs@)Z5_OxNu^|5JS^tNFPeEv!Mp+fj^Yc}Scf482J -z_jv2_UYgabd?1AMePOH(|ApkUIjM`|sON7?4||4r>}#l#)Nj}LPNV67U-a5cAqgk9 -z4hA)b1i?G`_{?Is2NgH3=G*Y_oV4G*#y>w?4I7fSpx2h|vD&hsqdFVmofnVkNpM8o -zEDOkF7WVse0CrXXeH^X&Y+X5Ugeg(@8XVq_7ngH%kQ4q8to@(w`VD%+t{VjBlZzMA{89 -z;%$e2aiD==VT$}%!%lBbY3xicyog$jB!Djxd7vpR6bXArR{Oqv(5MfWsJg3Yy -zcUpf*M1f-z9ik)^?H|-}` -zxbJl0Xc<(adaW`;Xc^eA&$kJ4EZWH)dOO+mFzw;MBfNjA5<1ZP>E3RWzD|&L1WdK! -z2k&T-AdM3|);yD$reQ{x9G{_#6R5f}9%tdjf-W#_wS$qa(*X;ot*Gkja`g1Q_eN^= -z`0%;Ho3r-6zU-m(+)f%v8KxzXfn20UBXua$j&hd^L+a{0lv^F@IS92IL#!_sffCl2&zHVp_~j(J1np!W5n69+~xPAJ6}_zBa%4jtFt9W -z{@f*=wRJ|ZitBopGm@A{J`xa&M -z)PY`TF0^X2?f!}827nOWNuI-}Ne-gU_A_rT89Qjihq3d_{Ugx}ge|kRq}v@?<-}sM1htR5<=} -zI1L1)$lG(bP|&c#@>`Np6h0xGHe-S%SWq_O*_rH`M&)M5xj9Un#*HS!PqE5 -zISo-XF(NX8c$<8iK|uH&>qt?Q&-b}D+Tgr7t>MFp&WJTZFnPZ1>|RTVqu7iauEwTX -zVJi3CHpH3>2eq__Ox+k#@Bzl=K|7STdhX7MT{c8Ce71~q9Y&PXH}*iaRuCUgMZj4H -z)QyHub -z_qnc(rzc$MCNk878`Sofx_>n{BwDNL?TS=$RO_S6!R*Ey=`(aG@LbB{HGQ+@MqP=h -zu&0VvO0ab!36xlai&*>Xc+6_xPmdSo9TasQ3?*TY!)%lYzD(AZ0HWie+au=#fiLo& -zU+O6Y`-6UchQAZ*C2TI_f~f(2hrMt6KE)jP36+(ZZfle23Dx>Inkk_7xY0&pkp)+N -z%^^0b-mA7bkD<)a8%J{cvSRJ2S;}#v9g(doR}TQ3QGy%7T$YWkQuW{|T0eu$!D%Gg -zhIpru$xwR_h!F-%c~|@zigH-C2m=8{D8VNnCdFPc6Rfz(8f#dDmuUW@`u=TQn?l6ex-ha;(`` -zrS1uS-(@|j8cS+#fW*WdM9k{Fbp6f|!@JL%Gh}@yEWnTjE-DYfVpx0s5?hF9Qzi@Lf>~6Pm?DX{;HP^Q242(r1D1_=jrbppWF;PQk_!Ls -zS?3Zy6SOYNhA^`C9Gr`$aM+kF+PqIpNc~b)YOTag^;@K{!LHyR#-D?kKh>QZn&JHs -z(S}LQ;l-T8IWrlT$vDeig`Pf3fs);`cyZgTesw;vUk*#=1ZlB5zS``R@)U;`I^|DW -z?`Wu5^KI6hZo2(M-a~zF#>3kiX?zjyY=f@)xk3s24jF8WN!RqnV5qMC{5IS-?p~l` -z*Od<2Atam`NRWyKlq2%T>WdXRFci|p)_QD!{us*BG6#&@1J>-ygf`d(+Yt%AR?$|m -zG2&h}ZNhe;3iL&t-&Bo~bSQvwc_uqFF*q*u<%r&3Io&Jc -z8X3Bs8jXqH@NHmV7BRmCYCHHs=Nrep*-}>qojz9eD&96O%Es8n$%gaSnOL~VE%6i@ -z&N;!@pfy%G7dw?+2y1|uMDE?45uzNTNB_7>aX);UvtG>N2^CK4jXJOIypMJdF8LKU -zTYqIdp7&|wl19M2-A~xsFLDE9e-nocdK3)_YdtcQ)W%k7bx|ihJbIc=Z5ZyZ^yh9L -zz(%H87tSJzNkw!4yq5hajBkYU#kO&cksLk7!K-`GO(iyvT=U{|HBlNQU1VB|)w$-~ -z!`vE~Br`P8J<1%ly9{1OIZc%XlCTOPAdcit!jhpR;%=Zn+J^5sT)?#vtC4a+pY5iB -zJDz5Ru-Z>~+fH$VWPdd~FVQ(AT}O25HPC_wANYArttZij2ISLx>m75xSQO6+R*;0g -zmeuq!90F_}HX%kFZpuj4@q)SDa3k?+Bb2PrSZjTt%acFjLT3$4HPduPZ4Sfv?#~)_ -z*x>rvxpNnXh2P;_1YzBnVcqa9VK{mn1MhEaK>}|FhPXm?dB28(cqh2Ag&XIAnbGh%w38mufD688Vg0{`stk3i+PA1e~X7W%o(N09G -z(V+dK5Ra`6>fQc$6V4g$Mc;jTrbmt|ZcfPDi&luFxnBGk{2GGnMACo~C5VWy9A^BK -z%9O|VK>O{=o7e@%H==p}Gh9?4J3)S(^K@|@-bpGMlMM#a6u}N>;hDZ{$m0w+?{P+i -zv!bb`WN0Gnx5bB0s;!iJeK(?O@&xo_Yr==8dbs9N^gw0u(XKa5#%g4gLt%5d9^x&bUp+ -zI*CuQXb^F)LGcsTq00ke&-aZbA7b?Ow}kNZFJJuWYsoo#JJ -zd^|iHd;0^2Lk8)L=de&2-C9OWIvMMW>WH|w6peAk$qJ4MH%Wu;|h=~A6+4h{@J3knK0*pJ@vag9^60=vvWcI&Lb_(VX2 -zy)N7VOA=(g{REg_f)&_ekDo9i1vl8j0R0zl47}1}4kDqz)m%np1-97YCtxX^_8Eb1U&2>fjdHvFw8)9n=PT=mS{*wNJdpIN5Au>lfU5v4<160teocH-d>QHxOk-7@IW}47m1u$uA~w=(B0jA`kk+l2DCPaOxmP~ndvI$ -zYkm8H%IFn;s^>pUrvz6NLyr<`Ro3Korg8A+&kfO!G6vn2h>XJTf5yvnnk!b`Vn06= -zO|u}x(#U)>eRZq|c{Ep6$&^P+2{n)IUvm+$hJWpRp@dc$Pc5;};;;?#x;>0!Q&lV! -z`h5GsX89Y7O)`a6U8!1!!`XBAGrQC|6pr$y?Yi~{n@H;dTYvsSV}Guzrbl=`^4UoI -z8~S7M#L3iCl4D&LZY7p{pxhZgK`flMwzluNP~zogXL!BoNYnrwRFOn1!FLoBg%hgK -zT2%$)cYHjmbW$l?<>3q586J5ELJKn1OZfwK6zZEGypC8YxWSi_nBA+Z_&{j*y_tMb -z6C6(s<>8a1YQkTymwXrrI?Xm2Z(XHsp-_~6s;*Hc@MZxKw?mh=jIMvB--jM9zQDT5 -z_##%J(qN!>z*rOmA{Oc8*IOL7NzRt42R1uBo;?F>^ndx{qY!eko1xoqPknBbx`jeg -zBK1!If?!CHwgxmCjWr7V)0^wAxV{-lm1HGp@U)MCwN_MeX3LZ*jEL+Um3h1ahneA%41;uV#JudJYWnF4<o}yV;v9^YzeZ9DJPbxV -zCaJz8JMuzS|;y@^GISocc73^ZoFw_q)lcpJX%zS -z?3#&5BtAW>(BMlU0{VA<|F{5pf0gcm5ueT^9u0&(YN^<63?O&=!S{pn(` -zLg_%W?ebF_1IK2E8}fXKJRN7Sd1NEd3=zE}{Ff-55EeRtg*n1;E66aMQp_*vt;2W-BHy(2b;Flg4sLL8j`MDJ -zAbfu?@{0+Il12eRII46kiNKmt05>iU=h -z$)Irsw!hHw5wf7*gjxln_O`c8!(m4}pSsbqKLIVrd=!}5jW}+WPlzQ;+_e-& -z?Dy<48J&+h3*@LUmFxqzh_g>rb^`iEl)hiDf5($dZZJpaL!%i&d@Buf3+M~(|w0IKfQ -za3X0Srk%nLvE~Ab9|gBtt2_H<(fw_Zha@}t^K>=dbE+8{uYX2|#N=bmI)Wc;T*rwV -zwd5A@i2kamPB6hHF1AG?W!pUo_~vz+3wdlN<%QSGe!5}^qJ59h?#udS@qUf7 -zv-9ZWcl%ZgYEV62Ov?klP4Ypq+COVB -zzbpQbKJ4p#FTFlCeU?M~M)FWg!L^__)A~q8ym6&0c0f4_^d1Qsf;q;YQPHwFTKQaY -z@}^_vfdLrw7oSN5$O~22BEUPFgd#kF2FBsIH_Toz2Nw=v^=tZBu!NT|Lp7qp(fZ&&7q@7C0rFJD6; -z(%|4PztN>6GF#&@{I1tbNIIaALQ8ulFL8_Y1vGk-QMPKSZe0HpMtxgqkoct%kuq`w -z#x-}Cb*!ytPr?%+STtAMUu{{K-N%@g062$UWI7UOQm3=mc9wknbhD2qEj-!b^P -z%oYhuwx~lumz_3B^a7bYyyq-71@Fw*7ULPhNJocwr5CvLRsE<~sh>maF=R1p!hO** -zh+7MfH?17kb@`xEls`270@5OICG>$(UstdYt%lJ^wwiJK8I1@$5SE2?UF-^CtL8@; -zs4{#zGZBM@8f^QW&S9I{2Bl9>kdJkdQs6??R6c{5q%l*?6D-aNSM(>Zc4);q<1&7n -zVSb1AZyvYG&77Xtb`dpP1hGZw+U_-uc%-;be&gSUcbi*hJ9V!?LnI5O4d&1TOrlrE -z11&b|=uC!5&O5GB^zm!T#ncJ-bmy8|`YuXV_zy3)jPFmR0m -zFLy&N`z42~p5XU|+fn|GAIE2AfPi3JbxB>QXQ+7$3m_ug7v}~qfMAh#5*_)0mSKO^ -z)R>_thix1PNC=^T>X5@o5Ik^s!>_0nb%0+Qu?l@fMu||fRMI8(eq@a06~$a6goXp4 -zTc(!CW&GU`Z?7*~C%0!|`Po;Y-B>bq8(=^Pt0w>CW3cOKf|^OmN3o|I)zb~mlpR!VZRWgf3r$DjB6U@% -zJ!v9xOZ<+LBarT*ahaknq^miC#W^ANPQ%<$&RHDpEBCU_M(sbvsugC-mYh-fO{Sw9 -z2eEARzci;On#5;xRA{kHL-zc9^rxh(B6&XXZ*i0bo|+5(tR}B*i$>CjH@i(J`<5N< -zm*!QawcKB`2qVVWN|!2bmCj+qMz_>lyQe41Uc6GYo8|ZmgRouOWH<`fPtitAzEwsVe{gYe@!;OmfY1hA^J^GP2Zh7jc0#tW -zV;K{f-a2?ll{FjAo&kmu**_ByBXvrN+H7%pUgwrk*v>}T<%nfg$(O1#f`vAf;$Wwj -zK4OU>ekZ7*cXG`zK^{1Jk?6U1Z!$nXMaDUqNo}Oc<%5yn3pWZ=j1+|nlh9DXMmgJp -zw$>=#X^n__>Lz7RpGg`FbOM{jMF-I&Mx~Gtq{nwcJ*VwE0OFOdSNksknPO9!AjUy9a^u}; -zl{GfA#HVPd@8C*|vf;gcdLXrJL?MukrGr%c^ -z`dR^O=T^5*G@CU0fpX=d2?dv}l#Z}rvrURI+yrK9#ndWZg69>4-LW#tEa5!`s{Zgq -z8R@zhQOojaXAAXjJW6}a5>uV1LhgG$u5JQ_EBF0C=A-S5S2BuoH^CBy68!ST^VMKp -z5t!x0xnCI*Lk$t%?=aM?bAC5Sk&8&Qiu@hZj7DiJ;6#WZd1Z764c#+#;>O(U9%lfW -z>suxqZ)SVz&lYoFmEAcgM7u2vPU$2e-Hjzv>AJy1PeOk$DMk`K`~^i^seLl#HX2s@ -z&vS?_kECyji(-+eKdk1750r)$2U(RhTgkZT@l<$kC`GSck-TzG(h{pKG1aJhxkqgZ -zItykNw;mTU?xiP8Q;PAKW4yNPGkd;&0<^_8y4rHh6AzZ1@@Og1z$t3+RoVK`LOEWpvj)dqZ+bn-ZI_R@g2TDm -zUOXS$8{AioF8c*Kd%YqEKoqkyqA= -z;h>9H=F|lLAffO3sj^3_YLHV~t7o60Afgf+&g?fx9El~tAP}$YS=MFe#gI{HMPF+3A4XgD2y6V7pZ8*{ -zm8;APEKL9wC2F|aO=CXGJo^TSmQpb}X_X3Im%nsfn-Yr)Ip(;&N*#Ay_m3?ila&Xh -zA6V?kP!$WD1kP``H7hg@QY|w7?54~1UuB*oXqD_ePJg`i3GPV0EM`;%joWPh;8C{7 -zYdmIemNAl|da??P+nTE06i%eXK303w@_~!CLz4QEZFdnUm~0^2U*Dh4GePdBsTQhV -zsihVr6*e(LETK(_Y=c5vXJenfn3=4BLe-LG|E6?ccR#tlx)pG=|6cC;SaBt^!li5R -zcPgX&c2MsDL}~N-O+3=a0$|oiwZm$c)<&SyI4_0A@|JEcP=7FY3^?#Of0zNSfD^&A$%$p{mSW|9&i*6 -zj(_qDpxvBQ=^ptttH-vj$9~Va*80<33lpe5w3*6)d5BABGb>2&T7!J8KM%t$O}n*W -zJo+7yk8gR<_bN{XJ|u{lon5UfZc>HMFjulERk&KL*jqG{qadfz)xhuQcg|aymb_Y? -zVYhel3JJX|M+K*)DQMX1IZ`*_*vfscZkpLiT)9gL=cKs}uA(KzRP<4d8#RxOLcE#D -zJP9@OB>kt#JaeOXaqm4Kc^GYiehxcy4(-(f*^`-a9<3OAl0lXjMU1hK=(Co4O{$8%UM|E#&*;l(B?QsiT24bqlr*B{Z7V`VuFjMMHlGAysOT^==1z=5qZQ_2R -z-1qLb)#p6A6j}B#jg`CWg~=F5uJg4=mk4 -zMbEFlbNEc>OXUCT5piF*6@<3E+@D1YQ`=LOmdxBa$alJ^s;X9Vnwl%91RCi4CyD~~ -zEfY~;r~^+zF4y_)m=yu>0s3+B%|pI?8RS^ct^$kP#XRzE>S#R+#~GhIc~p)Cii4cW -z9H*m(D~n23;e5HIw0*7&$Qv-cSkS?#GB%E4^9a4Zdg>n0VB=s|P>wkUFR@1Py;++p -zX;6LW6tT+67ZSct6f1(Z{;9<&8!$Q%dsr@?heJCLyu$kE{QNwMcpba!S7M2R5q^_F -z1m`x@%z~KAD3f^-kF`7BW3BU>kYEeLw+hLBNDUxD$O}Z7ySX3c -zb)wd!i4k24wW1_C2@tbyw%f-8qhJmP`&caiZ`w$^LAjZS5Sn#m^9yX>OCkC~g$Cc7>RooBAs^cU -zIlTk#)OXQ82-Til1rliQ85sNCA>X3OzZ4b&8XPSua_&2S?i?lbG}vKCBGdB|nXS>g -zJ0*+o--w^syM8BpvQ@ycNTP2WG0U^*#8-MC0N=cB;m&`}!LXiv%vI8XM1O%D865l( -z{g6XRuw=jeOMjz9WK|@yzj!yA9i}KA0|SHG1bi12L)S{x7e=_kAN~FN)m7xbSP^arS9Rd{|t-bdQUEl`8{54zNMvQ -zmVu~1GPeH>P7JxwZV*CX5cIQzmo3E{siDMziZ%E7Tl9Q4KN4`#}D9_*vX?k}pO!=)gn7_4Bb4bJT -zqDaOnV(7U1_j;to@cwADU9mBc-@BdBUmAHSzyI{7YGVPi_y~b*r-e;$%CQnDe?9;8 -zfw~{4mSb>(|FgeRQE<@@i1>JZxfuACaFBgBIQO3(xsqo~Se?tnEhWOPgi|!6k69%H -zBXMEw6q@;gX1q%5b}P&*(QhwjwHm7%kJPg>aV1XSsKm6t<)rE6*j;x$hUQ|hu`kT) -zV+}ADC0AEh_W-HRr1Y}-%^FExK~@Y^t(ANZuuEJ`p#^k<`-MWnN77L2@X=9jV+>R; -zXOQ`#-WMm65hugihkOgXY4OID(WpNU{=B$ZDs8X^hCKKCdranviTkKK>$2J_;-Ga6 -z>WBEX7GD$0K(CoP7J96eYCwj_U5&HrOXJSWm=N0MQ^#7X5>(8zV6XiWLH3_ZhnV9@qF1Eb95#jw+CTK -zcnC_X6?w!ouwb8!t?ZeXbU*`_*tn=L1`tKaPq~o#XH-LT(pdaeEr(+5o7_BF^YP^9 -z=s=xqrRelm)Z^rj$VCV;RnXkG!NaMn=)gAL=kN77LMYwzIqFtY;-;Q!9U{UKkl*Z; -zxmwdAck=k)YYlsT2UM!0spVa*x7IFL)Qt{!?hIJJcZxQPc`eiw~~Oj@Tz_oM0xtx3Lb{5kxu -zyBD?uz>WN#g_E*U&crG80;MCX-DnFuJuz_nIeOw6$6c?&s+F|L2zU?5G!ekeS!llo -zFPgW-3Pcj`}O?5W?ab_h%Gy97f=v~(o -zy&qFFhNcAIGR5-l!~O!ti+&6tBv?y$VCZ!G*COZC^Rd=v3DD{VK&YZV`0rM0q-=5@nOTtcx@ -z-`GfyVTF_)=xoTY-xG)BHAl-#;@k>0Kap5G)B~X77JGh`U;(W#+Xleny2|+?3X~v9 -z@j4(Oa(GxV=hv@n1U4Y(PY6pg$c&Ot;)efq)~zTw>;uHy`pS!hYaNUHxEYhbgRg4R -z+}+}7o`g)4OPEQ|;tiYeawTA$%HmQyClOH{QqjoI$3uxnpv;6|Hoy*8NC^3e-^$N* -zqqby_w*0S5T>t%`@v?z_`@m;FByBE`COSJ7m_~uq^-Bim*HTzq_chCA9jeHpXN(2n -zwRqW7h)`1w=SY~Q#F+#wWc43wU)ql>D-{W#MMi*+Rc<(sqj$1IsI?*Vo~~JX4iGFY -zSjVn{Ia}(<$;mhGkK6li&$laGUX5+PgyS=U#yks+rN3QUeb1{R0P)Mr;duDNP0Yns -zOl80yG--mz(9cLJmrW%6skc}}J*KYlL*%B2MMfm>8W3{uoeA1tCC=;U0l+}4z>%rz1`1Gu3qlk(DUqGWSub-M#qTbUB+d9M069OLgJ6ct8Id?;aM)g-r9s^V6BrQ}Q;SCiP`udh7DC -zQX$nG;n1i3pom{#4@R?{E?z&>^3sL?I2rH<%HigVl9la73e4N^TR>PE}F -zsi3VDlCxI}2NOm!ndIQSbW~gNZ4rN(jki^a>Fbq! -zqTN5 -zzb`nx8&_h%Jrt7lQxR^o;6yE0jUGfj6BHagGKnEIbC?*Yeh-mN_p6 -zlPomN>R(3=k&0Ki-xElR=54S -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 -zqSFt2_caUMO6L4Xk>1Be-C -zNHX4bgVd8eU&h^$7@$FnL%%Qp$e+fZ(4dAotr#y7!RrZ>u)-F!F&*jOE8kA5rqU|| -zkg!kLmDxaol3FWgZ=YGJwHYE#cf7j}8z24RotEJKC)?r64}@x}^89m-1nf0~ -z*_bz@JP+Ml3hd*HWuOR@sNVh74L-Sw?LaYKwKo+rvy}#|aFc!~jT1o|KFR)cI+)Bn -z7Gg?S>|0zfR!%gT?WBBV*!!8j6W>|lJse7F&5>m#;ooWbRQhP@izf8nK?3n;AClTI -z6#M340iQgXluMzeY19}<(0FQ=O$wq@ql-?Y9&<2A-S>4Nw#z1Z-(eOaL`iCMI&1sAHP4i1wfU%}{TH10ti=qYU -zDz0-eM;$$6p`VP-jrsMCM}MB&A!(m3WE#f9F_{oZS)?8^0-?^g11w23S(X*2v9^k* -zKU)$N`g+?WLff<~UDFNP<{vgF`ivNrY!#|!D3|%nvN;axyiKQdEH}n|UAvW!JH2@P -z6TzqIA6}zL<{b4pMQp)4ffz(REKD*y3@}3^xF7ui{>6upo0Tm&dOIrt&>JXx_VQrn -z?-nhZdK!u;m!%$urT+S%i$tA>aj?l1`%j#jH%{|kdYyAos^NAM25jH<6TePW$nes= -z1!HeZ;$v}XEv4u4(RnINU~U}A*?wwCqU9m|k--nxsx^vf5AeRn$pVh?0Mnuc`C!uLu2;Vg{7)wfw`U -zX;*Wa;BHUq-TwcZ=lb=LAJ!W;9=uX-aQwln)6svvPf%SQ<1JdhQIPpzpQJ_KDid+% -z!(xv_|7G`-+M9p4uk#~(Mx)cG<|di_EPs|%wf~Qb+;nQM%q9N4&z7FNB6Z+G+^+MR -zj)|=QD8BER{dSeRdtd$LH*1N?VC!qI+*y}-;)|d!tvt|0N -zm5Vlct%>!zH1~C#{PXnRXO%R17-p8ep7o3QUvcWms)tYH$`9TvKIF>&@BVzZ?VI=h -zpErH+ydwvGOs@R*Hs)&kpXVngrCvTXb;0-d@xj~oPM7_l|L;HY`3dlY6p$IBU;poR -XXyugpZ1#qMfq}u()z4*}Q$iB}^Bg|U +zcmaicV|1Ng^k&Q(Hn!T>_Kj`Zc4OO48rwD-Gw*(Xv_UIGaL4*?7e3`t5-R2lSh^xqd84Cs4}W^FDQn9zijsF13M{zVR~<`0dB +z;hww3Rk_uLO*yyZ^N(arMN#SjFcHEi60E_fZug`IjtJ^LVtno=lKj+Jze{_WszRIN1X*HUTCH>C_wc;+D)6YYT +z*RWmTUi`Puu_Uwkj6-qwu_Ue*kO&$%=o%J?6*rej_Ock3znkGIb6 +zWm&yS2Z9LS7slFgUx+?ilDgQBdj7`ruw|IVzJ@wV{&tD)G@SPTMW@9Wl5lcsuU~6` +z7raw|%Or|@Pnlh`7!!rA1H$`p;zz}+92Tp2bFmKDAL`nrC>)<{qBHso +zvJ6|o^vMxL?frh4XZ`3WdH7s_NI0p@{EElbnX*!yp;Vtx&K&w$&to`sW +z79>enm;xWhu;ZKKIN}-h!eBKZM6j$9~*Q(SlE*i_bHS0o#tPY +z5-j+ww|x>h9%`RLUixM!e%f0qVAe5GH83X6?!#^_j-M@lO@*-aD%NMF2;Hg^Wgh@}elrPA3o_&(- +zeNyws4es~%;K1o+pfG(Z!G-nFWzl7)ejRNxY?M~uI=I&MYuz@4>GLH*ptjlQJ`LYr +z*KIIVzBhKHIDwe`X2hc@gsdjzXxX%b<_#kc$vIHFi2)-XM1=fs(`g?0)M{lcJXwp< +zBgIdDXM&n-=+_%;1a?sE$oeN{r%w=8tFfAlQopAk +z%wrVN=r>)oZ0w7^M~Xi~qp6lEaABgF(ck7V3Un;@cg|ODuD7@fw~OZ;^TQV +z$&4AiUj}-4;o`6JV$Y4C2G +z8hVweUdzl78hWzD|&J_)oRr2JdJP +zA&lca);^P(q@hQb9-kqNXVo9An7Q3NoAtyRQw-@JUDD$oluryjE +z3{zzbZhStP-K;xw@Yxf-B=4h(p=4f`k8p2DH$>qQLPR!szD!2|vJ}J`C6=EoRwG^+ +z;`ZDv1SGVO+?IqSxpxSM^_V~@2E+~dZQdl+oz;TP1MX+XXwugMy?Z5AoZ7#R33Y@T +zM)w4;9L0szO3>6i#4fV3q49@wu&`zcvQ!d8!m*dpn&7pp0Y=;QbiyOzhC7)Ki7tDt +zXaIqysWqx53ZgHlO)|YRDG**$7&F{0a8VEECY`3;yx)F>2;4Xr&gC;Iqiqx;orWkF +z8xk0Ty-mK&z`^~Fbs#S;;Qd@1ZFJh4R`+H>Wx$xgn>^oka;w9~QfR>rS7lYHG?D#o +z6Jo`Qg_-DP +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 +zw1mJ8tVoSO-(}absB6M8b$Zqe)Ok0$OkaA#I +z48@e8TAlv;PmB6dbP|{7<%qt@Ea>I;PRL4)=M`_G!A40Y$Xy1Mum)I0#!3<77H4)u +zI6c{)TUsy&o^*@2H9Bp>QJA#S8$`zN?+@z^IIQL|VxYEQfVw~Oc}Wq!FS`G2T=aDu +z-DMYe(1$x=331oN(i#yV%?Q)lcY`}FpGRp*74@@$fX%pE+dAGOh5QRhJ&mcaXOhk4 +zLi_pirw^Zws;d9n^#IE8T1ypZDX|crNABquU?iL2;Ql%4Vg5cNBt}OJdbLKnEi|`g2q%v70%eM&7 +z5gdFefu8Ix3n54MC +zW40SGT11ajrrm5AI24T?-2$|VMsU%VX}AMmt>Pr~B}#An{>%QG>_1FQYV^)CExzx2 +z&7E_9c!fpiCLci|F3H*eM2DQQRtQp4>V2RP=KX3ZVw#OXuFxj$VDmM&HQD{*dc7301976VQyI69%EFvxxn>qC&Lo-`%ImvM +zCv>AXKPcD26Z_;m`1pw)uF6Mp=RnShU^yM81!?jbl!v#-kSa#RLhSOG0?yp1YB6Jr +zW=GrO|0zIRSHiH?DYiO+$EpdMkwz#4I6V(J12-W0+dAo4J*?nDQrFI<*}a92Y%1bU +z`RC_4tyg7>R(8{ +zA8*g?PWv##WoF+p0bJe>whg#+(1_+A+)9HS$|n?k;(r=Le*vR;57rn)2& +zEkD8KBSZm#3Drt?t!*#s#>0+yUNysIKRg=t`KSOcSHieiUP0z8F_$tZ(ciPnq_o~@ +z%-{zhbs{i7 +zt~8q8%WO|MF(FE_ye*bl_-@NcA!S9$IMb6x0`e_oNF!hy5a)H^H)5)t(}ek4a1Nc~FF4@f;5aO%aB&3O%B8NuMWWCzYb`d> +zQ-&3)G|5M|pzcLy>pA(p=?3&XKn+v0^`HNsS?M0eb+60BxF|&Y{?>MI^x``)Vp}1V +z;<0N$BUc(0=p=y>zD3k_I~ +zMC>T|rn!T!wN%lqT@ +z&Afsj|04$m&CH2M?F|6yeqb+e`&JWTP^~~z(;c>5;z6RuFKe)%3j|YzeZB9c)5E08 +zvX9?L9%?PT7Vu(RAIXR}s*=I*@Qp<*vA{&7B2uwdBH$_I`33U5di9weG|3 +zx-Iy`1L`R>G-q<+w-{f5qc<7ls}^cT4Y^Qi+meHXFIDgqkt0wpdBZGY?LB+q9&o`T +zd18L5%R+44Ml^UNbEw58BXP#{+I#J1$;VGO`#6Grd<=RWgP+T+ktE6H^>C;%(}szj +zK;wt^oW!yG4Fz=zm4zKw@$Wdo`VJm=879kp$F&$uMP_qiKSB4L@SV)g55F9Rb=3ocrK>iqIRR9n!X0Do*Ldi{9M&^sg&T_TZz~>`tbXc$p%%BI% +z#MahUA?U0t#2ZA4_41*w&52#TXU^_G4)$#uGOnpIb{Gs?Bge_xP|beH;cUSBec^gk +zu;a`And#3j5LZ)LALL9lQ0{$A?tzx&K6M(;#M))7n&`7KTkT>KvjI7O4?mTa;X`81yn7WAir6 +z^Dv#2{~#3{X=5gyP*2v`3yoLJl)--n2rC2}*3n8(L~4ohHzT6QbyEu{!K3q#&p9Lp +z?3#RrZR0JWoh5V%Au%m2?uSB&RO!i99khjDd#7P;NaxJ<_f>mYXQOtXqBZifoWn1d5WC&hmG;&Gv(>!l)|)selJ-m-pz9Og@*rA +z%Xl~n+gHI_Rjy513U_dEaq-~ZLm%H7RpVbREoW=Zu*D?n%JFyy6(v}{RCOy +z>_wu--o5bv-4rRuWG0oN3a2+(f)C6nR0%>9HdI1mB`d{jE6Q4vSf>>{@~N-bGMc6~ +zn=1MB2?XIjZuOC!s@-pN5{60UUw-L4f1L-3Ohud?4)I$4Y&#w^A*ij(1$$3|Vskv} +z#YKCOBnHKh5QN8fd|k)wI{^HZj_1!`{L&>R(m@P^tYk*J)5>eCrio9{j>kWLDCGrM +z*O<)utCbjQiH>aHzD!~>SNyzV|B?uyizaR*!v`(g6N5ks=aSqWHk#wzbQOx2Ehc(>s +zfl`oSK+EzLOKDeK?n#pu;5qF1g-8bXyN##%K`x2R14CxOh8w&P-kz4U}>3Q=A& +zwAa>sCXe?|fR^Y+S9_jW;=!_GK`1Bc2HY6Y)*s}A##+#}239~LV&Q~wL&4n_6^@vW +z;nGUYJ$5-C#kJr2EtD&Ty$t-H)#GyT->}39LWB1gdo%LwqR8{YbRBL*-FCEc5iY{; +z#TpZ~y8yolNKuWi&enqz%<*)Y)j#ff)9q1ezkI|N7|zr3b=T|b>+m?)d% +zKJ;1@L~w8ZQn0MxZS*{ew-;Ohn^Jl!+U{m|QvgB~tai**t#d>0E=CMjN*SZ+36QnO +z4NrSN!Cd>9SLf?=!Hjh+ek}c}ND_U`vvi9(MS>7nGZ*lPm%4(7(bhfuTHod8y%;N{YO_KMV}N<7D)x5snD;XG +zzCOH#WK2$4mAvQWFCCZW#F8TRInJ+=$6eR`V~dES6+!6-=6lkVCHyCW^Bb-$@=b%3 +zi%hxQwAp^EOp|zR61~UikJsM89qE@P3@X5J>+K)hO6K`Z$80UqhLV&|mVt3wQ#G4H +zi4>T}s*jr9pkN+B@=LbuMW8^kzEFQde*yOdnXiUws9u#OD8dYzm?0F`qCm7pBCNNz +zOJB@PR!5?2&9Zw_Jg~i=TwmStKiYq1_@$ +zZKB*^u}y2o({7rV#Nl+8$2T5 +zthMF3X`+*;4Q-~&-*4NzrU=7>#}h=jB}<^tsAch7Ac~Vq;V7 +ziknpCHOP}_P8F&VE%6e`WG~EVa?$ra`knKZrYWbIZ_w@4vO+{B!(Pb&!YhY8pCfe= +zjxF8x>Zh3;#gw`fu})grVJcf=Ohg_Xc9m?(57$!NXQ#N%;Q{V}EjtmA$m<@Ie2(h2j9T2Xq=0<2R#daW&$ +z85=lCIqjn+?h$SF4u|?#DOOKg9>2c{9GSdlh{<(WR;Mb+bxH>u95roevUiqSmcdG* +zEL`{Qv+mA#hjLxuC*l?ROBgDsPYkDNU%;m09$2^ni=SVA=kS_) +z_h->URCbhQr89T-a-Gg9Dk?P`CT8-=f%@A28AYMmma&Ks#DNDsr^|eI%nHBQ0Nps* +z<{@u^G-9krSD|^{Vm?_nRkW_T!;E*n95To#4sxn;9FH2W%&T043S^Vg_Bk^^&J9*H +z=-^Zd6GYUG(CMkA?hy<&4Tc5fn4$3ys+ZiGw!07qHH1zPDzAJY;{8Oj#B1-LTAZ>D +zKqX)c%j0#o|H%z2zdkxYKaV6<&nEMgP`q%2&v+2dsa++rFeWoOnf$VkCAY6|8|kw{ +zdwe(maC?oeGlx#HVClH?)W&QZ`+=l3PIeQ%9cb~nWxJ9)YD|MPt`v?0-3bMcbZ<2Z +zG7xSnH{QoOr#C@?R{C$168|JMfCxcPAVuEhewgQpYO@AfbP3Fw+|Vi7h~L@$6ydj5 +zyf7_h9Rp$0Gii0mkT9xddqw>hIVCXV203~$D~swIj_)TV=zX)@-tK6Hb66mM;EywH +zsMV;{!i^8fvae3b)iz7_f6$4yU2i-b%Bh|o@eU2$RD^G(AtWlyl0^8dxd<9 +zCi_xU0%&wFugtmc%-uOk=xMY?lR%{7BQRZ~b8}1<=DQI)v2*#3|70VNVV*?SK4O}0 +z-HEICfCoyTwy@{F=Ac>4KISQEgQLDcj|>j}hzn(*RSn +zZw&u6!^Z2~7ae&u`+{IHYm_vxJJ@RRZ!LoCjQ2ecK6E;AqeyJZxfuAC +zaFBgBIQO4DawgA~vN)BCS%`;S38kn@9kWOTMq)$V$+z&4nDQvH*{(1#N58$C)v2#; +zJW|ch#FaXRBNNj6mX)HNV{_ScADWB7#Jn(Th}B15lvrI|-2fj-=SL1AY +zQrI&y#`tyxRIyenc$G7)m}|d;5&h;8q8?ap1~7v{vEXIAhojO|^XI$6=K!f+>;5yx +zJJXiq*Z?mW;Ak{?4<=)9$$a@6Q*=1_%}Nx&bGA3oqS%{I)k3y{#DALAzrPw)h(FU +zj}8a8Xte($dBpT +z_ZLeg50aO#zhmy?M*+dS#c4NyP>CZSyS+OOi>@2;)lr;&A$)(OEO;kV+bz6O57by +zyW>9>Ij2^Du|A83(r~$46%S7?Ancv(6R +zJK?TL+k$9p$KMJgY}hdrTzyS}0it==hvU?8YM**7M}l@-W{&s26~NM6 +z#U8(RCX-=6Lw%{$D&=aKSfE%aJ<__RASP1DaZcJPva<-yi3NH#t$OuNk6wlp&CD~1 +zanJ|7AhF;l{a^)Qhr_9Bo;2ZG8=}0whx#r7zZ6W`Fs5 +zJEbvhZVJVsORu$w4Y1HyT1E4?Vka&kS*mSpBuKM>OAT~3W;g7KLGzfQWF~QJ1)H6S +zFCOXwP_auqzKSygLBPB}EH;Q1gXb@Wm*lZWfM<8NWGZM_*$8Ze)0+^IpqCyco5T+P +z>!edzc-RMsx%H6~4%a*u{&6!V2Xf)f8oOKEEtBAhvI#TkSv+Ago-TMSQ(2q}=S0FP +zL(1v}1vp6Ya1@zfO!}Dq3ke|~@mmFXu2dHEQWpO$6X$;c8V@V*w>NACSkmSKF-THX +zXc85Wu2(uhx0b@}vaeA-YhO(oJ!8ZlugSxzOn{tnI7h@dCB`UVE~EEY_ww_|qDlb| +zQh0>qvDy{uar91x0J$!N&ch{3*B*?y730`NAZJT0IXU?T1Oo1Zc+QnB&!+ZYLh%_v +zV;)6DQs1sEzvoxu0r{lou-yG%CgwotYzFK>vqr!e>KRehvaz@y)fTge`_wgV2*|2H +zVl|vbxEx$3ymn~uGqN65%FYqJ<_)*Uqs49;KY2h*(Xa?Tk7AFfl-xf>irJoUyL*;0 +z19&1GQV*5Ni~#kTnaq0ymCiLjk_=0q&=&|cG{r57n*6NwV6zJl5K*ED&DsZy8iEL_rr +zgsLXr6cN9-S7dCo0TeKI3ByoGNNBIG{4b4m4=LB^FstU0B?!6TBZ1v~zn%e*Xk=B) +z@_rySE6iHcIxSfbe^sRAkjZKFfR!7A5uNa|Q%HSV{);)`X_I$=Rz#g9)RV +zjIuDE+A6IDHt@Noy^%sCnU|?kL3tCMU12QN7688MFeYr;%^{CT)BqX<4rY8gFNo(^2<+x6~@> +z0Y;8%xJK3sk3si!JoTyNPRqf>i>%mkw_b{g-~}-aAljQww_S1L53kdn=uMDZM5$#ndk +z&22o*u=b&^trc3UMGkzzrL*~$;t?gd{w8WCC+z$)6{fY`v4CL%;?|JZtR3}&oLz8* +zT?G#HsX)xAYvWho@h=pJpzsjcWp0%LD4s08onG)Nb4)MY=8K^XfVvcKVvP||0{idF +zr>Wx=dX&);ID@-|u5Y#BAa0c8rW_t)Xfo4c@By|jKCCPsr7DjJ6t;eTIrmF;CpM`~(ysWB=S@seY-cC;IYp7eGp3%$l} +z)oc?3jDrN<0qs>+yfj#>o^%eHp8`K^wUK{qUM_Xl#K;;VHK+>&$DqLQV1~BoxLuBrt&0}DAhEKn_^ER` +zz-29QNvC|8F%an87xNYKcn*LCu89T8nVkc&?~&O83)5GbY)slt*#=)i7s;A_C=2r7N7+fk`X1KngTDCyUEafq@X5m_z1=DeiD@Q38P{+Ou8AdwgrjC5 +zajlbj!7Ae^jZ~9GGnmvF%|dV*Siz7~1$lG}zFHP5%BV8TD09lQN!w79WRZ;`=PM(z +z0;YT`0PcRb5SM~SQ_OKjwTc~?W_G_IPe||U$;Um2U%fe+7X>%Nvy!xcXUbbT1miw0 +z=$X7_W&m0ay!h~`ae>C68mu@al*ia7R0saqO=sn$tE@ww372nWLhU^>%{WE>Eoln8 +zaeH(5Zly+xlW1Z@B{Z2HqS52V*oh`BC}k&quf19RS}N6$l#0qGWzl9DQkZ@85(#UMH4E) +z!&hPrOmR$HRF*}2C{e3A#U3h9d)gN68^|>O9=TO4Ga~u#5kl0}_*QP9IxEl~Ce;Vj +zS3zvyQ+p-TKYiV8z>J$akDBH=i$W7}&)8|aN%_17$7$H|;eKWRKgAtrMwoyE;#kJp +z>iJ{R+d4p$2q2;Y5EBQ7>@E&mk*MzVW>!EDsQ9Pd1Icl|=0d^U2HU!hP6MLe0bwp2 +zA=U!|OQM?{{^8dU?o^&w|I~Y5fw~zw)IT&*mzBRUy1Ljo^-=Z`fvN|N_JgxG~k*Hc%03VftQZkoi*AD{-11-bt2%}_=-R;7ZY`jOzsFyAEWb! +zVJNLPL#@4|8iv-c@m4Lu!^Uc7?VOsDWty>@T6^QN67|~9P?w&boWVpR2)d)gI@s*$ +zT0uPct)H#x^_Y(_q2El&g2<(pF8niAzCde(;c)XAp3awn@Z)3{qMO$l1?#O_cXL+a +zB+yS96Q;w{xIBw9%-h2xp$%a(D0`Noi$$31BbukCM_lu$4sG_+rWsH9U`eD0eY3t3 +z@`vkyB5OW$_NhyNPE(&_JPvYO1XVd%SiaJPVza|ZguGogD*p`OzJ!Odk4wR7o=G7; +zQFEN*_9WQcO`Vliy5G@VCnZ;Qb~fJ44e1$o^Tw=L_lA;Z-8Dw0CC}X_m5Q_J*xP61 +z2tVQGAnU9PA@k;{9QL{c=-~c_joC`W*8qxTI)7}foE-)SU;g6SD;S1P5oGCta0DrC +zGXz?khB$Fn{Ycwuk%t&RTyJ!Mz8mnC0U+AYu}PkaA-t-gE*25%;RVKNKyWz!scpu6 +zZDKFBX5S4#lCQK!Ip%UxMsP%cC4T!8d`;mo#M{(B)h;Ilk3UVA`-O^+JuQDuUnt-K +z=jEH2NuzvVs7mGT0rJ;Nz54;;pVk-{O`o<8h5~yAG9cx)%sJ+#d0-B8j!9{+{>1@9 +zYiz-m^g@6wE8^*umZD0JhIN!|&Ok-?2XhJ@B|oI&FfS^$rs90JhlZBoJW`e5b9j^- +zWO>uD9oB-o4QKEBn$akVeT1MeUX-s%#m~lPXZR!_h7SU~%Y_rx{QlrO`$o+{oUb!PIS+x5N +z+{O+YLa6?IE1#&A?RMZ&J}!O!vj>Os^y>J_BMi^Cu8;>FP)!5eagStg`4k8`f<9)s +zLv>uniXJHc5tD}2a*xO+UycHT8lGykAS#tq7H&?$Q|yXO#aH{77;M;}%#Rn*u_i#Q#=kFoCjB +zxM)O)sW@_wx=K{lJ|iyESH0iv9Nr111eP3eEA!SenTb%U12{RS*7qj0=;%^Kd#QiJ +ziYTEU=jFY{zWsSqmqmw<7L@5T1o7NxWhht`9gu$(b|QZnjVAE)D;lyC=>~hv=8piE3T9#-QVKCSaq-q&xr*zuRbfKtru+;Kkp5Si5+<6{tz}rp +zigZWmiiYYR#xdxCbhhJz=wN$k9zPcR8H;AJErv2><3*Bm51h&CEJlpT9yo5`1`w{pnaAJ%0k=ISmg0E +zo$J6^H1-w0!^WV5w|yx36dtal`WN}DGpD-gqYjDTfjIaLtR}xxCDSo6v=}KHRM^9@ +z&T;nw5x5ee(K3%Z3QQF%sMId_cIRpr&3g$f><9ZoX7X_c7g4f{y)mf(?;`TLI@jLv +z?N)ryzDJ)LsBZU+VnRH0X1E}KJ!}%#n_-hEY9w +z`8(=7Fd9^wGY;{_ggJK@ZR?yW!1!^^d;F^x%}=DG(7K8XMm$L~K*Np|t>vZmA5%Y| +zINrWxnZFq_J7&ksTGEluekfNRCX$8u^xk+?w8Q1iII^7LA8Wc=uh=>E34C14fN(+~ +zjb&LKSzG|ur8^cG=n*d|U)DK;5`-D7c>o{;1qb8{cYdL5^ll*Y29ag^ZWs(}{Dq?& +z7Vt6fu%BVSoqvD;RYW!I!KS^e-kCz_2@FvAByt<`2mpvxlE{aWp)% +z7->KZs4&!M+Z9|_;(QrbPRGNC2zLU&;bq*v@zaDlNR7 +zR!OB(0w7?XvMI3w1tc_A&fY$=RO&K>9q)K{?KeL9#X2nl`k!ouFF)XFC@Tui*%L4~ +zwNvTu3}=K5TH;uDS!^k3d+!l_hx$f?(hkYU(6NBYx@mz*Y6dZ7D@JF^5^p{aiT5zv +z;Xjc--#|sw407DGZz<4^FBXBq5F)zwTQ|65$~FTfyft2wOiY&QG(ydKoz#wa?YKny +z)9C@EX0c#XN}}K5dNFdMNo^+Os>0sS^c;E5Ky4zm)q;>J{J+z3sdUj)7tN@@gZSf7 +zJ|wiD$oI`e{Xe-gDV9P_(x}i7AaPVJn&m~NMi(84-RGbXy6@{lY?h66ze7!6Ee=i! +zInre-6PCHrI9+8v4+)Zge*esLVEy0*)t)o|)801Zf98hgQ=EZH2bpZ=)5NN_2yjw# +zP8Ewr(5WN{8DJpt*e!|G(gvZ5Pxywag$Agdns%%4+IH>|FMw9b +zKb<-v)*Cb*Ao~hb;B*`Ee&trZYBi`{$ru%gmKbuXcPNb3lD3H3Jimki7;BEFp{bxX +zFJ7Rk<~$d5(AGs1%w=$DDrj&3=?C4wX`U{m8^^=Z8R3YTB_A>ZAOkmldWl +zwo0ZyTNCB`dfUZA+chm*()HWtA2!JQ3>g${8%Vr% +zasf==&095e)fG}M%iIsk{PaQ>2|D59ppz^2pExvb9Ou9EI^`kN!0aXr*u3p0ex0b4 +z=AnHH#@v>`#o*LjN-yB0^^l)H2Nm=yD3|>1aNigv$f`s680kxF8B%d>SUG)YF0R~W +z$TI5rvll2~&q4RSwu3})*@1!~z4l}@NsY#MwV(2Y=hbLZh-ce*Eq3<#rZ +zxra}au9h@`-JaCDeW|)St?N40z`g~4rjZ?xu=?#W;cJyHNPXCV2DuxD%N1A2hAlFH +zwTJm(6XPn#dA&{dq>&yd{5Lp=pa<%$*em=~TdQ%rn_v#5`>I!IS>M^uNpl#N|wC@HMBcRTMT#SL;d7 +z<(&BuA6dLkkx|8fWw@PXzCeCBgDx@HJs@)L+j8y~gZ)7)${p-|O7{G? +z&|M6FI|A*^d_U+Of-3`+w(c~-YsQby|NH)g|G7xv|Nek^|Jex)g~z+)I0xPC0460S +LFIp>X81%mY^Bg|U literal 0 HcmV?d00001 From f4741f22e813e0909a3f5ceacbadeac4f2b03f3b Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Tue, 26 Nov 2024 18:46:12 +0100 Subject: [PATCH 09/13] Expose particle status client option (#11573) --- .../0183-Add-Player-Client-Options-API.patch | 49 +++++++++--- ...-Implement-Player-Client-Options-API.patch | 74 ++++++++++--------- patches/server/0388-Brand-support.patch | 6 +- ...-Add-methods-to-get-translation-keys.patch | 15 ++-- ...r-spawnParticle-x-y-z-precision-loss.patch | 4 +- patches/server/0465-Add-sendOpLevel-API.patch | 4 +- ...526-Expand-PlayerGameModeChangeEvent.patch | 8 +- .../0538-Add-PlayerKickEvent-causes.patch | 4 +- ...PlayerDropItemEvent-using-wrong-item.patch | 4 +- .../server/0565-Add-PlayerSetSpawnEvent.patch | 10 +-- ...ulti-Block-Change-API-Implementation.patch | 4 +- patches/server/0714-More-Teleport-API.patch | 12 +-- ...stom-Chat-Completion-Suggestions-API.patch | 4 +- .../0744-Elder-Guardian-appearance-API.patch | 4 +- .../0756-Add-Player-Warden-Warning-API.patch | 4 +- patches/server/0768-fix-Instruments.patch | 4 +- patches/server/0777-Flying-Fall-Damage.patch | 4 +- patches/server/0782-Win-Screen-API.patch | 4 +- .../0807-Expand-PlayerItemMendEvent.patch | 4 +- patches/server/0826-Fix-BanList-API.patch | 6 +- .../server/0845-Bandaid-fix-for-Effect.patch | 4 +- .../0853-Add-Listing-API-for-Player.patch | 6 +- .../0883-Add-player-idle-duration-API.patch | 4 +- ...stack-for-Player-sendEquipmentChange.patch | 4 +- .../0906-Add-experience-points-API.patch | 4 +- ...item-frames-performance-and-bug-fixe.patch | 2 +- .../1027-Improve-entity-effect-API.patch | 8 +- .../1038-Moonrise-optimisation-patches.patch | 10 +-- .../1039-API-for-checking-sent-chunks.patch | 4 +- ...Allow-using-old-ender-pearl-behavior.patch | 2 +- 30 files changed, 155 insertions(+), 121 deletions(-) diff --git a/patches/api/0183-Add-Player-Client-Options-API.patch b/patches/api/0183-Add-Player-Client-Options-API.patch index 44f597e144..94a094608b 100644 --- a/patches/api/0183-Add-Player-Client-Options-API.patch +++ b/patches/api/0183-Add-Player-Client-Options-API.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Add Player Client Options API diff --git a/src/main/java/com/destroystokyo/paper/ClientOption.java b/src/main/java/com/destroystokyo/paper/ClientOption.java new file mode 100644 -index 0000000000000000000000000000000000000000..ed08f823e0620289392f7fc2ff0ac721cff60478 +index 0000000000000000000000000000000000000000..7af28d6ba27c97a87ffbb9db03a5c340277853cc --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/ClientOption.java -@@ -0,0 +1,51 @@ +@@ -0,0 +1,70 @@ +package com.destroystokyo.paper; + +import net.kyori.adventure.translation.Translatable; @@ -26,8 +26,9 @@ index 0000000000000000000000000000000000000000..ed08f823e0620289392f7fc2ff0ac721 + public static final ClientOption LOCALE = new ClientOption<>(String.class); + public static final ClientOption MAIN_HAND = new ClientOption<>(MainHand.class); + public static final ClientOption VIEW_DISTANCE = new ClientOption<>(Integer.class); -+ public static final ClientOption ALLOW_SERVER_LISTINGS = new ClientOption<>(Boolean.class); + public static final ClientOption TEXT_FILTERING_ENABLED = new ClientOption<>(Boolean.class); ++ public static final ClientOption ALLOW_SERVER_LISTINGS = new ClientOption<>(Boolean.class); ++ public static final ClientOption PARTICLE_VISIBILITY = new ClientOption<>(ParticleVisibility.class); + + private final Class type; + @@ -60,6 +61,24 @@ index 0000000000000000000000000000000000000000..ed08f823e0620289392f7fc2ff0ac721 + return "options.chat.visibility." + this.name; + } + } ++ ++ public enum ParticleVisibility implements Translatable { ++ ALL("all"), ++ DECREASED("decreased"), ++ MINIMAL("minimal"); ++ ++ public static final Index NAMES = Index.create(ParticleVisibility.class, particleVisibility -> particleVisibility.name); ++ private final String name; ++ ++ ParticleVisibility(final String name) { ++ this.name = name; ++ } ++ ++ @Override ++ public String translationKey() { ++ return "options.particles." + this.name; ++ } ++ } +} diff --git a/src/main/java/com/destroystokyo/paper/SkinParts.java b/src/main/java/com/destroystokyo/paper/SkinParts.java new file mode 100644 @@ -89,14 +108,15 @@ index 0000000000000000000000000000000000000000..4a0c39405d4fbed457787e3c6ded4cc6 +} diff --git a/src/main/java/com/destroystokyo/paper/event/player/PlayerClientOptionsChangeEvent.java b/src/main/java/com/destroystokyo/paper/event/player/PlayerClientOptionsChangeEvent.java new file mode 100644 -index 0000000000000000000000000000000000000000..6cf6aa876278d0d3e75148608951fc5865ad5aee +index 0000000000000000000000000000000000000000..5245955fb3466d2b89eaad4027d145ebf7bb122c --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/event/player/PlayerClientOptionsChangeEvent.java -@@ -0,0 +1,130 @@ +@@ -0,0 +1,142 @@ +package com.destroystokyo.paper.event.player; + +import com.destroystokyo.paper.ClientOption; +import com.destroystokyo.paper.ClientOption.ChatVisibility; ++import com.destroystokyo.paper.ClientOption.ParticleVisibility; +import com.destroystokyo.paper.SkinParts; +import java.util.Map; +import org.bukkit.entity.Player; @@ -122,6 +142,7 @@ index 0000000000000000000000000000000000000000..6cf6aa876278d0d3e75148608951fc58 + private final MainHand mainHand; + private final boolean allowsServerListings; + private final boolean textFilteringEnabled; ++ private final ParticleVisibility particleVisibility; + + @Deprecated + public PlayerClientOptionsChangeEvent(final Player player, final String locale, final int viewDistance, final ChatVisibility chatVisibility, final boolean chatColors, final SkinParts skinParts, final MainHand mainHand) { @@ -134,6 +155,7 @@ index 0000000000000000000000000000000000000000..6cf6aa876278d0d3e75148608951fc58 + this.mainHand = mainHand; + this.allowsServerListings = false; + this.textFilteringEnabled = false; ++ this.particleVisibility = ParticleVisibility.ALL; + } + + @ApiStatus.Internal @@ -148,6 +170,7 @@ index 0000000000000000000000000000000000000000..6cf6aa876278d0d3e75148608951fc58 + this.mainHand = (MainHand) options.get(ClientOption.MAIN_HAND); + this.allowsServerListings = (boolean) options.get(ClientOption.ALLOW_SERVER_LISTINGS); + this.textFilteringEnabled = (boolean) options.get(ClientOption.TEXT_FILTERING_ENABLED); ++ this.particleVisibility = (ParticleVisibility) options.get(ClientOption.PARTICLE_VISIBILITY); + } + + public String getLocale() { @@ -198,6 +221,14 @@ index 0000000000000000000000000000000000000000..6cf6aa876278d0d3e75148608951fc58 + return this.mainHand != this.player.getClientOption(ClientOption.MAIN_HAND); + } + ++ public boolean hasTextFilteringEnabled() { ++ return this.textFilteringEnabled; ++ } ++ ++ public boolean hasTextFilteringChanged() { ++ return this.textFilteringEnabled != this.player.getClientOption(ClientOption.TEXT_FILTERING_ENABLED); ++ } ++ + public boolean allowsServerListings() { + return this.allowsServerListings; + } @@ -206,12 +237,12 @@ index 0000000000000000000000000000000000000000..6cf6aa876278d0d3e75148608951fc58 + return this.allowsServerListings != this.player.getClientOption(ClientOption.ALLOW_SERVER_LISTINGS); + } + -+ public boolean hasTextFilteringEnabled() { -+ return this.textFilteringEnabled; ++ public ParticleVisibility getParticleVisibility() { ++ return this.particleVisibility; + } + -+ public boolean hasTextFilteringChanged() { -+ return this.textFilteringEnabled != this.player.getClientOption(ClientOption.TEXT_FILTERING_ENABLED); ++ public boolean hasParticleVisibilityChanged() { ++ return this.particleVisibility != this.player.getClientOption(ClientOption.PARTICLE_VISIBILITY); + } + + @Override diff --git a/patches/server/0337-Implement-Player-Client-Options-API.patch b/patches/server/0337-Implement-Player-Client-Options-API.patch index 05731c9616..96ad445461 100644 --- a/patches/server/0337-Implement-Player-Client-Options-API.patch +++ b/patches/server/0337-Implement-Player-Client-Options-API.patch @@ -5,6 +5,7 @@ Subject: [PATCH] Implement Player Client Options API == AT == public net.minecraft.world.entity.player.Player DATA_PLAYER_MODE_CUSTOMISATION +public net.minecraft.server.level.ServerPlayer particleStatus diff --git a/src/main/java/com/destroystokyo/paper/PaperSkinParts.java b/src/main/java/com/destroystokyo/paper/PaperSkinParts.java new file mode 100644 @@ -87,7 +88,7 @@ index 0000000000000000000000000000000000000000..b6f4400df3d8ec7e06a996de54f8cabb + } +} diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 363175d3325c012f31ba84060bb0bfac694f6ab8..9911e231ad021286f2da90057b06874f7b4e3b4d 100644 +index 0c68c0a9ec9b353b353eff0c36af2993df5f59b3..eebf44c7124c4f48b6d48562a00633b1e8ff9b00 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -420,7 +420,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { @@ -99,31 +100,27 @@ index 363175d3325c012f31ba84060bb0bfac694f6ab8..9911e231ad021286f2da90057b06874f this.object = null; // CraftBukkit start -@@ -2404,7 +2404,23 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { - } +@@ -2405,6 +2405,19 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { } -+ // Paper start - Client option API -+ private java.util.Map, ?> getClientOptionMap(String locale, int viewDistance, com.destroystokyo.paper.ClientOption.ChatVisibility chatVisibility, boolean chatColors, com.destroystokyo.paper.PaperSkinParts skinParts, org.bukkit.inventory.MainHand mainHand, boolean allowsServerListing, boolean textFilteringEnabled) { -+ java.util.Map, Object> map = new java.util.HashMap<>(); -+ map.put(com.destroystokyo.paper.ClientOption.LOCALE, locale); -+ map.put(com.destroystokyo.paper.ClientOption.VIEW_DISTANCE, viewDistance); -+ map.put(com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY, chatVisibility); -+ map.put(com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED, chatColors); -+ map.put(com.destroystokyo.paper.ClientOption.SKIN_PARTS, skinParts); -+ map.put(com.destroystokyo.paper.ClientOption.MAIN_HAND, mainHand); -+ map.put(com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS, allowsServerListing); -+ map.put(com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED, textFilteringEnabled); -+ return map; -+ } -+ // Paper end -+ public void updateOptions(ClientInformation clientOptions) { -+ new com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent(getBukkitEntity(), getClientOptionMap(clientOptions.language(), clientOptions.viewDistance(), com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(clientOptions.chatVisibility().name()), clientOptions.chatColors(), new com.destroystokyo.paper.PaperSkinParts(clientOptions.modelCustomisation()), clientOptions.mainHand() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT, clientOptions.allowsListing(), clientOptions.textFilteringEnabled())).callEvent(); // Paper - settings event ++ // Paper start - settings event ++ new com.destroystokyo.paper.event.player.PlayerClientOptionsChangeEvent(this.getBukkitEntity(), Util.make(new java.util.IdentityHashMap<>(), map -> { ++ map.put(com.destroystokyo.paper.ClientOption.LOCALE, clientOptions.language()); ++ map.put(com.destroystokyo.paper.ClientOption.VIEW_DISTANCE, clientOptions.viewDistance()); ++ map.put(com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY, com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(clientOptions.chatVisibility().name())); ++ map.put(com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED, clientOptions.chatColors()); ++ map.put(com.destroystokyo.paper.ClientOption.SKIN_PARTS, new com.destroystokyo.paper.PaperSkinParts(clientOptions.modelCustomisation())); ++ map.put(com.destroystokyo.paper.ClientOption.MAIN_HAND, clientOptions.mainHand() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT); ++ map.put(com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED, clientOptions.textFilteringEnabled()); ++ map.put(com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS, clientOptions.allowsListing()); ++ map.put(com.destroystokyo.paper.ClientOption.PARTICLE_VISIBILITY, com.destroystokyo.paper.ClientOption.ParticleVisibility.valueOf(clientOptions.particleStatus().name())); ++ })).callEvent(); ++ // Paper end - settings event // CraftBukkit start if (this.getMainArm() != clientOptions.mainHand()) { PlayerChangedMainHandEvent event = new PlayerChangedMainHandEvent(this.getBukkitEntity(), this.getMainArm() == HumanoidArm.LEFT ? MainHand.LEFT : MainHand.RIGHT); -@@ -2415,6 +2431,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { +@@ -2415,6 +2428,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { this.server.server.getPluginManager().callEvent(event); } // CraftBukkit end @@ -136,10 +133,10 @@ index 363175d3325c012f31ba84060bb0bfac694f6ab8..9911e231ad021286f2da90057b06874f this.adventure$locale = java.util.Objects.requireNonNullElse(net.kyori.adventure.translation.Translator.parseLocale(this.language), java.util.Locale.US); // Paper this.requestedViewDistance = clientOptions.viewDistance(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 341dbff92d15886afe8fe628e06d1c07817241ed..66e5e949c8711103ae9bf73161422f350c217874 100644 +index b3b13f1baea0b170fd4f1546689aad40f53d3c27..8cfcd8797d056be07b09ec9627bc35bf75eb0d2d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -658,6 +658,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -658,6 +658,30 @@ public class CraftPlayer extends CraftHumanEntity implements Player { connection.disconnect(message == null ? net.kyori.adventure.text.Component.empty() : message); } } @@ -147,21 +144,23 @@ index 341dbff92d15886afe8fe628e06d1c07817241ed..66e5e949c8711103ae9bf73161422f35 + @Override + public T getClientOption(com.destroystokyo.paper.ClientOption type) { + if (com.destroystokyo.paper.ClientOption.SKIN_PARTS == type) { -+ return type.getType().cast(new com.destroystokyo.paper.PaperSkinParts(getHandle().getEntityData().get(net.minecraft.world.entity.player.Player.DATA_PLAYER_MODE_CUSTOMISATION))); ++ return type.getType().cast(new com.destroystokyo.paper.PaperSkinParts(this.getHandle().getEntityData().get(net.minecraft.world.entity.player.Player.DATA_PLAYER_MODE_CUSTOMISATION))); + } else if (com.destroystokyo.paper.ClientOption.CHAT_COLORS_ENABLED == type) { -+ return type.getType().cast(getHandle().canChatInColor()); ++ return type.getType().cast(this.getHandle().canChatInColor()); + } else if (com.destroystokyo.paper.ClientOption.CHAT_VISIBILITY == type) { -+ return type.getType().cast(getHandle().getChatVisibility() == null ? com.destroystokyo.paper.ClientOption.ChatVisibility.UNKNOWN : com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(getHandle().getChatVisibility().name())); ++ return type.getType().cast(this.getHandle().getChatVisibility() == null ? com.destroystokyo.paper.ClientOption.ChatVisibility.UNKNOWN : com.destroystokyo.paper.ClientOption.ChatVisibility.valueOf(this.getHandle().getChatVisibility().name())); + } else if (com.destroystokyo.paper.ClientOption.LOCALE == type) { -+ return type.getType().cast(getLocale()); ++ return type.getType().cast(this.getLocale()); + } else if (com.destroystokyo.paper.ClientOption.MAIN_HAND == type) { -+ return type.getType().cast(getMainHand()); ++ return type.getType().cast(this.getMainHand()); + } else if (com.destroystokyo.paper.ClientOption.VIEW_DISTANCE == type) { -+ return type.getType().cast(getClientViewDistance()); -+ } else if (com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS == type) { -+ return type.getType().cast(getHandle().allowsListing()); ++ return type.getType().cast(this.getClientViewDistance()); + } else if (com.destroystokyo.paper.ClientOption.TEXT_FILTERING_ENABLED == type) { -+ return type.getType().cast(getHandle().isTextFilteringEnabled()); ++ return type.getType().cast(this.getHandle().isTextFilteringEnabled()); ++ } else if (com.destroystokyo.paper.ClientOption.ALLOW_SERVER_LISTINGS == type) { ++ return type.getType().cast(this.getHandle().allowsListing()); ++ } else if (com.destroystokyo.paper.ClientOption.PARTICLE_VISIBILITY == type) { ++ return type.getType().cast(com.destroystokyo.paper.ClientOption.ParticleVisibility.valueOf(this.getHandle().particleStatus.name())); + } + throw new RuntimeException("Unknown settings type"); + } @@ -170,15 +169,15 @@ index 341dbff92d15886afe8fe628e06d1c07817241ed..66e5e949c8711103ae9bf73161422f35 @Override diff --git a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java new file mode 100644 -index 0000000000000000000000000000000000000000..7f8b6462d2a1bbd39a870d2543bebc135f7eb45b +index 0000000000000000000000000000000000000000..01e0936ea8ce5bcacafd9e89a1c0dfd2c172024d --- /dev/null +++ b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java -@@ -0,0 +1,18 @@ +@@ -0,0 +1,25 @@ +package io.papermc.paper.world; + +import com.destroystokyo.paper.ClientOption; ++import net.minecraft.server.level.ParticleStatus; +import net.minecraft.world.entity.player.ChatVisiblity; -+import org.bukkit.Difficulty; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + @@ -191,4 +190,11 @@ index 0000000000000000000000000000000000000000..7f8b6462d2a1bbd39a870d2543bebc13 + Assertions.assertEquals(ChatVisiblity.valueOf(chatVisibility.name()).getKey(), chatVisibility.translationKey(), chatVisibility + "'s translation key doesn't match"); + } + } ++ ++ @Test ++ public void testParticleVisibilityKeys() { ++ for (ClientOption.ParticleVisibility particleVisibility : ClientOption.ParticleVisibility.values()) { ++ Assertions.assertEquals(ParticleStatus.valueOf(particleVisibility.name()).getKey(), particleVisibility.translationKey(), particleVisibility + "'s translation key doesn't match"); ++ } ++ } +} diff --git a/patches/server/0388-Brand-support.patch b/patches/server/0388-Brand-support.patch index 0b8173758c..7ca0f729af 100644 --- a/patches/server/0388-Brand-support.patch +++ b/patches/server/0388-Brand-support.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Brand support diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index eacc0675d751caf996c9741a5ef5df28d1b9999b..80198c2f6419a3358f41df15dd7bbeb642d37585 100644 +index fd0fd75ed3e75cbdcc1abd56905ace176b871c25..b614be746f1b3c6470eddeb86bb1d4a976b84fcc 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -322,6 +322,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { @@ -57,10 +57,10 @@ index b9fbaddcc8239bf737fdea51790f678306e511eb..9a8b08d4b70b8890961e4af7ce6e870a } catch (Exception ex) { ServerGamePacketListenerImpl.LOGGER.error("Couldn\'t dispatch custom payload", ex); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index e4c39eba10124ebf675ac721866e0c73bf15e533..ad109929cb8d9be8e147adaf744f6fa588414404 100644 +index 5ca3025700b3e8995ae003b73dd53e580c95b889..93caaea4832f2cf7102b43c24afaea55e11ae4c1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3154,6 +3154,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3156,6 +3156,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper end }; diff --git a/patches/server/0400-Add-methods-to-get-translation-keys.patch b/patches/server/0400-Add-methods-to-get-translation-keys.patch index e917cc41d3..667be15737 100644 --- a/patches/server/0400-Add-methods-to-get-translation-keys.patch +++ b/patches/server/0400-Add-methods-to-get-translation-keys.patch @@ -130,32 +130,29 @@ index 4921fc085c9d60c74028ef390325e26c598e8df1..4941e0afff8df5f10f06c715b54bf58e case BALL: return FireworkExplosion.Shape.SMALL_BALL; diff --git a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java -index 7f8b6462d2a1bbd39a870d2543bebc135f7eb45b..c843de24f06dcdee474e9a21d0a3dc54b7b3557a 100644 +index 01e0936ea8ce5bcacafd9e89a1c0dfd2c172024d..95b7506c1317f2664f52c88295aee1006db4da63 100644 --- a/src/test/java/io/papermc/paper/world/TranslationKeyTest.java +++ b/src/test/java/io/papermc/paper/world/TranslationKeyTest.java -@@ -1,11 +1,32 @@ +@@ -1,11 +1,29 @@ package io.papermc.paper.world; import com.destroystokyo.paper.ClientOption; +import java.util.Locale; +import java.util.Map; -+import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.contents.TranslatableContents; +import net.minecraft.resources.ResourceKey; -+import net.minecraft.resources.ResourceLocation; + import net.minecraft.server.level.ParticleStatus; import net.minecraft.world.entity.player.ChatVisiblity; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.biome.Biome; - import org.bukkit.Difficulty; ++import org.bukkit.Difficulty; +import org.bukkit.FireworkEffect; +import org.bukkit.GameMode; +import org.bukkit.GameRule; -+import org.bukkit.MusicInstrument; +import org.bukkit.attribute.Attribute; +import org.bukkit.craftbukkit.CraftWorld; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.support.RegistryHelper; +import org.bukkit.support.environment.AllFeatures; import org.junit.jupiter.api.Assertions; @@ -166,8 +163,8 @@ index 7f8b6462d2a1bbd39a870d2543bebc135f7eb45b..c843de24f06dcdee474e9a21d0a3dc54 public class TranslationKeyTest { @Test -@@ -15,4 +36,61 @@ public class TranslationKeyTest { - Assertions.assertEquals(ChatVisiblity.valueOf(chatVisibility.name()).getKey(), chatVisibility.translationKey(), chatVisibility + "'s translation key doesn't match"); +@@ -22,4 +40,61 @@ public class TranslationKeyTest { + Assertions.assertEquals(ParticleStatus.valueOf(particleVisibility.name()).getKey(), particleVisibility.translationKey(), particleVisibility + "'s translation key doesn't match"); } } + diff --git a/patches/server/0429-Fix-Player-spawnParticle-x-y-z-precision-loss.patch b/patches/server/0429-Fix-Player-spawnParticle-x-y-z-precision-loss.patch index 7c58dabf9b..1934d75706 100644 --- a/patches/server/0429-Fix-Player-spawnParticle-x-y-z-precision-loss.patch +++ b/patches/server/0429-Fix-Player-spawnParticle-x-y-z-precision-loss.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Fix Player spawnParticle x/y/z precision loss diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index ad109929cb8d9be8e147adaf744f6fa588414404..c11c83376bd5e006bab86db6d8aa99b7ec371636 100644 +index 93caaea4832f2cf7102b43c24afaea55e11ae4c1..a88d94d51520521144799b9abc4bbde0596082e0 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2722,7 +2722,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2724,7 +2724,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) { diff --git a/patches/server/0465-Add-sendOpLevel-API.patch b/patches/server/0465-Add-sendOpLevel-API.patch index c781e09a03..4c6369b5e6 100644 --- a/patches/server/0465-Add-sendOpLevel-API.patch +++ b/patches/server/0465-Add-sendOpLevel-API.patch @@ -32,10 +32,10 @@ index fbe10666c4ec6caa95aa38a6f99ccca700e9a4d2..061bba184c8bc2569ce1d413435ec136 public boolean isWhiteListed(GameProfile profile) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index c11c83376bd5e006bab86db6d8aa99b7ec371636..1cc89895a1e03d4b1734a81d89c8bc396bf2b343 100644 +index a88d94d51520521144799b9abc4bbde0596082e0..dbb25f5cc8cf03654faf2386826965f049737897 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -682,6 +682,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -684,6 +684,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } // Paper end diff --git a/patches/server/0526-Expand-PlayerGameModeChangeEvent.patch b/patches/server/0526-Expand-PlayerGameModeChangeEvent.patch index 978d3da469..0198d74688 100644 --- a/patches/server/0526-Expand-PlayerGameModeChangeEvent.patch +++ b/patches/server/0526-Expand-PlayerGameModeChangeEvent.patch @@ -45,7 +45,7 @@ index 7f09119bc7d661e08a960dd2bd46006efe752d3e..d1da3600dc07107309b20ebe6e7c0c4d } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 57253e59b6330be6176d3aa42f8f575ad1995bca..254d9eede5a9a57280643284175df2e061aa78ea 100644 +index 7c4f7a17f34802962c74bb8c5a732861d1a759c6..d26c2b8fd241216d4411254c16012f8141f2856c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -2335,10 +2335,18 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { @@ -78,7 +78,7 @@ index 57253e59b6330be6176d3aa42f8f575ad1995bca..254d9eede5a9a57280643284175df2e0 } } -@@ -2806,6 +2814,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { +@@ -2803,6 +2811,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { } public void loadGameTypes(@Nullable CompoundTag nbt) { @@ -147,10 +147,10 @@ index 2bd2f1cdf3467cacee55094d43bd3eccf61b9aa7..c3b4b800c5a34afa03ed7c31e14f26ca } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 1cc89895a1e03d4b1734a81d89c8bc396bf2b343..2ebfc8744434dd4819f52201ae621268b0e04998 100644 +index dbb25f5cc8cf03654faf2386826965f049737897..a6a2ed03ae781809b50fd793265977db0918a259 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1669,7 +1669,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1671,7 +1671,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { Preconditions.checkArgument(mode != null, "GameMode cannot be null"); if (this.getHandle().connection == null) return; diff --git a/patches/server/0538-Add-PlayerKickEvent-causes.patch b/patches/server/0538-Add-PlayerKickEvent-causes.patch index 7ed95be99e..60d07ed41d 100644 --- a/patches/server/0538-Add-PlayerKickEvent-causes.patch +++ b/patches/server/0538-Add-PlayerKickEvent-causes.patch @@ -495,7 +495,7 @@ index 9e2ad78b12cadbf0e2bda1e12fe844120529c347..6a7d7fad990fc44fdda6849d43dad141 } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 2ebfc8744434dd4819f52201ae621268b0e04998..97046a2ae1ab30f4eefb64558afe312d2b9f55f8 100644 +index a6a2ed03ae781809b50fd793265977db0918a259..43d46239295ea16808383fbdb4d94da0b85e4fad 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -280,7 +280,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -533,7 +533,7 @@ index 2ebfc8744434dd4819f52201ae621268b0e04998..97046a2ae1ab30f4eefb64558afe312d } } -@@ -714,7 +719,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -716,7 +721,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper start - Improve chat handling if (ServerGamePacketListenerImpl.isChatMessageIllegal(msg)) { diff --git a/patches/server/0551-Fix-PlayerDropItemEvent-using-wrong-item.patch b/patches/server/0551-Fix-PlayerDropItemEvent-using-wrong-item.patch index 37338dc0ee..009c771fe8 100644 --- a/patches/server/0551-Fix-PlayerDropItemEvent-using-wrong-item.patch +++ b/patches/server/0551-Fix-PlayerDropItemEvent-using-wrong-item.patch @@ -34,7 +34,7 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/ma index 254d9eede5a9a57280643284175df2e061aa78ea..09798fc2d2d847f3ec705a2640f25ac08ca69f92 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -2747,7 +2747,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { +@@ -2744,7 +2744,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { if (flag1) { if (!itemstack1.isEmpty()) { @@ -43,7 +43,7 @@ index 254d9eede5a9a57280643284175df2e061aa78ea..09798fc2d2d847f3ec705a2640f25ac0 } this.awardStat(Stats.DROP); -@@ -2763,6 +2763,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { +@@ -2760,6 +2760,11 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { return null; } else { double d0 = this.getEyeY() - 0.30000001192092896D; diff --git a/patches/server/0565-Add-PlayerSetSpawnEvent.patch b/patches/server/0565-Add-PlayerSetSpawnEvent.patch index b7be9c0d9d..3dd1d604fe 100644 --- a/patches/server/0565-Add-PlayerSetSpawnEvent.patch +++ b/patches/server/0565-Add-PlayerSetSpawnEvent.patch @@ -49,7 +49,7 @@ index a2d0699e8427b2262a2396495111125eccafbb66..15db9368227dbc29d07d74e85bd126b3 } } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index f0655e6c9c0f60b57912a76448706d49ce774dce..fe39d0ab5e99818356d4e1a600af4bdd3eb03b70 100644 +index b8804881f983cc91ab8e92ba2447151f1e5af9fc..b0391056c5308292131de1d8d2a86a552a9d94e2 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -1690,7 +1690,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { @@ -61,7 +61,7 @@ index f0655e6c9c0f60b57912a76448706d49ce774dce..fe39d0ab5e99818356d4e1a600af4bdd if (this.level().isDay()) { return Either.left(net.minecraft.world.entity.player.Player.BedSleepingProblem.NOT_POSSIBLE_NOW); } else { -@@ -2640,44 +2640,50 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { +@@ -2637,44 +2637,50 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { this.setRespawnPosition(player.getRespawnDimension(), player.getRespawnPosition(), player.getRespawnAngle(), player.isRespawnForced(), false); } @@ -145,7 +145,7 @@ index f0655e6c9c0f60b57912a76448706d49ce774dce..fe39d0ab5e99818356d4e1a600af4bdd } else { this.respawnPosition = null; this.respawnDimension = Level.OVERWORLD; -@@ -2685,6 +2691,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { +@@ -2682,6 +2688,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { this.respawnForced = false; } @@ -187,10 +187,10 @@ index db26b5a0464bd6087eeacaf6dd61eba37365df92..9117c035d5a6ff114b028fad3380ceb1 } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 97046a2ae1ab30f4eefb64558afe312d2b9f55f8..fe05fe8f9c24ad15c083cb63bc6b7e004a974832 100644 +index 43d46239295ea16808383fbdb4d94da0b85e4fad..3f89cbc48828f36cf6ff02b9de6cd378b2fde4f2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1418,9 +1418,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1420,9 +1420,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setRespawnLocation(Location location, boolean override) { if (location == null) { diff --git a/patches/server/0647-Multi-Block-Change-API-Implementation.patch b/patches/server/0647-Multi-Block-Change-API-Implementation.patch index bfefeea7fa..657277a804 100644 --- a/patches/server/0647-Multi-Block-Change-API-Implementation.patch +++ b/patches/server/0647-Multi-Block-Change-API-Implementation.patch @@ -24,10 +24,10 @@ index 926ff9be3d9e3f5d620e4c7ccb22b9f64865ff8c..1a37654aff9a9c86c9f7af10a1cf7213 buf.writeLong(this.sectionPos.asLong()); buf.writeVarInt(this.positions.length); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index fe05fe8f9c24ad15c083cb63bc6b7e004a974832..728a65ad7a826596530b12594db15c93f1af68fb 100644 +index 3f89cbc48828f36cf6ff02b9de6cd378b2fde4f2..e9e895b885e6e45df45246f3988d6e62a1b3d960 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -935,6 +935,32 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -937,6 +937,32 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(packet); } diff --git a/patches/server/0714-More-Teleport-API.patch b/patches/server/0714-More-Teleport-API.patch index a8459c765a..d588e8eee3 100644 --- a/patches/server/0714-More-Teleport-API.patch +++ b/patches/server/0714-More-Teleport-API.patch @@ -113,10 +113,10 @@ index 10fb64df10820974d11f142c102a11a5bd0f317c..8d2f6bb43fb69a4a1e2085960eb24f43 private final org.bukkit.entity.Entity.Spigot spigot = new org.bukkit.entity.Entity.Spigot() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 728a65ad7a826596530b12594db15c93f1af68fb..87aa5f0d594ff697b87bc06019351d22b6c8c8e5 100644 +index e9e895b885e6e45df45246f3988d6e62a1b3d960..6c6128922491efe4f47eb27039eb078f2f411315 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1291,13 +1291,94 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1293,13 +1293,94 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setRotation(float yaw, float pitch) { @@ -212,7 +212,7 @@ index 728a65ad7a826596530b12594db15c93f1af68fb..87aa5f0d594ff697b87bc06019351d22 location.checkFinite(); ServerPlayer entity = this.getHandle(); -@@ -1310,7 +1391,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1312,7 +1393,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return false; } @@ -221,7 +221,7 @@ index 728a65ad7a826596530b12594db15c93f1af68fb..87aa5f0d594ff697b87bc06019351d22 return false; } -@@ -1319,7 +1400,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1321,7 +1402,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // To = Players new Location if Teleport is Successful Location to = location; // Create & Call the Teleport Event. @@ -230,7 +230,7 @@ index 728a65ad7a826596530b12594db15c93f1af68fb..87aa5f0d594ff697b87bc06019351d22 this.server.getPluginManager().callEvent(event); // Return False to inform the Plugin that the Teleport was unsuccessful/cancelled. -@@ -1328,7 +1409,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1330,7 +1411,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } // If this player is riding another entity, we must dismount before teleporting. @@ -239,7 +239,7 @@ index 728a65ad7a826596530b12594db15c93f1af68fb..87aa5f0d594ff697b87bc06019351d22 // SPIGOT-5509: Wakeup, similar to riding if (this.isSleeping()) { -@@ -1344,13 +1425,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1346,13 +1427,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player { ServerLevel toWorld = ((CraftWorld) to.getWorld()).getHandle(); // Close any foreign inventory diff --git a/patches/server/0719-Custom-Chat-Completion-Suggestions-API.patch b/patches/server/0719-Custom-Chat-Completion-Suggestions-API.patch index 11a0ecf025..f8af416810 100644 --- a/patches/server/0719-Custom-Chat-Completion-Suggestions-API.patch +++ b/patches/server/0719-Custom-Chat-Completion-Suggestions-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Custom Chat Completion Suggestions API diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 87aa5f0d594ff697b87bc06019351d22b6c8c8e5..51b6b8d54b139bc89e0343c7c1ec5acedcf6f8a2 100644 +index 6c6128922491efe4f47eb27039eb078f2f411315..b8a0be15e8987719b8cfb4ab842544197cfa2d67 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -696,6 +696,24 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -698,6 +698,24 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } // Paper end - Add sendOpLevel API diff --git a/patches/server/0744-Elder-Guardian-appearance-API.patch b/patches/server/0744-Elder-Guardian-appearance-API.patch index 64bfcb26e8..4d3622601d 100644 --- a/patches/server/0744-Elder-Guardian-appearance-API.patch +++ b/patches/server/0744-Elder-Guardian-appearance-API.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Elder Guardian appearance API diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 51b6b8d54b139bc89e0343c7c1ec5acedcf6f8a2..1fb27bf5da9bb281d1ff6e863912dfac2588611f 100644 +index b8a0be15e8987719b8cfb4ab842544197cfa2d67..762dfbf88773b85893b3d4fa3a71ce577f3ecbd6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3308,6 +3308,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3310,6 +3310,13 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } // Paper end diff --git a/patches/server/0756-Add-Player-Warden-Warning-API.patch b/patches/server/0756-Add-Player-Warden-Warning-API.patch index ee15f1630c..a8a6cb8100 100644 --- a/patches/server/0756-Add-Player-Warden-Warning-API.patch +++ b/patches/server/0756-Add-Player-Warden-Warning-API.patch @@ -10,10 +10,10 @@ public net.minecraft.world.entity.monster.warden.WardenSpawnTracker cooldownTick public net.minecraft.world.entity.monster.warden.WardenSpawnTracker increaseWarningLevel()V diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 1fb27bf5da9bb281d1ff6e863912dfac2588611f..95f0e7e1248ded53ec5de684ec0cfb6343598f51 100644 +index 762dfbf88773b85893b3d4fa3a71ce577f3ecbd6..82767306f63025fa537163cbbac24bd4d66e3416 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3313,6 +3313,41 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3315,6 +3315,41 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void showElderGuardian(boolean silent) { if (getHandle().connection != null) getHandle().connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.GUARDIAN_ELDER_EFFECT, silent ? 0F : 1F)); } diff --git a/patches/server/0768-fix-Instruments.patch b/patches/server/0768-fix-Instruments.patch index cd55e6ad4e..76c48459cd 100644 --- a/patches/server/0768-fix-Instruments.patch +++ b/patches/server/0768-fix-Instruments.patch @@ -6,10 +6,10 @@ Subject: [PATCH] fix Instruments properly handle Player#playNote diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 95f0e7e1248ded53ec5de684ec0cfb6343598f51..02850d3ef48aecda5d9b543e23d43c9b19ff3a89 100644 +index 82767306f63025fa537163cbbac24bd4d66e3416..02e3c1aef805dd83a54a9fab2843dc2d7d47cdb5 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -773,7 +773,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -775,7 +775,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { Sound instrumentSound = instrument.getSound(); if (instrumentSound == null) return; diff --git a/patches/server/0777-Flying-Fall-Damage.patch b/patches/server/0777-Flying-Fall-Damage.patch index 4347fe8264..55e6d96677 100644 --- a/patches/server/0777-Flying-Fall-Damage.patch +++ b/patches/server/0777-Flying-Fall-Damage.patch @@ -26,10 +26,10 @@ index 30e0a5fe3f9bd85d2b702c2c877c5682ed35d461..aca888c2f02b09ac6739bdc81b194c45 } else { if (fallDistance >= 2.0F) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 02850d3ef48aecda5d9b543e23d43c9b19ff3a89..68296e776cda9983d2b3f1fdabe7fcaa2e631e86 100644 +index 02e3c1aef805dd83a54a9fab2843dc2d7d47cdb5..9e46b2c9b3390c70ab10f279a4b41160b2f17b6d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2591,6 +2591,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2593,6 +2593,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().onUpdateAbilities(); } diff --git a/patches/server/0782-Win-Screen-API.patch b/patches/server/0782-Win-Screen-API.patch index 074d1e4455..2f98e51fbf 100644 --- a/patches/server/0782-Win-Screen-API.patch +++ b/patches/server/0782-Win-Screen-API.patch @@ -7,10 +7,10 @@ Subject: [PATCH] Win Screen API public net.minecraft.server.level.ServerPlayer seenCredits diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 68296e776cda9983d2b3f1fdabe7fcaa2e631e86..0eaae1dddf90a23210075b795116f74fad2e2d94 100644 +index 9e46b2c9b3390c70ab10f279a4b41160b2f17b6d..37f8b1adfeba6eebcbb21cd9a143ac8f6dacdcfb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1310,6 +1310,25 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1312,6 +1312,25 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(packet); } diff --git a/patches/server/0807-Expand-PlayerItemMendEvent.patch b/patches/server/0807-Expand-PlayerItemMendEvent.patch index 32b28446d4..f2aa9edbd1 100644 --- a/patches/server/0807-Expand-PlayerItemMendEvent.patch +++ b/patches/server/0807-Expand-PlayerItemMendEvent.patch @@ -30,10 +30,10 @@ index 3a7af27bb1ce0cbe56bd3760cd400083daf98d4c..bf0838f574fa3fb9654e087d602b8d38 if (l > 0) { // this.value = l; // CraftBukkit - update exp value of orb for PlayerItemMendEvent calls // Paper - the value field should not be mutated here because it doesn't take "count" into account diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 0eaae1dddf90a23210075b795116f74fad2e2d94..9cddd440e50d8314b4e853fccee22fc4540ccae0 100644 +index 37f8b1adfeba6eebcbb21cd9a143ac8f6dacdcfb..981b5074e832038537f8281e25bbd868c580c091 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1863,11 +1863,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1865,11 +1865,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { handle.serverLevel(), itemstack, amount ); int i = Math.min(possibleDurabilityFromXp, itemstack.getDamageValue()); diff --git a/patches/server/0826-Fix-BanList-API.patch b/patches/server/0826-Fix-BanList-API.patch index 39df7560c6..e1b5f101e4 100644 --- a/patches/server/0826-Fix-BanList-API.patch +++ b/patches/server/0826-Fix-BanList-API.patch @@ -208,10 +208,10 @@ index 172202accf4448a933fcf1ff820316c7910dd7f7..50ee7656580d386db473c054f5c5ec57 return null; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 9cddd440e50d8314b4e853fccee22fc4540ccae0..b0b417d916c6c3099157f8279c346bc6670c0012 100644 +index 981b5074e832038537f8281e25bbd868c580c091..cf9f7143924239c8add0e7231d922e41d9ff84d7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1757,23 +1757,23 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1759,23 +1759,23 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } @Override @@ -240,7 +240,7 @@ index 9cddd440e50d8314b4e853fccee22fc4540ccae0..b0b417d916c6c3099157f8279c346bc6 if (kickPlayer) { this.kickPlayer(reason); } -@@ -1781,12 +1781,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1783,12 +1783,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } @Override diff --git a/patches/server/0845-Bandaid-fix-for-Effect.patch b/patches/server/0845-Bandaid-fix-for-Effect.patch index 621a7cc2d2..088947acc2 100644 --- a/patches/server/0845-Bandaid-fix-for-Effect.patch +++ b/patches/server/0845-Bandaid-fix-for-Effect.patch @@ -81,10 +81,10 @@ index 431bd698e28b7731bf781e29de6c6a3fd936c71c..bca9e4908c7949a6f0b24fed2aa7332d // Special case: the axis is optional for ELECTRIC_SPARK Preconditions.checkArgument(effect.getData() == null || effect == Effect.ELECTRIC_SPARK, "Wrong kind of data for the %s effect", effect); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index b0b417d916c6c3099157f8279c346bc6670c0012..b397f784510d832d300a777b4c4a4de03c904b72 100644 +index cf9f7143924239c8add0e7231d922e41d9ff84d7..df986f2359b5bce137d7c37ed34e49ac912229e2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -922,7 +922,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -924,7 +924,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { Preconditions.checkArgument(effect != null, "Effect cannot be null"); if (data != null) { Preconditions.checkArgument(effect.getData() != null, "Effect.%s does not have a valid Data", effect); diff --git a/patches/server/0853-Add-Listing-API-for-Player.patch b/patches/server/0853-Add-Listing-API-for-Player.patch index a9183d8193..78c2c8af8c 100644 --- a/patches/server/0853-Add-Listing-API-for-Player.patch +++ b/patches/server/0853-Add-Listing-API-for-Player.patch @@ -122,7 +122,7 @@ index efc12d629b71ba1da664d9ecfd4575bee9b45dc3..9067100a82a8c405cec0a19e53b3b245 // Paper end - Use single player info update packet on join player.sentListPacket = true; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index b397f784510d832d300a777b4c4a4de03c904b72..76ee6dcf028720f22ca6d0ba5975a8f1555cca37 100644 +index df986f2359b5bce137d7c37ed34e49ac912229e2..21a700a44972336ee619389eab1d83545883f092 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -206,6 +206,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -133,7 +133,7 @@ index b397f784510d832d300a777b4c4a4de03c904b72..76ee6dcf028720f22ca6d0ba5975a8f1 private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>(); private int hash = 0; private double health = 20; -@@ -2102,7 +2103,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2104,7 +2105,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { otherPlayer.setUUID(uuidOverride); } // Paper end @@ -142,7 +142,7 @@ index b397f784510d832d300a777b4c4a4de03c904b72..76ee6dcf028720f22ca6d0ba5975a8f1 if (original != null) otherPlayer.setUUID(original); // Paper - uuid override } -@@ -2206,6 +2207,41 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2208,6 +2209,41 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return (entity != null) ? this.canSee(entity) : false; // If we can't find it, we can't see it } diff --git a/patches/server/0883-Add-player-idle-duration-API.patch b/patches/server/0883-Add-player-idle-duration-API.patch index e74ebf914c..ae9d939194 100644 --- a/patches/server/0883-Add-player-idle-duration-API.patch +++ b/patches/server/0883-Add-player-idle-duration-API.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Add player idle duration API Implements API for getting and resetting a player's idle duration. diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index d8f0f8f0afd0a3705cf20b2670a6dd137cd70c15..81455040c878b202cdb96a282fddfe4a65c7d0b7 100644 +index 24abbc26ef9bc8ddc468b7d241cf825405fcfae3..6f1533523424de0d362d1251f05490829460eb8b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3429,6 +3429,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3431,6 +3431,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } // Paper end diff --git a/patches/server/0886-Allow-null-itemstack-for-Player-sendEquipmentChange.patch b/patches/server/0886-Allow-null-itemstack-for-Player-sendEquipmentChange.patch index b540a94025..885ede13a7 100644 --- a/patches/server/0886-Allow-null-itemstack-for-Player-sendEquipmentChange.patch +++ b/patches/server/0886-Allow-null-itemstack-for-Player-sendEquipmentChange.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Allow null itemstack for Player#sendEquipmentChange diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 81455040c878b202cdb96a282fddfe4a65c7d0b7..273a94f727c6c736b2bdf98c1806431ebce4d90f 100644 +index 6f1533523424de0d362d1251f05490829460eb8b..cc4911163e0e22a7313ea4a591efc7dd40fb1b72 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1132,7 +1132,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1134,7 +1134,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void sendEquipmentChange(LivingEntity entity, EquipmentSlot slot, ItemStack item) { diff --git a/patches/server/0906-Add-experience-points-API.patch b/patches/server/0906-Add-experience-points-API.patch index b8ee3f5b5e..6db4aca493 100644 --- a/patches/server/0906-Add-experience-points-API.patch +++ b/patches/server/0906-Add-experience-points-API.patch @@ -18,10 +18,10 @@ index aca888c2f02b09ac6739bdc81b194c4527dd69f5..a19a795deaa7f46c92b97912e2ade006 // Paper start - send while respecting visibility private static void sendSoundEffect(Player fromEntity, double x, double y, double z, SoundEvent soundEffect, SoundSource soundCategory, float volume, float pitch) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 273a94f727c6c736b2bdf98c1806431ebce4d90f..a1c7e7b95718562d86ee8e6da1bb6e6b5d82ce7a 100644 +index cc4911163e0e22a7313ea4a591efc7dd40fb1b72..f881a73c6213582ef6d2632759a5d3a46dbf19ef 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1931,6 +1931,49 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1933,6 +1933,49 @@ public class CraftPlayer extends CraftHumanEntity implements Player { Preconditions.checkArgument(exp >= 0, "Total experience points must not be negative (%s)", exp); this.getHandle().totalExperience = exp; } diff --git a/patches/server/0973-Improve-Maps-in-item-frames-performance-and-bug-fixe.patch b/patches/server/0973-Improve-Maps-in-item-frames-performance-and-bug-fixe.patch index 9962dfd635..98c6089bbc 100644 --- a/patches/server/0973-Improve-Maps-in-item-frames-performance-and-bug-fixe.patch +++ b/patches/server/0973-Improve-Maps-in-item-frames-performance-and-bug-fixe.patch @@ -30,7 +30,7 @@ diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/ma index 55a4424c47591d1bcaba306f6af877a4fb7144bf..a13f88ed2ce39848b1fe1673265cf6c62adbfb66 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -2811,6 +2811,14 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { +@@ -2808,6 +2808,14 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { this.awardStat(Stats.DROP); } diff --git a/patches/server/1027-Improve-entity-effect-API.patch b/patches/server/1027-Improve-entity-effect-API.patch index 51c6f3ecf8..d1af1cbccf 100644 --- a/patches/server/1027-Improve-entity-effect-API.patch +++ b/patches/server/1027-Improve-entity-effect-API.patch @@ -25,10 +25,10 @@ index d1d9916db7bd4886d30355e6a0ecb69cd21c2364..ddabaed899c755925ad8618b78c33dac + // Paper end - broadcast hurt animation } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 700751a1469dd99339e6502e96cd98e72feee803..0d3d565db8fdc30e44966492f2c30171b4dac7ec 100644 +index 4b65a7967cdcc94e04fa375a6bad2c012b3b4d4b..4459d9f205222764affae053930c15f5107d4e69 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1282,6 +1282,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1284,6 +1284,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void sendHurtAnimation(float yaw) { @@ -40,7 +40,7 @@ index 700751a1469dd99339e6502e96cd98e72feee803..0d3d565db8fdc30e44966492f2c30171 if (this.getHandle().connection == null) { return; } -@@ -1291,7 +1296,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1293,7 +1298,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { * This makes no sense. We'll add 90 to it so that 0 = front, clockwise from there. */ float actualYaw = yaw + 90; @@ -49,7 +49,7 @@ index 700751a1469dd99339e6502e96cd98e72feee803..0d3d565db8fdc30e44966492f2c30171 } @Override -@@ -3528,4 +3533,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3530,4 +3535,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setSendViewDistance(final int viewDistance) { throw new UnsupportedOperationException("Not implemented yet"); } diff --git a/patches/server/1038-Moonrise-optimisation-patches.patch b/patches/server/1038-Moonrise-optimisation-patches.patch index d22d5be4dc..e66596c063 100644 --- a/patches/server/1038-Moonrise-optimisation-patches.patch +++ b/patches/server/1038-Moonrise-optimisation-patches.patch @@ -27566,7 +27566,7 @@ index c5f3e4dff83a85a3a5f29534afd84d4a332b1d3e..85c58214c13208ed30f0ae4a2722f172 return crashreportsystemdetails; } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 08a82b7a3456f58b3d0fdbb8e8dbce6972ad1672..dda53c52fab7c02f39451335fe0bfe36852ac994 100644 +index d80a03a72d150f9f496203dbce18ddf6d4cffee2..aba3a9f42a5fad867511ee69b385c00e9c496039 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -218,7 +218,7 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -36160,10 +36160,10 @@ index 4a5a0e33af16369f665bf39e70238e4e5a5486da..696152286a4d16fa51a23ff6e15fb297 // Paper start - implement pointers diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 0d3d565db8fdc30e44966492f2c30171b4dac7ec..4f1b3b38d1eec331ab67307eb0e9e62621ce3cd5 100644 +index 4459d9f205222764affae053930c15f5107d4e69..73de1c68e92bf6b17cbb5cd49447bc98ae0fb650 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3511,7 +3511,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3513,7 +3513,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setViewDistance(final int viewDistance) { @@ -36174,7 +36174,7 @@ index 0d3d565db8fdc30e44966492f2c30171b4dac7ec..4f1b3b38d1eec331ab67307eb0e9e626 } @Override -@@ -3521,7 +3523,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3523,7 +3525,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setSimulationDistance(final int simulationDistance) { @@ -36185,7 +36185,7 @@ index 0d3d565db8fdc30e44966492f2c30171b4dac7ec..4f1b3b38d1eec331ab67307eb0e9e626 } @Override -@@ -3531,7 +3535,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3533,7 +3537,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setSendViewDistance(final int viewDistance) { diff --git a/patches/server/1039-API-for-checking-sent-chunks.patch b/patches/server/1039-API-for-checking-sent-chunks.patch index 33cbf04ef5..94b9491284 100644 --- a/patches/server/1039-API-for-checking-sent-chunks.patch +++ b/patches/server/1039-API-for-checking-sent-chunks.patch @@ -5,10 +5,10 @@ Subject: [PATCH] API for checking sent chunks diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 4f1b3b38d1eec331ab67307eb0e9e62621ce3cd5..d0010dfd22463986bf3be9b3ee015ce92735753e 100644 +index 73de1c68e92bf6b17cbb5cd49447bc98ae0fb650..a6dd30f0267a4c8bdc58d8745782a8862aabeba6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3498,6 +3498,35 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3500,6 +3500,35 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } // Paper end diff --git a/patches/server/1056-Allow-using-old-ender-pearl-behavior.patch b/patches/server/1056-Allow-using-old-ender-pearl-behavior.patch index 6f44fde3f4..939dd90893 100644 --- a/patches/server/1056-Allow-using-old-ender-pearl-behavior.patch +++ b/patches/server/1056-Allow-using-old-ender-pearl-behavior.patch @@ -20,7 +20,7 @@ index b525369fb6f3bb80c1553ae41b1e3bddeda29936..2e8ecf3bbb9f9ceba6f896738fa1ab8e if (entityenderpearl.isRemoved()) { ServerPlayer.LOGGER.warn("Trying to save removed ender pearl, skipping"); -@@ -3146,7 +3147,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -3143,7 +3144,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple } public static long placeEnderPearlTicket(ServerLevel world, ChunkPos chunkPos) { From 7e789e8376b855e0c25fbbf23cf957daf24aa577 Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Tue, 26 Nov 2024 20:05:52 +0100 Subject: [PATCH 10/13] Prevent duplicate/superfluous BlockPhysicsEvent (#11609) --- ...dd-source-block-to-BlockPhysicsEvent.patch | 42 +++++++++++++++++++ ...32-Call-BlockPhysicsEvent-more-often.patch | 32 -------------- 2 files changed, 42 insertions(+), 32 deletions(-) create mode 100644 patches/server/0732-Add-source-block-to-BlockPhysicsEvent.patch delete mode 100644 patches/server/0732-Call-BlockPhysicsEvent-more-often.patch diff --git a/patches/server/0732-Add-source-block-to-BlockPhysicsEvent.patch b/patches/server/0732-Add-source-block-to-BlockPhysicsEvent.patch new file mode 100644 index 0000000000..91adea4a23 --- /dev/null +++ b/patches/server/0732-Add-source-block-to-BlockPhysicsEvent.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> +Date: Sun, 7 Aug 2022 22:16:36 +0200 +Subject: [PATCH] Add source block to BlockPhysicsEvent + + +diff --git a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java +index 5821c802ec880501df025fcd3fbbd98242ed952c..3a95e3236eafd14baed035e53503b58c2e21b68a 100644 +--- a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java ++++ b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java +@@ -135,7 +135,7 @@ public class CollectingNeighborUpdater implements NeighborUpdater { + orientation = this.orientation.withFront(direction); + } + +- NeighborUpdater.executeUpdate(world, blockState, blockPos, this.sourceBlock, orientation, false); ++ NeighborUpdater.executeUpdate(world, blockState, blockPos, this.sourceBlock, orientation, false, this.sourcePos); // Paper - Add source block to BlockPhysicsEvent + if (this.idx < NeighborUpdater.UPDATE_ORDER.length && NeighborUpdater.UPDATE_ORDER[this.idx] == this.skipDirection) { + this.idx++; + } +diff --git a/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java b/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java +index be8f34dd222e43b2db7f05e5e5839df8446e1b02..e414da8a51bb9b49c28a74eca166046cbee44835 100644 +--- a/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java ++++ b/src/main/java/net/minecraft/world/level/redstone/NeighborUpdater.java +@@ -55,11 +55,17 @@ public interface NeighborUpdater { + } + + static void executeUpdate(Level world, BlockState state, BlockPos pos, Block sourceBlock, @Nullable Orientation orientation, boolean notify) { ++ // Paper start - Add source block to BlockPhysicsEvent ++ executeUpdate(world, state, pos, sourceBlock, orientation, notify, pos); ++ } ++ ++ static void executeUpdate(Level world, BlockState state, BlockPos pos, Block sourceBlock, @Nullable Orientation orientation, boolean notify, BlockPos sourcePos) { ++ // Paper end - Add source block to BlockPhysicsEvent + try { + // CraftBukkit start + CraftWorld cworld = ((ServerLevel) world).getWorld(); + if (cworld != null) { +- BlockPhysicsEvent event = new BlockPhysicsEvent(CraftBlock.at(world, pos), CraftBlockData.fromData(state)); ++ BlockPhysicsEvent event = new BlockPhysicsEvent(CraftBlock.at(world, pos), CraftBlockData.fromData(state), CraftBlock.at(world, sourcePos)); // Paper - Add source block to BlockPhysicsEvent + ((ServerLevel) world).getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { diff --git a/patches/server/0732-Call-BlockPhysicsEvent-more-often.patch b/patches/server/0732-Call-BlockPhysicsEvent-more-often.patch deleted file mode 100644 index ad24091f87..0000000000 --- a/patches/server/0732-Call-BlockPhysicsEvent-more-often.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> -Date: Sun, 7 Aug 2022 22:16:36 +0200 -Subject: [PATCH] Call BlockPhysicsEvent more often - - -diff --git a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -index 5821c802ec880501df025fcd3fbbd98242ed952c..0587f4e5083a6c890a11642284a9c16fb2eb2fe1 100644 ---- a/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -+++ b/src/main/java/net/minecraft/world/level/redstone/CollectingNeighborUpdater.java -@@ -135,7 +135,20 @@ public class CollectingNeighborUpdater implements NeighborUpdater { - orientation = this.orientation.withFront(direction); - } - -- NeighborUpdater.executeUpdate(world, blockState, blockPos, this.sourceBlock, orientation, false); -+ // Paper start - Call BlockPhysicsEvent -+ try { -+ org.bukkit.event.block.BlockPhysicsEvent event = new org.bukkit.event.block.BlockPhysicsEvent( -+ org.bukkit.craftbukkit.block.CraftBlock.at(world, blockPos), -+ org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(blockState), -+ org.bukkit.craftbukkit.block.CraftBlock.at(world, this.sourcePos)); -+ -+ if (event.callEvent()) { // continue to check for adjacent block (increase idx) -+ NeighborUpdater.executeUpdate(world, blockState, blockPos, this.sourceBlock, orientation, false); -+ } -+ } catch (StackOverflowError ex) { -+ world.lastPhysicsProblem = blockPos; -+ } -+ // Paper end - Call BlockPhysicsEvent - if (this.idx < NeighborUpdater.UPDATE_ORDER.length && NeighborUpdater.UPDATE_ORDER[this.idx] == this.skipDirection) { - this.idx++; - } From afb5b13056ebbcdd3ae834c039046ecad4fa89eb Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Wed, 27 Nov 2024 06:16:27 -0800 Subject: [PATCH 11/13] Replace SimpleRandom with (Simple)ThreadUnsafeRandom ThreadUnsafeRandom is a random implementation that is identical to LegacyRandomSource behaviourally, but without the thread checks. SimpleThreadUnsafeRandom is ThreadUnsafeRandom except with its nextInt(int) function replaced with a faster but more biased implementation when bound is very large. Additionally, replace Level/Entity randoms with ThreadUnsafeRandom. This avoids the expensive CAS logic at the expense of losing the thread check. --- patches/server/0009-MC-Utils.patch | 179 +++++++++++++++-- .../1038-Moonrise-optimisation-patches.patch | 189 ++++++++++++++---- ...l-more-information-in-watchdog-dumps.patch | 12 +- ...070-Configurable-Entity-Despawn-Time.patch | 8 +- 4 files changed, 323 insertions(+), 65 deletions(-) diff --git a/patches/server/0009-MC-Utils.patch b/patches/server/0009-MC-Utils.patch index 1912c615e2..e857714e6c 100644 --- a/patches/server/0009-MC-Utils.patch +++ b/patches/server/0009-MC-Utils.patch @@ -4037,36 +4037,41 @@ index 0000000000000000000000000000000000000000..559c959aff3c9deef867b9e425fba3e2 + private MoonriseConstants() {} + +} -diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleRandom.java +diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleThreadUnsafeRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleThreadUnsafeRandom.java new file mode 100644 -index 0000000000000000000000000000000000000000..a9ff1c1a70faf4b7a64b265932f07a8b8f00c1ff +index 0000000000000000000000000000000000000000..8d57b9c141fbe049aea248faa547dc97ba24cba5 --- /dev/null -+++ b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleRandom.java -@@ -0,0 +1,52 @@ ++++ b/src/main/java/ca/spottedleaf/moonrise/common/util/SimpleThreadUnsafeRandom.java +@@ -0,0 +1,105 @@ +package ca.spottedleaf.moonrise.common.util; + -+import net.minecraft.world.level.levelgen.LegacyRandomSource; ++import net.minecraft.util.Mth; ++import net.minecraft.util.RandomSource; ++import net.minecraft.world.level.levelgen.BitRandomSource; ++import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian; ++import net.minecraft.world.level.levelgen.PositionalRandomFactory; + +/** -+ * Avoid costly CAS of superclass ++ * Avoid costly CAS of superclass + division in nextInt + */ -+public final class SimpleRandom extends LegacyRandomSource { ++public final class SimpleThreadUnsafeRandom implements BitRandomSource { + + private static final long MULTIPLIER = 25214903917L; + private static final long ADDEND = 11L; + private static final int BITS = 48; -+ private static final long MASK = (1L << BITS) - 1; ++ private static final long MASK = (1L << BITS) - 1L; + + private long value; ++ private final MarsagliaPolarGaussian gaussianSource = new MarsagliaPolarGaussian(this); + -+ public SimpleRandom(final long seed) { -+ super(0L); -+ this.value = seed; ++ public SimpleThreadUnsafeRandom(final long seed) { ++ this.setSeed(seed); + } + + @Override + public void setSeed(final long seed) { + this.value = (seed ^ MULTIPLIER) & MASK; ++ this.gaussianSource.reset(); + } + + private long advanceSeed() { @@ -4094,6 +4099,154 @@ index 0000000000000000000000000000000000000000..a9ff1c1a70faf4b7a64b265932f07a8b + final long value = this.advanceSeed() >>> (BITS - Integer.SIZE); + return (int)((value * (long)bound) >>> Integer.SIZE); + } ++ ++ @Override ++ public double nextGaussian() { ++ return this.gaussianSource.nextGaussian(); ++ } ++ ++ @Override ++ public RandomSource fork() { ++ return new SimpleThreadUnsafeRandom(this.nextLong()); ++ } ++ ++ @Override ++ public PositionalRandomFactory forkPositional() { ++ return new SimpleRandomPositionalFactory(this.nextLong()); ++ } ++ ++ public static final class SimpleRandomPositionalFactory implements PositionalRandomFactory { ++ ++ private final long seed; ++ ++ public SimpleRandomPositionalFactory(final long seed) { ++ this.seed = seed; ++ } ++ ++ public long getSeed() { ++ return this.seed; ++ } ++ ++ @Override ++ public RandomSource fromHashOf(final String string) { ++ return new SimpleThreadUnsafeRandom((long)string.hashCode() ^ this.seed); ++ } ++ ++ @Override ++ public RandomSource fromSeed(final long seed) { ++ return new SimpleThreadUnsafeRandom(seed); ++ } ++ ++ @Override ++ public RandomSource at(final int x, final int y, final int z) { ++ return new SimpleThreadUnsafeRandom(Mth.getSeed(x, y, z) ^ this.seed); ++ } ++ ++ @Override ++ public void parityConfigString(final StringBuilder stringBuilder) { ++ stringBuilder.append("SimpleRandomPositionalFactory{").append(this.seed).append('}'); ++ } ++ } ++} +diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java +new file mode 100644 +index 0000000000000000000000000000000000000000..12eb3add0931a4d77acdf6e875c42dda9c313dc3 +--- /dev/null ++++ b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java +@@ -0,0 +1,94 @@ ++package ca.spottedleaf.moonrise.common.util; ++ ++import net.minecraft.util.Mth; ++import net.minecraft.util.RandomSource; ++import net.minecraft.world.level.levelgen.BitRandomSource; ++import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian; ++import net.minecraft.world.level.levelgen.PositionalRandomFactory; ++ ++/** ++ * Avoid costly CAS of superclass ++ */ ++public final class ThreadUnsafeRandom implements BitRandomSource { ++ ++ private static final long MULTIPLIER = 25214903917L; ++ private static final long ADDEND = 11L; ++ private static final int BITS = 48; ++ private static final long MASK = (1L << BITS) - 1L; ++ ++ private long value; ++ private final MarsagliaPolarGaussian gaussianSource = new MarsagliaPolarGaussian(this); ++ ++ public ThreadUnsafeRandom(final long seed) { ++ this.setSeed(seed); ++ } ++ ++ @Override ++ public void setSeed(final long seed) { ++ this.value = (seed ^ MULTIPLIER) & MASK; ++ this.gaussianSource.reset(); ++ } ++ ++ private long advanceSeed() { ++ return this.value = ((this.value * MULTIPLIER) + ADDEND) & MASK; ++ } ++ ++ @Override ++ public int next(final int bits) { ++ return (int)(this.advanceSeed() >>> (BITS - bits)); ++ } ++ ++ @Override ++ public int nextInt() { ++ final long seed = this.advanceSeed(); ++ return (int)(seed >>> (BITS - Integer.SIZE)); ++ } ++ ++ @Override ++ public double nextGaussian() { ++ return this.gaussianSource.nextGaussian(); ++ } ++ ++ @Override ++ public RandomSource fork() { ++ return new ThreadUnsafeRandom(this.nextLong()); ++ } ++ ++ @Override ++ public PositionalRandomFactory forkPositional() { ++ return new ThreadUnsafeRandomPositionalFactory(this.nextLong()); ++ } ++ ++ public static final class ThreadUnsafeRandomPositionalFactory implements PositionalRandomFactory { ++ ++ private final long seed; ++ ++ public ThreadUnsafeRandomPositionalFactory(final long seed) { ++ this.seed = seed; ++ } ++ ++ public long getSeed() { ++ return this.seed; ++ } ++ ++ @Override ++ public RandomSource fromHashOf(final String string) { ++ return new ThreadUnsafeRandom((long)string.hashCode() ^ this.seed); ++ } ++ ++ @Override ++ public RandomSource fromSeed(final long seed) { ++ return new ThreadUnsafeRandom(seed); ++ } ++ ++ @Override ++ public RandomSource at(final int x, final int y, final int z) { ++ return new ThreadUnsafeRandom(Mth.getSeed(x, y, z) ^ this.seed); ++ } ++ ++ @Override ++ public void parityConfigString(final StringBuilder stringBuilder) { ++ stringBuilder.append("ThreadUnsafeRandomPositionalFactory{").append(this.seed).append('}'); ++ } ++ } +} diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java b/src/main/java/ca/spottedleaf/moonrise/common/util/TickThread.java new file mode 100644 @@ -4542,7 +4695,7 @@ index 46cab7a8c7b87ab01b26074b04f5a02b3907cfc4..49019b4a9bc4e634d54a9b0acaf9229a + // Paper end } diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index f0d470d7770e119f734b9e72021c806d0ea8ecbd..c3fe4481dd35f80815716e48beeeb07b1f51e30b 100644 +index 0ea9eba1367858dfa5284524a8dd2f79daf6fc69..18b64c00fa73e233bf41f519db54a1d43c2a8b1f 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java @@ -217,7 +217,7 @@ public class GlobalConfiguration extends ConfigurationPart { @@ -5553,7 +5706,7 @@ index f6a3606b972064c4ec78487374e6197c0c447e27..8978fa74ceae06bef6aad3b74d654498 public ServerLevel(MinecraftServer minecraftserver, Executor executor, LevelStorageSource.LevelStorageAccess convertable_conversionsession, PrimaryLevelData iworlddataserver, ResourceKey resourcekey, LevelStem worlddimension, ChunkProgressListener worldloadlistener, boolean flag, long i, List list, boolean flag1, @Nullable RandomSequences randomsequences, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { super(iworlddataserver, resourcekey, minecraftserver.registryAccess(), worlddimension.type(), false, flag, i, minecraftserver.getMaxChainedNeighborUpdates(), gen, biomeProvider, env, spigotConfig -> minecraftserver.paperConfigurations.createWorldConfig(io.papermc.paper.configuration.PaperConfigurations.createWorldContextMap(convertable_conversionsession.levelDirectory.path(), iworlddataserver.getLevelName(), resourcekey.location(), spigotConfig, minecraftserver.registryAccess(), iworlddataserver.getGameRules()))); // Paper - create paper world configs diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index fd97a0e54ad8487b0c6f242fcb626f0b76f88274..785c7e11f92610be58b624d252d1858658496af7 100644 +index 2819ee5726c759e524ba558155bcc516f1b70606..c60e7f27ea4060e455a18feb6f6a7919e80a8fc8 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -309,6 +309,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player { diff --git a/patches/server/1038-Moonrise-optimisation-patches.patch b/patches/server/1038-Moonrise-optimisation-patches.patch index e66596c063..d70d12cc2d 100644 --- a/patches/server/1038-Moonrise-optimisation-patches.patch +++ b/patches/server/1038-Moonrise-optimisation-patches.patch @@ -13,6 +13,7 @@ Currently includes: - Block/Biome Palette read optimisations - StateHolder (BlockState/FluidState) property access optimisations - Basic Fluid property read optimisations + - Entity/Level random replacement See https://github.com/Tuinity/Moonrise @@ -364,6 +365,19 @@ index 49fe9eed5d5d08abd6e9778fe0d0545f35552435..fc029c8fb22a7c8eeb23bfc171812f6d } private ChunkSystem() {} +diff --git a/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java +index 12eb3add0931a4d77acdf6e875c42dda9c313dc3..5239993a681d6113eec99fa627b85508656ed7ac 100644 +--- a/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java ++++ b/src/main/java/ca/spottedleaf/moonrise/common/util/ThreadUnsafeRandom.java +@@ -9,7 +9,7 @@ import net.minecraft.world.level.levelgen.PositionalRandomFactory; + /** + * Avoid costly CAS of superclass + */ +-public final class ThreadUnsafeRandom implements BitRandomSource { ++public class ThreadUnsafeRandom implements BitRandomSource { // Paper - replace random + + private static final long MULTIPLIER = 25214903917L; + private static final long ADDEND = 11L; diff --git a/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java b/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java index c8f2457ab3b28f2c3a6b500bcea40261669c24a4..ca8b6a926dfff3fdd6b04228809a4480366120b2 100644 --- a/src/main/java/ca/spottedleaf/moonrise/paper/PaperHooks.java @@ -26285,7 +26299,7 @@ index 65206fdfa5b94eaca139e433b4865c16b16641f3..bf4463bcb5dc439ac5a3fa08dd60845a } } diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 0a895055ec7f61d3cb52d303bbe3f89486a322e7..10a9406e96ab0ab2404c0e0a9bef08e86a6a12a2 100644 +index 0a895055ec7f61d3cb52d303bbe3f89486a322e7..56a109dc832c231bf8470f46e1ff37565e9fdd7a 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java @@ -52,7 +52,7 @@ import net.minecraft.world.level.storage.DimensionDataStorage; @@ -26366,7 +26380,7 @@ index 0a895055ec7f61d3cb52d303bbe3f89486a322e7..10a9406e96ab0ab2404c0e0a9bef08e8 + } + // Paper end - rewrite chunk system + // Paper start - chunk tick iteration optimisations -+ private final ca.spottedleaf.moonrise.common.util.SimpleRandom shuffleRandom = new ca.spottedleaf.moonrise.common.util.SimpleRandom(0L); ++ private final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom shuffleRandom = new ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom(0L); + private boolean isChunkNearPlayer(final ChunkMap chunkMap, final ChunkPos chunkPos, final LevelChunk levelChunk) { + final ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkData chunkData = ((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemChunkHolder)((ca.spottedleaf.moonrise.patches.chunk_system.level.chunk.ChunkSystemLevelChunk)levelChunk).moonrise$getChunkAndHolder().holder()) + .moonrise$getRealChunkHolder().holderData; @@ -26801,7 +26815,7 @@ index b2fd3e936559c8fcb8b02ae3ef63c4f3bd0edb08..5bbc7ceaafc163f12344e5d5d355ad2f if (!list.equals(this.lastPassengers)) { diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index c5f3e4dff83a85a3a5f29534afd84d4a332b1d3e..85c58214c13208ed30f0ae4a2722f172184123ab 100644 +index c5f3e4dff83a85a3a5f29534afd84d4a332b1d3e..9928e14a5a42a2f0deba86e9dcb1f6f9f59412ef 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -185,7 +185,7 @@ import org.bukkit.event.weather.LightningStrikeEvent; @@ -27232,12 +27246,12 @@ index c5f3e4dff83a85a3a5f29534afd84d4a332b1d3e..85c58214c13208ed30f0ae4a2722f172 } + // Paper start - optimise random ticking -+ private final ca.spottedleaf.moonrise.common.util.SimpleRandom simpleRandom = new ca.spottedleaf.moonrise.common.util.SimpleRandom(0L); ++ private final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = new ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom(net.minecraft.world.level.levelgen.RandomSupport.generateUniqueSeed()); + + private void optimiseRandomTick(final LevelChunk chunk, final int tickSpeed) { + final LevelChunkSection[] sections = chunk.getSections(); + final int minSection = ca.spottedleaf.moonrise.common.util.WorldUtil.getMinSection((ServerLevel)(Object)this); -+ final ca.spottedleaf.moonrise.common.util.SimpleRandom simpleRandom = this.simpleRandom; ++ final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = this.simpleRandom; + final boolean doubleTickFluids = !ca.spottedleaf.moonrise.common.PlatformHooks.get().configFixMC224294(); + + final ChunkPos cpos = chunk.getPos(); @@ -27284,7 +27298,7 @@ index c5f3e4dff83a85a3a5f29534afd84d4a332b1d3e..85c58214c13208ed30f0ae4a2722f172 + // Paper end - optimise random ticking + public void tickChunk(LevelChunk chunk, int randomTickSpeed) { -+ final ca.spottedleaf.moonrise.common.util.SimpleRandom simpleRandom = this.simpleRandom; // Paper - optimise random ticking ++ final ca.spottedleaf.moonrise.common.util.SimpleThreadUnsafeRandom simpleRandom = this.simpleRandom; // Paper - optimise random ticking ChunkPos chunkcoordintpair = chunk.getPos(); boolean flag = this.isRaining(); int j = chunkcoordintpair.getMinBlockX(); @@ -27566,7 +27580,7 @@ index c5f3e4dff83a85a3a5f29534afd84d4a332b1d3e..85c58214c13208ed30f0ae4a2722f172 return crashreportsystemdetails; } diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index d80a03a72d150f9f496203dbce18ddf6d4cffee2..aba3a9f42a5fad867511ee69b385c00e9c496039 100644 +index f6e130aba66935f808dcfd7ef987131092ddfe4e..2b6c5b2387b67f25d8877849ccbfaaa77eab51d3 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -218,7 +218,7 @@ import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -28437,7 +28451,7 @@ index 50040c497a819cd1229042ab3cb057d34a32cacc..1f9c436a632e4f110be61cf76fcfc3b7 + // Paper end - block counting } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba0a170365 100644 +index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..b810f887e536af938f978ca2af068e6ae89b5e60 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -176,7 +176,7 @@ import org.bukkit.event.player.PlayerTeleportEvent; @@ -28449,7 +28463,89 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba // CraftBukkit start private static final int CURRENT_LEVEL = 2; -@@ -461,6 +461,156 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -187,7 +187,17 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + + // Paper start - Share random for entities to make them more random + public static RandomSource SHARED_RANDOM = new RandomRandomSource(); +- private static final class RandomRandomSource extends java.util.Random implements net.minecraft.world.level.levelgen.BitRandomSource { ++ // Paper start - replace random ++ private static final class RandomRandomSource extends ca.spottedleaf.moonrise.common.util.ThreadUnsafeRandom { ++ public RandomRandomSource() { ++ this(net.minecraft.world.level.levelgen.RandomSupport.generateUniqueSeed()); ++ } ++ ++ public RandomRandomSource(long seed) { ++ super(seed); ++ } ++ ++ // Paper end - replace random + private boolean locked = false; + + @Override +@@ -200,61 +210,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess + } + } + +- @Override +- public RandomSource fork() { +- return new net.minecraft.world.level.levelgen.LegacyRandomSource(this.nextLong()); +- } +- +- @Override +- public net.minecraft.world.level.levelgen.PositionalRandomFactory forkPositional() { +- return new net.minecraft.world.level.levelgen.LegacyRandomSource.LegacyPositionalRandomFactory(this.nextLong()); +- } +- +- // these below are added to fix reobf issues that I don't wanna deal with right now +- @Override +- public int next(int bits) { +- return super.next(bits); +- } +- +- @Override +- public int nextInt(int origin, int bound) { +- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(origin, bound); +- } +- +- @Override +- public long nextLong() { +- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextLong(); +- } +- +- @Override +- public int nextInt() { +- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(); +- } +- +- @Override +- public int nextInt(int bound) { +- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextInt(bound); +- } +- +- @Override +- public boolean nextBoolean() { +- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextBoolean(); +- } +- +- @Override +- public float nextFloat() { +- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextFloat(); +- } +- +- @Override +- public double nextDouble() { +- return net.minecraft.world.level.levelgen.BitRandomSource.super.nextDouble(); +- } +- +- @Override +- public double nextGaussian() { +- return super.nextGaussian(); +- } ++ // Paper - replace random + } + // Paper end - Share random for entities to make them more random + public org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason; // Paper - Entity#getEntitySpawnReason +@@ -461,6 +417,156 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return this.dimensions.makeBoundingBox(x, y, z); } // Paper end @@ -28606,7 +28702,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba public Entity(EntityType type, Level world) { this.id = Entity.ENTITY_COUNTER.incrementAndGet(); -@@ -1366,41 +1516,76 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1366,41 +1472,76 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } private Vec3 collide(Vec3 movement) { @@ -28632,22 +28728,17 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba + if (xZero & yZero & zZero) { + return movement; + } ++ ++ final AABB currentBox = this.getBoundingBox(); ++ ++ final List potentialCollisionsVoxel = new ArrayList<>(); ++ final List potentialCollisionsBB = new ArrayList<>(); - List list1 = Entity.collectColliders(this, this.level, list, axisalignedbb2); - float f = (float) vec3d1.y; - float[] afloat = Entity.collectCandidateStepUpHeights(axisalignedbb1, list1, this.maxUpStep(), f); - float[] afloat1 = afloat; - int i = afloat.length; -+ final AABB currentBox = this.getBoundingBox(); - -- for (int j = 0; j < i; ++j) { -- float f1 = afloat1[j]; -- Vec3 vec3d2 = Entity.collideWithShapes(new Vec3(movement.x, (double) f1, movement.z), axisalignedbb1, list1); -+ final List potentialCollisionsVoxel = new ArrayList<>(); -+ final List potentialCollisionsBB = new ArrayList<>(); - -- if (vec3d2.horizontalDistanceSqr() > vec3d1.horizontalDistanceSqr()) { -- double d0 = axisalignedbb.minY - axisalignedbb1.minY; + final AABB initialCollisionBox; + if (xZero & zZero) { + // note: xZero & zZero -> collision on x/z == 0 -> no step height calculation @@ -28658,20 +28749,25 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba + initialCollisionBox = currentBox.expandTowards(movement); + } -- return vec3d2.add(0.0D, -d0, 0.0D); -- } +- for (int j = 0; j < i; ++j) { +- float f1 = afloat1[j]; +- Vec3 vec3d2 = Entity.collideWithShapes(new Vec3(movement.x, (double) f1, movement.z), axisalignedbb1, list1); + final List entityAABBs = new ArrayList<>(); + ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getEntityHardCollisions( + this.level, (Entity)(Object)this, initialCollisionBox, entityAABBs, 0, null + ); -+ + +- if (vec3d2.horizontalDistanceSqr() > vec3d1.horizontalDistanceSqr()) { +- double d0 = axisalignedbb.minY - axisalignedbb1.minY; + ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getCollisionsForBlocksOrWorldBorder( + this.level, (Entity)(Object)this, initialCollisionBox, potentialCollisionsVoxel, potentialCollisionsBB, + ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_CHECK_BORDER, null + ); + potentialCollisionsBB.addAll(entityAABBs); + final Vec3 collided = ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.performCollisions(movement, currentBox, potentialCollisionsVoxel, potentialCollisionsBB); -+ + +- return vec3d2.add(0.0D, -d0, 0.0D); +- } + final boolean collidedX = collided.x != movement.x; + final boolean collidedY = collided.y != movement.y; + final boolean collidedZ = collided.z != movement.z; @@ -28711,7 +28807,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba } private static float[] collectCandidateStepUpHeights(AABB collisionBox, List collisions, float f, float stepHeight) { -@@ -2788,18 +2973,110 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -2788,18 +2929,110 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public boolean isInWall() { @@ -28829,7 +28925,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba } public InteractionResult interact(Player player, InteractionHand hand) { -@@ -4272,14 +4549,17 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4272,14 +4505,17 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public Iterable getIndirectPassengers() { @@ -28854,7 +28950,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba } private Iterable getIndirectPassengers_old() { // Paper end - Optimize indirect passenger iteration -@@ -4437,82 +4717,136 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4437,82 +4673,136 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return Mth.lerp(delta, this.yRotO, this.yRot); } @@ -28955,7 +29051,9 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba + final int maxZIterate = currChunkZ == maxChunkZ ? (maxBlockZ & 15) : 15; + final int minYIterate = currChunkY == minChunkY ? (minBlockY & 15) : 0; + final int maxYIterate = currChunkY == maxChunkY ? (maxBlockY & 15) : 15; -+ + +- vec3d = vec3d.add(vec3d1); +- ++k1; + for (int currY = minYIterate; currY <= maxYIterate; ++currY) { + for (int currZ = minZIterate; currZ <= maxZIterate; ++currZ) { + for (int currX = minXIterate; currX <= maxXIterate; ++currX) { @@ -28963,21 +29061,19 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba + + if (fluidState.isEmpty() || !fluidState.is(fluid)) { + continue; -+ } + } +- // CraftBukkit start - store last lava contact location +- if (tag == FluidTags.LAVA) { +- this.lastLavaContact = blockposition_mutableblockposition.immutable(); + + mutablePos.set(currX | (currChunkX << 4), currY | (currChunkY << 4), currZ | (currChunkZ << 4)); - -- vec3d = vec3d.add(vec3d1); -- ++k1; ++ + final double height = (double)((float)mutablePos.getY() + fluidState.getHeight(world, mutablePos)); + final double diff = height - boundingBox.minY; + + if (diff < 0.0) { + continue; - } -- // CraftBukkit start - store last lava contact location -- if (tag == FluidTags.LAVA) { -- this.lastLavaContact = blockposition_mutableblockposition.immutable(); ++ } + + inFluid = true; + maxHeightDiff = Math.max(maxHeightDiff, diff); @@ -29049,7 +29145,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba public boolean touchingUnloadedChunk() { AABB axisalignedbb = this.getBoundingBox().inflate(1.0D); -@@ -4664,6 +4998,15 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4664,6 +4954,15 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.setPosRaw(x, y, z, false); } public final void setPosRaw(double x, double y, double z, boolean forceBoundingBoxUpdate) { @@ -29065,7 +29161,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba if (!checkPosition(this, x, y, z)) { return; } -@@ -4793,6 +5136,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4793,6 +5092,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @Override public final void setRemoved(Entity.RemovalReason entity_removalreason, EntityRemoveEvent.Cause cause) { @@ -29078,7 +29174,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba CraftEventFactory.callEntityRemoveEvent(this, cause); // CraftBukkit end final boolean alreadyRemoved = this.removalReason != null; // Paper - Folia schedulers -@@ -4804,7 +5153,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4804,7 +5109,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess this.stopRiding(); } @@ -29087,7 +29183,7 @@ index 5949cbccb569ab1d518508d200e69ad9d7d0ba9a..a9e1ae7ad0b81e7488cb07876b32d7ba this.levelCallback.onRemove(entity_removalreason); this.onRemoval(entity_removalreason); // Paper start - Folia schedulers -@@ -4836,7 +5185,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4836,7 +5141,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @Override public boolean shouldBeSaved() { @@ -29486,7 +29582,7 @@ index e185a33b5b1f8e8e0a0e666b24ba3e9186a8a7ff..5d7a6e4b73f032db356e7ec369b15001 // Paper start - Affects Spawning API diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 078088a854d466e66411d25d6dd6bcc536db78f3..86cd6e1b8f68dd0564ee2a7c60f02d7af287af67 100644 +index 078088a854d466e66411d25d6dd6bcc536db78f3..061d3e77fe8d9322eb660ac1995e025aba51ae1a 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -83,6 +83,7 @@ import net.minecraft.world.level.storage.LevelData; @@ -29506,6 +29602,15 @@ index 078088a854d466e66411d25d6dd6bcc536db78f3..86cd6e1b8f68dd0564ee2a7c60f02d7a public static final Codec> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION); public static final ResourceKey OVERWORLD = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("overworld")); +@@ -130,7 +131,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + public float rainLevel; + protected float oThunderLevel; + public float thunderLevel; +- public final RandomSource random = RandomSource.create(); ++ public final RandomSource random = new ca.spottedleaf.moonrise.common.util.ThreadUnsafeRandom(net.minecraft.world.level.levelgen.RandomSupport.generateUniqueSeed()); // Paper - replace random + /** @deprecated */ + @Deprecated + private final RandomSource threadSafeRandom = RandomSource.createThreadSafe(); @@ -206,7 +207,639 @@ public abstract class Level implements LevelAccessor, AutoCloseable { public abstract ResourceKey getTypeKey(); @@ -36160,7 +36265,7 @@ index 4a5a0e33af16369f665bf39e70238e4e5a5486da..696152286a4d16fa51a23ff6e15fb297 // Paper start - implement pointers diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 4459d9f205222764affae053930c15f5107d4e69..73de1c68e92bf6b17cbb5cd49447bc98ae0fb650 100644 +index 5989a9af8840e1bdb5c7a25a44473e2ab597e1e5..e1f20b5b9ebc5d9870136aa2c77d887094bd4b6e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -3513,7 +3513,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/1043-Detail-more-information-in-watchdog-dumps.patch b/patches/server/1043-Detail-more-information-in-watchdog-dumps.patch index ded78aa33e..98c659d4a2 100644 --- a/patches/server/1043-Detail-more-information-in-watchdog-dumps.patch +++ b/patches/server/1043-Detail-more-information-in-watchdog-dumps.patch @@ -78,7 +78,7 @@ index f7197f1347251a37dd0f6d9ffa2f09bc3a4e1233..1f7f68aad97ee73763c042837f239bdc }); throw RunningOnDifferentThreadException.RUNNING_ON_DIFFERENT_THREAD; diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 85c58214c13208ed30f0ae4a2722f172184123ab..ff79925649ac1ceb6121c4b74fdb65f5f138f689 100644 +index 9928e14a5a42a2f0deba86e9dcb1f6f9f59412ef..d81be1069ef6ce51789df38ce21f125b6d524945 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1253,7 +1253,26 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -123,10 +123,10 @@ index 85c58214c13208ed30f0ae4a2722f172184123ab..ff79925649ac1ceb6121c4b74fdb65f5 private void tickPassenger(Entity vehicle, Entity passenger, boolean isActive) { // Paper - EAR 2 diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index a9e1ae7ad0b81e7488cb07876b32d7ba0a170365..8be1b051543cda2b2e9e3d337834757e53f442de 100644 +index b810f887e536af938f978ca2af068e6ae89b5e60..8c62d1aa5c8a062685474dca7e91bf9f8b004ca5 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -1172,8 +1172,43 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1128,8 +1128,43 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess return this.onGround; } @@ -170,7 +170,7 @@ index a9e1ae7ad0b81e7488cb07876b32d7ba0a170365..8be1b051543cda2b2e9e3d337834757e if (this.noPhysics) { this.setPos(this.getX() + movement.x, this.getY() + movement.y, this.getZ() + movement.z); } else { -@@ -1294,6 +1329,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -1250,6 +1285,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess gameprofilerfiller.pop(); } } @@ -184,7 +184,7 @@ index a9e1ae7ad0b81e7488cb07876b32d7ba0a170365..8be1b051543cda2b2e9e3d337834757e } private void applyMovementEmissionAndPlaySound(Entity.MovementEmission moveEffect, Vec3 movement, BlockPos landingPos, BlockState landingState) { -@@ -4916,7 +4958,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4872,7 +4914,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public void setDeltaMovement(Vec3 velocity) { @@ -194,7 +194,7 @@ index a9e1ae7ad0b81e7488cb07876b32d7ba0a170365..8be1b051543cda2b2e9e3d337834757e } public void addDeltaMovement(Vec3 velocity) { -@@ -5022,7 +5066,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -4978,7 +5022,9 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } // Paper end - Fix MC-4 if (this.position.x != x || this.position.y != y || this.position.z != z) { diff --git a/patches/server/1070-Configurable-Entity-Despawn-Time.patch b/patches/server/1070-Configurable-Entity-Despawn-Time.patch index 9f3d4aa488..3885f857a3 100644 --- a/patches/server/1070-Configurable-Entity-Despawn-Time.patch +++ b/patches/server/1070-Configurable-Entity-Despawn-Time.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable Entity Despawn Time diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 8be1b051543cda2b2e9e3d337834757e53f442de..ed5b00620527c1776722d25b1b45f1544802a341 100644 +index 8c62d1aa5c8a062685474dca7e91bf9f8b004ca5..a15546e433ebba6c0de01bdaaef201a3d99a87b5 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java -@@ -432,6 +432,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -388,6 +388,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess private UUID originWorld; public boolean freezeLocked = false; // Paper - Freeze Tick Lock API public boolean fixedPose = false; // Paper - Expand Pose API @@ -16,7 +16,7 @@ index 8be1b051543cda2b2e9e3d337834757e53f442de..ed5b00620527c1776722d25b1b45f154 public void setOrigin(@javax.annotation.Nonnull Location location) { this.origin = location.toVector(); -@@ -614,6 +615,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -570,6 +571,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess public Entity(EntityType type, Level world) { this.id = Entity.ENTITY_COUNTER.incrementAndGet(); @@ -24,7 +24,7 @@ index 8be1b051543cda2b2e9e3d337834757e53f442de..ed5b00620527c1776722d25b1b45f154 this.passengers = ImmutableList.of(); this.deltaMovement = Vec3.ZERO; this.bb = Entity.INITIAL_AABB; -@@ -912,6 +914,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess +@@ -868,6 +870,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess } public void tick() { From d38624bdd8757f167552a278e6a355289aec7c48 Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Wed, 27 Nov 2024 12:19:39 -0800 Subject: [PATCH 12/13] Do not call modifyEntityTrackingRange on own range The range is already modified, so this call will not do anything. --- patches/server/1038-Moonrise-optimisation-patches.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/server/1038-Moonrise-optimisation-patches.patch b/patches/server/1038-Moonrise-optimisation-patches.patch index d70d12cc2d..7fe3f312d4 100644 --- a/patches/server/1038-Moonrise-optimisation-patches.patch +++ b/patches/server/1038-Moonrise-optimisation-patches.patch @@ -24172,7 +24172,7 @@ index d9ad32acdf46a43a649334a3b736aeb7b3af21d1..fae17a075d7efaf24d916877dd5968eb public static final int RADIUS_AROUND_FULL_CHUNK = FULL_CHUNK_STEP.accumulatedDependencies().getRadius(); public static final int MAX_LEVEL = 33 + RADIUS_AROUND_FULL_CHUNK; diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 7317c353edab8b11d9d94e257f968ac49284f47a..cb3850939955ae068d4776c835522e0b8f228984 100644 +index 7317c353edab8b11d9d94e257f968ac49284f47a..c185f634b962c40047696ec0df50eb88af3ac389 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -108,7 +108,7 @@ import org.slf4j.Logger; @@ -25455,7 +25455,7 @@ index 7317c353edab8b11d9d94e257f968ac49284f47a..cb3850939955ae068d4776c835522e0b - Iterator iterator = this.entity.getIndirectPassengers().iterator(); + // Paper start - optimise entity tracker + final Entity entity = this.entity; -+ int range = ca.spottedleaf.moonrise.common.PlatformHooks.get().modifyEntityTrackingRange(entity, this.range); ++ int range = this.range; - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); From cb2ab7d22509cf06b6086af2df8b469323183212 Mon Sep 17 00:00:00 2001 From: Noah <59799222+Leguan16@users.noreply.github.com> Date: Thu, 28 Nov 2024 18:17:57 +0100 Subject: [PATCH 13/13] Remove string dupe exploit setting (#11670) --- patches/server/0005-Paper-config-files.patch | 13 ++++++------- patches/server/0009-MC-Utils.patch | 2 +- .../0733-Configurable-chat-thread-limit.patch | 4 ++-- .../server/1038-Moonrise-optimisation-patches.patch | 4 ++-- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/patches/server/0005-Paper-config-files.patch b/patches/server/0005-Paper-config-files.patch index d5545fac61..bd72b5facf 100644 --- a/patches/server/0005-Paper-config-files.patch +++ b/patches/server/0005-Paper-config-files.patch @@ -485,10 +485,10 @@ index 0000000000000000000000000000000000000000..007e01d329a31acf7f4ed4c6dc4de7ad +} diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java new file mode 100644 -index 0000000000000000000000000000000000000000..0ea9eba1367858dfa5284524a8dd2f79daf6fc69 +index 0000000000000000000000000000000000000000..87da4ff63294735bfcbfa8442fb8ae7196b0f197 --- /dev/null +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -@@ -0,0 +1,330 @@ +@@ -0,0 +1,328 @@ +package io.papermc.paper.configuration; + +import com.mojang.logging.LogUtils; @@ -653,8 +653,6 @@ index 0000000000000000000000000000000000000000..0ea9eba1367858dfa5284524a8dd2f79 + public UnsupportedSettings unsupportedSettings; + + public class UnsupportedSettings extends ConfigurationPart { -+ @Comment("This setting controls if the broken behavior of disarmed tripwires not breaking should be allowed. This also allows for dupes") -+ public boolean allowTripwireDisarmingExploits = false; + @Comment("This setting allows for exploits related to end portals, for example sand duping") + public boolean allowUnsafeEndPortalTeleportation = false; + @Comment("This setting controls if players should be able to break bedrock, end portals and other intended to be permanent blocks.") @@ -1334,10 +1332,10 @@ index 0000000000000000000000000000000000000000..c5644d8d64f12073e39bc6ed79c8714f +} diff --git a/src/main/java/io/papermc/paper/configuration/RemovedConfigurations.java b/src/main/java/io/papermc/paper/configuration/RemovedConfigurations.java new file mode 100644 -index 0000000000000000000000000000000000000000..279b24c689b9979884b65df7eb1f059024f0feac +index 0000000000000000000000000000000000000000..f9a4bb664409a6c691c4dc901afe0bde75813636 --- /dev/null +++ b/src/main/java/io/papermc/paper/configuration/RemovedConfigurations.java -@@ -0,0 +1,83 @@ +@@ -0,0 +1,84 @@ +package io.papermc.paper.configuration; + +import org.spongepowered.configurate.NodePath; @@ -1417,7 +1415,8 @@ index 0000000000000000000000000000000000000000..279b24c689b9979884b65df7eb1f0590 + path("limit-player-interactions"), + path("warnWhenSettingExcessiveVelocity"), + path("logging", "use-rgb-for-named-text-colors"), -+ path("unsupported-settings", "allow-grindstone-overstacking") ++ path("unsupported-settings", "allow-grindstone-overstacking"), ++ path("unsupported-settings", "allow-tripwire-disarming-exploits") + }; + +} diff --git a/patches/server/0009-MC-Utils.patch b/patches/server/0009-MC-Utils.patch index e857714e6c..efbef79a1b 100644 --- a/patches/server/0009-MC-Utils.patch +++ b/patches/server/0009-MC-Utils.patch @@ -4698,7 +4698,7 @@ diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.ja index 0ea9eba1367858dfa5284524a8dd2f79daf6fc69..18b64c00fa73e233bf41f519db54a1d43c2a8b1f 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -@@ -217,7 +217,7 @@ public class GlobalConfiguration extends ConfigurationPart { +@@ -215,7 +215,7 @@ public class GlobalConfiguration extends ConfigurationPart { @PostProcess private void postProcess() { diff --git a/patches/server/0733-Configurable-chat-thread-limit.patch b/patches/server/0733-Configurable-chat-thread-limit.patch index a02e95e2bf..43277b9fb4 100644 --- a/patches/server/0733-Configurable-chat-thread-limit.patch +++ b/patches/server/0733-Configurable-chat-thread-limit.patch @@ -22,10 +22,10 @@ is actually processed, this is honestly really just exposed for the misnomers or who just wanna ensure that this won't grow over a specific size if chat gets stupidly active diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index c3fe4481dd35f80815716e48beeeb07b1f51e30b..56798215644d8bca1695856b3a941e8089f49e48 100644 +index 2eb155d3df2e34c050fd28c5a64015e6e1232851..d8db428f06606c16466d39cceb2a5e02eb3d3b24 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -@@ -302,7 +302,18 @@ public class GlobalConfiguration extends ConfigurationPart { +@@ -300,7 +300,18 @@ public class GlobalConfiguration extends ConfigurationPart { @PostProcess private void postProcess() { diff --git a/patches/server/1038-Moonrise-optimisation-patches.patch b/patches/server/1038-Moonrise-optimisation-patches.patch index 7fe3f312d4..da2851b944 100644 --- a/patches/server/1038-Moonrise-optimisation-patches.patch +++ b/patches/server/1038-Moonrise-optimisation-patches.patch @@ -23220,10 +23220,10 @@ index 0000000000000000000000000000000000000000..85950a1aa732ab8c01ad28bec9e0de14 + } +} diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index 5e9c471ab20b0391e7e41351c65d96745fc8ce4a..9221ce36355eaf8d4456209c57b68486d587c255 100644 +index 2d2ff826354670fef356e241d939080c9ed3fd4a..17e23ca4dd2bbfba49ea00aa2b719a95feb931be 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -@@ -219,6 +219,23 @@ public class GlobalConfiguration extends ConfigurationPart { +@@ -217,6 +217,23 @@ public class GlobalConfiguration extends ConfigurationPart { @PostProcess private void postProcess() { ca.spottedleaf.moonrise.common.util.MoonriseCommon.adjustWorkerThreads(this.workerThreads, this.ioThreads);