From 621edbd0bcee19191006ec32dd979f6f5af5dc38 Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Tue, 23 May 2023 17:21:41 +0200 Subject: [PATCH 01/23] new smithing recipe requires template --- .../item/recipe/smithing/SmithingRecipe.java | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/spongepowered/api/item/recipe/smithing/SmithingRecipe.java b/src/main/java/org/spongepowered/api/item/recipe/smithing/SmithingRecipe.java index c725b6d651..91a6b5f03a 100644 --- a/src/main/java/org/spongepowered/api/item/recipe/smithing/SmithingRecipe.java +++ b/src/main/java/org/spongepowered/api/item/recipe/smithing/SmithingRecipe.java @@ -58,34 +58,67 @@ static SmithingRecipe.Builder builder() { */ interface Builder extends ResourceKeyedBuilder { + // TODO Trim recipe? + /** - * Sets the base ingredient and returns this builder. + * Sets the template ingredient and returns this builder. * * @param ingredient The ingredient * * @return This builder, for chaining */ - AdditionStep base(ItemType ingredient); + BaseStep template(ItemType ingredient); /** - * Sets the base ingredient and returns this builder. + * Sets the template ingredient and returns this builder. * * @param ingredient The ingredient * * @return This builder, for chaining */ - default AdditionStep base(Supplier ingredient) { - return this.base(ingredient.get()); + default BaseStep template(Supplier ingredient) { + return this.template(ingredient.get()); } /** - * Sets the base ingredient and returns this builder. + * Sets the template ingredient and returns this builder. * * @param ingredient The ingredient * * @return This builder, for chaining */ - AdditionStep base(Ingredient ingredient); + BaseStep template(Ingredient ingredient); + + interface BaseStep extends SmithingRecipe.Builder { + /** + * Sets the base ingredient and returns this builder. + * + * @param ingredient The ingredient + * + * @return This builder, for chaining + */ + AdditionStep base(ItemType ingredient); + + /** + * Sets the base ingredient and returns this builder. + * + * @param ingredient The ingredient + * + * @return This builder, for chaining + */ + default AdditionStep base(Supplier ingredient) { + return this.base(ingredient.get()); + } + + /** + * Sets the base ingredient and returns this builder. + * + * @param ingredient The ingredient + * + * @return This builder, for chaining + */ + AdditionStep base(Ingredient ingredient); + } interface AdditionStep extends SmithingRecipe.Builder { /** From d532bf67a851046f2057bdb0dd53d339d64dda0c Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Tue, 23 May 2023 20:02:14 +0200 Subject: [PATCH 02/23] signs now have a backside API/Impl is WIP --- .../spongepowered/api/block/entity/Sign.java | 33 +++++++++++++++++++ .../java/org/spongepowered/api/data/Keys.java | 12 +++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/spongepowered/api/block/entity/Sign.java b/src/main/java/org/spongepowered/api/block/entity/Sign.java index 044d46671a..b1bc697795 100644 --- a/src/main/java/org/spongepowered/api/block/entity/Sign.java +++ b/src/main/java/org/spongepowered/api/block/entity/Sign.java @@ -25,6 +25,7 @@ package org.spongepowered.api.block.entity; import net.kyori.adventure.text.Component; +import org.spongepowered.api.data.DataHolder; import org.spongepowered.api.data.Keys; import org.spongepowered.api.data.value.ListValue; import org.spongepowered.api.data.value.Value; @@ -52,4 +53,36 @@ default Value.Mutable glowingText() { return this.requireValue(Keys.GLOWING_TEXT).asMutable(); } + default Value.Mutable waxed() { + return this.requireValue(Keys.SIGN_WAXED).asMutable(); + } + + default SignText backText() { + return this.require(Keys.SIGN_BACK_TEXT); + } + + default SignText frontText() { + return this.require(Keys.SIGN_FRONT_TEXT); + } + + interface SignText extends DataHolder.Mutable { + /** + * Gets the {@link org.spongepowered.api.data.value.ListValue.Mutable} of {@link Component} for the {@link Sign} + * to show. + * + * @return The list of text lines + */ + default ListValue.Mutable lines() { + return this.requireValue(Keys.SIGN_LINES).asMutable(); + } + + /** + * {@return Whether this sign has glowing text}. + */ + default Value.Mutable glowingText() { + return this.requireValue(Keys.GLOWING_TEXT).asMutable(); + } + + // TODO color? + } } diff --git a/src/main/java/org/spongepowered/api/data/Keys.java b/src/main/java/org/spongepowered/api/data/Keys.java index 485ee56fe2..be6972f6a0 100644 --- a/src/main/java/org/spongepowered/api/data/Keys.java +++ b/src/main/java/org/spongepowered/api/data/Keys.java @@ -1143,8 +1143,8 @@ public final class Keys { public static final Key> GRASS_COLOR_MODIFIER = Keys.key(ResourceKey.sponge("grass_color_modifier"), GrassColorModifier.class); /** - * Whether a {@link Sign} has glowing text (from dying - * with {@link ItemTypes#GLOW_INK_SAC}). + * Whether a {@link org.spongepowered.api.block.entity.Sign.SignText} has glowing text (from dying + * with {@link ItemTypes#GLOW_INK_SAC}). When using it on {@link Sign} this refers to the {@link #SIGN_FRONT_TEXT} only. */ public static final Key> GLOWING_TEXT = Keys.key(ResourceKey.sponge("glowing_text"), Boolean.class); @@ -2749,10 +2749,16 @@ public final class Keys { public static final Key> SHOW_BOTTOM = Keys.key(ResourceKey.sponge("show_bottom"), Boolean.class); /** - * The lines displayed on a {@link Sign}. + * The lines of a {@link org.spongepowered.api.block.entity.Sign.SignText}. + * When using it on {@link Sign} this refers to the {@link #SIGN_FRONT_TEXT} only. */ public static final Key> SIGN_LINES = Keys.listKey(ResourceKey.sponge("sign_lines"), Component.class); + public static final Key> SIGN_BACK_TEXT = Keys.key(ResourceKey.sponge("sign_back_text"), Sign.SignText.class); + public static final Key> SIGN_FRONT_TEXT = Keys.key(ResourceKey.sponge("sign_front_text"), Sign.SignText.class); + + public static final Key> SIGN_WAXED = Keys.key(ResourceKey.sponge("sign_waxed"), Boolean.class); + /** * The size of a {@link Slime}. * or From 6bba15dfed49af015f18c02d8af4c004271c921b Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Wed, 7 Jun 2023 16:25:11 +0200 Subject: [PATCH 03/23] API11 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 658613a18f..1c2216cd61 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group=org.spongepowered -version=10.0.0-SNAPSHOT +version=11.0.0-SNAPSHOT organization=SpongePowered projectUrl=https://www.spongepowered.org projectDescription=A plugin API for Minecraft: Java Edition From 89ea76171680601fa34aebbf01791af033be9d40 Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Fri, 9 Jun 2023 16:17:02 +0200 Subject: [PATCH 04/23] generate API Data --- .../criteria/trigger/Triggers.java | 2 + .../spongepowered/api/block/BlockTypes.java | 142 +----------- .../api/block/entity/BlockEntityTypes.java | 6 +- .../api/data/BlockStateKeys.java | 2 + .../api/effect/particle/ParticleTypes.java | 10 +- .../api/effect/sound/SoundTypes.java | 46 +++- .../cause/entity/damage/DamageTypes.java | 4 + .../org/spongepowered/api/item/ItemTypes.java | 216 +++++------------- .../api/state/BooleanStateProperties.java | 4 + .../org/spongepowered/api/tag/BiomeTags.java | 2 + .../spongepowered/api/tag/BlockTypeTags.java | 34 ++- .../spongepowered/api/tag/ItemTypeTags.java | 28 +++ .../spongepowered/api/world/biome/Biomes.java | 2 + .../api/world/chunk/ChunkStates.java | 13 +- .../generation/structure/StructureSets.java | 2 + .../generation/structure/Structures.java | 2 + .../structure/jigsaw/JigsawPools.java | 14 ++ .../structure/jigsaw/ProcessorLists.java | 6 + .../structure/jigsaw/ProcessorTypes.java | 2 + 19 files changed, 227 insertions(+), 310 deletions(-) diff --git a/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Triggers.java b/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Triggers.java index cdea5a65bb..3301377423 100644 --- a/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Triggers.java +++ b/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Triggers.java @@ -114,6 +114,8 @@ public final class Triggers { public static final DefaultedRegistryReference> RAID_WIN = Triggers.key(ResourceKey.minecraft("hero_of_the_village")); + public static final DefaultedRegistryReference> RECIPE_CRAFTED = Triggers.key(ResourceKey.minecraft("recipe_crafted")); + public static final DefaultedRegistryReference> RECIPE_UNLOCKED = Triggers.key(ResourceKey.minecraft("recipe_unlocked")); public static final DefaultedRegistryReference> RIDE_ENTITY_IN_LAVA = Triggers.key(ResourceKey.minecraft("ride_entity_in_lava")); diff --git a/src/main/java/org/spongepowered/api/block/BlockTypes.java b/src/main/java/org/spongepowered/api/block/BlockTypes.java index 1280e8426a..b1e0ff6a22 100644 --- a/src/main/java/org/spongepowered/api/block/BlockTypes.java +++ b/src/main/java/org/spongepowered/api/block/BlockTypes.java @@ -24,7 +24,6 @@ */ package org.spongepowered.api.block; -import org.jetbrains.annotations.ApiStatus; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.registry.DefaultedRegistryReference; @@ -33,7 +32,6 @@ import org.spongepowered.api.registry.RegistryScope; import org.spongepowered.api.registry.RegistryScopes; import org.spongepowered.api.registry.RegistryTypes; -import org.spongepowered.api.util.annotation.Experimental; /** * @@ -51,8 +49,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference ACACIA_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("acacia_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference ACACIA_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("acacia_hanging_sign")); public static final DefaultedRegistryReference ACACIA_LEAVES = BlockTypes.key(ResourceKey.minecraft("acacia_leaves")); @@ -73,8 +69,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference ACACIA_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("acacia_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference ACACIA_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("acacia_wall_hanging_sign")); public static final DefaultedRegistryReference ACACIA_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("acacia_wall_sign")); @@ -115,74 +109,40 @@ public final class BlockTypes { public static final DefaultedRegistryReference BAMBOO = BlockTypes.key(ResourceKey.minecraft("bamboo")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_BLOCK = BlockTypes.key(ResourceKey.minecraft("bamboo_block")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_BUTTON = BlockTypes.key(ResourceKey.minecraft("bamboo_button")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_DOOR = BlockTypes.key(ResourceKey.minecraft("bamboo_door")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_FENCE = BlockTypes.key(ResourceKey.minecraft("bamboo_fence")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("bamboo_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("bamboo_hanging_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_MOSAIC = BlockTypes.key(ResourceKey.minecraft("bamboo_mosaic")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_MOSAIC_SLAB = BlockTypes.key(ResourceKey.minecraft("bamboo_mosaic_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_MOSAIC_STAIRS = BlockTypes.key(ResourceKey.minecraft("bamboo_mosaic_stairs")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_PLANKS = BlockTypes.key(ResourceKey.minecraft("bamboo_planks")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_PRESSURE_PLATE = BlockTypes.key(ResourceKey.minecraft("bamboo_pressure_plate")); public static final DefaultedRegistryReference BAMBOO_SAPLING = BlockTypes.key(ResourceKey.minecraft("bamboo_sapling")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_SIGN = BlockTypes.key(ResourceKey.minecraft("bamboo_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_SLAB = BlockTypes.key(ResourceKey.minecraft("bamboo_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_STAIRS = BlockTypes.key(ResourceKey.minecraft("bamboo_stairs")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("bamboo_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("bamboo_wall_hanging_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("bamboo_wall_sign")); public static final DefaultedRegistryReference BARREL = BlockTypes.key(ResourceKey.minecraft("barrel")); @@ -215,8 +175,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference BIRCH_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("birch_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BIRCH_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("birch_hanging_sign")); public static final DefaultedRegistryReference BIRCH_LEAVES = BlockTypes.key(ResourceKey.minecraft("birch_leaves")); @@ -237,8 +195,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference BIRCH_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("birch_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BIRCH_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("birch_wall_hanging_sign")); public static final DefaultedRegistryReference BIRCH_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("birch_wall_sign")); @@ -387,6 +343,8 @@ public final class BlockTypes { public static final DefaultedRegistryReference CALCITE = BlockTypes.key(ResourceKey.minecraft("calcite")); + public static final DefaultedRegistryReference CALIBRATED_SCULK_SENSOR = BlockTypes.key(ResourceKey.minecraft("calibrated_sculk_sensor")); + public static final DefaultedRegistryReference CAMPFIRE = BlockTypes.key(ResourceKey.minecraft("campfire")); public static final DefaultedRegistryReference CANDLE = BlockTypes.key(ResourceKey.minecraft("candle")); @@ -411,80 +369,44 @@ public final class BlockTypes { public static final DefaultedRegistryReference CHAIN_COMMAND_BLOCK = BlockTypes.key(ResourceKey.minecraft("chain_command_block")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_BUTTON = BlockTypes.key(ResourceKey.minecraft("cherry_button")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_DOOR = BlockTypes.key(ResourceKey.minecraft("cherry_door")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_FENCE = BlockTypes.key(ResourceKey.minecraft("cherry_fence")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("cherry_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("cherry_hanging_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_LEAVES = BlockTypes.key(ResourceKey.minecraft("cherry_leaves")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_LOG = BlockTypes.key(ResourceKey.minecraft("cherry_log")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_PLANKS = BlockTypes.key(ResourceKey.minecraft("cherry_planks")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_PRESSURE_PLATE = BlockTypes.key(ResourceKey.minecraft("cherry_pressure_plate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_SAPLING = BlockTypes.key(ResourceKey.minecraft("cherry_sapling")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_SIGN = BlockTypes.key(ResourceKey.minecraft("cherry_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_SLAB = BlockTypes.key(ResourceKey.minecraft("cherry_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_STAIRS = BlockTypes.key(ResourceKey.minecraft("cherry_stairs")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("cherry_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("cherry_wall_hanging_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("cherry_wall_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_WOOD = BlockTypes.key(ResourceKey.minecraft("cherry_wood")); public static final DefaultedRegistryReference CHEST = BlockTypes.key(ResourceKey.minecraft("chest")); public static final DefaultedRegistryReference CHIPPED_ANVIL = BlockTypes.key(ResourceKey.minecraft("chipped_anvil")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHISELED_BOOKSHELF = BlockTypes.key(ResourceKey.minecraft("chiseled_bookshelf")); public static final DefaultedRegistryReference CHISELED_DEEPSLATE = BlockTypes.key(ResourceKey.minecraft("chiseled_deepslate")); @@ -573,8 +495,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference CRIMSON_FUNGUS = BlockTypes.key(ResourceKey.minecraft("crimson_fungus")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CRIMSON_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("crimson_hanging_sign")); public static final DefaultedRegistryReference CRIMSON_HYPHAE = BlockTypes.key(ResourceKey.minecraft("crimson_hyphae")); @@ -597,8 +517,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference CRIMSON_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("crimson_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CRIMSON_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("crimson_wall_hanging_sign")); public static final DefaultedRegistryReference CRIMSON_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("crimson_wall_sign")); @@ -659,8 +577,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference DARK_OAK_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("dark_oak_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference DARK_OAK_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("dark_oak_hanging_sign")); public static final DefaultedRegistryReference DARK_OAK_LEAVES = BlockTypes.key(ResourceKey.minecraft("dark_oak_leaves")); @@ -681,8 +597,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference DARK_OAK_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("dark_oak_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference DARK_OAK_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("dark_oak_wall_hanging_sign")); public static final DefaultedRegistryReference DARK_OAK_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("dark_oak_wall_sign")); @@ -739,8 +653,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference DEAD_TUBE_CORAL_WALL_FAN = BlockTypes.key(ResourceKey.minecraft("dead_tube_coral_wall_fan")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference DECORATED_POT = BlockTypes.key(ResourceKey.minecraft("decorated_pot")); public static final DefaultedRegistryReference DEEPSLATE = BlockTypes.key(ResourceKey.minecraft("deepslate")); @@ -1017,8 +929,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference JUNGLE_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("jungle_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference JUNGLE_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("jungle_hanging_sign")); public static final DefaultedRegistryReference JUNGLE_LEAVES = BlockTypes.key(ResourceKey.minecraft("jungle_leaves")); @@ -1039,8 +949,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference JUNGLE_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("jungle_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference JUNGLE_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("jungle_wall_hanging_sign")); public static final DefaultedRegistryReference JUNGLE_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("jungle_wall_sign")); @@ -1209,8 +1117,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference MANGROVE_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("mangrove_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference MANGROVE_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("mangrove_hanging_sign")); public static final DefaultedRegistryReference MANGROVE_LEAVES = BlockTypes.key(ResourceKey.minecraft("mangrove_leaves")); @@ -1233,8 +1139,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference MANGROVE_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("mangrove_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference MANGROVE_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("mangrove_wall_hanging_sign")); public static final DefaultedRegistryReference MANGROVE_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("mangrove_wall_sign")); @@ -1321,8 +1225,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference OAK_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("oak_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference OAK_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("oak_hanging_sign")); public static final DefaultedRegistryReference OAK_LEAVES = BlockTypes.key(ResourceKey.minecraft("oak_leaves")); @@ -1343,8 +1245,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference OAK_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("oak_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference OAK_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("oak_wall_hanging_sign")); public static final DefaultedRegistryReference OAK_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("oak_wall_sign")); @@ -1407,12 +1307,8 @@ public final class BlockTypes { public static final DefaultedRegistryReference PETRIFIED_OAK_SLAB = BlockTypes.key(ResourceKey.minecraft("petrified_oak_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference PIGLIN_HEAD = BlockTypes.key(ResourceKey.minecraft("piglin_head")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference PIGLIN_WALL_HEAD = BlockTypes.key(ResourceKey.minecraft("piglin_wall_head")); public static final DefaultedRegistryReference PINK_BANNER = BlockTypes.key(ResourceKey.minecraft("pink_banner")); @@ -1431,8 +1327,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference PINK_GLAZED_TERRACOTTA = BlockTypes.key(ResourceKey.minecraft("pink_glazed_terracotta")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference PINK_PETALS = BlockTypes.key(ResourceKey.minecraft("pink_petals")); public static final DefaultedRegistryReference PINK_SHULKER_BOX = BlockTypes.key(ResourceKey.minecraft("pink_shulker_box")); @@ -1453,6 +1347,10 @@ public final class BlockTypes { public static final DefaultedRegistryReference PISTON_HEAD = BlockTypes.key(ResourceKey.minecraft("piston_head")); + public static final DefaultedRegistryReference PITCHER_CROP = BlockTypes.key(ResourceKey.minecraft("pitcher_crop")); + + public static final DefaultedRegistryReference PITCHER_PLANT = BlockTypes.key(ResourceKey.minecraft("pitcher_plant")); + public static final DefaultedRegistryReference PLAYER_HEAD = BlockTypes.key(ResourceKey.minecraft("player_head")); public static final DefaultedRegistryReference PLAYER_WALL_HEAD = BlockTypes.key(ResourceKey.minecraft("player_wall_head")); @@ -1531,8 +1429,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference POTTED_CACTUS = BlockTypes.key(ResourceKey.minecraft("potted_cactus")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference POTTED_CHERRY_SAPLING = BlockTypes.key(ResourceKey.minecraft("potted_cherry_sapling")); public static final DefaultedRegistryReference POTTED_CORNFLOWER = BlockTypes.key(ResourceKey.minecraft("potted_cornflower")); @@ -1573,8 +1469,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference POTTED_SPRUCE_SAPLING = BlockTypes.key(ResourceKey.minecraft("potted_spruce_sapling")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference POTTED_TORCHFLOWER = BlockTypes.key(ResourceKey.minecraft("potted_torchflower")); public static final DefaultedRegistryReference POTTED_WARPED_FUNGUS = BlockTypes.key(ResourceKey.minecraft("potted_warped_fungus")); @@ -1809,6 +1703,8 @@ public final class BlockTypes { public static final DefaultedRegistryReference SMOOTH_STONE_SLAB = BlockTypes.key(ResourceKey.minecraft("smooth_stone_slab")); + public static final DefaultedRegistryReference SNIFFER_EGG = BlockTypes.key(ResourceKey.minecraft("sniffer_egg")); + public static final DefaultedRegistryReference SNOW = BlockTypes.key(ResourceKey.minecraft("snow")); public static final DefaultedRegistryReference SNOW_BLOCK = BlockTypes.key(ResourceKey.minecraft("snow_block")); @@ -1841,8 +1737,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference SPRUCE_FENCE_GATE = BlockTypes.key(ResourceKey.minecraft("spruce_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference SPRUCE_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("spruce_hanging_sign")); public static final DefaultedRegistryReference SPRUCE_LEAVES = BlockTypes.key(ResourceKey.minecraft("spruce_leaves")); @@ -1863,8 +1757,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference SPRUCE_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("spruce_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference SPRUCE_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("spruce_wall_hanging_sign")); public static final DefaultedRegistryReference SPRUCE_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("spruce_wall_sign")); @@ -1897,20 +1789,14 @@ public final class BlockTypes { public static final DefaultedRegistryReference STRIPPED_ACACIA_WOOD = BlockTypes.key(ResourceKey.minecraft("stripped_acacia_wood")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference STRIPPED_BAMBOO_BLOCK = BlockTypes.key(ResourceKey.minecraft("stripped_bamboo_block")); public static final DefaultedRegistryReference STRIPPED_BIRCH_LOG = BlockTypes.key(ResourceKey.minecraft("stripped_birch_log")); public static final DefaultedRegistryReference STRIPPED_BIRCH_WOOD = BlockTypes.key(ResourceKey.minecraft("stripped_birch_wood")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference STRIPPED_CHERRY_LOG = BlockTypes.key(ResourceKey.minecraft("stripped_cherry_log")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference STRIPPED_CHERRY_WOOD = BlockTypes.key(ResourceKey.minecraft("stripped_cherry_wood")); public static final DefaultedRegistryReference STRIPPED_CRIMSON_HYPHAE = BlockTypes.key(ResourceKey.minecraft("stripped_crimson_hyphae")); @@ -1949,8 +1835,8 @@ public final class BlockTypes { public static final DefaultedRegistryReference SUNFLOWER = BlockTypes.key(ResourceKey.minecraft("sunflower")); - @Experimental("update_1_20") - @ApiStatus.Experimental + public static final DefaultedRegistryReference SUSPICIOUS_GRAVEL = BlockTypes.key(ResourceKey.minecraft("suspicious_gravel")); + public static final DefaultedRegistryReference SUSPICIOUS_SAND = BlockTypes.key(ResourceKey.minecraft("suspicious_sand")); public static final DefaultedRegistryReference SWEET_BERRY_BUSH = BlockTypes.key(ResourceKey.minecraft("sweet_berry_bush")); @@ -1969,12 +1855,8 @@ public final class BlockTypes { public static final DefaultedRegistryReference TORCH = BlockTypes.key(ResourceKey.minecraft("torch")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference TORCHFLOWER = BlockTypes.key(ResourceKey.minecraft("torchflower")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference TORCHFLOWER_CROP = BlockTypes.key(ResourceKey.minecraft("torchflower_crop")); public static final DefaultedRegistryReference TRAPPED_CHEST = BlockTypes.key(ResourceKey.minecraft("trapped_chest")); @@ -2017,8 +1899,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference WARPED_FUNGUS = BlockTypes.key(ResourceKey.minecraft("warped_fungus")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference WARPED_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("warped_hanging_sign")); public static final DefaultedRegistryReference WARPED_HYPHAE = BlockTypes.key(ResourceKey.minecraft("warped_hyphae")); @@ -2041,8 +1921,6 @@ public final class BlockTypes { public static final DefaultedRegistryReference WARPED_TRAPDOOR = BlockTypes.key(ResourceKey.minecraft("warped_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference WARPED_WALL_HANGING_SIGN = BlockTypes.key(ResourceKey.minecraft("warped_wall_hanging_sign")); public static final DefaultedRegistryReference WARPED_WALL_SIGN = BlockTypes.key(ResourceKey.minecraft("warped_wall_sign")); diff --git a/src/main/java/org/spongepowered/api/block/entity/BlockEntityTypes.java b/src/main/java/org/spongepowered/api/block/entity/BlockEntityTypes.java index 95bdeeb3b8..2bfefc93dc 100644 --- a/src/main/java/org/spongepowered/api/block/entity/BlockEntityTypes.java +++ b/src/main/java/org/spongepowered/api/block/entity/BlockEntityTypes.java @@ -57,6 +57,10 @@ public final class BlockEntityTypes { public static final DefaultedRegistryReference BREWING_STAND = BlockEntityTypes.key(ResourceKey.minecraft("brewing_stand")); + public static final DefaultedRegistryReference BRUSHABLE_BLOCK = BlockEntityTypes.key(ResourceKey.minecraft("brushable_block")); + + public static final DefaultedRegistryReference CALIBRATED_SCULK_SENSOR = BlockEntityTypes.key(ResourceKey.minecraft("calibrated_sculk_sensor")); + public static final DefaultedRegistryReference CAMPFIRE = BlockEntityTypes.key(ResourceKey.minecraft("campfire")); public static final DefaultedRegistryReference CHEST = BlockEntityTypes.key(ResourceKey.minecraft("chest")); @@ -117,8 +121,6 @@ public final class BlockEntityTypes { public static final DefaultedRegistryReference STRUCTURE_BLOCK = BlockEntityTypes.key(ResourceKey.minecraft("structure_block")); - public static final DefaultedRegistryReference SUSPICIOUS_SAND = BlockEntityTypes.key(ResourceKey.minecraft("suspicious_sand")); - public static final DefaultedRegistryReference TRAPPED_CHEST = BlockEntityTypes.key(ResourceKey.minecraft("trapped_chest")); // @formatter:on diff --git a/src/main/java/org/spongepowered/api/data/BlockStateKeys.java b/src/main/java/org/spongepowered/api/data/BlockStateKeys.java index 227af97372..7255316d38 100644 --- a/src/main/java/org/spongepowered/api/data/BlockStateKeys.java +++ b/src/main/java/org/spongepowered/api/data/BlockStateKeys.java @@ -110,6 +110,8 @@ public final class BlockStateKeys { public static final Key> CONDITIONAL = BlockStateKeys.key(ResourceKey.minecraft("property/conditional"), Boolean.class); + public static final Key> CRACKED = BlockStateKeys.key(ResourceKey.minecraft("property/cracked"), Boolean.class); + public static final Key> DELAY = BlockStateKeys.key(ResourceKey.minecraft("property/delay"), Integer.class); public static final Key> DISARMED = BlockStateKeys.key(ResourceKey.minecraft("property/disarmed"), Boolean.class); diff --git a/src/main/java/org/spongepowered/api/effect/particle/ParticleTypes.java b/src/main/java/org/spongepowered/api/effect/particle/ParticleTypes.java index 8c19f1d314..3ba58942e0 100644 --- a/src/main/java/org/spongepowered/api/effect/particle/ParticleTypes.java +++ b/src/main/java/org/spongepowered/api/effect/particle/ParticleTypes.java @@ -61,6 +61,8 @@ public final class ParticleTypes { public static final DefaultedRegistryReference CAMPFIRE_SIGNAL_SMOKE = ParticleTypes.key(ResourceKey.minecraft("campfire_signal_smoke")); + public static final DefaultedRegistryReference CHERRY_LEAVES = ParticleTypes.key(ResourceKey.minecraft("cherry_leaves")); + public static final DefaultedRegistryReference CLOUD = ParticleTypes.key(ResourceKey.minecraft("cloud")); public static final DefaultedRegistryReference COMPOSTER = ParticleTypes.key(ResourceKey.minecraft("composter")); @@ -77,8 +79,6 @@ public final class ParticleTypes { public static final DefaultedRegistryReference DRAGON_BREATH = ParticleTypes.key(ResourceKey.minecraft("dragon_breath")); - public static final DefaultedRegistryReference DRIPPING_CHERRY_LEAVES = ParticleTypes.key(ResourceKey.minecraft("dripping_cherry_leaves")); - public static final DefaultedRegistryReference DRIPPING_DRIPSTONE_LAVA = ParticleTypes.key(ResourceKey.minecraft("dripping_dripstone_lava")); public static final DefaultedRegistryReference DRIPPING_DRIPSTONE_WATER = ParticleTypes.key(ResourceKey.minecraft("dripping_dripstone_water")); @@ -97,6 +97,8 @@ public final class ParticleTypes { public static final DefaultedRegistryReference EFFECT = ParticleTypes.key(ResourceKey.minecraft("effect")); + public static final DefaultedRegistryReference EGG_CRACK = ParticleTypes.key(ResourceKey.minecraft("egg_crack")); + public static final DefaultedRegistryReference ELDER_GUARDIAN = ParticleTypes.key(ResourceKey.minecraft("elder_guardian")); public static final DefaultedRegistryReference ELECTRIC_SPARK = ParticleTypes.key(ResourceKey.minecraft("electric_spark")); @@ -113,8 +115,6 @@ public final class ParticleTypes { public static final DefaultedRegistryReference EXPLOSION_EMITTER = ParticleTypes.key(ResourceKey.minecraft("explosion_emitter")); - public static final DefaultedRegistryReference FALLING_CHERRY_LEAVES = ParticleTypes.key(ResourceKey.minecraft("falling_cherry_leaves")); - public static final DefaultedRegistryReference FALLING_DRIPSTONE_LAVA = ParticleTypes.key(ResourceKey.minecraft("falling_dripstone_lava")); public static final DefaultedRegistryReference FALLING_DRIPSTONE_WATER = ParticleTypes.key(ResourceKey.minecraft("falling_dripstone_water")); @@ -157,8 +157,6 @@ public final class ParticleTypes { public static final DefaultedRegistryReference ITEM_SNOWBALL = ParticleTypes.key(ResourceKey.minecraft("item_snowball")); - public static final DefaultedRegistryReference LANDING_CHERRY_LEAVES = ParticleTypes.key(ResourceKey.minecraft("landing_cherry_leaves")); - public static final DefaultedRegistryReference LANDING_HONEY = ParticleTypes.key(ResourceKey.minecraft("landing_honey")); public static final DefaultedRegistryReference LANDING_LAVA = ParticleTypes.key(ResourceKey.minecraft("landing_lava")); diff --git a/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java b/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java index 9c736a7018..40a1ec60fe 100644 --- a/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java +++ b/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java @@ -95,6 +95,8 @@ public final class SoundTypes { public static final DefaultedRegistryReference BLOCK_AMETHYST_BLOCK_PLACE = SoundTypes.key(ResourceKey.minecraft("block.amethyst_block.place")); + public static final DefaultedRegistryReference BLOCK_AMETHYST_BLOCK_RESONATE = SoundTypes.key(ResourceKey.minecraft("block.amethyst_block.resonate")); + public static final DefaultedRegistryReference BLOCK_AMETHYST_BLOCK_STEP = SoundTypes.key(ResourceKey.minecraft("block.amethyst_block.step")); public static final DefaultedRegistryReference BLOCK_AMETHYST_CLUSTER_BREAK = SoundTypes.key(ResourceKey.minecraft("block.amethyst_cluster.break")); @@ -1145,6 +1147,8 @@ public final class SoundTypes { public static final DefaultedRegistryReference BLOCK_SHULKER_BOX_OPEN = SoundTypes.key(ResourceKey.minecraft("block.shulker_box.open")); + public static final DefaultedRegistryReference BLOCK_SIGN_WAXED_INTERACT_FAIL = SoundTypes.key(ResourceKey.minecraft("block.sign.waxed_interact_fail")); + public static final DefaultedRegistryReference BLOCK_SLIME_BLOCK_BREAK = SoundTypes.key(ResourceKey.minecraft("block.slime_block.break")); public static final DefaultedRegistryReference BLOCK_SLIME_BLOCK_FALL = SoundTypes.key(ResourceKey.minecraft("block.slime_block.fall")); @@ -1173,6 +1177,12 @@ public final class SoundTypes { public static final DefaultedRegistryReference BLOCK_SMOKER_SMOKE = SoundTypes.key(ResourceKey.minecraft("block.smoker.smoke")); + public static final DefaultedRegistryReference BLOCK_SNIFFER_EGG_CRACK = SoundTypes.key(ResourceKey.minecraft("block.sniffer_egg.crack")); + + public static final DefaultedRegistryReference BLOCK_SNIFFER_EGG_HATCH = SoundTypes.key(ResourceKey.minecraft("block.sniffer_egg.hatch")); + + public static final DefaultedRegistryReference BLOCK_SNIFFER_EGG_PLOP = SoundTypes.key(ResourceKey.minecraft("block.sniffer_egg.plop")); + public static final DefaultedRegistryReference BLOCK_SNOW_BREAK = SoundTypes.key(ResourceKey.minecraft("block.snow.break")); public static final DefaultedRegistryReference BLOCK_SNOW_FALL = SoundTypes.key(ResourceKey.minecraft("block.snow.fall")); @@ -1241,6 +1251,16 @@ public final class SoundTypes { public static final DefaultedRegistryReference BLOCK_STONE_PRESSURE_PLATE_CLICK_ON = SoundTypes.key(ResourceKey.minecraft("block.stone_pressure_plate.click_on")); + public static final DefaultedRegistryReference BLOCK_SUSPICIOUS_GRAVEL_BREAK = SoundTypes.key(ResourceKey.minecraft("block.suspicious_gravel.break")); + + public static final DefaultedRegistryReference BLOCK_SUSPICIOUS_GRAVEL_FALL = SoundTypes.key(ResourceKey.minecraft("block.suspicious_gravel.fall")); + + public static final DefaultedRegistryReference BLOCK_SUSPICIOUS_GRAVEL_HIT = SoundTypes.key(ResourceKey.minecraft("block.suspicious_gravel.hit")); + + public static final DefaultedRegistryReference BLOCK_SUSPICIOUS_GRAVEL_PLACE = SoundTypes.key(ResourceKey.minecraft("block.suspicious_gravel.place")); + + public static final DefaultedRegistryReference BLOCK_SUSPICIOUS_GRAVEL_STEP = SoundTypes.key(ResourceKey.minecraft("block.suspicious_gravel.step")); + public static final DefaultedRegistryReference BLOCK_SUSPICIOUS_SAND_BREAK = SoundTypes.key(ResourceKey.minecraft("block.suspicious_sand.break")); public static final DefaultedRegistryReference BLOCK_SUSPICIOUS_SAND_FALL = SoundTypes.key(ResourceKey.minecraft("block.suspicious_sand.fall")); @@ -2723,9 +2743,15 @@ public final class SoundTypes { public static final DefaultedRegistryReference ITEM_BOTTLE_FILL_DRAGONBREATH = SoundTypes.key(ResourceKey.minecraft("item.bottle.fill_dragonbreath")); - public static final DefaultedRegistryReference ITEM_BRUSH_BRUSH_SAND_COMPLETED = SoundTypes.key(ResourceKey.minecraft("item.brush.brush_sand_completed")); + public static final DefaultedRegistryReference ITEM_BRUSH_BRUSHING_GENERIC = SoundTypes.key(ResourceKey.minecraft("item.brush.brushing.generic")); - public static final DefaultedRegistryReference ITEM_BRUSH_BRUSHING = SoundTypes.key(ResourceKey.minecraft("item.brush.brushing")); + public static final DefaultedRegistryReference ITEM_BRUSH_BRUSHING_GRAVEL = SoundTypes.key(ResourceKey.minecraft("item.brush.brushing.gravel")); + + public static final DefaultedRegistryReference ITEM_BRUSH_BRUSHING_GRAVEL_COMPLETE = SoundTypes.key(ResourceKey.minecraft("item.brush.brushing.gravel.complete")); + + public static final DefaultedRegistryReference ITEM_BRUSH_BRUSHING_SAND = SoundTypes.key(ResourceKey.minecraft("item.brush.brushing.sand")); + + public static final DefaultedRegistryReference ITEM_BRUSH_BRUSHING_SAND_COMPLETE = SoundTypes.key(ResourceKey.minecraft("item.brush.brushing.sand.complete")); public static final DefaultedRegistryReference ITEM_BUCKET_EMPTY = SoundTypes.key(ResourceKey.minecraft("item.bucket.empty")); @@ -2867,19 +2893,29 @@ public final class SoundTypes { public static final DefaultedRegistryReference MUSIC_NETHER_WARPED_FOREST = SoundTypes.key(ResourceKey.minecraft("music.nether.warped_forest")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_BADLANDS = SoundTypes.key(ResourceKey.minecraft("music.overworld.badlands")); + + public static final DefaultedRegistryReference MUSIC_OVERWORLD_BAMBOO_JUNGLE = SoundTypes.key(ResourceKey.minecraft("music.overworld.bamboo_jungle")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_CHERRY_GROVE = SoundTypes.key(ResourceKey.minecraft("music.overworld.cherry_grove")); public static final DefaultedRegistryReference MUSIC_OVERWORLD_DEEP_DARK = SoundTypes.key(ResourceKey.minecraft("music.overworld.deep_dark")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_DESERT = SoundTypes.key(ResourceKey.minecraft("music.overworld.desert")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_DRIPSTONE_CAVES = SoundTypes.key(ResourceKey.minecraft("music.overworld.dripstone_caves")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_FLOWER_FOREST = SoundTypes.key(ResourceKey.minecraft("music.overworld.flower_forest")); + + public static final DefaultedRegistryReference MUSIC_OVERWORLD_FOREST = SoundTypes.key(ResourceKey.minecraft("music.overworld.forest")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_FROZEN_PEAKS = SoundTypes.key(ResourceKey.minecraft("music.overworld.frozen_peaks")); public static final DefaultedRegistryReference MUSIC_OVERWORLD_GROVE = SoundTypes.key(ResourceKey.minecraft("music.overworld.grove")); public static final DefaultedRegistryReference MUSIC_OVERWORLD_JAGGED_PEAKS = SoundTypes.key(ResourceKey.minecraft("music.overworld.jagged_peaks")); - public static final DefaultedRegistryReference MUSIC_OVERWORLD_JUNGLE_AND_FOREST = SoundTypes.key(ResourceKey.minecraft("music.overworld.jungle_and_forest")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_JUNGLE = SoundTypes.key(ResourceKey.minecraft("music.overworld.jungle")); public static final DefaultedRegistryReference MUSIC_OVERWORLD_LUSH_CAVES = SoundTypes.key(ResourceKey.minecraft("music.overworld.lush_caves")); @@ -2889,6 +2925,8 @@ public final class SoundTypes { public static final DefaultedRegistryReference MUSIC_OVERWORLD_SNOWY_SLOPES = SoundTypes.key(ResourceKey.minecraft("music.overworld.snowy_slopes")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_SPARSE_JUNGLE = SoundTypes.key(ResourceKey.minecraft("music.overworld.sparse_jungle")); + public static final DefaultedRegistryReference MUSIC_OVERWORLD_STONY_PEAKS = SoundTypes.key(ResourceKey.minecraft("music.overworld.stony_peaks")); public static final DefaultedRegistryReference MUSIC_OVERWORLD_SWAMP = SoundTypes.key(ResourceKey.minecraft("music.overworld.swamp")); @@ -2917,6 +2955,8 @@ public final class SoundTypes { public static final DefaultedRegistryReference MUSIC_DISC_PIGSTEP = SoundTypes.key(ResourceKey.minecraft("music_disc.pigstep")); + public static final DefaultedRegistryReference MUSIC_DISC_RELIC = SoundTypes.key(ResourceKey.minecraft("music_disc.relic")); + public static final DefaultedRegistryReference MUSIC_DISC_STAL = SoundTypes.key(ResourceKey.minecraft("music_disc.stal")); public static final DefaultedRegistryReference MUSIC_DISC_STRAD = SoundTypes.key(ResourceKey.minecraft("music_disc.strad")); diff --git a/src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageTypes.java b/src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageTypes.java index 5822dba606..f53dbdcff7 100644 --- a/src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageTypes.java +++ b/src/main/java/org/spongepowered/api/event/cause/entity/damage/DamageTypes.java @@ -75,6 +75,8 @@ public final class DamageTypes { public static final DefaultedRegistryReference GENERIC = DamageTypes.key(ResourceKey.minecraft("generic")); + public static final DefaultedRegistryReference GENERIC_KILL = DamageTypes.key(ResourceKey.minecraft("generic_kill")); + public static final DefaultedRegistryReference HOT_FLOOR = DamageTypes.key(ResourceKey.minecraft("hot_floor")); public static final DefaultedRegistryReference IN_FIRE = DamageTypes.key(ResourceKey.minecraft("in_fire")); @@ -99,6 +101,8 @@ public final class DamageTypes { public static final DefaultedRegistryReference OUT_OF_WORLD = DamageTypes.key(ResourceKey.minecraft("out_of_world")); + public static final DefaultedRegistryReference OUTSIDE_BORDER = DamageTypes.key(ResourceKey.minecraft("outside_border")); + public static final DefaultedRegistryReference PLAYER_ATTACK = DamageTypes.key(ResourceKey.minecraft("player_attack")); public static final DefaultedRegistryReference PLAYER_EXPLOSION = DamageTypes.key(ResourceKey.minecraft("player_explosion")); diff --git a/src/main/java/org/spongepowered/api/item/ItemTypes.java b/src/main/java/org/spongepowered/api/item/ItemTypes.java index 5646aa9d7c..8c1df49790 100644 --- a/src/main/java/org/spongepowered/api/item/ItemTypes.java +++ b/src/main/java/org/spongepowered/api/item/ItemTypes.java @@ -24,7 +24,6 @@ */ package org.spongepowered.api.item; -import org.jetbrains.annotations.ApiStatus; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.registry.DefaultedRegistryReference; @@ -33,7 +32,6 @@ import org.spongepowered.api.registry.RegistryScope; import org.spongepowered.api.registry.RegistryScopes; import org.spongepowered.api.registry.RegistryTypes; -import org.spongepowered.api.util.annotation.Experimental; /** * @@ -55,8 +53,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference ACACIA_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("acacia_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference ACACIA_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("acacia_hanging_sign")); public static final DefaultedRegistryReference ACACIA_LEAVES = ItemTypes.key(ResourceKey.minecraft("acacia_leaves")); @@ -103,12 +99,18 @@ public final class ItemTypes { public static final DefaultedRegistryReference ANDESITE_WALL = ItemTypes.key(ResourceKey.minecraft("andesite_wall")); + public static final DefaultedRegistryReference ANGLER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("angler_pottery_sherd")); + public static final DefaultedRegistryReference ANVIL = ItemTypes.key(ResourceKey.minecraft("anvil")); public static final DefaultedRegistryReference APPLE = ItemTypes.key(ResourceKey.minecraft("apple")); + public static final DefaultedRegistryReference ARCHER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("archer_pottery_sherd")); + public static final DefaultedRegistryReference ARMOR_STAND = ItemTypes.key(ResourceKey.minecraft("armor_stand")); + public static final DefaultedRegistryReference ARMS_UP_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("arms_up_pottery_sherd")); + public static final DefaultedRegistryReference ARROW = ItemTypes.key(ResourceKey.minecraft("arrow")); public static final DefaultedRegistryReference AXOLOTL_BUCKET = ItemTypes.key(ResourceKey.minecraft("axolotl_bucket")); @@ -125,72 +127,38 @@ public final class ItemTypes { public static final DefaultedRegistryReference BAMBOO = ItemTypes.key(ResourceKey.minecraft("bamboo")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_BLOCK = ItemTypes.key(ResourceKey.minecraft("bamboo_block")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_BUTTON = ItemTypes.key(ResourceKey.minecraft("bamboo_button")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_CHEST_RAFT = ItemTypes.key(ResourceKey.minecraft("bamboo_chest_raft")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_DOOR = ItemTypes.key(ResourceKey.minecraft("bamboo_door")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_FENCE = ItemTypes.key(ResourceKey.minecraft("bamboo_fence")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("bamboo_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("bamboo_hanging_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_MOSAIC = ItemTypes.key(ResourceKey.minecraft("bamboo_mosaic")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_MOSAIC_SLAB = ItemTypes.key(ResourceKey.minecraft("bamboo_mosaic_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_MOSAIC_STAIRS = ItemTypes.key(ResourceKey.minecraft("bamboo_mosaic_stairs")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_PLANKS = ItemTypes.key(ResourceKey.minecraft("bamboo_planks")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_PRESSURE_PLATE = ItemTypes.key(ResourceKey.minecraft("bamboo_pressure_plate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_RAFT = ItemTypes.key(ResourceKey.minecraft("bamboo_raft")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_SIGN = ItemTypes.key(ResourceKey.minecraft("bamboo_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_SLAB = ItemTypes.key(ResourceKey.minecraft("bamboo_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_STAIRS = ItemTypes.key(ResourceKey.minecraft("bamboo_stairs")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BAMBOO_TRAPDOOR = ItemTypes.key(ResourceKey.minecraft("bamboo_trapdoor")); public static final DefaultedRegistryReference BARREL = ItemTypes.key(ResourceKey.minecraft("barrel")); @@ -235,8 +203,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference BIRCH_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("birch_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BIRCH_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("birch_hanging_sign")); public static final DefaultedRegistryReference BIRCH_LEAVES = ItemTypes.key(ResourceKey.minecraft("birch_leaves")); @@ -293,6 +259,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference BLACKSTONE_WALL = ItemTypes.key(ResourceKey.minecraft("blackstone_wall")); + public static final DefaultedRegistryReference BLADE_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("blade_pottery_sherd")); + public static final DefaultedRegistryReference BLAST_FURNACE = ItemTypes.key(ResourceKey.minecraft("blast_furnace")); public static final DefaultedRegistryReference BLAZE_POWDER = ItemTypes.key(ResourceKey.minecraft("blaze_powder")); @@ -353,6 +321,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference BREAD = ItemTypes.key(ResourceKey.minecraft("bread")); + public static final DefaultedRegistryReference BREWER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("brewer_pottery_sherd")); + public static final DefaultedRegistryReference BREWING_STAND = ItemTypes.key(ResourceKey.minecraft("brewing_stand")); public static final DefaultedRegistryReference BRICK = ItemTypes.key(ResourceKey.minecraft("brick")); @@ -395,8 +365,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference BROWN_WOOL = ItemTypes.key(ResourceKey.minecraft("brown_wool")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference BRUSH = ItemTypes.key(ResourceKey.minecraft("brush")); public static final DefaultedRegistryReference BUBBLE_CORAL = ItemTypes.key(ResourceKey.minecraft("bubble_coral")); @@ -411,14 +379,16 @@ public final class ItemTypes { public static final DefaultedRegistryReference BUNDLE = ItemTypes.key(ResourceKey.minecraft("bundle")); + public static final DefaultedRegistryReference BURN_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("burn_pottery_sherd")); + public static final DefaultedRegistryReference CACTUS = ItemTypes.key(ResourceKey.minecraft("cactus")); public static final DefaultedRegistryReference CAKE = ItemTypes.key(ResourceKey.minecraft("cake")); public static final DefaultedRegistryReference CALCITE = ItemTypes.key(ResourceKey.minecraft("calcite")); - @Experimental("update_1_20") - @ApiStatus.Experimental + public static final DefaultedRegistryReference CALIBRATED_SCULK_SENSOR = ItemTypes.key(ResourceKey.minecraft("calibrated_sculk_sensor")); + public static final DefaultedRegistryReference CAMEL_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("camel_spawn_egg")); public static final DefaultedRegistryReference CAMPFIRE = ItemTypes.key(ResourceKey.minecraft("campfire")); @@ -453,72 +423,38 @@ public final class ItemTypes { public static final DefaultedRegistryReference CHARCOAL = ItemTypes.key(ResourceKey.minecraft("charcoal")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_BOAT = ItemTypes.key(ResourceKey.minecraft("cherry_boat")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_BUTTON = ItemTypes.key(ResourceKey.minecraft("cherry_button")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_CHEST_BOAT = ItemTypes.key(ResourceKey.minecraft("cherry_chest_boat")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_DOOR = ItemTypes.key(ResourceKey.minecraft("cherry_door")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_FENCE = ItemTypes.key(ResourceKey.minecraft("cherry_fence")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("cherry_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("cherry_hanging_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_LEAVES = ItemTypes.key(ResourceKey.minecraft("cherry_leaves")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_LOG = ItemTypes.key(ResourceKey.minecraft("cherry_log")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_PLANKS = ItemTypes.key(ResourceKey.minecraft("cherry_planks")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_PRESSURE_PLATE = ItemTypes.key(ResourceKey.minecraft("cherry_pressure_plate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_SAPLING = ItemTypes.key(ResourceKey.minecraft("cherry_sapling")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_SIGN = ItemTypes.key(ResourceKey.minecraft("cherry_sign")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_SLAB = ItemTypes.key(ResourceKey.minecraft("cherry_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_STAIRS = ItemTypes.key(ResourceKey.minecraft("cherry_stairs")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_TRAPDOOR = ItemTypes.key(ResourceKey.minecraft("cherry_trapdoor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHERRY_WOOD = ItemTypes.key(ResourceKey.minecraft("cherry_wood")); public static final DefaultedRegistryReference CHEST = ItemTypes.key(ResourceKey.minecraft("chest")); @@ -531,8 +467,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference CHIPPED_ANVIL = ItemTypes.key(ResourceKey.minecraft("chipped_anvil")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CHISELED_BOOKSHELF = ItemTypes.key(ResourceKey.minecraft("chiseled_bookshelf")); public static final DefaultedRegistryReference CHISELED_DEEPSLATE = ItemTypes.key(ResourceKey.minecraft("chiseled_deepslate")); @@ -569,8 +503,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference COARSE_DIRT = ItemTypes.key(ResourceKey.minecraft("coarse_dirt")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference COAST_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("coast_armor_trim_smithing_template")); public static final DefaultedRegistryReference COBBLED_DEEPSLATE = ItemTypes.key(ResourceKey.minecraft("cobbled_deepslate")); @@ -665,8 +597,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference CRIMSON_FUNGUS = ItemTypes.key(ResourceKey.minecraft("crimson_fungus")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference CRIMSON_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("crimson_hanging_sign")); public static final DefaultedRegistryReference CRIMSON_HYPHAE = ItemTypes.key(ResourceKey.minecraft("crimson_hyphae")); @@ -737,6 +667,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference DANDELION = ItemTypes.key(ResourceKey.minecraft("dandelion")); + public static final DefaultedRegistryReference DANGER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("danger_pottery_sherd")); + public static final DefaultedRegistryReference DARK_OAK_BOAT = ItemTypes.key(ResourceKey.minecraft("dark_oak_boat")); public static final DefaultedRegistryReference DARK_OAK_BUTTON = ItemTypes.key(ResourceKey.minecraft("dark_oak_button")); @@ -749,8 +681,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference DARK_OAK_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("dark_oak_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference DARK_OAK_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("dark_oak_hanging_sign")); public static final DefaultedRegistryReference DARK_OAK_LEAVES = ItemTypes.key(ResourceKey.minecraft("dark_oak_leaves")); @@ -815,8 +745,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference DEBUG_STICK = ItemTypes.key(ResourceKey.minecraft("debug_stick")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference DECORATED_POT = ItemTypes.key(ResourceKey.minecraft("decorated_pot")); public static final DefaultedRegistryReference DEEPSLATE = ItemTypes.key(ResourceKey.minecraft("deepslate")); @@ -917,8 +845,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference DROWNED_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("drowned_spawn_egg")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference DUNE_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("dune_armor_trim_smithing_template")); public static final DefaultedRegistryReference ECHO_SHARD = ItemTypes.key(ResourceKey.minecraft("echo_shard")); @@ -973,6 +899,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference EXPERIENCE_BOTTLE = ItemTypes.key(ResourceKey.minecraft("experience_bottle")); + public static final DefaultedRegistryReference EXPLORER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("explorer_pottery_sherd")); + public static final DefaultedRegistryReference EXPOSED_COPPER = ItemTypes.key(ResourceKey.minecraft("exposed_copper")); public static final DefaultedRegistryReference EXPOSED_CUT_COPPER = ItemTypes.key(ResourceKey.minecraft("exposed_cut_copper")); @@ -981,8 +909,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference EXPOSED_CUT_COPPER_STAIRS = ItemTypes.key(ResourceKey.minecraft("exposed_cut_copper_stairs")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference EYE_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("eye_armor_trim_smithing_template")); public static final DefaultedRegistryReference FARMLAND = ItemTypes.key(ResourceKey.minecraft("farmland")); @@ -1025,6 +951,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference FOX_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("fox_spawn_egg")); + public static final DefaultedRegistryReference FRIEND_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("friend_pottery_sherd")); + public static final DefaultedRegistryReference FROG_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("frog_spawn_egg")); public static final DefaultedRegistryReference FROGSPAWN = ItemTypes.key(ResourceKey.minecraft("frogspawn")); @@ -1177,6 +1105,10 @@ public final class ItemTypes { public static final DefaultedRegistryReference HEART_OF_THE_SEA = ItemTypes.key(ResourceKey.minecraft("heart_of_the_sea")); + public static final DefaultedRegistryReference HEART_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("heart_pottery_sherd")); + + public static final DefaultedRegistryReference HEARTBREAK_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("heartbreak_pottery_sherd")); + public static final DefaultedRegistryReference HEAVY_WEIGHTED_PRESSURE_PLATE = ItemTypes.key(ResourceKey.minecraft("heavy_weighted_pressure_plate")); public static final DefaultedRegistryReference HOGLIN_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("hoglin_spawn_egg")); @@ -1201,6 +1133,10 @@ public final class ItemTypes { public static final DefaultedRegistryReference HORSE_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("horse_spawn_egg")); + public static final DefaultedRegistryReference HOST_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("host_armor_trim_smithing_template")); + + public static final DefaultedRegistryReference HOWL_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("howl_pottery_sherd")); + public static final DefaultedRegistryReference HUSK_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("husk_spawn_egg")); public static final DefaultedRegistryReference ICE = ItemTypes.key(ResourceKey.minecraft("ice")); @@ -1277,8 +1213,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference JUNGLE_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("jungle_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference JUNGLE_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("jungle_hanging_sign")); public static final DefaultedRegistryReference JUNGLE_LEAVES = ItemTypes.key(ResourceKey.minecraft("jungle_leaves")); @@ -1481,8 +1415,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference MANGROVE_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("mangrove_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference MANGROVE_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("mangrove_hanging_sign")); public static final DefaultedRegistryReference MANGROVE_LEAVES = ItemTypes.key(ResourceKey.minecraft("mangrove_leaves")); @@ -1521,6 +1453,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference MINECART = ItemTypes.key(ResourceKey.minecraft("minecart")); + public static final DefaultedRegistryReference MINER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("miner_pottery_sherd")); + public static final DefaultedRegistryReference MOJANG_BANNER_PATTERN = ItemTypes.key(ResourceKey.minecraft("mojang_banner_pattern")); public static final DefaultedRegistryReference MOOSHROOM_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("mooshroom_spawn_egg")); @@ -1545,6 +1479,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference MOSSY_STONE_BRICKS = ItemTypes.key(ResourceKey.minecraft("mossy_stone_bricks")); + public static final DefaultedRegistryReference MOURNER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("mourner_pottery_sherd")); + public static final DefaultedRegistryReference MUD = ItemTypes.key(ResourceKey.minecraft("mud")); public static final DefaultedRegistryReference MUD_BRICK_SLAB = ItemTypes.key(ResourceKey.minecraft("mud_brick_slab")); @@ -1585,6 +1521,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference MUSIC_DISC_PIGSTEP = ItemTypes.key(ResourceKey.minecraft("music_disc_pigstep")); + public static final DefaultedRegistryReference MUSIC_DISC_RELIC = ItemTypes.key(ResourceKey.minecraft("music_disc_relic")); + public static final DefaultedRegistryReference MUSIC_DISC_STAL = ItemTypes.key(ResourceKey.minecraft("music_disc_stal")); public static final DefaultedRegistryReference MUSIC_DISC_STRAD = ItemTypes.key(ResourceKey.minecraft("music_disc_strad")); @@ -1649,8 +1587,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference NETHERITE_SWORD = ItemTypes.key(ResourceKey.minecraft("netherite_sword")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference NETHERITE_UPGRADE_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("netherite_upgrade_smithing_template")); public static final DefaultedRegistryReference NETHERRACK = ItemTypes.key(ResourceKey.minecraft("netherrack")); @@ -1669,8 +1605,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference OAK_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("oak_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference OAK_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("oak_hanging_sign")); public static final DefaultedRegistryReference OAK_LEAVES = ItemTypes.key(ResourceKey.minecraft("oak_leaves")); @@ -1767,8 +1701,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference PIGLIN_BRUTE_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("piglin_brute_spawn_egg")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference PIGLIN_HEAD = ItemTypes.key(ResourceKey.minecraft("piglin_head")); public static final DefaultedRegistryReference PIGLIN_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("piglin_spawn_egg")); @@ -1791,8 +1723,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference PINK_GLAZED_TERRACOTTA = ItemTypes.key(ResourceKey.minecraft("pink_glazed_terracotta")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference PINK_PETALS = ItemTypes.key(ResourceKey.minecraft("pink_petals")); public static final DefaultedRegistryReference PINK_SHULKER_BOX = ItemTypes.key(ResourceKey.minecraft("pink_shulker_box")); @@ -1809,8 +1739,14 @@ public final class ItemTypes { public static final DefaultedRegistryReference PISTON = ItemTypes.key(ResourceKey.minecraft("piston")); + public static final DefaultedRegistryReference PITCHER_PLANT = ItemTypes.key(ResourceKey.minecraft("pitcher_plant")); + + public static final DefaultedRegistryReference PITCHER_POD = ItemTypes.key(ResourceKey.minecraft("pitcher_pod")); + public static final DefaultedRegistryReference PLAYER_HEAD = ItemTypes.key(ResourceKey.minecraft("player_head")); + public static final DefaultedRegistryReference PLENTY_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("plenty_pottery_sherd")); + public static final DefaultedRegistryReference PODZOL = ItemTypes.key(ResourceKey.minecraft("podzol")); public static final DefaultedRegistryReference POINTED_DRIPSTONE = ItemTypes.key(ResourceKey.minecraft("pointed_dripstone")); @@ -1877,22 +1813,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference POTION = ItemTypes.key(ResourceKey.minecraft("potion")); - @Experimental("update_1_20") - @ApiStatus.Experimental - public static final DefaultedRegistryReference POTTERY_SHARD_ARCHER = ItemTypes.key(ResourceKey.minecraft("pottery_shard_archer")); - - @Experimental("update_1_20") - @ApiStatus.Experimental - public static final DefaultedRegistryReference POTTERY_SHARD_ARMS_UP = ItemTypes.key(ResourceKey.minecraft("pottery_shard_arms_up")); - - @Experimental("update_1_20") - @ApiStatus.Experimental - public static final DefaultedRegistryReference POTTERY_SHARD_PRIZE = ItemTypes.key(ResourceKey.minecraft("pottery_shard_prize")); - - @Experimental("update_1_20") - @ApiStatus.Experimental - public static final DefaultedRegistryReference POTTERY_SHARD_SKULL = ItemTypes.key(ResourceKey.minecraft("pottery_shard_skull")); - public static final DefaultedRegistryReference POWDER_SNOW_BUCKET = ItemTypes.key(ResourceKey.minecraft("powder_snow_bucket")); public static final DefaultedRegistryReference POWERED_RAIL = ItemTypes.key(ResourceKey.minecraft("powered_rail")); @@ -1915,6 +1835,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference PRISMARINE_WALL = ItemTypes.key(ResourceKey.minecraft("prismarine_wall")); + public static final DefaultedRegistryReference PRIZE_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("prize_pottery_sherd")); + public static final DefaultedRegistryReference PUFFERFISH = ItemTypes.key(ResourceKey.minecraft("pufferfish")); public static final DefaultedRegistryReference PUFFERFISH_BUCKET = ItemTypes.key(ResourceKey.minecraft("pufferfish_bucket")); @@ -1985,6 +1907,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference RAIL = ItemTypes.key(ResourceKey.minecraft("rail")); + public static final DefaultedRegistryReference RAISER_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("raiser_armor_trim_smithing_template")); + public static final DefaultedRegistryReference RAVAGER_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("ravager_spawn_egg")); public static final DefaultedRegistryReference RAW_COPPER = ItemTypes.key(ResourceKey.minecraft("raw_copper")); @@ -2069,8 +1993,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference RESPAWN_ANCHOR = ItemTypes.key(ResourceKey.minecraft("respawn_anchor")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference RIB_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("rib_armor_trim_smithing_template")); public static final DefaultedRegistryReference ROOTED_DIRT = ItemTypes.key(ResourceKey.minecraft("rooted_dirt")); @@ -2117,14 +2039,18 @@ public final class ItemTypes { public static final DefaultedRegistryReference SEAGRASS = ItemTypes.key(ResourceKey.minecraft("seagrass")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("sentry_armor_trim_smithing_template")); + public static final DefaultedRegistryReference SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("shaper_armor_trim_smithing_template")); + + public static final DefaultedRegistryReference SHEAF_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("sheaf_pottery_sherd")); + public static final DefaultedRegistryReference SHEARS = ItemTypes.key(ResourceKey.minecraft("shears")); public static final DefaultedRegistryReference SHEEP_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("sheep_spawn_egg")); + public static final DefaultedRegistryReference SHELTER_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("shelter_pottery_sherd")); + public static final DefaultedRegistryReference SHIELD = ItemTypes.key(ResourceKey.minecraft("shield")); public static final DefaultedRegistryReference SHROOMLIGHT = ItemTypes.key(ResourceKey.minecraft("shroomlight")); @@ -2135,6 +2061,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference SHULKER_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("shulker_spawn_egg")); + public static final DefaultedRegistryReference SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("silence_armor_trim_smithing_template")); + public static final DefaultedRegistryReference SILVERFISH_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("silverfish_spawn_egg")); public static final DefaultedRegistryReference SKELETON_HORSE_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("skeleton_horse_spawn_egg")); @@ -2145,6 +2073,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference SKULL_BANNER_PATTERN = ItemTypes.key(ResourceKey.minecraft("skull_banner_pattern")); + public static final DefaultedRegistryReference SKULL_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("skull_pottery_sherd")); + public static final DefaultedRegistryReference SLIME_BALL = ItemTypes.key(ResourceKey.minecraft("slime_ball")); public static final DefaultedRegistryReference SLIME_BLOCK = ItemTypes.key(ResourceKey.minecraft("slime_block")); @@ -2183,12 +2113,12 @@ public final class ItemTypes { public static final DefaultedRegistryReference SMOOTH_STONE_SLAB = ItemTypes.key(ResourceKey.minecraft("smooth_stone_slab")); - @Experimental("update_1_20") - @ApiStatus.Experimental + public static final DefaultedRegistryReference SNIFFER_EGG = ItemTypes.key(ResourceKey.minecraft("sniffer_egg")); + public static final DefaultedRegistryReference SNIFFER_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("sniffer_spawn_egg")); - @Experimental("update_1_20") - @ApiStatus.Experimental + public static final DefaultedRegistryReference SNORT_POTTERY_SHERD = ItemTypes.key(ResourceKey.minecraft("snort_pottery_sherd")); + public static final DefaultedRegistryReference SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("snout_armor_trim_smithing_template")); public static final DefaultedRegistryReference SNOW = ItemTypes.key(ResourceKey.minecraft("snow")); @@ -2217,8 +2147,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference SPIDER_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("spider_spawn_egg")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("spire_armor_trim_smithing_template")); public static final DefaultedRegistryReference SPLASH_POTION = ItemTypes.key(ResourceKey.minecraft("splash_potion")); @@ -2239,8 +2167,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference SPRUCE_FENCE_GATE = ItemTypes.key(ResourceKey.minecraft("spruce_fence_gate")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference SPRUCE_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("spruce_hanging_sign")); public static final DefaultedRegistryReference SPRUCE_LEAVES = ItemTypes.key(ResourceKey.minecraft("spruce_leaves")); @@ -2311,20 +2237,14 @@ public final class ItemTypes { public static final DefaultedRegistryReference STRIPPED_ACACIA_WOOD = ItemTypes.key(ResourceKey.minecraft("stripped_acacia_wood")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference STRIPPED_BAMBOO_BLOCK = ItemTypes.key(ResourceKey.minecraft("stripped_bamboo_block")); public static final DefaultedRegistryReference STRIPPED_BIRCH_LOG = ItemTypes.key(ResourceKey.minecraft("stripped_birch_log")); public static final DefaultedRegistryReference STRIPPED_BIRCH_WOOD = ItemTypes.key(ResourceKey.minecraft("stripped_birch_wood")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference STRIPPED_CHERRY_LOG = ItemTypes.key(ResourceKey.minecraft("stripped_cherry_log")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference STRIPPED_CHERRY_WOOD = ItemTypes.key(ResourceKey.minecraft("stripped_cherry_wood")); public static final DefaultedRegistryReference STRIPPED_CRIMSON_HYPHAE = ItemTypes.key(ResourceKey.minecraft("stripped_crimson_hyphae")); @@ -2365,8 +2285,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference SUNFLOWER = ItemTypes.key(ResourceKey.minecraft("sunflower")); - @Experimental("update_1_20") - @ApiStatus.Experimental + public static final DefaultedRegistryReference SUSPICIOUS_GRAVEL = ItemTypes.key(ResourceKey.minecraft("suspicious_gravel")); + public static final DefaultedRegistryReference SUSPICIOUS_SAND = ItemTypes.key(ResourceKey.minecraft("suspicious_sand")); public static final DefaultedRegistryReference SUSPICIOUS_STEW = ItemTypes.key(ResourceKey.minecraft("suspicious_stew")); @@ -2383,8 +2303,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference TERRACOTTA = ItemTypes.key(ResourceKey.minecraft("terracotta")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference TIDE_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("tide_armor_trim_smithing_template")); public static final DefaultedRegistryReference TINTED_GLASS = ItemTypes.key(ResourceKey.minecraft("tinted_glass")); @@ -2397,12 +2315,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference TORCH = ItemTypes.key(ResourceKey.minecraft("torch")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference TORCHFLOWER = ItemTypes.key(ResourceKey.minecraft("torchflower")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference TORCHFLOWER_SEEDS = ItemTypes.key(ResourceKey.minecraft("torchflower_seeds")); public static final DefaultedRegistryReference TOTEM_OF_UNDYING = ItemTypes.key(ResourceKey.minecraft("totem_of_undying")); @@ -2439,8 +2353,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference VERDANT_FROGLIGHT = ItemTypes.key(ResourceKey.minecraft("verdant_froglight")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference VEX_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("vex_armor_trim_smithing_template")); public static final DefaultedRegistryReference VEX_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("vex_spawn_egg")); @@ -2453,8 +2365,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference WANDERING_TRADER_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("wandering_trader_spawn_egg")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference WARD_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("ward_armor_trim_smithing_template")); public static final DefaultedRegistryReference WARDEN_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("warden_spawn_egg")); @@ -2471,8 +2381,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference WARPED_FUNGUS_ON_A_STICK = ItemTypes.key(ResourceKey.minecraft("warped_fungus_on_a_stick")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference WARPED_HANGING_SIGN = ItemTypes.key(ResourceKey.minecraft("warped_hanging_sign")); public static final DefaultedRegistryReference WARPED_HYPHAE = ItemTypes.key(ResourceKey.minecraft("warped_hyphae")); @@ -2531,6 +2439,8 @@ public final class ItemTypes { public static final DefaultedRegistryReference WAXED_WEATHERED_CUT_COPPER_STAIRS = ItemTypes.key(ResourceKey.minecraft("waxed_weathered_cut_copper_stairs")); + public static final DefaultedRegistryReference WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("wayfinder_armor_trim_smithing_template")); + public static final DefaultedRegistryReference WEATHERED_COPPER = ItemTypes.key(ResourceKey.minecraft("weathered_copper")); public static final DefaultedRegistryReference WEATHERED_CUT_COPPER = ItemTypes.key(ResourceKey.minecraft("weathered_cut_copper")); @@ -2575,8 +2485,6 @@ public final class ItemTypes { public static final DefaultedRegistryReference WHITE_WOOL = ItemTypes.key(ResourceKey.minecraft("white_wool")); - @Experimental("update_1_20") - @ApiStatus.Experimental public static final DefaultedRegistryReference WILD_ARMOR_TRIM_SMITHING_TEMPLATE = ItemTypes.key(ResourceKey.minecraft("wild_armor_trim_smithing_template")); public static final DefaultedRegistryReference WITCH_SPAWN_EGG = ItemTypes.key(ResourceKey.minecraft("witch_spawn_egg")); diff --git a/src/main/java/org/spongepowered/api/state/BooleanStateProperties.java b/src/main/java/org/spongepowered/api/state/BooleanStateProperties.java index fe48229e4c..5c48414afd 100644 --- a/src/main/java/org/spongepowered/api/state/BooleanStateProperties.java +++ b/src/main/java/org/spongepowered/api/state/BooleanStateProperties.java @@ -81,6 +81,10 @@ public static BooleanStateProperty property_CONDITIONAL() { return BooleanStateProperty.of("CONDITIONAL"); } + public static BooleanStateProperty property_CRACKED() { + return BooleanStateProperty.of("CRACKED"); + } + public static BooleanStateProperty property_DISARMED() { return BooleanStateProperty.of("DISARMED"); } diff --git a/src/main/java/org/spongepowered/api/tag/BiomeTags.java b/src/main/java/org/spongepowered/api/tag/BiomeTags.java index a130af9075..d4e278786a 100644 --- a/src/main/java/org/spongepowered/api/tag/BiomeTags.java +++ b/src/main/java/org/spongepowered/api/tag/BiomeTags.java @@ -96,6 +96,8 @@ public final class BiomeTags { public static final Tag HAS_STRUCTURE_SWAMP_HUT = BiomeTags.key(ResourceKey.minecraft("has_structure/swamp_hut")); + public static final Tag HAS_STRUCTURE_TRAIL_RUINS = BiomeTags.key(ResourceKey.minecraft("has_structure/trail_ruins")); + public static final Tag HAS_STRUCTURE_VILLAGE_DESERT = BiomeTags.key(ResourceKey.minecraft("has_structure/village_desert")); public static final Tag HAS_STRUCTURE_VILLAGE_PLAINS = BiomeTags.key(ResourceKey.minecraft("has_structure/village_plains")); diff --git a/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java b/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java index 8efa7bc9be..dd003c66fd 100644 --- a/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java +++ b/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java @@ -40,6 +40,8 @@ public final class BlockTypeTags { // @formatter:off public static final Tag ACACIA_LOGS = BlockTypeTags.key(ResourceKey.minecraft("acacia_logs")); + public static final Tag ALL_HANGING_SIGNS = BlockTypeTags.key(ResourceKey.minecraft("all_hanging_signs")); + public static final Tag ALL_SIGNS = BlockTypeTags.key(ResourceKey.minecraft("all_signs")); public static final Tag ANCIENT_CITY_REPLACEABLE = BlockTypeTags.key(ResourceKey.minecraft("ancient_city_replaceable")); @@ -54,6 +56,8 @@ public final class BlockTypeTags { public static final Tag AZALEA_ROOT_REPLACEABLE = BlockTypeTags.key(ResourceKey.minecraft("azalea_root_replaceable")); + public static final Tag BAMBOO_BLOCKS = BlockTypeTags.key(ResourceKey.minecraft("bamboo_blocks")); + public static final Tag BAMBOO_PLANTABLE_ON = BlockTypeTags.key(ResourceKey.minecraft("bamboo_plantable_on")); public static final Tag BANNERS = BlockTypeTags.key(ResourceKey.minecraft("banners")); @@ -86,10 +90,16 @@ public final class BlockTypeTags { public static final Tag CAVE_VINES = BlockTypeTags.key(ResourceKey.minecraft("cave_vines")); + public static final Tag CEILING_HANGING_SIGNS = BlockTypeTags.key(ResourceKey.minecraft("ceiling_hanging_signs")); + + public static final Tag CHERRY_LOGS = BlockTypeTags.key(ResourceKey.minecraft("cherry_logs")); + public static final Tag CLIMBABLE = BlockTypeTags.key(ResourceKey.minecraft("climbable")); public static final Tag COAL_ORES = BlockTypeTags.key(ResourceKey.minecraft("coal_ores")); + public static final Tag COMBINATION_STEP_SOUND_BLOCKS = BlockTypeTags.key(ResourceKey.minecraft("combination_step_sound_blocks")); + public static final Tag COMPLETES_FIND_TREE_TUTORIAL = BlockTypeTags.key(ResourceKey.minecraft("completes_find_tree_tutorial")); public static final Tag CONVERTABLE_TO_MUD = BlockTypeTags.key(ResourceKey.minecraft("convertable_to_mud")); @@ -130,6 +140,10 @@ public final class BlockTypeTags { public static final Tag EMERALD_ORES = BlockTypeTags.key(ResourceKey.minecraft("emerald_ores")); + public static final Tag ENCHANTMENT_POWER_PROVIDER = BlockTypeTags.key(ResourceKey.minecraft("enchantment_power_provider")); + + public static final Tag ENCHANTMENT_POWER_TRANSMITTER = BlockTypeTags.key(ResourceKey.minecraft("enchantment_power_transmitter")); + public static final Tag ENDERMAN_HOLDABLE = BlockTypeTags.key(ResourceKey.minecraft("enderman_holdable")); public static final Tag FALL_DAMAGE_RESETTING = BlockTypeTags.key(ResourceKey.minecraft("fall_damage_resetting")); @@ -192,6 +206,8 @@ public final class BlockTypeTags { public static final Tag LUSH_GROUND_REPLACEABLE = BlockTypeTags.key(ResourceKey.minecraft("lush_ground_replaceable")); + public static final Tag MAINTAINS_FARMLAND = BlockTypeTags.key(ResourceKey.minecraft("maintains_farmland")); + public static final Tag MANGROVE_LOGS = BlockTypeTags.key(ResourceKey.minecraft("mangrove_logs")); public static final Tag MANGROVE_LOGS_CAN_GROW_THROUGH = BlockTypeTags.key(ResourceKey.minecraft("mangrove_logs_can_grow_through")); @@ -250,7 +266,9 @@ public final class BlockTypeTags { public static final Tag REDSTONE_ORES = BlockTypeTags.key(ResourceKey.minecraft("redstone_ores")); - public static final Tag REPLACEABLE_PLANTS = BlockTypeTags.key(ResourceKey.minecraft("replaceable_plants")); + public static final Tag REPLACEABLE = BlockTypeTags.key(ResourceKey.minecraft("replaceable")); + + public static final Tag REPLACEABLE_BY_TREES = BlockTypeTags.key(ResourceKey.minecraft("replaceable_by_trees")); public static final Tag SAND = BlockTypeTags.key(ResourceKey.minecraft("sand")); @@ -274,6 +292,10 @@ public final class BlockTypeTags { public static final Tag SNAPS_GOAT_HORN = BlockTypeTags.key(ResourceKey.minecraft("snaps_goat_horn")); + public static final Tag SNIFFER_DIGGABLE_BLOCK = BlockTypeTags.key(ResourceKey.minecraft("sniffer_diggable_block")); + + public static final Tag SNIFFER_EGG_HATCH_BOOST = BlockTypeTags.key(ResourceKey.minecraft("sniffer_egg_hatch_boost")); + public static final Tag SNOW = BlockTypeTags.key(ResourceKey.minecraft("snow")); public static final Tag SNOW_LAYER_CAN_SURVIVE_ON = BlockTypeTags.key(ResourceKey.minecraft("snow_layer_can_survive_on")); @@ -292,16 +314,22 @@ public final class BlockTypeTags { public static final Tag STONE_BRICKS = BlockTypeTags.key(ResourceKey.minecraft("stone_bricks")); + public static final Tag STONE_BUTTONS = BlockTypeTags.key(ResourceKey.minecraft("stone_buttons")); + public static final Tag STONE_ORE_REPLACEABLES = BlockTypeTags.key(ResourceKey.minecraft("stone_ore_replaceables")); public static final Tag STONE_PRESSURE_PLATES = BlockTypeTags.key(ResourceKey.minecraft("stone_pressure_plates")); public static final Tag STRIDER_WARM_BLOCKS = BlockTypeTags.key(ResourceKey.minecraft("strider_warm_blocks")); + public static final Tag SWORD_EFFICIENT = BlockTypeTags.key(ResourceKey.minecraft("sword_efficient")); + public static final Tag TALL_FLOWERS = BlockTypeTags.key(ResourceKey.minecraft("tall_flowers")); public static final Tag TERRACOTTA = BlockTypeTags.key(ResourceKey.minecraft("terracotta")); + public static final Tag TRAIL_RUINS_REPLACEABLE = BlockTypeTags.key(ResourceKey.minecraft("trail_ruins_replaceable")); + public static final Tag TRAPDOORS = BlockTypeTags.key(ResourceKey.minecraft("trapdoors")); public static final Tag UNDERWATER_BONEMEALS = BlockTypeTags.key(ResourceKey.minecraft("underwater_bonemeals")); @@ -310,8 +338,12 @@ public final class BlockTypeTags { public static final Tag VALID_SPAWN = BlockTypeTags.key(ResourceKey.minecraft("valid_spawn")); + public static final Tag VIBRATION_RESONATORS = BlockTypeTags.key(ResourceKey.minecraft("vibration_resonators")); + public static final Tag WALL_CORALS = BlockTypeTags.key(ResourceKey.minecraft("wall_corals")); + public static final Tag WALL_HANGING_SIGNS = BlockTypeTags.key(ResourceKey.minecraft("wall_hanging_signs")); + public static final Tag WALL_POST_OVERRIDE = BlockTypeTags.key(ResourceKey.minecraft("wall_post_override")); public static final Tag WALL_SIGNS = BlockTypeTags.key(ResourceKey.minecraft("wall_signs")); diff --git a/src/main/java/org/spongepowered/api/tag/ItemTypeTags.java b/src/main/java/org/spongepowered/api/tag/ItemTypeTags.java index 2aad66b95c..13c3bfc0fa 100644 --- a/src/main/java/org/spongepowered/api/tag/ItemTypeTags.java +++ b/src/main/java/org/spongepowered/api/tag/ItemTypeTags.java @@ -48,6 +48,8 @@ public final class ItemTypeTags { public static final Tag AXOLOTL_TEMPT_ITEMS = ItemTypeTags.key(ResourceKey.minecraft("axolotl_tempt_items")); + public static final Tag BAMBOO_BLOCKS = ItemTypeTags.key(ResourceKey.minecraft("bamboo_blocks")); + public static final Tag BANNERS = ItemTypeTags.key(ResourceKey.minecraft("banners")); public static final Tag BEACON_PAYMENT_ITEMS = ItemTypeTags.key(ResourceKey.minecraft("beacon_payment_items")); @@ -58,10 +60,16 @@ public final class ItemTypeTags { public static final Tag BOATS = ItemTypeTags.key(ResourceKey.minecraft("boats")); + public static final Tag BOOKSHELF_BOOKS = ItemTypeTags.key(ResourceKey.minecraft("bookshelf_books")); + + public static final Tag BREAKS_DECORATED_POTS = ItemTypeTags.key(ResourceKey.minecraft("breaks_decorated_pots")); + public static final Tag BUTTONS = ItemTypeTags.key(ResourceKey.minecraft("buttons")); public static final Tag CANDLES = ItemTypeTags.key(ResourceKey.minecraft("candles")); + public static final Tag CHERRY_LOGS = ItemTypeTags.key(ResourceKey.minecraft("cherry_logs")); + public static final Tag CHEST_BOATS = ItemTypeTags.key(ResourceKey.minecraft("chest_boats")); public static final Tag CLUSTER_MAX_HARVESTABLES = ItemTypeTags.key(ResourceKey.minecraft("cluster_max_harvestables")); @@ -86,6 +94,10 @@ public final class ItemTypeTags { public static final Tag DARK_OAK_LOGS = ItemTypeTags.key(ResourceKey.minecraft("dark_oak_logs")); + public static final Tag DECORATED_POT_INGREDIENTS = ItemTypeTags.key(ResourceKey.minecraft("decorated_pot_ingredients")); + + public static final Tag DECORATED_POT_SHERDS = ItemTypeTags.key(ResourceKey.minecraft("decorated_pot_sherds")); + public static final Tag DIAMOND_ORES = ItemTypeTags.key(ResourceKey.minecraft("diamond_ores")); public static final Tag DIRT = ItemTypeTags.key(ResourceKey.minecraft("dirt")); @@ -108,6 +120,8 @@ public final class ItemTypeTags { public static final Tag GOLD_ORES = ItemTypeTags.key(ResourceKey.minecraft("gold_ores")); + public static final Tag HANGING_SIGNS = ItemTypeTags.key(ResourceKey.minecraft("hanging_signs")); + public static final Tag HOES = ItemTypeTags.key(ResourceKey.minecraft("hoes")); public static final Tag IGNORED_BY_PIGLIN_BABIES = ItemTypeTags.key(ResourceKey.minecraft("ignored_by_piglin_babies")); @@ -132,6 +146,8 @@ public final class ItemTypeTags { public static final Tag NON_FLAMMABLE_WOOD = ItemTypeTags.key(ResourceKey.minecraft("non_flammable_wood")); + public static final Tag NOTEBLOCK_TOP_INSTRUMENTS = ItemTypeTags.key(ResourceKey.minecraft("noteblock_top_instruments")); + public static final Tag OAK_LOGS = ItemTypeTags.key(ResourceKey.minecraft("oak_logs")); public static final Tag PICKAXES = ItemTypeTags.key(ResourceKey.minecraft("pickaxes")); @@ -162,6 +178,8 @@ public final class ItemTypeTags { public static final Tag SMELTS_TO_GLASS = ItemTypeTags.key(ResourceKey.minecraft("smelts_to_glass")); + public static final Tag SNIFFER_FOOD = ItemTypeTags.key(ResourceKey.minecraft("sniffer_food")); + public static final Tag SOUL_FIRE_BASE_BLOCKS = ItemTypeTags.key(ResourceKey.minecraft("soul_fire_base_blocks")); public static final Tag SPRUCE_LOGS = ItemTypeTags.key(ResourceKey.minecraft("spruce_logs")); @@ -170,6 +188,8 @@ public final class ItemTypeTags { public static final Tag STONE_BRICKS = ItemTypeTags.key(ResourceKey.minecraft("stone_bricks")); + public static final Tag STONE_BUTTONS = ItemTypeTags.key(ResourceKey.minecraft("stone_buttons")); + public static final Tag STONE_CRAFTING_MATERIALS = ItemTypeTags.key(ResourceKey.minecraft("stone_crafting_materials")); public static final Tag STONE_TOOL_MATERIALS = ItemTypeTags.key(ResourceKey.minecraft("stone_tool_materials")); @@ -184,6 +204,14 @@ public final class ItemTypeTags { public static final Tag TRAPDOORS = ItemTypeTags.key(ResourceKey.minecraft("trapdoors")); + public static final Tag TRIM_MATERIALS = ItemTypeTags.key(ResourceKey.minecraft("trim_materials")); + + public static final Tag TRIM_TEMPLATES = ItemTypeTags.key(ResourceKey.minecraft("trim_templates")); + + public static final Tag TRIMMABLE_ARMOR = ItemTypeTags.key(ResourceKey.minecraft("trimmable_armor")); + + public static final Tag VILLAGER_PLANTABLE_SEEDS = ItemTypeTags.key(ResourceKey.minecraft("villager_plantable_seeds")); + public static final Tag WALLS = ItemTypeTags.key(ResourceKey.minecraft("walls")); public static final Tag WARPED_STEMS = ItemTypeTags.key(ResourceKey.minecraft("warped_stems")); diff --git a/src/main/java/org/spongepowered/api/world/biome/Biomes.java b/src/main/java/org/spongepowered/api/world/biome/Biomes.java index ff1d4bdd67..0390b94f7e 100644 --- a/src/main/java/org/spongepowered/api/world/biome/Biomes.java +++ b/src/main/java/org/spongepowered/api/world/biome/Biomes.java @@ -51,6 +51,8 @@ public final class Biomes { public static final RegistryReference BIRCH_FOREST = Biomes.key(ResourceKey.minecraft("birch_forest")); + public static final RegistryReference CHERRY_GROVE = Biomes.key(ResourceKey.minecraft("cherry_grove")); + public static final RegistryReference COLD_OCEAN = Biomes.key(ResourceKey.minecraft("cold_ocean")); public static final RegistryReference CRIMSON_FOREST = Biomes.key(ResourceKey.minecraft("crimson_forest")); diff --git a/src/main/java/org/spongepowered/api/world/chunk/ChunkStates.java b/src/main/java/org/spongepowered/api/world/chunk/ChunkStates.java index ff89e5f255..b8c0811419 100644 --- a/src/main/java/org/spongepowered/api/world/chunk/ChunkStates.java +++ b/src/main/java/org/spongepowered/api/world/chunk/ChunkStates.java @@ -79,12 +79,7 @@ public final class ChunkStates { */ public static final DefaultedRegistryReference FULL = ChunkStates.key(ResourceKey.minecraft("full")); - /** - * A {@link Chunk} state that is "cleaning" up remnant objects of a - * chunk in process of world generation. Generally, height maps are being - * calculated at this point as entity spawning can affect block placement. - */ - public static final DefaultedRegistryReference HEIGHTMAPS = ChunkStates.key(ResourceKey.minecraft("heightmaps")); + public static final DefaultedRegistryReference INITIALIZE_LIGHT = ChunkStates.key(ResourceKey.minecraft("initialize_light")); /** * A {@link Chunk} state that has yet been processed with lighting in @@ -94,12 +89,6 @@ public final class ChunkStates { */ public static final DefaultedRegistryReference LIGHT = ChunkStates.key(ResourceKey.minecraft("light")); - /** - * A {@link Chunk} state that is being "carved" with liquid cave - * features, such as underwater ravines, underwater caves, etc. - */ - public static final DefaultedRegistryReference LIQUID_CARVERS = ChunkStates.key(ResourceKey.minecraft("liquid_carvers")); - /** * A {@link Chunk} where the {@link BlockState block states} are being * set and structure locations are set. diff --git a/src/main/java/org/spongepowered/api/world/generation/structure/StructureSets.java b/src/main/java/org/spongepowered/api/world/generation/structure/StructureSets.java index 03cf1db577..0cae98e775 100644 --- a/src/main/java/org/spongepowered/api/world/generation/structure/StructureSets.java +++ b/src/main/java/org/spongepowered/api/world/generation/structure/StructureSets.java @@ -73,6 +73,8 @@ public final class StructureSets { public static final DefaultedRegistryReference SWAMP_HUTS = StructureSets.key(ResourceKey.minecraft("swamp_huts")); + public static final DefaultedRegistryReference TRAIL_RUINS = StructureSets.key(ResourceKey.minecraft("trail_ruins")); + public static final DefaultedRegistryReference VILLAGES = StructureSets.key(ResourceKey.minecraft("villages")); public static final DefaultedRegistryReference WOODLAND_MANSIONS = StructureSets.key(ResourceKey.minecraft("woodland_mansions")); diff --git a/src/main/java/org/spongepowered/api/world/generation/structure/Structures.java b/src/main/java/org/spongepowered/api/world/generation/structure/Structures.java index ea6ce0b5b3..500ff8a947 100644 --- a/src/main/java/org/spongepowered/api/world/generation/structure/Structures.java +++ b/src/main/java/org/spongepowered/api/world/generation/structure/Structures.java @@ -95,6 +95,8 @@ public final class Structures { public static final DefaultedRegistryReference SWAMP_HUT = Structures.key(ResourceKey.minecraft("swamp_hut")); + public static final DefaultedRegistryReference TRAIL_RUINS = Structures.key(ResourceKey.minecraft("trail_ruins")); + public static final DefaultedRegistryReference VILLAGE_DESERT = Structures.key(ResourceKey.minecraft("village_desert")); public static final DefaultedRegistryReference VILLAGE_PLAINS = Structures.key(ResourceKey.minecraft("village_plains")); diff --git a/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPools.java b/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPools.java index 03d52d15c8..81f31a6f45 100644 --- a/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPools.java +++ b/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/JigsawPools.java @@ -185,6 +185,20 @@ public final class JigsawPools { public static final DefaultedRegistryReference PILLAGER_OUTPOST_TOWERS = JigsawPools.key(ResourceKey.minecraft("pillager_outpost/towers")); + public static final DefaultedRegistryReference TRAIL_RUINS_BUILDINGS = JigsawPools.key(ResourceKey.minecraft("trail_ruins/buildings")); + + public static final DefaultedRegistryReference TRAIL_RUINS_BUILDINGS_GROUPED = JigsawPools.key(ResourceKey.minecraft("trail_ruins/buildings/grouped")); + + public static final DefaultedRegistryReference TRAIL_RUINS_DECOR = JigsawPools.key(ResourceKey.minecraft("trail_ruins/decor")); + + public static final DefaultedRegistryReference TRAIL_RUINS_ROADS = JigsawPools.key(ResourceKey.minecraft("trail_ruins/roads")); + + public static final DefaultedRegistryReference TRAIL_RUINS_TOWER = JigsawPools.key(ResourceKey.minecraft("trail_ruins/tower")); + + public static final DefaultedRegistryReference TRAIL_RUINS_TOWER_ADDITIONS = JigsawPools.key(ResourceKey.minecraft("trail_ruins/tower/additions")); + + public static final DefaultedRegistryReference TRAIL_RUINS_TOWER_TOWER_TOP = JigsawPools.key(ResourceKey.minecraft("trail_ruins/tower/tower_top")); + public static final DefaultedRegistryReference VILLAGE_COMMON_ANIMALS = JigsawPools.key(ResourceKey.minecraft("village/common/animals")); public static final DefaultedRegistryReference VILLAGE_COMMON_BUTCHER_ANIMALS = JigsawPools.key(ResourceKey.minecraft("village/common/butcher_animals")); diff --git a/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorLists.java b/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorLists.java index b940695d1f..3cc6c111e2 100644 --- a/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorLists.java +++ b/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorLists.java @@ -101,6 +101,12 @@ public final class ProcessorLists { public static final DefaultedRegistryReference STREET_SNOWY_OR_TAIGA = ProcessorLists.key(ResourceKey.minecraft("street_snowy_or_taiga")); + public static final DefaultedRegistryReference TRAIL_RUINS_HOUSES_ARCHAEOLOGY = ProcessorLists.key(ResourceKey.minecraft("trail_ruins_houses_archaeology")); + + public static final DefaultedRegistryReference TRAIL_RUINS_ROADS_ARCHAEOLOGY = ProcessorLists.key(ResourceKey.minecraft("trail_ruins_roads_archaeology")); + + public static final DefaultedRegistryReference TRAIL_RUINS_TOWER_TOP_ARCHAEOLOGY = ProcessorLists.key(ResourceKey.minecraft("trail_ruins_tower_top_archaeology")); + public static final DefaultedRegistryReference TREASURE_ROOMS = ProcessorLists.key(ResourceKey.minecraft("treasure_rooms")); public static final DefaultedRegistryReference ZOMBIE_DESERT = ProcessorLists.key(ResourceKey.minecraft("zombie_desert")); diff --git a/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorTypes.java b/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorTypes.java index 0c69fbb431..48c6d43d59 100644 --- a/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorTypes.java +++ b/src/main/java/org/spongepowered/api/world/generation/structure/jigsaw/ProcessorTypes.java @@ -49,6 +49,8 @@ public final class ProcessorTypes { public static final DefaultedRegistryReference BLOCK_ROT = ProcessorTypes.key(ResourceKey.minecraft("block_rot")); + public static final DefaultedRegistryReference CAPPED = ProcessorTypes.key(ResourceKey.minecraft("capped")); + public static final DefaultedRegistryReference GRAVITY = ProcessorTypes.key(ResourceKey.minecraft("gravity")); public static final DefaultedRegistryReference JIGSAW_REPLACEMENT = ProcessorTypes.key(ResourceKey.minecraft("jigsaw_replacement")); From e1f959dec289c800a70b8a08ff46a73c8dd8a516 Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Fri, 9 Jun 2023 17:20:16 +0200 Subject: [PATCH 05/23] add SignText color and ChangeSignEvent front/back side --- .../spongepowered/api/block/entity/Sign.java | 34 +++++++++++++++++-- .../event/block/entity/ChangeSignEvent.java | 7 ++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/spongepowered/api/block/entity/Sign.java b/src/main/java/org/spongepowered/api/block/entity/Sign.java index b1bc697795..2caaad9c14 100644 --- a/src/main/java/org/spongepowered/api/block/entity/Sign.java +++ b/src/main/java/org/spongepowered/api/block/entity/Sign.java @@ -27,6 +27,7 @@ import net.kyori.adventure.text.Component; import org.spongepowered.api.data.DataHolder; import org.spongepowered.api.data.Keys; +import org.spongepowered.api.data.type.DyeColor; import org.spongepowered.api.data.value.ListValue; import org.spongepowered.api.data.value.Value; import org.spongepowered.api.util.Nameable; @@ -47,25 +48,43 @@ default ListValue.Mutable lines() { } /** - * {@return Whether this sign has glowing text}. + * Gets whether the front side {@link SignText} has {@link SignText#glowingText() glowing text} + * + * @return Whether this sign has glowing text */ default Value.Mutable glowingText() { return this.requireValue(Keys.GLOWING_TEXT).asMutable(); } + /** + * Gets whether this sign is waxed. + * + * @return true when this sign is waxed. + */ default Value.Mutable waxed() { return this.requireValue(Keys.SIGN_WAXED).asMutable(); } + /** + * Gets the back side {@link SignText} + * + * @return the back side sign-text + */ default SignText backText() { return this.require(Keys.SIGN_BACK_TEXT); } + /** + * Gets the front side {@link SignText} + * + * @return the back side sign-text + */ default SignText frontText() { return this.require(Keys.SIGN_FRONT_TEXT); } interface SignText extends DataHolder.Mutable { + /** * Gets the {@link org.spongepowered.api.data.value.ListValue.Mutable} of {@link Component} for the {@link Sign} * to show. @@ -77,12 +96,21 @@ default ListValue.Mutable lines() { } /** - * {@return Whether this sign has glowing text}. + * Gets whether this sign has glowing text. + * + * @return Whether this sign has glowing text. */ default Value.Mutable glowingText() { return this.requireValue(Keys.GLOWING_TEXT).asMutable(); } - // TODO color? + /** + * Gets the {@link DyeColor} of this sign text. + * + * @return the dye-color of this sign text + */ + default Value.Mutable dyeColor() { + return this.requireValue(Keys.DYE_COLOR).asMutable(); + } } } diff --git a/src/main/java/org/spongepowered/api/event/block/entity/ChangeSignEvent.java b/src/main/java/org/spongepowered/api/event/block/entity/ChangeSignEvent.java index b70ec2bc9a..e187b6505d 100644 --- a/src/main/java/org/spongepowered/api/event/block/entity/ChangeSignEvent.java +++ b/src/main/java/org/spongepowered/api/event/block/entity/ChangeSignEvent.java @@ -53,4 +53,11 @@ public interface ChangeSignEvent extends Event, Cancellable { */ ListValue.Mutable text(); + /** + * Gets whether this event is for the front side or back side of the sign. + * + * @return true if this event fired for the front side. + */ + boolean isFrontSide(); + } From a004b9fc9679b7afaef17d970e72e343bdf75068 Mon Sep 17 00:00:00 2001 From: ImMorpheus Date: Tue, 29 Aug 2023 00:28:29 +0200 Subject: [PATCH 06/23] generate api data --- .../api/effect/sound/SoundTypes.java | 22 +++++++++++++++++++ .../entity/attribute/type/AttributeTypes.java | 2 ++ .../spongepowered/api/tag/BlockTypeTags.java | 4 ++++ .../spongepowered/api/tag/DamageTypeTags.java | 2 ++ .../spongepowered/api/tag/EntityTypeTags.java | 2 ++ .../world/generation/feature/Features.java | 2 ++ .../generation/feature/PlacedFeatures.java | 2 ++ 7 files changed, 36 insertions(+) diff --git a/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java b/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java index 40a1ec60fe..aa76ceaf85 100644 --- a/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java +++ b/src/main/java/org/spongepowered/api/effect/sound/SoundTypes.java @@ -1213,6 +1213,18 @@ public final class SoundTypes { public static final DefaultedRegistryReference BLOCK_SOUL_SOIL_STEP = SoundTypes.key(ResourceKey.minecraft("block.soul_soil.step")); + public static final DefaultedRegistryReference BLOCK_SPONGE_ABSORB = SoundTypes.key(ResourceKey.minecraft("block.sponge.absorb")); + + public static final DefaultedRegistryReference BLOCK_SPONGE_BREAK = SoundTypes.key(ResourceKey.minecraft("block.sponge.break")); + + public static final DefaultedRegistryReference BLOCK_SPONGE_FALL = SoundTypes.key(ResourceKey.minecraft("block.sponge.fall")); + + public static final DefaultedRegistryReference BLOCK_SPONGE_HIT = SoundTypes.key(ResourceKey.minecraft("block.sponge.hit")); + + public static final DefaultedRegistryReference BLOCK_SPONGE_PLACE = SoundTypes.key(ResourceKey.minecraft("block.sponge.place")); + + public static final DefaultedRegistryReference BLOCK_SPONGE_STEP = SoundTypes.key(ResourceKey.minecraft("block.sponge.step")); + public static final DefaultedRegistryReference BLOCK_SPORE_BLOSSOM_BREAK = SoundTypes.key(ResourceKey.minecraft("block.spore_blossom.break")); public static final DefaultedRegistryReference BLOCK_SPORE_BLOSSOM_FALL = SoundTypes.key(ResourceKey.minecraft("block.spore_blossom.fall")); @@ -1337,6 +1349,16 @@ public final class SoundTypes { public static final DefaultedRegistryReference BLOCK_WET_GRASS_STEP = SoundTypes.key(ResourceKey.minecraft("block.wet_grass.step")); + public static final DefaultedRegistryReference BLOCK_WET_SPONGE_BREAK = SoundTypes.key(ResourceKey.minecraft("block.wet_sponge.break")); + + public static final DefaultedRegistryReference BLOCK_WET_SPONGE_FALL = SoundTypes.key(ResourceKey.minecraft("block.wet_sponge.fall")); + + public static final DefaultedRegistryReference BLOCK_WET_SPONGE_HIT = SoundTypes.key(ResourceKey.minecraft("block.wet_sponge.hit")); + + public static final DefaultedRegistryReference BLOCK_WET_SPONGE_PLACE = SoundTypes.key(ResourceKey.minecraft("block.wet_sponge.place")); + + public static final DefaultedRegistryReference BLOCK_WET_SPONGE_STEP = SoundTypes.key(ResourceKey.minecraft("block.wet_sponge.step")); + public static final DefaultedRegistryReference BLOCK_WOOD_BREAK = SoundTypes.key(ResourceKey.minecraft("block.wood.break")); public static final DefaultedRegistryReference BLOCK_WOOD_FALL = SoundTypes.key(ResourceKey.minecraft("block.wood.fall")); diff --git a/src/main/java/org/spongepowered/api/entity/attribute/type/AttributeTypes.java b/src/main/java/org/spongepowered/api/entity/attribute/type/AttributeTypes.java index 1f204b4102..eabab189ea 100644 --- a/src/main/java/org/spongepowered/api/entity/attribute/type/AttributeTypes.java +++ b/src/main/java/org/spongepowered/api/entity/attribute/type/AttributeTypes.java @@ -59,6 +59,8 @@ public final class AttributeTypes { public static final DefaultedRegistryReference GENERIC_LUCK = AttributeTypes.key(ResourceKey.minecraft("generic.luck")); + public static final DefaultedRegistryReference GENERIC_MAX_ABSORPTION = AttributeTypes.key(ResourceKey.minecraft("generic.max_absorption")); + public static final DefaultedRegistryReference GENERIC_MAX_HEALTH = AttributeTypes.key(ResourceKey.minecraft("generic.max_health")); public static final DefaultedRegistryReference GENERIC_MOVEMENT_SPEED = AttributeTypes.key(ResourceKey.minecraft("generic.movement_speed")); diff --git a/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java b/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java index dd003c66fd..a3bc25cef4 100644 --- a/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java +++ b/src/main/java/org/spongepowered/api/tag/BlockTypeTags.java @@ -80,6 +80,8 @@ public final class BlockTypeTags { public static final Tag BUTTONS = BlockTypeTags.key(ResourceKey.minecraft("buttons")); + public static final Tag CAMEL_SAND_STEP_SOUND_BLOCKS = BlockTypeTags.key(ResourceKey.minecraft("camel_sand_step_sound_blocks")); + public static final Tag CAMPFIRES = BlockTypeTags.key(ResourceKey.minecraft("campfires")); public static final Tag CANDLE_CAKES = BlockTypeTags.key(ResourceKey.minecraft("candle_cakes")); @@ -102,6 +104,8 @@ public final class BlockTypeTags { public static final Tag COMPLETES_FIND_TREE_TUTORIAL = BlockTypeTags.key(ResourceKey.minecraft("completes_find_tree_tutorial")); + public static final Tag CONCRETE_POWDER = BlockTypeTags.key(ResourceKey.minecraft("concrete_powder")); + public static final Tag CONVERTABLE_TO_MUD = BlockTypeTags.key(ResourceKey.minecraft("convertable_to_mud")); public static final Tag COPPER_ORES = BlockTypeTags.key(ResourceKey.minecraft("copper_ores")); diff --git a/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java b/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java index 6be378dbff..cab740feb3 100644 --- a/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java +++ b/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java @@ -82,6 +82,8 @@ public final class DamageTypeTags { public static final Tag NO_IMPACT = DamageTypeTags.key(ResourceKey.minecraft("no_impact")); + public static final Tag NO_KNOCKBACK = DamageTypeTags.key(ResourceKey.minecraft("no_knockback")); + public static final Tag WITCH_RESISTANT_TO = DamageTypeTags.key(ResourceKey.minecraft("witch_resistant_to")); public static final Tag WITHER_IMMUNE_TO = DamageTypeTags.key(ResourceKey.minecraft("wither_immune_to")); diff --git a/src/main/java/org/spongepowered/api/tag/EntityTypeTags.java b/src/main/java/org/spongepowered/api/tag/EntityTypeTags.java index 50d4dd6cd7..99130a72b2 100644 --- a/src/main/java/org/spongepowered/api/tag/EntityTypeTags.java +++ b/src/main/java/org/spongepowered/api/tag/EntityTypeTags.java @@ -58,6 +58,8 @@ public final class EntityTypeTags { public static final Tag> IMPACT_PROJECTILES = EntityTypeTags.key(ResourceKey.minecraft("impact_projectiles")); + public static final Tag> NON_CONTROLLING_RIDER = EntityTypeTags.key(ResourceKey.minecraft("non_controlling_rider")); + public static final Tag> POWDER_SNOW_WALKABLE_MOBS = EntityTypeTags.key(ResourceKey.minecraft("powder_snow_walkable_mobs")); public static final Tag> RAIDERS = EntityTypeTags.key(ResourceKey.minecraft("raiders")); diff --git a/src/main/java/org/spongepowered/api/world/generation/feature/Features.java b/src/main/java/org/spongepowered/api/world/generation/feature/Features.java index 5b1e5fe528..c3ddb8eb20 100644 --- a/src/main/java/org/spongepowered/api/world/generation/feature/Features.java +++ b/src/main/java/org/spongepowered/api/world/generation/feature/Features.java @@ -245,6 +245,8 @@ public final class Features { public static final DefaultedRegistryReference ORE_DIAMOND_LARGE = Features.key(ResourceKey.minecraft("ore_diamond_large")); + public static final DefaultedRegistryReference ORE_DIAMOND_MEDIUM = Features.key(ResourceKey.minecraft("ore_diamond_medium")); + public static final DefaultedRegistryReference ORE_DIAMOND_SMALL = Features.key(ResourceKey.minecraft("ore_diamond_small")); public static final DefaultedRegistryReference ORE_DIORITE = Features.key(ResourceKey.minecraft("ore_diorite")); diff --git a/src/main/java/org/spongepowered/api/world/generation/feature/PlacedFeatures.java b/src/main/java/org/spongepowered/api/world/generation/feature/PlacedFeatures.java index cd61c5464f..09b1257d6a 100644 --- a/src/main/java/org/spongepowered/api/world/generation/feature/PlacedFeatures.java +++ b/src/main/java/org/spongepowered/api/world/generation/feature/PlacedFeatures.java @@ -241,6 +241,8 @@ public final class PlacedFeatures { public static final DefaultedRegistryReference ORE_DIAMOND_LARGE = PlacedFeatures.key(ResourceKey.minecraft("ore_diamond_large")); + public static final DefaultedRegistryReference ORE_DIAMOND_MEDIUM = PlacedFeatures.key(ResourceKey.minecraft("ore_diamond_medium")); + public static final DefaultedRegistryReference ORE_DIORITE_LOWER = PlacedFeatures.key(ResourceKey.minecraft("ore_diorite_lower")); public static final DefaultedRegistryReference ORE_DIORITE_UPPER = PlacedFeatures.key(ResourceKey.minecraft("ore_diorite_upper")); From 0a47d5d8a588b00766748128402171def86a273a Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Thu, 28 Sep 2023 04:26:12 +0200 Subject: [PATCH 07/23] MC 1.20.2 API breaks --- .../api/advancement/Advancement.java | 23 ++--------- .../{TreeLayout.java => AdvancementNode.java} | 32 ++++++--------- .../api/advancement/AdvancementTemplate.java | 23 ++++++++++- .../api/advancement/AdvancementTree.java | 39 +++++++++++++++---- .../api/advancement/TreeLayoutElement.java | 2 +- .../criteria/AdvancementCriterion.java | 12 +++++- .../criteria/trigger/FilteredTrigger.java | 18 +-------- .../advancement/criteria/trigger/Trigger.java | 7 ++-- .../api/command/selector/Selector.java | 9 +++-- .../living/player/server/ServerPlayer.java | 3 +- .../event/advancement/AdvancementEvent.java | 8 ++++ .../advancement/AdvancementTreeEvent.java | 9 +---- .../api/event/advancement/CriterionEvent.java | 9 +++++ .../api/event/block/entity/CookingEvent.java | 3 ++ .../event/item/inventory/CraftItemEvent.java | 3 ++ .../spongepowered/api/item/recipe/Recipe.java | 3 +- 16 files changed, 115 insertions(+), 88 deletions(-) rename src/main/java/org/spongepowered/api/advancement/{TreeLayout.java => AdvancementNode.java} (62%) diff --git a/src/main/java/org/spongepowered/api/advancement/Advancement.java b/src/main/java/org/spongepowered/api/advancement/Advancement.java index 93836ae23e..98daddb439 100644 --- a/src/main/java/org/spongepowered/api/advancement/Advancement.java +++ b/src/main/java/org/spongepowered/api/advancement/Advancement.java @@ -26,34 +26,17 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; -import org.spongepowered.api.ResourceKeyed; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.advancement.criteria.AdvancementCriterion; import org.spongepowered.api.data.persistence.DataSerializable; -import java.util.Collection; import java.util.List; import java.util.Optional; /** * An advancement. */ -public interface Advancement extends ComponentLike, ResourceKeyed, DataSerializable { - - /** - * Gets the {@link AdvancementTree} this advancement is located in, - * will only be present if the root advancement was used to create - * a {@link AdvancementTree}. - * - * @return The advancement tree - */ - Optional tree(); - - /** - * Gets all the children {@link Advancement}s. - * - * @return The children advancements - */ - Collection children(); +public interface Advancement extends ComponentLike, DataSerializable { /** * Gets all the {@link AdvancementCriterion} that should be achieved @@ -72,7 +55,7 @@ public interface Advancement extends ComponentLike, ResourceKeyed, DataSerializa * * @return The parent advancement, if present */ - Optional parent(); + Optional parent(); /** * Gets the {@link DisplayInfo} of this advancement, if present. diff --git a/src/main/java/org/spongepowered/api/advancement/TreeLayout.java b/src/main/java/org/spongepowered/api/advancement/AdvancementNode.java similarity index 62% rename from src/main/java/org/spongepowered/api/advancement/TreeLayout.java rename to src/main/java/org/spongepowered/api/advancement/AdvancementNode.java index 8a9b4a15ab..02bef84fab 100644 --- a/src/main/java/org/spongepowered/api/advancement/TreeLayout.java +++ b/src/main/java/org/spongepowered/api/advancement/AdvancementNode.java @@ -24,37 +24,29 @@ */ package org.spongepowered.api.advancement; +import org.spongepowered.api.ResourceKeyed; +import org.spongepowered.api.entity.living.player.Player; + import java.util.Collection; -import java.util.Optional; /** - * Represents the tree (tab) layout of a {@link AdvancementTree}. + * A node in a {@link AdvancementTree} + * visible to a {@link Player} once the root {@link Advancement} gets achieved. */ -public interface TreeLayout { - - /** - * Gets the {@link AdvancementTree} this layout is assigned to. - * - * @return The tree - */ - AdvancementTree tree(); +public interface AdvancementNode extends ResourceKeyed { /** - * Gets all the {@link TreeLayoutElement}s that are - * present in this layout. + * Gets the root {@link Advancement}. * - * @return The tree layout elements + * @return The root advancement */ - Collection elements(); + Advancement rootAdvancement(); /** - * Gets the {@link TreeLayoutElement} for the specified {@link Advancement}, - * {@link Optional#empty()} will be returned if the advancement is not present - * in the tree or if there is no {@link DisplayInfo} present. + * Gets all the children {@link Advancement}s. * - * @param advancement The advancement - * @return The tree layout element + * @return The children advancements */ - Optional element(Advancement advancement); + Collection children(); } diff --git a/src/main/java/org/spongepowered/api/advancement/AdvancementTemplate.java b/src/main/java/org/spongepowered/api/advancement/AdvancementTemplate.java index 8fa7268533..7388e88569 100644 --- a/src/main/java/org/spongepowered/api/advancement/AdvancementTemplate.java +++ b/src/main/java/org/spongepowered/api/advancement/AdvancementTemplate.java @@ -31,6 +31,8 @@ import org.spongepowered.api.datapack.DataPackEntry; import org.spongepowered.api.util.ResourceKeyedBuilder; +import java.util.Optional; + /** * A template for an {@link Advancement}. */ @@ -52,19 +54,36 @@ static Builder builder() { */ Advancement advancement(); + /** + * Gets the {@link AdvancementTree} of this advancement + * will only be present if it is a root advancement. + * + * @return The advancement tree + */ + Optional tree(); + /** * A builder to create {@link Advancement}s. */ interface Builder extends ResourceKeyedBuilder { /** - * Sets the parent {@link Advancement}. + * Sets the parent {@link Advancement} template. + *

For the root advancement use {@link #root}

+ * + * @param parent The parent advancement + * @return This builder, for chaining + */ + Builder parent(AdvancementTemplate parent); + + /** + * Sets the parent {@link Advancement} key. *

For the root advancement use {@link #root}

* * @param parent The parent advancement * @return This builder, for chaining */ - Builder parent(Advancement parent); + Builder parent(ResourceKey parent); /** * Sets this advancement as root. diff --git a/src/main/java/org/spongepowered/api/advancement/AdvancementTree.java b/src/main/java/org/spongepowered/api/advancement/AdvancementTree.java index 2f892b76e0..a477132c2d 100644 --- a/src/main/java/org/spongepowered/api/advancement/AdvancementTree.java +++ b/src/main/java/org/spongepowered/api/advancement/AdvancementTree.java @@ -27,26 +27,49 @@ import org.spongepowered.api.ResourceKey; import org.spongepowered.api.entity.living.player.Player; +import java.util.Collection; import java.util.Optional; /** * Represents a {@link Advancement} tree or tab menu. The tree will become - * visible to a {@link Player} once the root {@link Advancement} gets achieved. + * visible to a {@link Player} once the {@link #rootAdvancement() root advancement} gets achieved. */ -public interface AdvancementTree { +public interface AdvancementTree extends AdvancementNode { /** - * Gets the root {@link Advancement}. + * Gets the background texture of this tree. * - * @return The root advancement + * @return The background texture */ - Advancement rootAdvancement(); + Optional backgroundPath(); /** - * Gets the background texture of this tree. + * Gets all the {@link TreeLayoutElement}s that are + * present in this layout. * - * @return The background texture + * @return The tree layout elements */ - Optional backgroundPath(); + Collection layoutElements(); + + /** + * Gets the {@link TreeLayoutElement} for the specified {@link Advancement}, + * {@link Optional#empty()} will be returned if the advancement is not present + * in the tree or if there is no {@link DisplayInfo} present. + * + * @param advancement The advancement + * @return The tree layout element + */ + Optional layoutElement(AdvancementTemplate advancement); + + + /** + * Gets the {@link TreeLayoutElement} for the specified {@link Advancement}, + * {@link Optional#empty()} will be returned if the advancement is not present + * in the tree or if there is no {@link DisplayInfo} present. + * + * @param advancementKey The advancement key + * @return The tree layout element + */ + Optional layoutElement(ResourceKey advancementKey); } diff --git a/src/main/java/org/spongepowered/api/advancement/TreeLayoutElement.java b/src/main/java/org/spongepowered/api/advancement/TreeLayoutElement.java index 5cd0e00993..3e84bab417 100644 --- a/src/main/java/org/spongepowered/api/advancement/TreeLayoutElement.java +++ b/src/main/java/org/spongepowered/api/advancement/TreeLayoutElement.java @@ -27,7 +27,7 @@ import org.spongepowered.math.vector.Vector2d; /** - * Represents a element in the {@link TreeLayout}. + * Represents a layout element in the {@link AdvancementTree}. */ public interface TreeLayoutElement { diff --git a/src/main/java/org/spongepowered/api/advancement/criteria/AdvancementCriterion.java b/src/main/java/org/spongepowered/api/advancement/criteria/AdvancementCriterion.java index 08c8959914..9477ef1b44 100644 --- a/src/main/java/org/spongepowered/api/advancement/criteria/AdvancementCriterion.java +++ b/src/main/java/org/spongepowered/api/advancement/criteria/AdvancementCriterion.java @@ -27,6 +27,8 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.advancement.Advancement; import org.spongepowered.api.advancement.criteria.trigger.FilteredTrigger; +import org.spongepowered.api.advancement.criteria.trigger.FilteredTriggerConfiguration; +import org.spongepowered.api.advancement.criteria.trigger.Trigger; import org.spongepowered.api.util.CopyableBuilder; import org.spongepowered.api.util.Nameable; @@ -127,6 +129,13 @@ static Builder builder() { */ Optional> trigger(); + /** + * Gets the {@link Trigger} of this {@link AdvancementCriterion}, if present. + * + * @return The trigger + */ + Optional> type(); + /** * A builder to create {@link AdvancementCriterion}s. */ @@ -142,10 +151,11 @@ interface BaseBuilder trigger); + B trigger(Trigger type, FilteredTrigger trigger); /** * Sets the name of the {@link AdvancementCriterion}. Names can be diff --git a/src/main/java/org/spongepowered/api/advancement/criteria/trigger/FilteredTrigger.java b/src/main/java/org/spongepowered/api/advancement/criteria/trigger/FilteredTrigger.java index d9169ec070..2a542d9a8d 100644 --- a/src/main/java/org/spongepowered/api/advancement/criteria/trigger/FilteredTrigger.java +++ b/src/main/java/org/spongepowered/api/advancement/criteria/trigger/FilteredTrigger.java @@ -44,13 +44,6 @@ static Builder builder() { return Sponge.game().builderProvider().provide(Builder.class); } - /** - * Gets the {@link Trigger}. - * - * @return The type - */ - Trigger type(); - /** * Gets the {@link FilteredTriggerConfiguration} of this trigger. * @@ -66,22 +59,13 @@ static Builder builder() { interface Builder extends org.spongepowered.api.util.Builder, Builder>, CopyableBuilder, Builder> { - /** - * Sets the {@link Trigger}. - * - * @param type The trigger type - * @param The configuration type - * @return This builder, for chaining - */ - Builder type(Trigger type); - /** * Sets the {@link FilteredTriggerConfiguration}. * * @param config The configuration * @return This builder, for chaining */ - Builder config(C config); + Builder config(T config); /** * Builds the {@link FilteredTrigger}. diff --git a/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Trigger.java b/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Trigger.java index 1252514036..3d27675864 100644 --- a/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Trigger.java +++ b/src/main/java/org/spongepowered/api/advancement/criteria/trigger/Trigger.java @@ -26,7 +26,6 @@ import com.google.gson.Gson; import io.leangen.geantyref.TypeToken; -import org.spongepowered.api.ResourceKeyed; import org.spongepowered.api.Sponge; import org.spongepowered.api.advancement.criteria.AdvancementCriterion; import org.spongepowered.api.config.ConfigManager; @@ -37,8 +36,8 @@ import org.spongepowered.api.event.advancement.CriterionEvent; import org.spongepowered.api.registry.DefaultedRegistryValue; import org.spongepowered.api.scoreboard.criteria.Criterion; +import org.spongepowered.api.util.Builder; import org.spongepowered.api.util.CopyableBuilder; -import org.spongepowered.api.util.ResourceKeyedBuilder; import org.spongepowered.api.util.annotation.CatalogedBy; import org.spongepowered.configurate.ConfigurationOptions; import org.spongepowered.configurate.serialize.TypeSerializer; @@ -55,7 +54,7 @@ */ @SuppressWarnings("unchecked") @CatalogedBy(Triggers.class) -public interface Trigger extends DefaultedRegistryValue, ResourceKeyed { +public interface Trigger extends DefaultedRegistryValue { /** * Creates a new {@link Builder} which can be used to create @@ -103,7 +102,7 @@ static Builder builder() { * * @param The configuration type */ - interface Builder extends ResourceKeyedBuilder, Builder>, + interface Builder extends org.spongepowered.api.util.Builder, Builder>, CopyableBuilder, Builder> { /** diff --git a/src/main/java/org/spongepowered/api/command/selector/Selector.java b/src/main/java/org/spongepowered/api/command/selector/Selector.java index 7174e46420..e00251ca20 100644 --- a/src/main/java/org/spongepowered/api/command/selector/Selector.java +++ b/src/main/java/org/spongepowered/api/command/selector/Selector.java @@ -26,6 +26,7 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.advancement.Advancement; +import org.spongepowered.api.advancement.AdvancementTemplate; import org.spongepowered.api.advancement.criteria.AdvancementCriterion; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.data.persistence.DataView; @@ -204,7 +205,7 @@ interface Builder extends org.spongepowered.api.util.Builder * @param advancement The advancement that players must have. * @return This builder, for chaining */ - Builder addAdvancement(Advancement advancement); + Builder addAdvancement(AdvancementTemplate advancement); /** * Adds an {@link Advancement} constraint to this selector, requiring @@ -213,7 +214,7 @@ interface Builder extends org.spongepowered.api.util.Builder * @param advancement The advancement that players must not have. * @return This builder, for chaining */ - Builder addNotAdvancement(Advancement advancement); + Builder addNotAdvancement(AdvancementTemplate advancement); /** * Adds an {@link AdvancementCriterion} constraint to this selector, @@ -224,7 +225,7 @@ interface Builder extends org.spongepowered.api.util.Builder * @param criterion The criterion the player must have * @return This builder, for chaining */ - Builder addAdvancementCriterion(Advancement advancement, AdvancementCriterion criterion); + Builder addAdvancementCriterion(AdvancementTemplate advancement, AdvancementCriterion criterion); /** * Adds an {@link AdvancementCriterion} constraint to this selector, @@ -235,7 +236,7 @@ interface Builder extends org.spongepowered.api.util.Builder * @param criterion The criterion the player must not have * @return This builder, for chaining */ - Builder addNotAdvancementCriterion(Advancement advancement, AdvancementCriterion criterion); + Builder addNotAdvancementCriterion(AdvancementTemplate advancement, AdvancementCriterion criterion); /** * Adds an {@link DataView} as an NBT style constraint. diff --git a/src/main/java/org/spongepowered/api/entity/living/player/server/ServerPlayer.java b/src/main/java/org/spongepowered/api/entity/living/player/server/ServerPlayer.java index 76ee065335..f408b4f274 100644 --- a/src/main/java/org/spongepowered/api/entity/living/player/server/ServerPlayer.java +++ b/src/main/java/org/spongepowered/api/entity/living/player/server/ServerPlayer.java @@ -30,6 +30,7 @@ import org.spongepowered.api.Server; import org.spongepowered.api.advancement.Advancement; import org.spongepowered.api.advancement.AdvancementProgress; +import org.spongepowered.api.advancement.AdvancementTemplate; import org.spongepowered.api.advancement.AdvancementTree; import org.spongepowered.api.data.Keys; import org.spongepowered.api.data.type.SkinPart; @@ -280,7 +281,7 @@ default SetValue.Mutable displayedSkinParts() { * @param advancement The advancement * @return The advancement progress */ - AdvancementProgress progress(Advancement advancement); + AdvancementProgress progress(AdvancementTemplate advancement); /** * Gets all the {@link AdvancementTree}s that this diff --git a/src/main/java/org/spongepowered/api/event/advancement/AdvancementEvent.java b/src/main/java/org/spongepowered/api/event/advancement/AdvancementEvent.java index b71a7c111d..16348f97a7 100644 --- a/src/main/java/org/spongepowered/api/event/advancement/AdvancementEvent.java +++ b/src/main/java/org/spongepowered/api/event/advancement/AdvancementEvent.java @@ -24,6 +24,7 @@ */ package org.spongepowered.api.event.advancement; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.advancement.Advancement; import org.spongepowered.api.advancement.criteria.AdvancementCriterion; import org.spongepowered.api.entity.living.player.server.ServerPlayer; @@ -52,6 +53,13 @@ public interface AdvancementEvent extends Event { */ Advancement advancement(); + /** + * Gets the {@link Advancement} that is being targeted. + * + * @return The advancement + */ + ResourceKey advancementKey(); + /** * Is called when a {@link Advancement} is granted/unlocked. * diff --git a/src/main/java/org/spongepowered/api/event/advancement/AdvancementTreeEvent.java b/src/main/java/org/spongepowered/api/event/advancement/AdvancementTreeEvent.java index 8b07fb33e7..880b523718 100644 --- a/src/main/java/org/spongepowered/api/event/advancement/AdvancementTreeEvent.java +++ b/src/main/java/org/spongepowered/api/event/advancement/AdvancementTreeEvent.java @@ -25,7 +25,6 @@ package org.spongepowered.api.event.advancement; import org.spongepowered.api.advancement.AdvancementTree; -import org.spongepowered.api.advancement.TreeLayout; import org.spongepowered.api.event.Event; /** @@ -43,16 +42,10 @@ public interface AdvancementTreeEvent extends Event { /** * Is called when the layout of a {@link AdvancementTree} gets * updated, this is done after the vanilla game generates the - * layout. You can safely move elements in the {@link TreeLayout} + * layout. You can safely move layout elements in the {@link AdvancementTree} * within this event. */ interface GenerateLayout extends AdvancementTreeEvent { - /** - * Gets the {@link TreeLayout} that got generated. - * - * @return The tree layout - */ - TreeLayout layout(); } } diff --git a/src/main/java/org/spongepowered/api/event/advancement/CriterionEvent.java b/src/main/java/org/spongepowered/api/event/advancement/CriterionEvent.java index bc0bf1982f..f3a4606f48 100644 --- a/src/main/java/org/spongepowered/api/event/advancement/CriterionEvent.java +++ b/src/main/java/org/spongepowered/api/event/advancement/CriterionEvent.java @@ -28,6 +28,7 @@ import org.spongepowered.api.advancement.criteria.ScoreAdvancementCriterion; import org.spongepowered.api.advancement.criteria.trigger.FilteredTrigger; import org.spongepowered.api.advancement.criteria.trigger.FilteredTriggerConfiguration; +import org.spongepowered.api.advancement.criteria.trigger.Trigger; import org.spongepowered.api.event.Cancellable; import org.spongepowered.api.event.Cause; import org.spongepowered.api.event.GenericEvent; @@ -129,6 +130,14 @@ interface Trigger extends CriterionEvent */ FilteredTrigger trigger(); + /** + * Gets the {@link FilteredTrigger} + * that is being processed. + * + * @return The trigger + */ + org.spongepowered.api.advancement.criteria.trigger.Trigger type(); + /** * Gets the result of the trigger event. * diff --git a/src/main/java/org/spongepowered/api/event/block/entity/CookingEvent.java b/src/main/java/org/spongepowered/api/event/block/entity/CookingEvent.java index acedf03258..c71c95e4fa 100644 --- a/src/main/java/org/spongepowered/api/event/block/entity/CookingEvent.java +++ b/src/main/java/org/spongepowered/api/event/block/entity/CookingEvent.java @@ -24,6 +24,7 @@ */ package org.spongepowered.api.event.block.entity; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.block.entity.BlockEntity; import org.spongepowered.api.event.Cancellable; import org.spongepowered.api.event.Event; @@ -62,6 +63,8 @@ public interface CookingEvent extends Event { */ Optional recipe(); + Optional recipeKey(); + /** * The first tick of an item cooking. */ diff --git a/src/main/java/org/spongepowered/api/event/item/inventory/CraftItemEvent.java b/src/main/java/org/spongepowered/api/event/item/inventory/CraftItemEvent.java index 84f3abd6bb..6341cff580 100644 --- a/src/main/java/org/spongepowered/api/event/item/inventory/CraftItemEvent.java +++ b/src/main/java/org/spongepowered/api/event/item/inventory/CraftItemEvent.java @@ -24,6 +24,7 @@ */ package org.spongepowered.api.event.item.inventory; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.event.item.inventory.container.ClickContainerEvent; import org.spongepowered.api.item.inventory.ItemStackSnapshot; import org.spongepowered.api.item.inventory.Slot; @@ -51,6 +52,8 @@ public interface CraftItemEvent extends ChangeInventoryEvent { */ Optional recipe(); + Optional recipeKey(); + /** * This event is fired before the item is taken out of the * output slot but after completing the recipe in the grid. diff --git a/src/main/java/org/spongepowered/api/item/recipe/Recipe.java b/src/main/java/org/spongepowered/api/item/recipe/Recipe.java index ba0fd6c65b..f3d263619c 100644 --- a/src/main/java/org/spongepowered/api/item/recipe/Recipe.java +++ b/src/main/java/org/spongepowered/api/item/recipe/Recipe.java @@ -24,7 +24,6 @@ */ package org.spongepowered.api.item.recipe; -import org.spongepowered.api.ResourceKeyed; import org.spongepowered.api.block.BlockTypes; import org.spongepowered.api.block.entity.carrier.Campfire; import org.spongepowered.api.block.entity.carrier.furnace.BlastFurnace; @@ -58,7 +57,7 @@ *

{@link StoneCutterRecipe} for recipes in a {@link BlockTypes#STONECUTTER} block

*

{@link SmithingRecipe} for recipes in a {@link BlockTypes#SMITHING_TABLE} block

*/ -public interface Recipe extends ResourceKeyed { +public interface Recipe { /** * Checks if the given inventory fits the required constraints to make a valid recipe From eb1faca2f1b2782e8aa3b8524abf712b62fb4c4f Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Tue, 3 Oct 2023 18:38:43 +0200 Subject: [PATCH 08/23] bump dependencies used by vanilla minecraft --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1c2216cd61..dc2f753925 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,8 +13,8 @@ caffeineVersion=3.1.2 checkstyleVersion=10.5.0 configurateVersion=4.1.2 errorproneVersion=2.16 -gsonVersion=2.10 -guavaVersion=31.1-jre +gsonVersion=2.10.1 +guavaVersion=32.1.2-jre junitVersion=5.9.1 log4jVersion=2.19.0 From cd1da78b41d962bef0e638504a446f778fc2ba7b Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Wed, 4 Oct 2023 16:55:46 +0200 Subject: [PATCH 09/23] use advancement key for command selectors --- .../api/command/selector/Selector.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/spongepowered/api/command/selector/Selector.java b/src/main/java/org/spongepowered/api/command/selector/Selector.java index e00251ca20..352d4ba285 100644 --- a/src/main/java/org/spongepowered/api/command/selector/Selector.java +++ b/src/main/java/org/spongepowered/api/command/selector/Selector.java @@ -24,9 +24,9 @@ */ package org.spongepowered.api.command.selector; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.advancement.Advancement; -import org.spongepowered.api.advancement.AdvancementTemplate; import org.spongepowered.api.advancement.criteria.AdvancementCriterion; import org.spongepowered.api.command.CommandCause; import org.spongepowered.api.data.persistence.DataView; @@ -202,41 +202,41 @@ interface Builder extends org.spongepowered.api.util.Builder * Adds an {@link Advancement} constraint to this selector, requiring * that the advancement must be granted to be selected. * - * @param advancement The advancement that players must have. + * @param advancement The key of the advancement that players must have. * @return This builder, for chaining */ - Builder addAdvancement(AdvancementTemplate advancement); + Builder addAdvancement(ResourceKey advancement); /** * Adds an {@link Advancement} constraint to this selector, requiring * that the advancement must NOT be granted to be selected. * - * @param advancement The advancement that players must not have. + * @param advancement The key of the advancement that players must not have. * @return This builder, for chaining */ - Builder addNotAdvancement(AdvancementTemplate advancement); + Builder addNotAdvancement(ResourceKey advancement); /** * Adds an {@link AdvancementCriterion} constraint to this selector, * requiring that the criterion on the given {@link Advancement} must * be granted to be selected. * - * @param advancement The advancement + * @param advancement The key of the advancement * @param criterion The criterion the player must have * @return This builder, for chaining */ - Builder addAdvancementCriterion(AdvancementTemplate advancement, AdvancementCriterion criterion); + Builder addAdvancementCriterion(ResourceKey advancement, AdvancementCriterion criterion); /** * Adds an {@link AdvancementCriterion} constraint to this selector, * requiring that the criterion on the given {@link Advancement} must * not be granted to be selected. * - * @param advancement The advancement + * @param advancement The key of the advancement * @param criterion The criterion the player must not have * @return This builder, for chaining */ - Builder addNotAdvancementCriterion(AdvancementTemplate advancement, AdvancementCriterion criterion); + Builder addNotAdvancementCriterion(ResourceKey advancement, AdvancementCriterion criterion); /** * Adds an {@link DataView} as an NBT style constraint. From 08791f8c18484b286a5035d2e0f39e7afe59ace2 Mon Sep 17 00:00:00 2001 From: Morpheus Date: Sat, 11 Nov 2023 19:55:20 +0000 Subject: [PATCH 10/23] Regenerate API data (#2470) * Regenerate api data * Add ArmorMaterials generator * Add BambooLeavesTypes generator * Add DyeColors generator * Add FoxTypes generator * Add HorseColors generator * Add HorseStyles generator * Add InstrumentTypes generator * Add TropicalFishShapes generator * Add GameRules generator --- .../api/data/type/ArmorMaterials.java | 6 +- .../api/data/type/BambooLeavesTypes.java | 4 +- .../api/data/type/DyeColors.java | 4 - .../spongepowered/api/data/type/FoxTypes.java | 4 - .../api/data/type/HorseColors.java | 4 - .../api/data/type/HorseStyles.java | 8 +- .../api/data/type/InstrumentTypes.java | 22 +- .../api/data/type/TropicalFishShapes.java | 4 - .../spongepowered/api/tag/DamageTypeTags.java | 2 + .../api/world/gamerule/GameRules.java | 302 ++---------------- 10 files changed, 47 insertions(+), 313 deletions(-) diff --git a/src/main/java/org/spongepowered/api/data/type/ArmorMaterials.java b/src/main/java/org/spongepowered/api/data/type/ArmorMaterials.java index 161c200b1a..1b067997a2 100644 --- a/src/main/java/org/spongepowered/api/data/type/ArmorMaterials.java +++ b/src/main/java/org/spongepowered/api/data/type/ArmorMaterials.java @@ -38,9 +38,7 @@ public final class ArmorMaterials { // @formatter:off - // SORTFIELDS:ON - public static final DefaultedRegistryReference CHAINMAIL = ArmorMaterials.key(ResourceKey.sponge("chainmail")); public static final DefaultedRegistryReference DIAMOND = ArmorMaterials.key(ResourceKey.sponge("diamond")); @@ -51,12 +49,12 @@ public final class ArmorMaterials { public static final DefaultedRegistryReference LEATHER = ArmorMaterials.key(ResourceKey.sponge("leather")); + public static final DefaultedRegistryReference NETHERITE = ArmorMaterials.key(ResourceKey.sponge("netherite")); + public static final DefaultedRegistryReference TURTLE = ArmorMaterials.key(ResourceKey.sponge("turtle")); // SORTFIELDS:OFF - // @formatter:on - private ArmorMaterials() { } diff --git a/src/main/java/org/spongepowered/api/data/type/BambooLeavesTypes.java b/src/main/java/org/spongepowered/api/data/type/BambooLeavesTypes.java index 603aa56981..ecffa37e23 100644 --- a/src/main/java/org/spongepowered/api/data/type/BambooLeavesTypes.java +++ b/src/main/java/org/spongepowered/api/data/type/BambooLeavesTypes.java @@ -38,15 +38,13 @@ public final class BambooLeavesTypes { // @formatter:off + public static final DefaultedRegistryReference LARGE = BambooLeavesTypes.key(ResourceKey.sponge("large")); public static final DefaultedRegistryReference NONE = BambooLeavesTypes.key(ResourceKey.sponge("none")); public static final DefaultedRegistryReference SMALL = BambooLeavesTypes.key(ResourceKey.sponge("small")); - public static final DefaultedRegistryReference LARGE = BambooLeavesTypes.key(ResourceKey.sponge("large")); - // @formatter:on - private BambooLeavesTypes() { } diff --git a/src/main/java/org/spongepowered/api/data/type/DyeColors.java b/src/main/java/org/spongepowered/api/data/type/DyeColors.java index 47849e6235..66cf59ba48 100644 --- a/src/main/java/org/spongepowered/api/data/type/DyeColors.java +++ b/src/main/java/org/spongepowered/api/data/type/DyeColors.java @@ -41,9 +41,7 @@ public final class DyeColors { // @formatter:off - // SORTFIELDS:ON - public static final DefaultedRegistryReference BLACK = DyeColors.key(ResourceKey.sponge("black")); public static final DefaultedRegistryReference BLUE = DyeColors.key(ResourceKey.sponge("blue")); @@ -77,9 +75,7 @@ public final class DyeColors { public static final DefaultedRegistryReference YELLOW = DyeColors.key(ResourceKey.sponge("yellow")); // SORTFIELDS:OFF - // @formatter:on - private DyeColors() { } diff --git a/src/main/java/org/spongepowered/api/data/type/FoxTypes.java b/src/main/java/org/spongepowered/api/data/type/FoxTypes.java index 83c7df6715..6fd233ed4e 100644 --- a/src/main/java/org/spongepowered/api/data/type/FoxTypes.java +++ b/src/main/java/org/spongepowered/api/data/type/FoxTypes.java @@ -41,17 +41,13 @@ public final class FoxTypes { // @formatter:off - // SORTFIELDS:ON - public static final DefaultedRegistryReference RED = FoxTypes.key(ResourceKey.sponge("red")); public static final DefaultedRegistryReference SNOW = FoxTypes.key(ResourceKey.sponge("snow")); // SORTFIELDS:OFF - // @formatter:on - private FoxTypes() { } diff --git a/src/main/java/org/spongepowered/api/data/type/HorseColors.java b/src/main/java/org/spongepowered/api/data/type/HorseColors.java index 86507018ae..ba02ac51c5 100644 --- a/src/main/java/org/spongepowered/api/data/type/HorseColors.java +++ b/src/main/java/org/spongepowered/api/data/type/HorseColors.java @@ -41,9 +41,7 @@ public final class HorseColors { // @formatter:off - // SORTFIELDS:ON - public static final DefaultedRegistryReference BLACK = HorseColors.key(ResourceKey.sponge("black")); public static final DefaultedRegistryReference BROWN = HorseColors.key(ResourceKey.sponge("brown")); @@ -59,9 +57,7 @@ public final class HorseColors { public static final DefaultedRegistryReference WHITE = HorseColors.key(ResourceKey.sponge("white")); // SORTFIELDS:OFF - // @formatter:on - private HorseColors() { } diff --git a/src/main/java/org/spongepowered/api/data/type/HorseStyles.java b/src/main/java/org/spongepowered/api/data/type/HorseStyles.java index d76452e363..7b4516f51f 100644 --- a/src/main/java/org/spongepowered/api/data/type/HorseStyles.java +++ b/src/main/java/org/spongepowered/api/data/type/HorseStyles.java @@ -41,23 +41,19 @@ public final class HorseStyles { // @formatter:off - // SORTFIELDS:ON - public static final DefaultedRegistryReference BLACK_DOTS = HorseStyles.key(ResourceKey.sponge("black_dots")); public static final DefaultedRegistryReference NONE = HorseStyles.key(ResourceKey.sponge("none")); public static final DefaultedRegistryReference WHITE = HorseStyles.key(ResourceKey.sponge("white")); - public static final DefaultedRegistryReference WHITE_FIELD = HorseStyles.key(ResourceKey.sponge("white_field")); - public static final DefaultedRegistryReference WHITE_DOTS = HorseStyles.key(ResourceKey.sponge("white_dots")); - // SORTFIELDS:OFF + public static final DefaultedRegistryReference WHITE_FIELD = HorseStyles.key(ResourceKey.sponge("white_field")); + // SORTFIELDS:OFF // @formatter:on - private HorseStyles() { } diff --git a/src/main/java/org/spongepowered/api/data/type/InstrumentTypes.java b/src/main/java/org/spongepowered/api/data/type/InstrumentTypes.java index 8addb97a11..24d933ea84 100644 --- a/src/main/java/org/spongepowered/api/data/type/InstrumentTypes.java +++ b/src/main/java/org/spongepowered/api/data/type/InstrumentTypes.java @@ -41,15 +41,13 @@ public final class InstrumentTypes { // @formatter:off - // SORTFIELDS:ON - public static final DefaultedRegistryReference BANJO = InstrumentTypes.key(ResourceKey.sponge("banjo")); - public static final DefaultedRegistryReference BASS = InstrumentTypes.key(ResourceKey.sponge("bass")); - public static final DefaultedRegistryReference BASE_DRUM = InstrumentTypes.key(ResourceKey.sponge("basedrum")); + public static final DefaultedRegistryReference BASS = InstrumentTypes.key(ResourceKey.sponge("bass")); + public static final DefaultedRegistryReference BELL = InstrumentTypes.key(ResourceKey.sponge("bell")); public static final DefaultedRegistryReference BIT = InstrumentTypes.key(ResourceKey.sponge("bit")); @@ -58,8 +56,14 @@ public final class InstrumentTypes { public static final DefaultedRegistryReference COW_BELL = InstrumentTypes.key(ResourceKey.sponge("cow_bell")); + public static final DefaultedRegistryReference CREEPER = InstrumentTypes.key(ResourceKey.sponge("creeper")); + + public static final DefaultedRegistryReference CUSTOM_HEAD = InstrumentTypes.key(ResourceKey.sponge("custom_head")); + public static final DefaultedRegistryReference DIDGERIDOO = InstrumentTypes.key(ResourceKey.sponge("didgeridoo")); + public static final DefaultedRegistryReference DRAGON = InstrumentTypes.key(ResourceKey.sponge("dragon")); + public static final DefaultedRegistryReference FLUTE = InstrumentTypes.key(ResourceKey.sponge("flute")); public static final DefaultedRegistryReference GUITAR = InstrumentTypes.key(ResourceKey.sponge("guitar")); @@ -70,16 +74,22 @@ public final class InstrumentTypes { public static final DefaultedRegistryReference IRON_XYLOPHONE = InstrumentTypes.key(ResourceKey.sponge("iron_xylophone")); + public static final DefaultedRegistryReference PIGLIN = InstrumentTypes.key(ResourceKey.sponge("piglin")); + public static final DefaultedRegistryReference PLING = InstrumentTypes.key(ResourceKey.sponge("pling")); + public static final DefaultedRegistryReference SKELETON = InstrumentTypes.key(ResourceKey.sponge("skeleton")); + public static final DefaultedRegistryReference SNARE = InstrumentTypes.key(ResourceKey.sponge("snare")); + public static final DefaultedRegistryReference WITHER_SKELETON = InstrumentTypes.key(ResourceKey.sponge("wither_skeleton")); + public static final DefaultedRegistryReference XYLOPHONE = InstrumentTypes.key(ResourceKey.sponge("xylophone")); - // SORTFIELDS:OFF + public static final DefaultedRegistryReference ZOMBIE = InstrumentTypes.key(ResourceKey.sponge("zombie")); + // SORTFIELDS:OFF // @formatter:on - private InstrumentTypes() { } diff --git a/src/main/java/org/spongepowered/api/data/type/TropicalFishShapes.java b/src/main/java/org/spongepowered/api/data/type/TropicalFishShapes.java index 290de413f9..3f5521cca3 100644 --- a/src/main/java/org/spongepowered/api/data/type/TropicalFishShapes.java +++ b/src/main/java/org/spongepowered/api/data/type/TropicalFishShapes.java @@ -42,9 +42,7 @@ public final class TropicalFishShapes { // @formatter:off - // SORTFIELDS:ON - public static final DefaultedRegistryReference BETTY = TropicalFishShapes.key(ResourceKey.sponge("betty")); public static final DefaultedRegistryReference BLOCKFISH = TropicalFishShapes.key(ResourceKey.sponge("blockfish")); @@ -70,9 +68,7 @@ public final class TropicalFishShapes { public static final DefaultedRegistryReference SUNSTREAK = TropicalFishShapes.key(ResourceKey.sponge("sunstreak")); // SORTFIELDS:OFF - // @formatter:on - private TropicalFishShapes() { } diff --git a/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java b/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java index cab740feb3..237f98db4d 100644 --- a/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java +++ b/src/main/java/org/spongepowered/api/tag/DamageTypeTags.java @@ -40,6 +40,8 @@ public final class DamageTypeTags { // @formatter:off public static final Tag ALWAYS_HURTS_ENDER_DRAGONS = DamageTypeTags.key(ResourceKey.minecraft("always_hurts_ender_dragons")); + public static final Tag ALWAYS_KILLS_ARMOR_STANDS = DamageTypeTags.key(ResourceKey.minecraft("always_kills_armor_stands")); + public static final Tag ALWAYS_MOST_SIGNIFICANT_FALL = DamageTypeTags.key(ResourceKey.minecraft("always_most_significant_fall")); public static final Tag ALWAYS_TRIGGERS_SILVERFISH = DamageTypeTags.key(ResourceKey.minecraft("always_triggers_silverfish")); diff --git a/src/main/java/org/spongepowered/api/world/gamerule/GameRules.java b/src/main/java/org/spongepowered/api/world/gamerule/GameRules.java index a474288e6a..7a382dd342 100644 --- a/src/main/java/org/spongepowered/api/world/gamerule/GameRules.java +++ b/src/main/java/org/spongepowered/api/world/gamerule/GameRules.java @@ -26,31 +26,6 @@ import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; -import org.spongepowered.api.block.BlockTypes; -import org.spongepowered.api.block.entity.CommandBlock; -import org.spongepowered.api.entity.living.Agent; -import org.spongepowered.api.entity.living.Bat; -import org.spongepowered.api.entity.living.animal.Rabbit; -import org.spongepowered.api.entity.living.animal.Sheep; -import org.spongepowered.api.entity.living.golem.SnowGolem; -import org.spongepowered.api.entity.living.monster.Creeper; -import org.spongepowered.api.entity.living.monster.Enderman; -import org.spongepowered.api.entity.living.monster.Ghast; -import org.spongepowered.api.entity.living.monster.Patroller; -import org.spongepowered.api.entity.living.monster.Phantom; -import org.spongepowered.api.entity.living.monster.Silverfish; -import org.spongepowered.api.entity.living.monster.boss.Wither; -import org.spongepowered.api.entity.living.monster.boss.dragon.EnderDragon; -import org.spongepowered.api.entity.living.monster.skeleton.Skeleton; -import org.spongepowered.api.entity.living.monster.zombie.Zombie; -import org.spongepowered.api.entity.living.monster.zombie.ZombifiedPiglin; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.living.player.gamemode.GameModes; -import org.spongepowered.api.entity.living.trader.Villager; -import org.spongepowered.api.entity.living.trader.WanderingTrader; -import org.spongepowered.api.entity.vehicle.Boat; -import org.spongepowered.api.entity.vehicle.minecart.MinecartLike; -import org.spongepowered.api.raid.Raid; import org.spongepowered.api.registry.DefaultedRegistryReference; import org.spongepowered.api.registry.Registry; import org.spongepowered.api.registry.RegistryKey; @@ -66,330 +41,101 @@ public final class GameRules { // @formatter:off - // SORTFIELDS:ON - - /** - * If advancements should be announced to the server. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> ANNOUNCE_ADVANCEMENTS = GameRules.key(ResourceKey.sponge("announce_advancements")); - /** - * Whether {@link CommandBlock}s should notify admins when - * they perform commands. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ + public static final DefaultedRegistryReference> BLOCK_EXPLOSION_DROP_DECAY = GameRules.key(ResourceKey.sponge("block_explosion_drop_decay")); + public static final DefaultedRegistryReference> COMMAND_BLOCK_OUTPUT = GameRules.key(ResourceKey.sponge("command_block_output")); - /** - * Whether the server should skip checking player speed when - * the player is wearing elytra. - * - *

This is a boolean game rule, with a default value of - * {@code false}.

- */ + public static final DefaultedRegistryReference> COMMAND_MODIFICATION_BLOCK_LIMIT = GameRules.key(ResourceKey.sponge("command_modification_block_limit")); + public static final DefaultedRegistryReference> DISABLE_ELYTRA_MOVEMENT_CHECK = GameRules.key(ResourceKey.sponge("disable_elytra_movement_check")); - /** - * Whether {@link Raid}s are disabled. - * - *

If the value of this game rule is {@code true}, all {@link Raid}s will stop. - * - *

This is a boolean game rule, with a default value of - * {@code false}.

- */ public static final DefaultedRegistryReference> DISABLE_RAIDS = GameRules.key(ResourceKey.sponge("disable_raids")); - /** - * Whether the day-night cycle and moon phases progress. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> DO_DAYLIGHT_CYCLE = GameRules.key(ResourceKey.sponge("do_daylight_cycle")); - /** - * Whether entities that are not mobs should have drops. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> DO_ENTITY_DROPS = GameRules.key(ResourceKey.sponge("do_entity_drops")); - /** - * Whether fire should spread and naturally extinguish. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> DO_FIRE_TICK = GameRules.key(ResourceKey.sponge("do_fire_tick")); - /** - * Whether {@link Phantom}s can spawn in the night-time. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ - public static final DefaultedRegistryReference> DO_INSOMNIA = GameRules.key(ResourceKey.sponge("do_insomnia")); - - /** - * Whether {@link Player}s should respawn immediately without showing the death screen. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> DO_IMMEDIATE_RESPAWN = GameRules.key(ResourceKey.sponge("do_immediate_respawn")); - /** - * Whether {@link Player}s can only craft recipes they have unlocked. - * - *

This is a boolean game rule, with a default value of - * {@code false}.

- */ + public static final DefaultedRegistryReference> DO_INSOMNIA = GameRules.key(ResourceKey.sponge("do_insomnia")); + public static final DefaultedRegistryReference> DO_LIMITED_CRAFTING = GameRules.key(ResourceKey.sponge("do_limited_crafting")); - /** - * Whether {@link Agent}s should drop items. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> DO_MOB_LOOT = GameRules.key(ResourceKey.sponge("do_mob_loot")); - /** - * Whether {@link Agent}s should naturally spawn. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> DO_MOB_SPAWNING = GameRules.key(ResourceKey.sponge("do_mob_spawning")); - /** - * Whether {@link Patroller patrollers} will go out on patrol (typically in a {@link Raid}. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> DO_PATROL_SPAWNING = GameRules.key(ResourceKey.sponge("do_patrol_spawning")); - /** - * Whether blocks should have drops. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> DO_TILE_DROPS = GameRules.key(ResourceKey.sponge("do_tile_drops")); - /** - * Whether {@link WanderingTrader traders} will naturally spawn. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> DO_TRADER_SPAWNING = GameRules.key(ResourceKey.sponge("do_trader_spawning")); - /** - * Whether the weather will change. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ + public static final DefaultedRegistryReference> DO_VINES_SPREAD = GameRules.key(ResourceKey.sponge("do_vines_spread")); + + public static final DefaultedRegistryReference> DO_WARDEN_SPAWNING = GameRules.key(ResourceKey.sponge("do_warden_spawning")); + public static final DefaultedRegistryReference> DO_WEATHER_CYCLE = GameRules.key(ResourceKey.sponge("do_weather_cycle")); - /** - * Whether entities should take drowning damage. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> DROWNING_DAMAGE = GameRules.key(ResourceKey.sponge("drowning_damage")); - /** - * Whether entities should take fall damage. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ + public static final DefaultedRegistryReference> ENDER_PEARLS_VANISH_ON_DEATH = GameRules.key(ResourceKey.sponge("ender_pearls_vanish_on_death")); + public static final DefaultedRegistryReference> FALL_DAMAGE = GameRules.key(ResourceKey.sponge("fall_damage")); - /** - * Whether entities should take fire damage. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> FIRE_DAMAGE = GameRules.key(ResourceKey.sponge("fire_damage")); - /** - * Makes angered neutral mobs stop being angry when the targeted player dies nearby. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> FORGIVE_DEAD_PLAYERS = GameRules.key(ResourceKey.sponge("forgive_dead_players")); - /** - * Whether entities should take freeze damage. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ public static final DefaultedRegistryReference> FREEZE_DAMAGE = GameRules.key(ResourceKey.sponge("freeze_damage")); - /** - * Whether {@link Player}s should keep items in their inventory - * after death. - * - *

This is a boolean game rule, with a default value of - * {@code false}.

- */ + public static final DefaultedRegistryReference> GLOBAL_SOUND_EVENTS = GameRules.key(ResourceKey.sponge("global_sound_events")); + public static final DefaultedRegistryReference> KEEP_INVENTORY = GameRules.key(ResourceKey.sponge("keep_inventory")); - /** - * Whether to log admin commands to server log. - * - *

This is a boolean game rule, with a default value of - * {@code true}.

- */ + public static final DefaultedRegistryReference> LAVA_SOURCE_CONVERSION = GameRules.key(ResourceKey.sponge("lava_source_conversion")); + public static final DefaultedRegistryReference> LOG_ADMIN_COMMANDS = GameRules.key(ResourceKey.sponge("log_admin_commands")); - /** - * The total number of {@link BlockTypes#CHAIN_COMMAND_BLOCK chain command - * blocks} that can run during a single tick. - * - *

This is a numerical game rule, with a default value - * of {@code 65536}.

- */ public static final DefaultedRegistryReference> MAX_COMMAND_CHAIN_LENGTH = GameRules.key(ResourceKey.sponge("max_command_chain_length")); - /** - * The maximum number of other pushable entities a mob or player can push, - * before taking 3 suffocation damage per half-second. - * - *

Damage affects {@link GameModes#SURVIVAL survival mode} or - * {@link GameModes#ADVENTURE adventure mode} {@link Player}s, and all - * mobs but bats. Pushable entities include non-spectator-mode - * {@link Player}, any mob except {@link Bat}s, as well as - * {@link Boat}s and {@link MinecartLike}.

- * - *

Setting to {@code 0} disables the rule.

- * - *

This is a numerical game rule, with a default value of {@code 24}.

- */ public static final DefaultedRegistryReference> MAX_ENTITY_CRAMMING = GameRules.key(ResourceKey.sponge("max_entity_cramming")); - /** - * Whether {@link Agent}s should be able to change blocks, and whether - * {@link Agent}s can pick up items. - * - *

In vanilla Minecraft, the following entities can change blocks when - * this game rule is {@code true}: - *

    - *
  • {@link Creeper}
  • - *
  • {@link Zombie}
  • - *
  • {@link Enderman}
  • - *
  • {@link Ghast}
  • - *
  • {@link Wither}
  • - *
  • {@link EnderDragon}
  • - *
  • {@link Rabbit}
  • - *
  • {@link Sheep}
  • - *
  • {@link Villager}
  • - *
  • {@link SnowGolem}
  • - *
  • {@link Silverfish}
  • - *
- * - *

In vanilla Minecraft, the following entities can pick up items when - * this game rule is {@code true}: - *

    - *
  • {@link Villager}
  • - *
  • {@link Zombie}
  • - *
  • {@link Skeleton}
  • - *
  • {@link ZombifiedPiglin}
  • - *
- * - *

This is a boolean game rule, with a default value of {@code true}.

- */ + public static final DefaultedRegistryReference> MOB_EXPLOSION_DROP_DECAY = GameRules.key(ResourceKey.sponge("mob_explosion_drop_decay")); + public static final DefaultedRegistryReference> MOB_GRIEFING = GameRules.key(ResourceKey.sponge("mob_griefing")); - /** - * Whether {@link Player}s can regenerate health naturally if their - * hunger is full enough (doesn't affect external healing, such as - * golden apples, the Regeneration effect, etc.). - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> NATURAL_REGENERATION = GameRules.key(ResourceKey.sponge("natural_regeneration")); - /** - * What percentage of players must sleep to skip the night. - * - *

This is a numerical game rule, with a default value of {@code 100}.

- */ public static final DefaultedRegistryReference> PLAYERS_SLEEPING_PERCENTAGE = GameRules.key(ResourceKey.sponge("players_sleeping_percentage")); - /** - * How often a random block tick occurs (such as plant growth, - * leaf decay, etc.) per chunk section per game tick. - * - *

0 will disable random ticks, higher numbers will increase random - * ticks

- * - *

This is a numerical game rule, with a default value of {@code 3}.

- */ public static final DefaultedRegistryReference> RANDOM_TICK_SPEED = GameRules.key(ResourceKey.sponge("random_tick_speed")); - /** - * Whether the debug screen shows all or reduced information. - * - *

This is a boolean game rule, with a default value of - * {@code false}.

- */ public static final DefaultedRegistryReference> REDUCED_DEBUG_INFO = GameRules.key(ResourceKey.sponge("reduced_debug_info")); - /** - * Whether the feedback from commands executed by a {@link Player} - * should show up in chat. - * - *

This game rule affects the default behavior of whether - * {@link CommandBlock}s store their output text.

- * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> SEND_COMMAND_FEEDBACK = GameRules.key(ResourceKey.sponge("send_command_feedback")); - /** - * Whether a message appears in chat when a {@link Player} dies. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> SHOW_DEATH_MESSAGES = GameRules.key(ResourceKey.sponge("show_death_messages")); - /** - * The number of blocks outward from the world spawn coordinates - * that a player will spawn in when first joining a server or when - * dying without a spawn point. - * - *

This is a numerical game rule, with a default value of {@code 10}.

- */ + public static final DefaultedRegistryReference> SNOW_ACCUMULATION_HEIGHT = GameRules.key(ResourceKey.sponge("snow_accumulation_height")); + public static final DefaultedRegistryReference> SPAWN_RADIUS = GameRules.key(ResourceKey.sponge("spawn_radius")); - /** - * Whether players in {@link GameModes#SPECTATOR spectator mode} can - * generate chunks. - * - *

This is a boolean game rule, with a default value of {@code true}.

- */ public static final DefaultedRegistryReference> SPECTATORS_GENERATE_CHUNKS = GameRules.key(ResourceKey.sponge("spectators_generate_chunks")); - /** - * Makes angered neutral mobs attack any nearby player, not just the player that angered them. - * - *

This is a boolean game rule, with a default value of - * {@code false}.

- */ + public static final DefaultedRegistryReference> TNT_EXPLOSION_DROP_DECAY = GameRules.key(ResourceKey.sponge("tnt_explosion_drop_decay")); + public static final DefaultedRegistryReference> UNIVERSAL_ANGER = GameRules.key(ResourceKey.sponge("universal_anger")); - // SORTFIELDS:OFF + public static final DefaultedRegistryReference> WATER_SOURCE_CONVERSION = GameRules.key(ResourceKey.sponge("water_source_conversion")); + // SORTFIELDS:OFF // @formatter:on - private GameRules() { } From 177cd806687c0a12121ef405066abb5e7650cf1a Mon Sep 17 00:00:00 2001 From: Morpheus Date: Sun, 12 Nov 2023 12:21:15 +0000 Subject: [PATCH 11/23] Bump to gradle 8.4 (#2471) * Bump to gradle 8.4 * Bump to gradle 8.4 * Bump gradle wrapper --- build.gradle.kts | 12 +++++----- gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 3 ++- gradlew | 29 +++++++++++++---------- settings.gradle.kts | 6 ++--- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 900da820a2..de7d56c87e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -64,14 +64,14 @@ dependencies { // Dependency injection api("com.google.inject:guice:5.0.1") { - exclude(group ="com.google.code.findbugs", module = "jsr305") // We don't want to use jsr305, use checkerframework + exclude(group = "com.google.code.findbugs", module = "jsr305") // We don't want to use jsr305, use checkerframework exclude(group = "javax.inject", module = "javax.inject") exclude(group = "com.google.guava", module = "guava") // We use an older version than Guice does } // High performance cache + guava - shaded guava api("com.github.ben-manes.caffeine:caffeine:$caffeineVersion") { - exclude(group= "org.checkerframework", module = "checker-qual") + exclude(group = "org.checkerframework", module = "checker-qual") exclude(group = "com.google.errorprone", module = "error_prone_annotations") } @@ -85,17 +85,17 @@ dependencies { } api("org.spongepowered:configurate-hocon") { exclude(group = "org.spongepowered", module = "configurate-core") - exclude(group= "org.checkerframework", module = "checker-qual") + exclude(group = "org.checkerframework", module = "checker-qual") } api("org.spongepowered:configurate-gson") { exclude(group = "org.spongepowered", module = "configurate-core") exclude(group = "com.google.code.gson", module = "gson") // We have the same version technically, but use the gson we provide. - exclude(group= "org.checkerframework", module = "checker-qual") + exclude(group = "org.checkerframework", module = "checker-qual") } api("org.spongepowered:configurate-yaml") { exclude(group = "org.spongepowered", module = "configurate-core") - exclude(group= "org.checkerframework", module = "checker-qual") + exclude(group = "org.checkerframework", module = "checker-qual") } api("org.spongepowered:configurate-extra-guice") { exclude(group = "com.google.inject", module = "guice") @@ -241,7 +241,7 @@ indra { checkstyle(checkstyleVersion) configurePublications { - artifactId = project.name.toLowerCase() + artifactId = project.name.lowercase() pom { this.url.set(projectUrl) this.description.set(projectDescription) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa754578e88a3dae77fce6e3dea56edbf..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 41154 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%0DEqyP8OADCy^l*0 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f398c33c4b..3fa8f862f7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 65dcd68d65..1aa94a4269 100755 --- a/gradlew +++ b/gradlew @@ -83,10 +83,8 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,10 +131,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/settings.gradle.kts b/settings.gradle.kts index 6765aa5f08..e698cafef5 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,11 +7,11 @@ pluginManagement { } } plugins { - val indraVersion = "3.0.1" + val indraVersion = "3.1.3" id("org.spongepowered.gradle.event-impl-gen") version "7.0.0" id("org.spongepowered.gradle.sponge.dev") version "2.1.1" id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" - id("net.ltgt.errorprone") version "3.0.1" + id("net.ltgt.errorprone") version "3.1.0" id("net.kyori.indra.publishing") version indraVersion id("net.kyori.indra.publishing.sonatype") version indraVersion id("net.kyori.indra.checkstyle") version indraVersion @@ -19,5 +19,5 @@ pluginManagement { } } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version ("0.3.0") + id("org.gradle.toolchains.foojay-resolver-convention") version ("0.7.0") } From 925b9321c41406d8bbc5a5e7c786ace574811e11 Mon Sep 17 00:00:00 2001 From: Morpheus Date: Sun, 12 Nov 2023 16:02:04 +0000 Subject: [PATCH 12/23] Stop marking sniffer as experimental api (#2474) --- src/main/java/org/spongepowered/api/entity/EntityTypes.java | 2 -- .../org/spongepowered/api/entity/living/animal/Sniffer.java | 5 ----- 2 files changed, 7 deletions(-) diff --git a/src/main/java/org/spongepowered/api/entity/EntityTypes.java b/src/main/java/org/spongepowered/api/entity/EntityTypes.java index ce9576e020..748a9d07d1 100644 --- a/src/main/java/org/spongepowered/api/entity/EntityTypes.java +++ b/src/main/java/org/spongepowered/api/entity/EntityTypes.java @@ -150,7 +150,6 @@ import org.spongepowered.api.registry.RegistryScope; import org.spongepowered.api.registry.RegistryScopes; import org.spongepowered.api.registry.RegistryTypes; -import org.spongepowered.api.util.annotation.Experimental; @SuppressWarnings("unused") @RegistryScopes(scopes = RegistryScope.GAME) @@ -344,7 +343,6 @@ public final class EntityTypes { public static final DefaultedRegistryReference> SMALL_FIREBALL = EntityTypes.key(ResourceKey.minecraft("small_fireball")); - @Experimental("update_1_20") public static final DefaultedRegistryReference> SNIFFER = EntityTypes.key(ResourceKey.minecraft("sniffer")); public static final DefaultedRegistryReference> SNOWBALL = EntityTypes.key(ResourceKey.minecraft("snowball")); diff --git a/src/main/java/org/spongepowered/api/entity/living/animal/Sniffer.java b/src/main/java/org/spongepowered/api/entity/living/animal/Sniffer.java index d184a21e47..ab937f6665 100644 --- a/src/main/java/org/spongepowered/api/entity/living/animal/Sniffer.java +++ b/src/main/java/org/spongepowered/api/entity/living/animal/Sniffer.java @@ -24,11 +24,6 @@ */ package org.spongepowered.api.entity.living.animal; -import org.jetbrains.annotations.ApiStatus; -import org.spongepowered.api.util.annotation.Experimental; - -@ApiStatus.Experimental -@Experimental("update_1_20") public interface Sniffer extends Animal { } From 8892083dc834fa20fa02a088cc0bfd7eb4e58604 Mon Sep 17 00:00:00 2001 From: Morpheus Date: Sun, 12 Nov 2023 16:03:01 +0000 Subject: [PATCH 13/23] Fix dependency conflicts (#2473) --- build.gradle.kts | 22 +++++++++++++++++++--- gradle.properties | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index de7d56c87e..b317fa2594 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { val junitVersion: String by project val mockitoVersion: String by project val pluginSpiVersion: String by project + val checkerVersion: String by project // Directly tied to what's available from Minecraft api("org.apache.logging.log4j:log4j-api:$log4jVersion") @@ -47,7 +48,9 @@ dependencies { // Adventure api(platform("net.kyori:adventure-bom:$adventureVersion")) - api("net.kyori:adventure-api") + api("net.kyori:adventure-api") { + exclude(group = "org.jetbrains", module = "annotations") + } api("net.kyori:adventure-text-serializer-gson") { exclude(group = "com.google.code.gson", module = "gson") exclude(group = "net.kyori", module = "adventure-api") @@ -67,16 +70,25 @@ dependencies { exclude(group = "com.google.code.findbugs", module = "jsr305") // We don't want to use jsr305, use checkerframework exclude(group = "javax.inject", module = "javax.inject") exclude(group = "com.google.guava", module = "guava") // We use an older version than Guice does + exclude(group = "org.ow2.asm", module = "asm") } // High performance cache + guava - shaded guava api("com.github.ben-manes.caffeine:caffeine:$caffeineVersion") { exclude(group = "org.checkerframework", module = "checker-qual") exclude(group = "com.google.errorprone", module = "error_prone_annotations") + exclude(group = "org.junit", module = "junit-bom") + exclude(group = "org.yaml", module = "snakeyaml") + exclude(group = "com.fasterxml.jackson", module = "jackson-bom") + exclude(group = "org.ow2.asm", module = "asm-bom") } // Plugin spi, includes plugin-meta - api("org.spongepowered:plugin-spi:$pluginSpiVersion") + api("org.spongepowered:plugin-spi:$pluginSpiVersion") { + exclude(group = "org.checkerframework", module = "checker-qual") + exclude(group = "com.google.code.gson", module = "gson") + exclude(group = "org.apache.logging.log4j", module = "log4j-api") + } // Configurate api(platform("org.spongepowered:configurate-bom:$configurateVersion")) @@ -106,7 +118,11 @@ dependencies { errorprone("com.google.errorprone:error_prone_core:$errorproneVersion") // Math library - api("org.spongepowered:math:$mathVersion") + api("org.spongepowered:math:$mathVersion") { + exclude(group = "com.google.errorprone", module = "error_prone_annotations") + } + + compileOnlyApi("org.checkerframework:checker-qual:$checkerVersion") testImplementation(platform("org.junit:junit-bom:$junitVersion")) testImplementation("org.junit.jupiter:junit-jupiter-api") diff --git a/gradle.properties b/gradle.properties index 86296d79aa..edd3e7c936 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,3 +20,4 @@ log4jVersion=2.19.0 mathVersion=2.0.1 mockitoVersion=4.8.0 pluginSpiVersion=0.3.0 +checkerVersion=3.26.0 From 06b6318daa44629a02640ca94bb17f0b0b084c0a Mon Sep 17 00:00:00 2001 From: Morpheus Date: Sun, 12 Nov 2023 16:05:17 +0000 Subject: [PATCH 14/23] Fix errorprone warnings and remove printstacktrace (#2475) --- .../org/spongepowered/api/data/DataManipulator.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/spongepowered/api/data/DataManipulator.java b/src/main/java/org/spongepowered/api/data/DataManipulator.java index 950f9f37a5..05254bc457 100644 --- a/src/main/java/org/spongepowered/api/data/DataManipulator.java +++ b/src/main/java/org/spongepowered/api/data/DataManipulator.java @@ -496,11 +496,7 @@ default Mutable set(final Value value) { */ default Mutable set(final Value... values) { for (final Value value : Objects.requireNonNull(values)) { - try { - this.set(Objects.requireNonNull(value, "A null value was provided!")); - } catch (final IllegalArgumentException e) { - e.printStackTrace(); - } + this.set(Objects.requireNonNull(value, "A null value was provided!")); } return this; } @@ -518,11 +514,7 @@ default Mutable set(final Value... values) { */ default Mutable set(final Iterable> values) { for (final Value value : Objects.requireNonNull(values)) { - try { - this.set(Objects.requireNonNull(value, "A null value was provided!")); - } catch (final IllegalArgumentException e) { - e.printStackTrace(); - } + this.set(Objects.requireNonNull(value, "A null value was provided!")); } return this; } From fe7d8de923aa9327469cfe010bcb9cd7ebb90acd Mon Sep 17 00:00:00 2001 From: Morpheus Date: Sun, 12 Nov 2023 16:05:29 +0000 Subject: [PATCH 15/23] Bump additional dependencies (#2476) --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index edd3e7c936..19f319e283 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,10 +9,10 @@ javadocPublishRoot=https://jd.spongepowered.org/ org.gradle.parallel=true adventureVersion=4.12.0 -caffeineVersion=3.1.2 -checkstyleVersion=10.5.0 +caffeineVersion=3.1.8 +checkstyleVersion=10.12.4 configurateVersion=4.1.2 -errorproneVersion=2.16 +errorproneVersion=2.23.0 gsonVersion=2.10.1 junitVersion=5.9.1 log4jVersion=2.19.0 From f578181b04ae1f908a2a6ada21fcf74378414407 Mon Sep 17 00:00:00 2001 From: Morpheus Date: Fri, 17 Nov 2023 21:59:52 +0000 Subject: [PATCH 16/23] Add missing particle options (#2477) --- .../api/effect/particle/ParticleOptions.java | 72 ++++++++++--------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/spongepowered/api/effect/particle/ParticleOptions.java b/src/main/java/org/spongepowered/api/effect/particle/ParticleOptions.java index 924d98524d..f7debab78e 100644 --- a/src/main/java/org/spongepowered/api/effect/particle/ParticleOptions.java +++ b/src/main/java/org/spongepowered/api/effect/particle/ParticleOptions.java @@ -37,6 +37,7 @@ import org.spongepowered.api.registry.RegistryTypes; import org.spongepowered.api.util.Color; import org.spongepowered.api.util.Direction; +import org.spongepowered.api.util.Ticks; import org.spongepowered.math.vector.Vector3d; /** @@ -74,21 +75,21 @@ public final class ParticleOptions { */ public static final DefaultedRegistryReference> COLOR = ParticleOptions.key(ResourceKey.sponge("color")); + /** + * This option will affect the delay of particles that are spawned. + * The only vanilla {@link ParticleType}s this option isn't applicable to are: + * + *
    + *
  • {@link ParticleTypes#SHRIEK}
  • + *
+ */ + public static final DefaultedRegistryReference> DELAY = ParticleOptions.key(ResourceKey.sponge("delay")); + /** * This option will change the direction of a particle. */ public static final DefaultedRegistryReference> DIRECTION = ParticleOptions.key(ResourceKey.sponge("direction")); -// /** TODO -// * This option will modify the color of a particle. The only vanilla -// * {@link ParticleType}s this option is applicable to is -// * {@link ParticleTypes#FIREWORKS}. -// * -// *

The {@link List} may never be empty. Or a {@link IllegalArgumentException} -// * will be thrown when applying.

-// */ -// public static final Supplier>> FIREWORK_EFFECTS = Sponge.getRegistry().getCatalogRegistry().provideSupplier(ParticleOption.class, "firework_effects"); - /** * This option will affect the appearance of a particle. The only vanilla * {@link ParticleType} this option is applicable to are: @@ -101,13 +102,6 @@ public final class ParticleOptions { */ public static final DefaultedRegistryReference> ITEM_STACK_SNAPSHOT = ParticleOptions.key(ResourceKey.sponge("item_stack_snapshot")); -// /** TODO -// * This option will affect the appearance of a particle. The only vanilla -// * {@link ParticleType} this option is applicable to is -// * {@link ParticleTypes#NOTE}. -// */ -// public static final Supplier> NOTE = Sponge.getRegistry().getCatalogRegistry().provideSupplier(ParticleOption.class, "note"); - /** * This option will affect how all the particles are spread. */ @@ -134,6 +128,16 @@ public final class ParticleOptions { */ public static final DefaultedRegistryReference> QUANTITY = ParticleOptions.key(ResourceKey.sponge("quantity")); + /** + * This option will change the roll of a particle. The only + * vanilla {@link ParticleType}s this option is applicable to is: + * + *
    + *
  • {@link ParticleTypes#SCULK_CHARGE}
  • + *
+ */ + public static final DefaultedRegistryReference> ROLL = ParticleOptions.key(ResourceKey.sponge("roll")); + /** * This option will change the scale of a particle. The only * vanilla {@link ParticleType}s this option is applicable to is: @@ -147,21 +151,25 @@ public final class ParticleOptions { */ public static final DefaultedRegistryReference> SCALE = ParticleOptions.key(ResourceKey.sponge("scale")); -// /** TODO -// * This option will affect whether a particle type will have a lower -// * velocity in the horizontal plane. The only vanilla {@link ParticleType}s -// * that this option will affect are: -// * -// *
    -// *
  • {@link ParticleTypes#EFFECT}
  • -// *
  • {@link ParticleTypes#INSTANT_EFFECT}
  • -// *
  • {@link ParticleTypes#WITCH_MAGIC}
  • -// *
-// * -// *

These particle types don't have a configurable velocity (through -// * {@link #VELOCITY}) in the horizontal plane.

-// */ -// public static final Supplier> SLOW_HORIZONTAL_VELOCITY = Sponge.getRegistry().getCatalogRegistry().provideSupplier(ParticleOption.class, "slow_horizontal_velocity"); + /** + * This option will change the color the transition particle will change to. + * The only vanilla {@link ParticleType}s this option is applicable to is: + * + *
    + *
  • {@link ParticleTypes#DUST_COLOR_TRANSITION}
  • + *
+ */ + public static final DefaultedRegistryReference> TO_COLOR = ParticleOptions.key(ResourceKey.sponge("to_color")); + + /** + * This option will change the travel time of a particle. + * The only vanilla {@link ParticleType}s this option is applicable to is: + * + *
    + *
  • {@link ParticleTypes#VIBRATION}
  • + *
+ */ + public static final DefaultedRegistryReference> TRAVEL_TIME = ParticleOptions.key(ResourceKey.sponge("travel_time")); /** * This option will affect how most particles are moving. From 3141631cd630641db336b5abdb49364b85b587c1 Mon Sep 17 00:00:00 2001 From: Morpheus Date: Sat, 18 Nov 2023 14:06:54 +0000 Subject: [PATCH 17/23] Allow negative amplifiers in potion effects (#2478) --- .../spongepowered/api/effect/potion/PotionEffect.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/spongepowered/api/effect/potion/PotionEffect.java b/src/main/java/org/spongepowered/api/effect/potion/PotionEffect.java index 2b83756d6e..350a9d0cea 100644 --- a/src/main/java/org/spongepowered/api/effect/potion/PotionEffect.java +++ b/src/main/java/org/spongepowered/api/effect/potion/PotionEffect.java @@ -61,7 +61,7 @@ static Builder builder() { * @param amplifier The zero-indexed amplifier * @param duration The duration in ticks * @return The potion effect - * @throws IllegalArgumentException If the amplifier is negative or the duration is not positive + * @throws IllegalArgumentException If the duration is not positive */ static PotionEffect of(final PotionEffectType type, final int amplifier, final Ticks duration) throws IllegalArgumentException { return PotionEffect.builder().potionType(type).amplifier(amplifier).duration(duration).build(); @@ -76,7 +76,7 @@ static PotionEffect of(final PotionEffectType type, final int amplifier, final T * @param amplifier The amplifier * @param duration The duration in ticks * @return The potion effect - * @throws IllegalArgumentException If the amplifier is negative or the duration is not positive + * @throws IllegalArgumentException If the duration is not positive */ static PotionEffect of(final Supplier type, final int amplifier, final Ticks duration) throws IllegalArgumentException { return PotionEffect.builder().potionType(type).amplifier(amplifier).duration(duration).build(); @@ -172,15 +172,14 @@ default Builder potionType(final Supplier potionEffe /** * Sets the amplifier power of the potion effect. * - *

Amplifiers must be greater than or equal to zero. See + *

See * {@link #amplifier()} for an explanation of what the amplifier means. *

* * @param amplifier The amplifier power * @return This builder, for chaining - * @throws IllegalArgumentException If the amplifier is less than zero */ - Builder amplifier(int amplifier) throws IllegalArgumentException; + Builder amplifier(int amplifier); /** * Sets whether the potion effect is ambient. From ac8aa2bce2b5594af257f0a239368ec525ce0d86 Mon Sep 17 00:00:00 2001 From: aromaa Date: Fri, 8 Dec 2023 01:30:40 +0200 Subject: [PATCH 18/23] Add DataHolder.Mutable to chunk --- .../java/org/spongepowered/api/world/chunk/WorldChunk.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/spongepowered/api/world/chunk/WorldChunk.java b/src/main/java/org/spongepowered/api/world/chunk/WorldChunk.java index aad9e76be6..884afd26a6 100644 --- a/src/main/java/org/spongepowered/api/world/chunk/WorldChunk.java +++ b/src/main/java/org/spongepowered/api/world/chunk/WorldChunk.java @@ -25,6 +25,7 @@ package org.spongepowered.api.world.chunk; import org.spongepowered.api.Sponge; +import org.spongepowered.api.data.DataHolder; import org.spongepowered.api.util.Direction; import org.spongepowered.api.world.World; import org.spongepowered.api.world.volume.block.PhysicsAwareMutableBlockVolume; @@ -39,7 +40,7 @@ *

In Minecraft, the chunk is 16 by 16 blocks on the X and Z axes. The height * of each chunk varies between worlds.

*/ -public interface WorldChunk extends Chunk, EntityVolume.Modifiable, PhysicsAwareMutableBlockVolume { +public interface WorldChunk extends Chunk, EntityVolume.Modifiable, PhysicsAwareMutableBlockVolume, DataHolder.Mutable { /** * Gets the world the chunk is in. From 92619ec8919f18bfd083c295a972c4cdeceb0e43 Mon Sep 17 00:00:00 2001 From: zml Date: Sat, 27 Jan 2024 09:30:57 -0800 Subject: [PATCH 19/23] Build cleanup (#2482) * chore(build): bump gradle plugins, add junit launcher to resolve some deprecations * chore(build): Move to using version catalogs for dependencies * chore(build): remove duplicated repository declaration * chore(build): Clean up idea-ext blocks * chore(deps): Bump misc dependencies * chore(build): Silence some warnings from Adventure references * chore(build): Resolve remaining deprecation warnings * chore(build): break out idea-ext version for impl use * chore(build): Bump foojay plugin version * chore(build): Declare our Java target in one central place --- build.gradle.kts | 136 ++++++++++++++++++-------------------- gradle.properties | 15 +---- gradle/libs.versions.toml | 67 +++++++++++++++++++ settings.gradle.kts | 19 ++---- 4 files changed, 138 insertions(+), 99 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/build.gradle.kts b/build.gradle.kts index b317fa2594..6eb9da096e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,72 +1,65 @@ import net.ltgt.gradle.errorprone.errorprone +import org.jetbrains.gradle.ext.delegateActions +import org.jetbrains.gradle.ext.settings +import org.jetbrains.gradle.ext.taskTriggers buildscript { dependencies { - classpath("fr.inria.gforge.spoon:spoon-core:10.2.0") // bump for EIG + classpath(libs.spoon) // bump for EIG } } plugins { eclipse - id("org.spongepowered.gradle.sponge.dev") - id("net.kyori.indra.checkstyle") - id("net.kyori.indra.crossdoc") - id("net.kyori.indra.publishing") - id("net.kyori.indra.publishing.sonatype") - id("org.spongepowered.gradle.event-impl-gen") - id("org.jetbrains.gradle.plugin.idea-ext") - id("net.ltgt.errorprone") -} - -repositories { - maven("https://repo.spongepowered.org/repository/maven-public/") { - name = "sponge" - } + alias(libs.plugins.spongeGradle.convention) + alias(libs.plugins.indra.checkstyle) + alias(libs.plugins.indra.crossdoc) + alias(libs.plugins.indra.publishing) + alias(libs.plugins.indra.publishing.sonatype) + alias(libs.plugins.eventImplGen) + alias(libs.plugins.ideaExt) + alias(libs.plugins.errorprone) + alias(libs.plugins.nexusPublish) } +val javaTarget: String by project val ap by sourceSets.registering { compileClasspath += sourceSets.main.get().compileClasspath + sourceSets.main.get().output } +configurations { + sequenceOf(apiElements, runtimeElements).forEach { + it.configure { + exclude(group = "org.jetbrains", module = "annotations") + } + } +} + // Project dependencies -val adventureVersion: String by project -val configurateVersion: String by project -val gsonVersion: String by project -val log4jVersion: String by project -val mathVersion: String by project dependencies { - val caffeineVersion: String by project - val errorproneVersion: String by project - val junitVersion: String by project - val mockitoVersion: String by project - val pluginSpiVersion: String by project - val checkerVersion: String by project - // Directly tied to what's available from Minecraft - api("org.apache.logging.log4j:log4j-api:$log4jVersion") - api("com.google.code.gson:gson:$gsonVersion") + api(libs.log4j.api) + api(libs.gson) // Adventure - api(platform("net.kyori:adventure-bom:$adventureVersion")) - api("net.kyori:adventure-api") { - exclude(group = "org.jetbrains", module = "annotations") - } - api("net.kyori:adventure-text-serializer-gson") { + api(platform(libs.adventure.bom)) + api(libs.adventure.api) + api(libs.adventure.textSerializer.gson) { exclude(group = "com.google.code.gson", module = "gson") exclude(group = "net.kyori", module = "adventure-api") } - api("net.kyori:adventure-text-serializer-legacy") { + api(libs.adventure.textSerializer.legacy) { exclude(group = "net.kyori", module = "adventure-api") } - api("net.kyori:adventure-text-serializer-plain") { + api(libs.adventure.textSerializer.plain) { exclude(group = "net.kyori", module = "adventure-api") } - api("net.kyori:adventure-text-minimessage") { + api(libs.adventure.minimessage) { exclude(group = "net.kyori", module = "adventure-api") } // Dependency injection - api("com.google.inject:guice:5.0.1") { + api(libs.guice) { exclude(group = "com.google.code.findbugs", module = "jsr305") // We don't want to use jsr305, use checkerframework exclude(group = "javax.inject", module = "javax.inject") exclude(group = "com.google.guava", module = "guava") // We use an older version than Guice does @@ -74,7 +67,7 @@ dependencies { } // High performance cache + guava - shaded guava - api("com.github.ben-manes.caffeine:caffeine:$caffeineVersion") { + api(libs.caffeine) { exclude(group = "org.checkerframework", module = "checker-qual") exclude(group = "com.google.errorprone", module = "error_prone_annotations") exclude(group = "org.junit", module = "junit-bom") @@ -84,58 +77,59 @@ dependencies { } // Plugin spi, includes plugin-meta - api("org.spongepowered:plugin-spi:$pluginSpiVersion") { + api(libs.pluginSpi) { exclude(group = "org.checkerframework", module = "checker-qual") exclude(group = "com.google.code.gson", module = "gson") exclude(group = "org.apache.logging.log4j", module = "log4j-api") } // Configurate - api(platform("org.spongepowered:configurate-bom:$configurateVersion")) - api("org.spongepowered:configurate-core") { + api(platform(libs.configurate.bom)) + api(libs.configurate.core) { exclude(group = "org.checkerframework", module = "checker-qual") // We use our own version } - api("org.spongepowered:configurate-hocon") { + api(libs.configurate.hocon) { exclude(group = "org.spongepowered", module = "configurate-core") exclude(group = "org.checkerframework", module = "checker-qual") } - api("org.spongepowered:configurate-gson") { + api(libs.configurate.gson) { exclude(group = "org.spongepowered", module = "configurate-core") exclude(group = "com.google.code.gson", module = "gson") // We have the same version technically, but use the gson we provide. exclude(group = "org.checkerframework", module = "checker-qual") } - api("org.spongepowered:configurate-yaml") { + api(libs.configurate.yaml) { exclude(group = "org.spongepowered", module = "configurate-core") exclude(group = "org.checkerframework", module = "checker-qual") } - api("org.spongepowered:configurate-extra-guice") { + api(libs.configurate.extraGuice) { exclude(group = "com.google.inject", module = "guice") } // Compile-time static analysis - compileOnly("com.google.errorprone:error_prone_annotations:$errorproneVersion") - errorprone("com.google.errorprone:error_prone_core:$errorproneVersion") + compileOnly(libs.errorprone.annotations) + errorprone(libs.errorprone) // Math library - api("org.spongepowered:math:$mathVersion") { + api(libs.math) { exclude(group = "com.google.errorprone", module = "error_prone_annotations") } - compileOnlyApi("org.checkerframework:checker-qual:$checkerVersion") + compileOnlyApi(libs.checkerQual) - testImplementation(platform("org.junit:junit-bom:$junitVersion")) - testImplementation("org.junit.jupiter:junit-jupiter-api") - testImplementation("org.junit.jupiter:junit-jupiter-params") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") - testImplementation("org.hamcrest:hamcrest:2.2") - testImplementation("org.mockito:mockito-core:$mockitoVersion") + testImplementation(platform(libs.junit.bom)) + testImplementation(libs.junit.api) + testImplementation(libs.junit.params) + testRuntimeOnly(libs.junit.engine) + testRuntimeOnly(libs.junit.launcher) + testImplementation(libs.hamcrest) + testImplementation(libs.mockito) } tasks { genEventImpl { - sourceCompatibility = "16" - destinationDir = project.layout.buildDirectory.dir("generated/event-factory").get().asFile + sourceCompatibility = javaTarget + destinationDirectory = project.layout.buildDirectory.dir("generated/event-factory") outputFactory = "org.spongepowered.api.event.SpongeEventFactory" include("org/spongepowered/api/event/*/**/*") @@ -180,14 +174,14 @@ tasks { options { (this as? StandardJavadocDocletOptions)?.apply { links( - "https://logging.apache.org/log4j/log4j-$log4jVersion/log4j-api/apidocs/", - "https://google.github.io/guice/api-docs/5.0.1/javadoc/", - "https://configurate.aoeu.xyz/$configurateVersion/apidocs/", - "https://www.javadoc.io/doc/com.google.code.gson/gson/$gsonVersion/", - "https://jd.spongepowered.org/math/$mathVersion" + "https://logging.apache.org/log4j/log4j-${libs.versions.log4j.get()}/log4j-api/apidocs/", + "https://google.github.io/guice/api-docs/${libs.versions.guice.get()}/javadoc/", + "https://configurate.aoeu.xyz/${libs.versions.configurate.get()}/apidocs/", + "https://www.javadoc.io/doc/com.google.code.gson/gson/${libs.versions.gson.get()}/", + "https://jd.spongepowered.org/math/${libs.versions.math.get()}" ) sequenceOf("api", "key", "text-serializer-gson", "text-serializer-legacy", "text-serializer-plain").forEach { - links("https://jd.advntr.dev/$it/$adventureVersion/") + links("https://jd.advntr.dev/$it/${libs.versions.adventure.get()}/") } addBooleanOption("quiet", true) } @@ -212,14 +206,12 @@ tasks { idea { if (project != null) { - (project as ExtensionAware).extensions["settings"].run { - require(this is ExtensionAware) - - this.extensions.getByType(org.jetbrains.gradle.ext.ActionDelegationConfig::class).run { + project.settings.run { + delegateActions { delegateBuildRunToGradle = false testRunner = org.jetbrains.gradle.ext.ActionDelegationConfig.TestRunner.PLATFORM } - this.extensions.getByType(org.jetbrains.gradle.ext.TaskTriggersConfig::class).run { + taskTriggers { beforeBuild(tasks.genEventImpl) } } @@ -249,12 +241,10 @@ spongeConvention { } indra { - val checkstyleVersion: String by project - javaVersions { - target(17) + target(javaTarget.toInt()) } - checkstyle(checkstyleVersion) + checkstyle(libs.versions.checkstyle.get()) configurePublications { artifactId = project.name.lowercase() diff --git a/gradle.properties b/gradle.properties index 19f319e283..969e73ca4f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,21 +3,8 @@ version=11.0.0-SNAPSHOT organization=SpongePowered projectUrl=https://www.spongepowered.org projectDescription=A plugin API for Minecraft: Java Edition +javaTarget=17 javadocPublishRoot=https://jd.spongepowered.org/ org.gradle.parallel=true - -adventureVersion=4.12.0 -caffeineVersion=3.1.8 -checkstyleVersion=10.12.4 -configurateVersion=4.1.2 -errorproneVersion=2.23.0 -gsonVersion=2.10.1 -junitVersion=5.9.1 -log4jVersion=2.19.0 - -mathVersion=2.0.1 -mockitoVersion=4.8.0 -pluginSpiVersion=0.3.0 -checkerVersion=3.26.0 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000000..3c4d734882 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,67 @@ +[metadata] +format = { version = "1.1" } + +[versions] +adventure = "4.12.0" +caffeine = "3.1.8" +checker = "3.42.0" +checkstyle = "10.12.7" +configurate = "4.1.2" +errorprone = "2.24.1" +gson = "2.10.1" +guice = "5.0.1" +ideaExt = "1.1.7" +indra = "3.1.3" +junit = "5.10.1" +log4j = "2.19.0" +math = "2.0.1" +mockito = "5.9.0" +pluginSpi = "0.3.0" + +[libraries] +adventure-bom = { module = "net.kyori:adventure-bom", version.ref = "adventure" } +adventure-api = { module = "net.kyori:adventure-api" } +adventure-textSerializer-gson = { module = "net.kyori:adventure-text-serializer-gson" } +adventure-textSerializer-legacy = { module = "net.kyori:adventure-text-serializer-legacy" } +adventure-textSerializer-plain = { module = "net.kyori:adventure-text-serializer-plain" } +adventure-minimessage = { module = "net.kyori:adventure-text-minimessage" } +caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "caffeine" } +configurate-bom = { module = "org.spongepowered:configurate-bom", version.ref = "configurate" } +configurate-core = { module = "org.spongepowered:configurate-core" } +configurate-hocon = { module = "org.spongepowered:configurate-hocon" } +configurate-gson = { module = "org.spongepowered:configurate-gson" } +configurate-yaml = { module = "org.spongepowered:configurate-yaml" } +configurate-extraGuice = { module = "org.spongepowered:configurate-extra-guice" } +gson = { module = "com.google.code.gson:gson", version.ref = "gson" } +guice = { module = "com.google.inject:guice", version.ref = "guice" } +log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } +math = { module = "org.spongepowered:math", version.ref = "math" } +pluginSpi = { module = "org.spongepowered:plugin-spi", version.ref = "pluginSpi" } + +# build-time/annotations + +checkerQual = { module = "org.checkerframework:checker-qual", version.ref = "checker" } +errorprone = { module = "com.google.errorprone:error_prone_core", version.ref = "errorprone" } +errorprone-annotations = { module = "com.google.errorprone:error_prone_annotations", version.ref = "errorprone" } +spoon = { module = "fr.inria.gforge.spoon:spoon-core", version = "10.4.2" } # bump for EIG + +# testing + +hamcrest = { module = "org.hamcrest:hamcrest", version = "2.2" } +junit-bom = { module = "org.junit:junit-bom", version.ref = "junit" } +junit-api = { module = "org.junit.jupiter:junit-jupiter-api" } +junit-params = { module = "org.junit.jupiter:junit-jupiter-params" } +junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine" } +junit-launcher = { module = "org.junit.platform:junit-platform-launcher" } +mockito = { module = "org.mockito:mockito-core", version.ref = "mockito" } + +[plugins] +errorprone = { id = "net.ltgt.errorprone", version = "3.1.0" } +eventImplGen = { id = "org.spongepowered.gradle.event-impl-gen", version = "7.1.0" } +ideaExt = { id = "org.jetbrains.gradle.plugin.idea-ext", version.ref = "ideaExt" } +indra-checkstyle = { id = "net.kyori.indra.checkstyle", version.ref = "indra" } +indra-crossdoc = { id = "net.kyori.indra.crossdoc", version.ref = "indra" } +indra-publishing = { id = "net.kyori.indra.publishing", version.ref = "indra" } +indra-publishing-sonatype = { id = "net.kyori.indra.publishing.sonatype", version.ref = "indra" } +nexusPublish = { id = "io.github.gradle-nexus.publish-plugin", version = "2.0.0-rc-1"} +spongeGradle-convention = { id = "org.spongepowered.gradle.sponge.dev", version = "2.2.0" } diff --git a/settings.gradle.kts b/settings.gradle.kts index e698cafef5..9007387b61 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -6,18 +6,13 @@ pluginManagement { name = "sponge" } } - plugins { - val indraVersion = "3.1.3" - id("org.spongepowered.gradle.event-impl-gen") version "7.0.0" - id("org.spongepowered.gradle.sponge.dev") version "2.1.1" - id("org.jetbrains.gradle.plugin.idea-ext") version "1.1.7" - id("net.ltgt.errorprone") version "3.1.0" - id("net.kyori.indra.publishing") version indraVersion - id("net.kyori.indra.publishing.sonatype") version indraVersion - id("net.kyori.indra.checkstyle") version indraVersion - id("net.kyori.indra.crossdoc") version indraVersion - } } + plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version ("0.7.0") + id("org.gradle.toolchains.foojay-resolver-convention") version ("0.8.0") +} + +dependencyResolutionManagement { + repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS + pluginManagement.repositories.forEach(repositories::add) } From 05c01382a94ad254090f6df5ac00b0af78622114 Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Wed, 22 Nov 2023 21:33:16 +0100 Subject: [PATCH 20/23] fix recipes stonecutting and smithing done --- .../org/spongepowered/api/item/recipe/RecipeRegistration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/spongepowered/api/item/recipe/RecipeRegistration.java b/src/main/java/org/spongepowered/api/item/recipe/RecipeRegistration.java index a33cf51d57..905b955a2d 100644 --- a/src/main/java/org/spongepowered/api/item/recipe/RecipeRegistration.java +++ b/src/main/java/org/spongepowered/api/item/recipe/RecipeRegistration.java @@ -32,5 +32,5 @@ *

All registrations through the API will generate into the Vanilla data pack system

*/ public interface RecipeRegistration extends DataPackEntry { - + Recipe recipe(); } From 92b85c19187a76b62e55a3004190aff08f276b8a Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Fri, 24 Nov 2023 23:22:20 +0100 Subject: [PATCH 21/23] fix advancement trigger registry triggers are now in registry --- .../java/org/spongepowered/api/registry/RegistryTypes.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/spongepowered/api/registry/RegistryTypes.java b/src/main/java/org/spongepowered/api/registry/RegistryTypes.java index cb94503c5a..d4d773c1af 100644 --- a/src/main/java/org/spongepowered/api/registry/RegistryTypes.java +++ b/src/main/java/org/spongepowered/api/registry/RegistryTypes.java @@ -266,6 +266,8 @@ public final class RegistryTypes { public static final DefaultedRegistryType STRUCTURE_TYPE = RegistryTypes.minecraftKeyInGame("worldgen/structure_type"); + public static final DefaultedRegistryType> TRIGGER = RegistryTypes.minecraftKeyInGame("trigger_type"); + public static final DefaultedRegistryType VILLAGER_TYPE = RegistryTypes.minecraftKeyInGame("villager_type"); public static final DefaultedRegistryType WORLD_TYPE = RegistryTypes.minecraftKeyInServer("dimension_type"); @@ -490,8 +492,6 @@ public final class RegistryTypes { public static final DefaultedRegistryType TRANSACTION_TYPE = RegistryTypes.spongeKeyInGame("transaction_type"); - public static final DefaultedRegistryType> TRIGGER = RegistryTypes.spongeKeyInGame("trigger"); - public static final DefaultedRegistryType TROPICAL_FISH_SHAPE = RegistryTypes.spongeKeyInGame("tropical_fish_shape"); public static final DefaultedRegistryType TILT = RegistryTypes.spongeKeyInGame("tilt"); From c91c23890ebf8d93391452006c482d57f1f0580a Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Sat, 25 Nov 2023 02:53:20 +0100 Subject: [PATCH 22/23] [breaking] Scoreboard API for 1.20.4 --- .../spongepowered/api/scoreboard/Score.java | 34 +++++- .../api/scoreboard/ScoreFormat.java | 76 +++++++++++++ .../api/scoreboard/Scoreboard.java | 4 +- .../api/scoreboard/objective/Objective.java | 106 ++++++++++++++++-- 4 files changed, 205 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/spongepowered/api/scoreboard/ScoreFormat.java diff --git a/src/main/java/org/spongepowered/api/scoreboard/Score.java b/src/main/java/org/spongepowered/api/scoreboard/Score.java index b95d2c8569..64d87f09c0 100644 --- a/src/main/java/org/spongepowered/api/scoreboard/Score.java +++ b/src/main/java/org/spongepowered/api/scoreboard/Score.java @@ -25,8 +25,10 @@ package org.spongepowered.api.scoreboard; import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.scoreboard.objective.Objective; +import java.util.Optional; import java.util.Set; /** @@ -39,7 +41,7 @@ public interface Score { * * @return The name of this score */ - Component name(); + String name(); /** * Gets the current score value. @@ -69,6 +71,36 @@ public interface Score { */ void setLocked(boolean locked); + // TODO javadocs + + /** + * Sets this score display + * + * @param display the display + */ + void setDisplay(@Nullable Component display); + + /** + * Returns this score display + * + * @return the display + */ + Optional display(); + + /** + * Sets the score number format + * + * @param format the number format + */ + void setNumberFormat(@Nullable ScoreFormat format); + + /** + * Returns the score number format + * + * @return the number format + */ + Optional numberFormat(); + /** * Returns a {@link Set} of parent {@link Objective}s this {@link Score} is * registered to. diff --git a/src/main/java/org/spongepowered/api/scoreboard/ScoreFormat.java b/src/main/java/org/spongepowered/api/scoreboard/ScoreFormat.java new file mode 100644 index 0000000000..329324a22c --- /dev/null +++ b/src/main/java/org/spongepowered/api/scoreboard/ScoreFormat.java @@ -0,0 +1,76 @@ +/* + * This file is part of SpongeAPI, licensed under the MIT License (MIT). + * + * Copyright (c) SpongePowered + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.spongepowered.api.scoreboard; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.Style; +import org.spongepowered.api.Sponge; + +/** + * A Score Number Format + */ +public interface ScoreFormat { + + static ScoreFormat blank() { + return Sponge.game().factoryProvider().provide(Factory.class).blank(); + } + + static ScoreFormat fixed(Component component) { + return Sponge.game().factoryProvider().provide(Factory.class).fixed(component); + } + + static ScoreFormat styled(Style style) { + return Sponge.game().factoryProvider().provide(Factory.class).styled(style); + } + + interface Factory { + + /** + * Blank score formatting. + * + * @return the format + */ + ScoreFormat blank(); + + /** + * Fixed score formatting + * + * @param component the fixed component + * + * @return the format + */ + ScoreFormat fixed(Component component); + + /** + * Styled number formatting + * + * @param style the style + * + * @return the format + */ + ScoreFormat styled(Style style); + } + +} diff --git a/src/main/java/org/spongepowered/api/scoreboard/Scoreboard.java b/src/main/java/org/spongepowered/api/scoreboard/Scoreboard.java index e8d8d7b808..a43fc9a4fc 100644 --- a/src/main/java/org/spongepowered/api/scoreboard/Scoreboard.java +++ b/src/main/java/org/spongepowered/api/scoreboard/Scoreboard.java @@ -193,7 +193,7 @@ default Set objectivesByCriterion(Supplier crite * @param name The name whose scores are being retrieved * @return A set of all scores for the name */ - Set scores(Component name); + Set scores(String name); /** * Removes all scores with the specified name on this scoreboard, @@ -201,7 +201,7 @@ default Set objectivesByCriterion(Supplier crite * * @param name The name to remove all scores for */ - void removeScores(Component name); + void removeScores(String name); /** * Gets a {@link Team} by name on this scoreboard. diff --git a/src/main/java/org/spongepowered/api/scoreboard/objective/Objective.java b/src/main/java/org/spongepowered/api/scoreboard/objective/Objective.java index 00cf258dc3..6c8237ab73 100644 --- a/src/main/java/org/spongepowered/api/scoreboard/objective/Objective.java +++ b/src/main/java/org/spongepowered/api/scoreboard/objective/Objective.java @@ -26,6 +26,8 @@ import net.kyori.adventure.text.Component; import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.Entity; +import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.scoreboard.Score; import org.spongepowered.api.scoreboard.Scoreboard; import org.spongepowered.api.scoreboard.criteria.Criterion; @@ -103,7 +105,7 @@ static Builder builder() { * * @return The set of {@link Score}s for this objective */ - Map scores(); + Map scores(); /** * Returns whether this objective has a {@link Score} with the given name. @@ -111,7 +113,25 @@ static Builder builder() { * @param name The name of the {@link Score} to check for. * @return Whether this objective has a {@link Score} with the given name. */ - boolean hasScore(Component name); + boolean hasScore(String name); + + + /** + * Returns whether this objective has a {@link Score} with the given entity. + * + * @param entity The entity of the {@link Score} to check for. + * @return Whether this objective has a {@link Score} with the given entity. + */ + boolean hasScore(Entity entity); + + + /** + * Returns whether this objective has a {@link Score} with the given profile. + * + * @param profile The profile of the {@link Score} to check for. + * @return Whether this objective has a {@link Score} with the given profile. + */ + boolean hasScore(GameProfile profile); /** * Adds the specified {@link Score} to this objective. @@ -125,9 +145,9 @@ static Builder builder() { * Gets an entry's {@link Score} for this objective, if it exists. * * @param name The name of the {@link Score} to get. - * @return The {@link Score} for te specified {@link Component}, if it exists. + * @return The {@link Score} for the specified name, if it exists. */ - default Optional findScore(final Component name) { + default Optional findScore(final String name) { if (!this.hasScore(name)) { return Optional.empty(); } @@ -140,25 +160,87 @@ default Optional findScore(final Component name) { *

If the {@link Score} does not exist, it will be created.

* * @param name The name of the {@link Score} to get - * @return The {@link Score} for the specified {@link Component} + * @return The {@link Score} for the specified name */ - Score findOrCreateScore(Component name); + Score findOrCreateScore(String name); /** - * Removes the specified {@link Score} from this objective, if present. + * Removes the {@link Score} with the specified name from this objective, if present. * - * @param score The {@link Score} to remove + * @param name The name of the {@link Score} to remove. * @return Whether the score existed on this objective */ - boolean removeScore(Score score); + boolean removeScore(String name); /** - * Removes the {@link Score} with the specified name from this objective, if present. + * Gets an entry's {@link Score} for this objective, if it exists. * - * @param name The name of the {@link Score} to remove. + * @param entity The entity of the {@link Score} to get. + * @return The {@link Score} for the specified entity, if it exists. + */ + default Optional findScore(final Entity entity) { + if (!this.hasScore(entity)) { + return Optional.empty(); + } + return Optional.of(this.findOrCreateScore(entity)); + } + + /** + * Gets an entry's {@link Score} for this objective. + * + *

If the {@link Score} does not exist, it will be created.

+ * + * @param entity The name of the {@link Score} to get + * @return The {@link Score} for the specified entity + */ + Score findOrCreateScore(Entity entity); + + /** + * Removes the {@link Score} with the specified entity from this objective, if present. + * + * @param entity The entity of the {@link Score} to remove. + * @return Whether the score existed on this objective + */ + boolean removeScore(Entity entity); + + /** + * Gets an entry's {@link Score} for this objective, if it exists. + * + * @param profile The profile of the {@link Score} to get. + * @return The {@link Score} for the specified profile, if it exists. + */ + default Optional findScore(final GameProfile profile) { + if (!this.hasScore(profile)) { + return Optional.empty(); + } + return Optional.of(this.findOrCreateScore(profile)); + } + + /** + * Gets an entry's {@link Score} for this objective. + * + *

If the {@link Score} does not exist, it will be created.

+ * + * @param profile The profile of the {@link Score} to get + * @return The {@link Score} for the specified profile + */ + Score findOrCreateScore(GameProfile profile); + + /** + * Removes the {@link Score} with the specified profile from this objective, if present. + * + * @param profile The profile of the {@link Score} to remove. * @return Whether the score existed on this objective */ - boolean removeScore(Component name); + boolean removeScore(GameProfile profile); + + /** + * Removes the specified {@link Score} from this objective, if present. + * + * @param score The {@link Score} to remove + * @return Whether the score existed on this objective + */ + boolean removeScore(Score score); /** * Returns a {@link Set} of parent {@link Scoreboard}s this From ef584a582f84354eb2d565dd28539b222a9e6185 Mon Sep 17 00:00:00 2001 From: Anselm Brehme Date: Tue, 5 Dec 2023 21:51:39 +0100 Subject: [PATCH 23/23] BuiltIn Registries --- .../api/event/lifecycle/RegisterRegistryValueEvent.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/spongepowered/api/event/lifecycle/RegisterRegistryValueEvent.java b/src/main/java/org/spongepowered/api/event/lifecycle/RegisterRegistryValueEvent.java index b5ad65060e..d812948098 100644 --- a/src/main/java/org/spongepowered/api/event/lifecycle/RegisterRegistryValueEvent.java +++ b/src/main/java/org/spongepowered/api/event/lifecycle/RegisterRegistryValueEvent.java @@ -27,6 +27,7 @@ import org.spongepowered.api.Engine; import org.spongepowered.api.ResourceKey; import org.spongepowered.api.event.GenericEvent; +import org.spongepowered.api.registry.DefaultedRegistryValue; import org.spongepowered.api.registry.RegistryType; public interface RegisterRegistryValueEvent extends LifecycleEvent { @@ -38,6 +39,11 @@ interface RegistryStep { RegistryStep register(ResourceKey key, T value); } + interface BuiltIn extends LifecycleEvent { + + RegistryStep registry(RegistryType registryType); + } + interface GameScoped extends RegisterRegistryValueEvent { }