From 928cff77c21000b19428b3f9f1d51ca12baf0b8d Mon Sep 17 00:00:00 2001 From: tacf Date: Fri, 27 Mar 2026 14:22:51 +0000 Subject: [PATCH] feat: bump to 1.21.11 --- .gitignore | 1 + .../blocks/behaviours/BedBlockBehaviour.java | 39 +++++- .../behaviours/EndPortalBlockBehaviour.java | 2 +- .../behaviours/JukeboxBlockBehaviour.java | 5 +- .../NetherPortalBlockBehaviour.java | 3 +- build.gradle.kts | 39 +++++- core/build.gradle.kts | 2 + .../vanilla/datapack/DatapackLoader.java | 1 + .../datapack/dimension/DimensionType.java | 11 +- .../vanilla/datapack/loot/LootTable.java | 23 ++++ .../vanilla/datapack/loot/SlotSource.java | 56 +++++++++ .../loot/function/InBuiltLootFunctions.java | 70 ++++++++++- .../loot/function/InBuiltPredicates.java | 4 +- .../datapack/loot/function/LootFunction.java | 2 + .../vanilla/datapack/worldgen/Biome.java | 38 +++++- .../vanilla/datapack/worldgen/Carver.java | 113 +++++++++++------- datapack-tests/build.gradle.kts | 2 +- .../datapack/loot/LootTableTestData.java | 2 +- .../github/togar2/fluids/FlowableFluid.java | 9 +- gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 45457 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- .../vanilla/items/FlintAndSteelHandler.java | 1 + jitpack.yml | 2 +- .../minestom/vanilla/loot/LootFunction.java | 3 +- .../io/github/pesto/MojangDataFeature.java | 2 +- .../vanilla/server/VanillaEvents.java | 4 +- 27 files changed, 346 insertions(+), 92 deletions(-) create mode 100644 datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/SlotSource.java diff --git a/.gitignore b/.gitignore index c04d0e49..7f78afa0 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ hs_err_pid* .idea/ out/ .gradle/ +.gradel-home/ # Minestom /minecraft_data/ diff --git a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/BedBlockBehaviour.java b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/BedBlockBehaviour.java index 4b1e1586..d2d3494d 100644 --- a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/BedBlockBehaviour.java +++ b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/BedBlockBehaviour.java @@ -4,7 +4,7 @@ import net.minestom.server.coordinate.Point; import net.minestom.server.entity.EntityPose; import net.minestom.server.entity.Player; -import net.minestom.server.entity.metadata.PlayerMeta; +import net.minestom.server.entity.metadata.avatar.PlayerMeta; import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.Block; import net.minestom.server.item.ItemStack; @@ -12,10 +12,14 @@ import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.world.DimensionType; +import net.minestom.server.world.attribute.BedRule; +import net.minestom.server.world.attribute.EnvironmentAttribute; +import net.minestom.server.world.attribute.EnvironmentAttributeMap; import net.minestom.vanilla.blocks.VanillaBlockBehaviour; import net.minestom.vanilla.blocks.VanillaBlocks; import net.minestom.vanilla.instance.VanillaExplosion; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @SuppressWarnings("UnstableApiUsage") public class BedBlockBehaviour extends VanillaBlockBehaviour { @@ -76,10 +80,26 @@ public boolean onInteract(@NotNull Interaction interaction) { Instance instance = interaction.getInstance(); Point pos = interaction.getBlockPosition(); Player player = interaction.getPlayer(); + var dimensionKey = instance.getDimensionType(); DimensionType dimension = MinecraftServer.getDimensionTypeRegistry().get(dimensionKey); + if (dimension == null) { + return false; + } + + BedRule bedRule = resolveBedRule(dimension); + if (bedRule == null) { + return false; + } + + // Closest replacement for old dimension.bedWorks(): + // beds "work" if they do not explode in this dimension. + if (!bedRule.explodes()) { + // Optional: only allow actual sleeping when the rule says so + if (bedRule.canSleep() == BedRule.Rule.NEVER) { + return false; + } - if (dimension.bedWorks()) { // TODO: make player sleep // TODO: checks for mobs // TODO: check for day @@ -116,6 +136,21 @@ public boolean onInteract(@NotNull Interaction interaction) { return true; } + @SuppressWarnings("unchecked") + private static @Nullable BedRule resolveBedRule(@NotNull DimensionType dimension) { + EnvironmentAttributeMap.Entry rawEntry = + dimension.attributes().entries().get(EnvironmentAttribute.BED_RULE); + + if (rawEntry == null) { + return null; + } + + EnvironmentAttributeMap.Entry entry = + (EnvironmentAttributeMap.Entry) rawEntry; + + return entry.modifier().modify(null, entry.argument()); + } + @Override public void onDestroy(@NotNull Destroy destroy) { Instance instance = destroy.getInstance(); diff --git a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/EndPortalBlockBehaviour.java b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/EndPortalBlockBehaviour.java index 36f7e919..2d7f5d66 100644 --- a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/EndPortalBlockBehaviour.java +++ b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/EndPortalBlockBehaviour.java @@ -59,7 +59,7 @@ public void onTouch(@NotNull Touch touch) { spawnPoint = new Pos(obsidianPlatformX, yLevel, obsidianPlatformZ); } - if (targetDimension.effects().equals("the_end")) { + if (targetInstance.getDimensionType().equals(DimensionType.THE_END)) { for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { targetInstance.loadChunk(obsidianPlatformX / 16 + x, obsidianPlatformZ / 16 + z); diff --git a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/JukeboxBlockBehaviour.java b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/JukeboxBlockBehaviour.java index 97bd563f..169a5e36 100644 --- a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/JukeboxBlockBehaviour.java +++ b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/JukeboxBlockBehaviour.java @@ -12,7 +12,6 @@ import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.jukebox.JukeboxSong; import net.minestom.server.item.ItemStack; -import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.tag.Tag; import net.minestom.server.worldevent.WorldEvent; import net.minestom.vanilla.blocks.VanillaBlockBehaviour; @@ -84,8 +83,8 @@ public boolean onInteract(@NotNull Interaction interaction) { InventoryManipulation.consumeItemIfNotCreative(player, heldItem, hand); - JukeboxSong song = heldItem.get(DataComponents.JUKEBOX_PLAYABLE).holder().resolve(MinecraftServer.getJukeboxSongRegistry()); - DynamicRegistry.Key songKey = MinecraftServer.getJukeboxSongRegistry().getKey(song); + JukeboxSong song = heldItem.get(DataComponents.JUKEBOX_PLAYABLE).resolve(MinecraftServer.getJukeboxSongRegistry()); + net.minestom.server.registry.@Nullable RegistryKey songKey = MinecraftServer.getJukeboxSongRegistry().getKey(song); int songId = MinecraftServer.getJukeboxSongRegistry().getId(songKey); // TODO: Group packet? diff --git a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/NetherPortalBlockBehaviour.java b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/NetherPortalBlockBehaviour.java index ada1be76..a6064cb0 100644 --- a/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/NetherPortalBlockBehaviour.java +++ b/blocks/src/main/java/net/minestom/vanilla/blocks/behaviours/NetherPortalBlockBehaviour.java @@ -141,8 +141,7 @@ private void attemptTeleport(Instance instance, Entity touching, Block block, lo double targetZ = position.z() / 8; var key = instance.getDimensionType(); - DimensionType dimension = MinecraftServer.getDimensionTypeRegistry().get(key); - if (dimension.effects().equals("nether")) { + if (key == DimensionType.THE_NETHER) { targetDimension = MinecraftServer.getDimensionTypeRegistry().get(DimensionType.OVERWORLD); targetX = position.x() * 8; targetZ = position.z() * 8; diff --git a/build.gradle.kts b/build.gradle.kts index d8a207c7..e80b03c9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,24 +2,26 @@ plugins { java `java-library` `maven-publish` - id("com.github.harbby.gradle.serviceloader") version ("1.1.8") - id("io.github.goooler.shadow") version ("8.1.8") + id("com.github.harbby.gradle.serviceloader") version ("1.1.9") + id("com.gradleup.shadow") version "8.3.10" apply false } subprojects { - plugins.apply("java") plugins.apply("java-library") plugins.apply("maven-publish") plugins.apply("com.github.harbby.gradle.serviceloader") - plugins.apply("io.github.goooler.shadow") + plugins.apply("com.gradleup.shadow") group = "net.minestom.vanilla" version = "indev" java { - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(25) + } + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 // withJavadocJar() withSourcesJar() @@ -37,6 +39,28 @@ subprojects { gradleVersion = rootProject.gradle.gradleVersion } + tasks.withType().configureEach { + options.release = 25 + } + + tasks.withType().configureEach { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(25) + } + } + + tasks.withType().configureEach { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(25) + } + } + + tasks.withType().configureEach { + javadocTool = javaToolchains.javadocToolFor { + languageVersion = JavaLanguageVersion.of(25) + } + } + repositories { mavenCentral() maven(url = "https://jitpack.io") @@ -44,6 +68,9 @@ subprojects { } dependencies { + testImplementation(platform("org.junit:junit-bom:5.13.4")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } publishing { diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 9fd5f82b..7137c037 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -18,6 +18,8 @@ dependencies { api("com.squareup.moshi:moshi:1.14.0") api("com.squareup.moshi:moshi-adapters:1.14.0") + api("it.unimi.dsi:fastutil:8.5.18") + // Tests testImplementation(platform("org.junit:junit-bom:5.9.1")) testImplementation("org.junit.jupiter:junit-jupiter") diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/DatapackLoader.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/DatapackLoader.java index c1f7713d..7627bac2 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/DatapackLoader.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/DatapackLoader.java @@ -129,6 +129,7 @@ public void toJson(@NotNull JsonWriter writer, JsonUtils.SingleOrList value) register(builder, Datapack.Tag.TagValue.ObjectOrTagReference.class, Datapack.Tag.TagValue.ObjectOrTagReference::fromJson); register(builder, Biome.Effects.Particle.Options.class, Biome.Effects.Particle.Options::fromJson); register(builder, Biome.Sound.class, Biome.Sound::fromJson); + register(builder, Biome.Color.class, Biome.Color::fromJson); register(builder, Carver.class, Carver::fromJson); register(builder, FloatProvider.class, FloatProvider::fromJson); register(builder, Biome.CarversList.class, Biome.CarversList::fromJson); diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/dimension/DimensionType.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/dimension/DimensionType.java index da5b233a..912c69bb 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/dimension/DimensionType.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/dimension/DimensionType.java @@ -4,11 +4,9 @@ // { // "ambient_light": 0.0, -// "bed_works": true, // "coordinate_scale": 1.0, // "effects": "minecraft:overworld", // "has_ceiling": false, -// "has_raids": true, // "has_skylight": true, // "height": 384, // "infiniburn": "#minecraft:infiniburn_overworld", @@ -29,21 +27,14 @@ //} public record DimensionType( double ambient_light, - boolean bed_works, double coordinate_scale, - String effects, boolean has_ceiling, - boolean has_raids, boolean has_skylight, int height, String infiniburn, int logical_height, int min_y, int monster_spawn_block_light_limit, - NumberProvider.Int monster_spawn_light_level, - boolean natural, - boolean piglin_safe, - boolean respawn_anchor_works, - boolean ultrawarm + NumberProvider.Int monster_spawn_light_level ) { } diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/LootTable.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/LootTable.java index d4b7e20d..bf832d2b 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/LootTable.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/LootTable.java @@ -44,6 +44,7 @@ static Pool.Entry fromJson(JsonReader reader) throws IOException { case "minecraft:tag" -> Pool.Entry.Tag.class; case "minecraft:loot_table" -> Pool.Entry.LootTableNested.class; case "minecraft:dynamic" -> Pool.Entry.Dynamic.class; + case "minecraft:slots" -> Pool.Entry.Slots.class; case "minecraft:empty" -> Pool.Entry.Empty.class; case "minecraft:group" -> Pool.Entry.Group.class; case "minecraft:alternatives" -> Pool.Entry.Alternatives.class; @@ -183,6 +184,28 @@ public List> apply(Datapack datapack, LootContext context) { } } + /** + * slots -> Provides the items contained within slots selected by a slot source. + * • slot_source: A slot source describing where the items are located. + */ + record Slots(List conditions, + List functions, + NumberProvider weight, + NumberProvider quality, + SlotSource slot_source) implements ItemGenerator { + + @Override + public Key type() { + return Key.key("minecraft:slots"); + } + + @Override + public List> apply(Datapack datapack, LootContext context) { + // TODO: Resolve slot_source against loot context and produce items. + return List.of(List.of()); + } + } + /** * empty -> Provides a loot entry that generates nothing into the loot pool. * • functions: Invokes item functions to the item stack(s). diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/SlotSource.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/SlotSource.java new file mode 100644 index 00000000..4c1b96bc --- /dev/null +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/SlotSource.java @@ -0,0 +1,56 @@ +package net.minestom.vanilla.datapack.loot; + +import com.squareup.moshi.JsonReader; +import net.kyori.adventure.key.Key; +import net.minestom.vanilla.datapack.json.JsonUtils; +import net.minestom.vanilla.datapack.tags.ConditionsFor; + +import java.io.IOException; +import java.util.List; + +/** + * Slot source definitions introduced in datapack version 92.0. + */ +public sealed interface SlotSource { + static SlotSource fromJson(JsonReader reader) throws IOException { + return JsonUtils.typeMap(reader, token -> switch (token) { + case BEGIN_ARRAY -> json -> { + json.beginArray(); + java.util.ArrayList terms = new java.util.ArrayList<>(); + while (json.hasNext()) { + terms.add(fromJson(json)); + } + json.endArray(); + return new Group(List.copyOf(terms)); + }; + case BEGIN_OBJECT -> json -> JsonUtils.unionStringTypeAdapted(json, "type", type -> switch (type) { + case "minecraft:empty" -> Empty.class; + case "minecraft:group" -> Group.class; + case "minecraft:slot_range" -> SlotRange.class; + case "minecraft:contents" -> Contents.class; + case "minecraft:filtered" -> Filtered.class; + case "minecraft:limit_slots" -> LimitSlots.class; + default -> null; + }); + default -> null; + }); + } + + record Empty() implements SlotSource { + } + + record Group(List terms) implements SlotSource { + } + + record SlotRange(String source, String slots) implements SlotSource { + } + + record Contents(Key component, SlotSource slot_source) implements SlotSource { + } + + record Filtered(ConditionsFor.Item item_filter, SlotSource slot_source) implements SlotSource { + } + + record LimitSlots(int limit, SlotSource slot_source) implements SlotSource { + } +} diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltLootFunctions.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltLootFunctions.java index 47de7841..11fd1e0f 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltLootFunctions.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltLootFunctions.java @@ -27,6 +27,7 @@ import net.minestom.vanilla.datapack.loot.NBTPath; import net.minestom.vanilla.datapack.loot.context.LootContext; import net.minestom.vanilla.datapack.number.NumberProvider; +import net.minestom.vanilla.datapack.tags.ConditionsFor; import net.minestom.vanilla.tag.Tags; import net.minestom.vanilla.utils.JavaUtils; import net.minestom.vanilla.utils.MinestomUtils; @@ -38,6 +39,63 @@ @SuppressWarnings("unused") interface InBuiltLootFunctions { + // Replaces any item stack with empty one. + record Discard() implements LootFunction { + + @Override + public Key function() { + return Key.key("minecraft:discard"); + } + + @Override + public ItemStack apply(Context context) { + return ItemStack.AIR; + } + } + + // Conditionally applies different modifier chains based on item_filter. + // In 1.21.11+, `modifier` was split into `on_pass` and `on_fail`. + record Filtered(ConditionsFor.Item item_filter, + @Nullable JsonUtils.SingleOrList on_pass, + @Nullable JsonUtils.SingleOrList on_fail, + @Nullable JsonUtils.SingleOrList modifier) implements LootFunction { + + @Override + public Key function() { + return Key.key("minecraft:filtered"); + } + + @Override + public ItemStack apply(Context context) { + // TODO: Evaluate item_filter when item predicates are implemented. + boolean passesFilter = true; + JsonUtils.SingleOrList selected = passesFilter + ? Objects.requireNonNullElse(on_pass, modifier) + : on_fail; + + ItemStack current = context.itemStack(); + for (LootFunction function : selected == null ? List.of() : selected.list()) { + final ItemStack input = current; + current = function.apply(new Context() { + @Override + public RandomGenerator random() { + return context.random(); + } + + @Override + public ItemStack itemStack() { + return input; + } + + @Override + public @Nullable T get(LootContext.Trait trait) { + return context.get(trait); + } + }); + } + return current; + } + } // Applies a predefined bonus formula to the count of the item stack. interface ApplyBonus extends LootFunction { @@ -47,7 +105,7 @@ default Key function() { return Key.key("minecraft:apply_bonus"); } - Key enchantment(); + Enchantment enchantment(); Key formula(); @@ -59,7 +117,7 @@ static ApplyBonus fromJson(JsonReader reader) throws IOException { )); } - record BinomialWithBonusCount(Key enchantment, Parameters parameters) implements ApplyBonus { + record BinomialWithBonusCount(Enchantment enchantment, Parameters parameters) implements ApplyBonus { @Override public Key formula() { return Key.key("minecraft:binomial_with_bonus_count"); @@ -84,7 +142,7 @@ public ItemStack apply(Context context) { } } - record UniformBonusCount(Key enchantment, Parameters parameters) implements ApplyBonus { + record UniformBonusCount(Enchantment enchantment, Parameters parameters) implements ApplyBonus { @Override public Key formula() { @@ -103,7 +161,7 @@ public ItemStack apply(Context context) { } } - record OreDrops(Key enchantment) implements ApplyBonus { + record OreDrops(Enchantment enchantment) implements ApplyBonus { @Override public Key formula() { @@ -554,7 +612,7 @@ public ItemStack apply(Context context) { int looting; if (killer instanceof Player player) { ItemStack mainHand = player.getItemInMainHand(); - int lootingValue = MinestomUtils.getEnchantLevel(mainHand, Enchantment.LOOTING.key(), 0); + int lootingValue = MinestomUtils.getEnchantLevel(mainHand, Enchantment.LOOTING.asValue(), 0); if (lootingValue == 0) return itemStack; looting = lootingValue; } else { @@ -793,7 +851,7 @@ public ItemStack apply(Context context) { Enchantment enchantment = entry.getKey(); int count = entry.getValue().asInt().apply(context::random); - DynamicRegistry.Key key = MinestomUtils.getEnchantKey(enchantment); + net.minestom.server.registry.RegistryKey key = MinestomUtils.getEnchantKey(enchantment); if (add) { int previousValue = list.has(key) ? list.level(key) : 0; diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltPredicates.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltPredicates.java index 649a518a..8e0141a7 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltPredicates.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/InBuiltPredicates.java @@ -352,7 +352,7 @@ public boolean test(LootContext context) { * • enchantment: Resource location of enchantment. * • chances: List of probabilities for enchantment power, indexed from 0. */ - record TableBonus(Key enchantment, List chances) implements Predicate { + record TableBonus(Enchantment enchantment, List chances) implements Predicate { @Override public String condition() { return "table_bonus"; @@ -362,7 +362,7 @@ public String condition() { public boolean test(LootContext context) { ItemStack item = context.getOrThrow(LootContext.TOOL); EnchantmentList enchants = item.get(DataComponents.ENCHANTMENTS); - DynamicRegistry.Key enchantment = MinestomUtils.getEnchantKey(this.enchantment); + net.minestom.server.registry.RegistryKey enchantment = MinestomUtils.getEnchantKey(this.enchantment); int level = enchants == null || !enchants.has(enchantment) ? 0 : enchants.level(enchantment); return ThreadLocalRandom.current().nextFloat() < chances.get(level); diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/LootFunction.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/LootFunction.java index 267e6135..91e1a089 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/LootFunction.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/loot/function/LootFunction.java @@ -33,11 +33,13 @@ static LootFunction fromJson(JsonReader reader) throws IOException { Map.entry("minecraft:copy_name", CopyName.class), Map.entry("minecraft:copy_nbt", CopyNbt.class), Map.entry("minecraft:copy_state", CopyState.class), + Map.entry("minecraft:discard", Discard.class), Map.entry("minecraft:enchant_randomly", EnchantRandomly.class), Map.entry("minecraft:enchant_with_levels", EnchantWithLevels.class), Map.entry("minecraft:exploration_map", ExplorationMap.class), Map.entry("minecraft:explosion_decay", ExplosionDecay.class), Map.entry("minecraft:fill_player_head", FillPlayerHead.class), + Map.entry("minecraft:filtered", Filtered.class), Map.entry("minecraft:furnace_smelt", FurnaceSmelt.class), Map.entry("minecraft:limit_count", LimitCount.class), Map.entry("minecraft:looting_enchant", LootingEnchant.class), diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Biome.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Biome.java index d22dd5ea..540fbbaf 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Biome.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Biome.java @@ -98,13 +98,39 @@ public Key type() { /** * Represents the effects of a biome. */ + public sealed interface Color { + static Color fromJson(JsonReader reader) throws IOException { + return JsonUtils.typeMap(reader, token -> switch (token) { + case NUMBER -> json -> new IntColor(json.nextInt()); + case STRING -> json -> new HexColor(json.nextString()); + case BEGIN_ARRAY -> json -> { + json.beginArray(); + java.util.ArrayList values = new java.util.ArrayList<>(); + while (json.hasNext()) { + values.add((float) json.nextDouble()); + } + json.endArray(); + return new FloatArrayColor(List.copyOf(values)); + }; + default -> null; + }); + } + + record IntColor(int value) implements Color { + } + + record HexColor(String value) implements Color { + } + + record FloatArrayColor(List value) implements Color { + } + } + public record Effects( - int fog_color, - int sky_color, - int water_color, - int water_fog_color, - @Optional Integer foliage_color, - @Optional Integer grass_color, + Color water_color, + @Optional Color foliage_color, + @Optional Color dry_foliage_color, + @Optional Color grass_color, @Optional GrassColorModifier grass_color_modifier, @Optional Particle particle, @Optional Sound ambient_sound, diff --git a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Carver.java b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Carver.java index dd672b5c..1d167e38 100644 --- a/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Carver.java +++ b/datapack-loading/src/main/java/net/minestom/vanilla/datapack/worldgen/Carver.java @@ -9,10 +9,10 @@ import java.io.IOException; -// The root object. +// The root object. // -// type: The ID of carver type. -// config: Configuration values for the carver. +// type: The ID of carver type. +// config: Configuration values for the carver. public record Carver(Key type, BaseConfig config) { public static Carver fromJson(JsonReader reader) throws IOException { @@ -31,72 +31,105 @@ public static Carver fromJson(JsonReader reader) throws IOException { case "minecraft:canyon" -> DatapackLoader.moshi(CanyonConfig.class); default -> throw new IOException("Unknown carver type: " + type); }; + reader.beginObject(); var config = JsonUtils.findProperty(reader, "config", configReader); reader.endObject(); + if (config == null) { throw new IOException("Missing config"); } + return new Carver(Key.key(type), config); } - // cave - Carves a cave. A cave is a long tunnel that sometimes branches. Somtimes one or more tunnels start from a circular void. - // nether_cave - Similar to cave, but with a less frequency and wider tunnels. And aquifer doesn't work. The carved blocks below bottom_y + 32.0 are filled with lava. - // canyon - Carves a canyon. - + // cave - Carves a cave. + // A cave is a long tunnel that sometimes branches. Sometimes one or more tunnels start from a circular void. + // + // nether_cave - Similar to cave, but with a less frequency and wider tunnels. And aquifer doesn't work. + // The carved blocks below bottom_y + 32.0 are filled with lava. + // + // canyon - Carves a canyon. public interface BaseConfig { - - // probability: The probability that each chunk attempts to generate carvers. Value between 0 and 1 (both inclusive). + // probability: The probability that each chunk attempts to generate carvers. Value between 0 and 1 (both inclusive). float probability(); - // y: The height at which this carver attempts to generate. + // y: The height at which this carver attempts to generate. HeightProvider y(); - // lava_level: The Y-level below or equal to which the carved areas are filled with lava. Doesn't affect nether_cave (where lava level is always bottom_y + 31). (This field is seemingly ignored and always set to -56 (MC-237017), needs testing) + // lava_level: The Y-level below or equal to which the carved areas are filled with lava. + // Doesn't affect nether_cave (where lava level is always bottom_y + 31). + // (This field is seemingly ignored and always set to -56 (MC-237017), needs testing) HeightProvider lava_level(); - // replaceable: Blocks that can be carved. Can be a block ID, a block tag, or a list of block IDs. - JsonUtils.SingleOrList replaceable(); + // replaceable: Blocks that can be carved. + // Can be a block ID, a block tag, or a list of block IDs/tags. + JsonUtils.SingleOrList replaceable(); // debug_settings: (optional) Replaces blocks in the carved areas for debugging. // - // debug_mode: (optional, defauts to false) Enable debug mode for this carver. - // air_state: (optional, defaults to acacia button's default state) Replaces air blocks. - // water_state: (optional, defaults to acacia button's default state) Replaces water blocks and then waterlogs these blocks. - // lava_state: (optional, defaults to acacia button's default state) Replaces lava blocks. - // barrier_state: (optional, defaults to acacia button's default state) Replaces barriers of aquifers. - @Optional - BaseConfig.DebugSettings debug_settings(); - - record DebugSettings(@Optional Boolean debug_mode, @Optional Block air_state, - @Optional Block water_state, @Optional Block lava_state, - @Optional Block barrier_state) { + // debug_mode: (optional, defaults to false) Enable debug mode for this carver. + // air_state: (optional, defaults to acacia button's default state) Replaces air blocks. + // water_state: (optional, defaults to acacia button's default state) Replaces water blocks and then waterlogs these blocks. + // lava_state: (optional, defaults to acacia button's default state) Replaces lava blocks. + // barrier_state: (optional, defaults to acacia button's default state) Replaces barriers of aquifers. + @Optional DebugSettings debug_settings(); + + record DebugSettings( + @Optional Boolean debug_mode, + @Optional Block air_state, + @Optional Block water_state, + @Optional Block lava_state, + @Optional Block barrier_state + ) { } } - public record Config(float probability, HeightProvider y, HeightProvider lava_level, - JsonUtils.SingleOrList replaceable, @Optional BaseConfig.DebugSettings debug_settings) implements BaseConfig { + public record Config( + float probability, + HeightProvider y, + HeightProvider lava_level, + JsonUtils.SingleOrList replaceable, + @Optional BaseConfig.DebugSettings debug_settings + ) implements BaseConfig { } // If carver type is cave or nether_cave, additional fields are as follows: // // yScale: Vertically scales circular voids. // vertical_radius_multiplier: Vertically scales cave tunnels. Doesn't affect the length of tunnels. - // floor_level: Value between -1.0 and 1.0 (both inclusive). Change the shape of the cave's horizontal floor. If 0.0, carves the terrain with ellipsoids. If 1.0, carves with upper semi-ellipsoids, resulting in a level floor. - public record CaveConfig(float probability, HeightProvider y, HeightProvider lava_level, - JsonUtils.SingleOrList replaceable, @Optional BaseConfig.DebugSettings debug_settings, - FloatProvider yScale, FloatProvider vertical_radius_multiplier, - FloatProvider floor_level) implements BaseConfig { + // floor_level: Value between -1.0 and 1.0 (both inclusive). + // Change the shape of the cave's horizontal floor. + // If 0.0, carves the terrain with ellipsoids. + // If 1.0, carves with upper semi-ellipsoids, resulting in a level floor. + public record CaveConfig( + float probability, + HeightProvider y, + HeightProvider lava_level, + JsonUtils.SingleOrList replaceable, + @Optional BaseConfig.DebugSettings debug_settings, + FloatProvider yScale, + FloatProvider vertical_radius_multiplier, + FloatProvider floor_level + ) implements BaseConfig { } // If carver type is canyon, additional fields are as follows: - // yScale: Vertically scales canyons. + // yScale: Vertically scales canyons. // vertical_rotation: Vertical rotation as a canyon extends. - // shape: The shape to use for the ravine. - public record CanyonConfig(float probability, HeightProvider y, HeightProvider lava_level, - JsonUtils.SingleOrList replaceable, @Optional BaseConfig.DebugSettings debug_settings, - FloatProvider yScale, FloatProvider vertical_rotation, Shape shape) implements BaseConfig { - // distance_factor: Scales the length of canyons. Higher values make canyons longer. + // shape: The shape to use for the ravine. + public record CanyonConfig( + float probability, + HeightProvider y, + HeightProvider lava_level, + JsonUtils.SingleOrList replaceable, + @Optional BaseConfig.DebugSettings debug_settings, + FloatProvider yScale, + FloatProvider vertical_rotation, + Shape shape + ) implements BaseConfig { + + // distance_factor: Scales the length of canyons. Higher values make canyons longer. // thickness: Scales the breadth and height of canyons. // horizontal_radius_factor: Scales the breadth of canyons. Higher values make canyons wider. // vertical_radius_default_factor: Vertically scales canyons. Higher values make canyons deeper. @@ -108,8 +141,8 @@ public record Shape( FloatProvider horizontal_radius_factor, float vertical_radius_default_factor, float vertical_radius_center_factor, - int width_smoothness) { + int width_smoothness + ) { } } - -} +} \ No newline at end of file diff --git a/datapack-tests/build.gradle.kts b/datapack-tests/build.gradle.kts index 90f24cfe..fac6e586 100644 --- a/datapack-tests/build.gradle.kts +++ b/datapack-tests/build.gradle.kts @@ -18,7 +18,7 @@ tasks.test { } minecraft { - version("1.21.5") + version("1.21.11") runs { server() } diff --git a/datapack-tests/src/test/java/net/minestom/vanilla/datapack/loot/LootTableTestData.java b/datapack-tests/src/test/java/net/minestom/vanilla/datapack/loot/LootTableTestData.java index 6761edd1..7c97d9c7 100644 --- a/datapack-tests/src/test/java/net/minestom/vanilla/datapack/loot/LootTableTestData.java +++ b/datapack-tests/src/test/java/net/minestom/vanilla/datapack/loot/LootTableTestData.java @@ -163,7 +163,7 @@ public class LootTableTestData { expected.put("cauldron", List.of(ItemStack.of(Material.CAULDRON, 1))); expected.put("cave_vines", List.of()); expected.put("cave_vines_plant", List.of()); - expected.put("chain", List.of(ItemStack.of(Material.CHAIN, 1))); + expected.put("iron_chain", List.of(ItemStack.of(Material.IRON_CHAIN, 1))); expected.put("cherry_button", List.of(ItemStack.of(Material.CHERRY_BUTTON, 1))); expected.put("cherry_door", List.of()); expected.put("cherry_fence", List.of(ItemStack.of(Material.CHERRY_FENCE, 1))); diff --git a/fluid-simulation/src/main/java/io/github/togar2/fluids/FlowableFluid.java b/fluid-simulation/src/main/java/io/github/togar2/fluids/FlowableFluid.java index 2769093c..517cc4b1 100644 --- a/fluid-simulation/src/main/java/io/github/togar2/fluids/FlowableFluid.java +++ b/fluid-simulation/src/main/java/io/github/togar2/fluids/FlowableFluid.java @@ -2,18 +2,17 @@ import it.unimi.dsi.fastutil.shorts.Short2BooleanMap; import it.unimi.dsi.fastutil.shorts.Short2BooleanOpenHashMap; +import net.kyori.adventure.key.Key; import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; -import net.minestom.server.gamedata.tags.Tag; -import net.minestom.server.gamedata.tags.TagManager; import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.Block; import net.minestom.server.item.Material; +import net.minestom.server.registry.RegistryTag; import net.minestom.server.utils.Direction; import java.util.EnumMap; import java.util.Map; -import java.util.Objects; public abstract class FlowableFluid extends Fluid { @@ -242,7 +241,7 @@ private int getAdjacentSourceCount(Instance instance, Point point) { */ private boolean canFill(Instance instance, Point point, Block block, Block flowing) { //TODO check waterloggable - TagManager tags = MinecraftServer.getTagManager(); + RegistryTag signs = MinecraftServer.process().blocks().getTag(Key.key("minecraft:signs")); if (block.compare(Block.LADDER) || block.compare(Block.SUGAR_CANE) || block.compare(Block.BUBBLE_COLUMN) @@ -254,7 +253,7 @@ private boolean canFill(Instance instance, Point point, Block block, Block flowi || block.compare(Block.SEAGRASS) || block.compare(Block.TALL_SEAGRASS) || block.compare(Block.SEA_PICKLE) - || Objects.requireNonNull(tags.getTag(Tag.BasicType.BLOCKS, "minecraft:signs")).contains(block.key()) + || (signs != null && signs.contains(block)) || block.name().contains("door") || block.name().contains("coral")) { return false; diff --git a/gradle.properties b/gradle.properties index 73724aba..a3cb9cf2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -minestom_version=2025.07.04-1.21.5 +minestom_version=2026.03.25-1.21.11 rayfast_version=684e854a48 jnoise_version=4.0.0 annotations_version=23.0.0 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..8bdaf60c75ab801e22807dde59e12a8735a34077 100644 GIT binary patch delta 37298 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 bk)x42o%IjI4BRP0u<>w0AZH4H-*Em1`@F3o delta 35308 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 BrcM9= diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23a..2e111328 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/items/src/main/java/net/minestom/vanilla/items/FlintAndSteelHandler.java b/items/src/main/java/net/minestom/vanilla/items/FlintAndSteelHandler.java index ec647926..1e19abea 100644 --- a/items/src/main/java/net/minestom/vanilla/items/FlintAndSteelHandler.java +++ b/items/src/main/java/net/minestom/vanilla/items/FlintAndSteelHandler.java @@ -40,6 +40,7 @@ public boolean onUseOnBlock(PlayerUseItemOnBlockEvent event) { // BlockFace blockFace, float cursorX, float cursorY, float cursorZ instance.placeBlock(new BlockHandler.PlayerPlacement( Block.FIRE, + Block.AIR, instance, firePosition, player, diff --git a/jitpack.yml b/jitpack.yml index 727c9abd..aaa58906 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,2 +1,2 @@ jdk: - - openjdk21 + - openjdk25 diff --git a/loot-table/src/main/java/net/minestom/vanilla/loot/LootFunction.java b/loot-table/src/main/java/net/minestom/vanilla/loot/LootFunction.java index 0e746154..0c0726c4 100644 --- a/loot-table/src/main/java/net/minestom/vanilla/loot/LootFunction.java +++ b/loot-table/src/main/java/net/minestom/vanilla/loot/LootFunction.java @@ -25,6 +25,7 @@ import net.minestom.server.item.component.*; import net.minestom.server.item.enchant.Enchantment; import net.minestom.server.item.instrument.Instrument; +import net.minestom.server.network.player.ResolvableProfile; import net.minestom.server.potion.PotionEffect; import net.minestom.server.potion.PotionType; import net.minestom.server.registry.DynamicRegistry; @@ -621,7 +622,7 @@ record FillPlayerHead(@NotNull List predicates, @NotNull Relevant PlayerSkin skin = player.getSkin(); if (skin == null) return input; - return input.with(DataComponents.PROFILE, new HeadProfile(skin)); + return input.with(DataComponents.PROFILE, new ResolvableProfile(skin)); } @Override diff --git a/mojang-data/src/main/java/io/github/pesto/MojangDataFeature.java b/mojang-data/src/main/java/io/github/pesto/MojangDataFeature.java index 36a74356..350b5f21 100644 --- a/mojang-data/src/main/java/io/github/pesto/MojangDataFeature.java +++ b/mojang-data/src/main/java/io/github/pesto/MojangDataFeature.java @@ -10,7 +10,7 @@ public class MojangDataFeature implements VanillaReimplementation.Feature { - private static final String LATEST = "1.21.5"; + private static final String LATEST = "1.21.11"; private final MojangAssets assets = new MojangAssets(); private final CompletableFuture> latest = new CompletableFuture<>(); diff --git a/server/src/main/java/net/minestom/vanilla/server/VanillaEvents.java b/server/src/main/java/net/minestom/vanilla/server/VanillaEvents.java index 890509c9..2a38c245 100644 --- a/server/src/main/java/net/minestom/vanilla/server/VanillaEvents.java +++ b/server/src/main/java/net/minestom/vanilla/server/VanillaEvents.java @@ -1,5 +1,6 @@ package net.minestom.vanilla.server; +import net.minestom.server.Auth; import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Pos; @@ -14,7 +15,6 @@ import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.PickupItemEvent; import net.minestom.server.event.player.*; -import net.minestom.server.extras.MojangAuth; import net.minestom.server.instance.ExplosionSupplier; import net.minestom.server.instance.Instance; import net.minestom.server.inventory.PlayerInventory; @@ -93,7 +93,7 @@ public static void register(VanillaServer server, ServerProperties properties, E }); if (Boolean.parseBoolean(properties.get("online-mode"))) { - MojangAuth.init(); + MinecraftServer.init(new Auth.Online()); } ConnectionManager connectionManager = MinecraftServer.getConnectionManager();