diff --git a/README.md b/README.md index 70ae6836c..2c33f6fb8 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,7 @@ Maven maven.modrinth pl3xmap - 1.21.11.539 + 26.1.2.546 provided ``` @@ -101,7 +101,7 @@ repositories { } dependencies { - compileOnly 'maven.modrinth:pl3xmap:1.21.11.539' + compileOnly 'maven.modrinth:pl3xmap:26.1.2.546' } ``` diff --git a/build.gradle.kts b/build.gradle.kts index 093a6b30b..25321dfd6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,8 +19,11 @@ tasks { // this is janky, but it works val manifestFiles = subprojects.filter({ it.name != "webmap" && it.name != "core" }).map { val regularFile = it.layout.buildDirectory.file("libs/${project.name}-${it.name}-${it.version}.jar") + val fabricFile = it.layout.buildDirectory.file("libs/${project.name}-${it.name}-${it.version}.jar.tmp") if (regularFile.isPresent) { zipTree(regularFile) + } else if (fabricFile.isPresent) { + zipTree(fabricFile) } else { null } diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index a10c186d6..8d04d9f7c 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -35,11 +35,6 @@ dependencies { } tasks { - reobfJar { - dependsOn(jar) - outputJar.set(jar.get().archiveFile) - } - // needed for below jank compileJava { dependsOn(":core:jar") @@ -52,10 +47,12 @@ tasks { manifest { from(project(":core").tasks.named("shadowJar").get().manifest) } + + archiveClassifier.set("") } build { - dependsOn(reobfJar) + dependsOn(shadowJar) } runServer { diff --git a/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java b/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java index 19422bd53..bb71d37f9 100644 --- a/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java +++ b/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitWorld.java @@ -54,22 +54,6 @@ public class BukkitWorld extends World { private static Field LEVEL_STORAGE_ACCESS_FIELD = null; - static { - if (LEVEL_STORAGE_ACCESS_FIELD == null) { - Arrays.stream(ServerLevel.class.getFields()) - .filter(field -> field.getType().equals(LevelStorageSource.LevelStorageAccess.class)) - .findAny().ifPresent(field -> LEVEL_STORAGE_ACCESS_FIELD = field); - } - } - - private static LevelStorageSource.LevelStorageAccess getLevelStorageAccess(ServerLevel level) { - try { - return (LevelStorageSource.LevelStorageAccess) LEVEL_STORAGE_ACCESS_FIELD.get(level); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } - private final ServerLevel level; public BukkitWorld(ServerLevel level, String name) { @@ -78,7 +62,7 @@ public BukkitWorld(ServerLevel level, String name) { level.getSeed(), Point.of(level.getLevelData().getRespawnData().pos().getX(), level.getLevelData().getRespawnData().pos().getZ()), Type.get(level.dimension().identifier().toString()), - BukkitWorld.getLevelStorageAccess(level).getDimensionPath(level.dimension()).resolve("region") + level.getServer().storageSource.getDimensionPath(level.dimension()).resolve("region") ); this.level = level; diff --git a/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java b/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java index 6db6c7060..0a2f6e39e 100644 --- a/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java +++ b/bukkit/src/main/java/net/pl3x/map/bukkit/Pl3xMapImpl.java @@ -23,18 +23,25 @@ */ package net.pl3x.map.bukkit; +import com.google.common.collect.ImmutableList; import java.net.URISyntaxException; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import net.kyori.adventure.platform.AudienceProvider; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.features.VegetationFeatures; import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; @@ -44,8 +51,8 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RedStoneWireBlock; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.log.Logger; import net.pl3x.map.core.registry.BiomeRegistry; @@ -65,6 +72,8 @@ public class Pl3xMapImpl extends Pl3xMap { private BukkitAudiences adventure; private Path jarPath; + private Map>> biomeFeatureCache = new LinkedHashMap<>(); + ArrayList>> canSpawnFromBonemealList = new ArrayList<>(10); public Pl3xMapImpl(JavaPlugin plugin) { super(true); @@ -74,6 +83,14 @@ public Pl3xMapImpl(JavaPlugin plugin) { @Override public void enable() { this.adventure = BukkitAudiences.create(this.plugin); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_DEFAULT); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_FLOWER_FOREST); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_SWAMP); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_PLAIN); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_MEADOW); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_CHERRY); + canSpawnFromBonemealList.add(VegetationFeatures.WILDFLOWER); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_PALE_GARDEN); super.enable(); } @@ -152,6 +169,26 @@ public int getColorForPower(byte power) { return RedStoneWireBlock.getColorForPower(power); } + private List> getBoneMealFeatures(Biome biome) { + // https://github.com/Draradech/FlowerMap (CC0-1.0 license) + // the biomes created from the builtin registry are missing tags + // with the new can_spawn_from_bonemeal tag for vegetation features we can no longer just call getFlowerFeatures (now called getBonemealFeatures) + // iterate through the feature stream and collect matching features manually + if (!biomeFeatureCache.containsKey(biome)) { + biomeFeatureCache.put(biome, + biome.getGenerationSettings().features().stream() + .flatMap(HolderSet::stream) + .flatMap(feature -> ((PlacedFeature) feature.value()).getFeatures()) + .filter(feature -> { + Optional>> key = feature.unwrapKey(); + return key.isPresent() && canSpawnFromBonemealList.contains(key.get()); + }) + .map(Holder::value) + .collect(ImmutableList.toImmutableList())); + } + return biomeFeatureCache.get(biome); + } + @Override public net.pl3x.map.core.world.@Nullable Block getFlower(World world, net.pl3x.map.core.world.Biome biome, int blockX, int blockY, int blockZ) { // https://github.com/Draradech/FlowerMap (CC0-1.0 license) @@ -159,13 +196,12 @@ public int getColorForPower(byte power) { if (nms == null) { return null; } - List> flowers = nms.getGenerationSettings().getFlowerFeatures(); + List> flowers = this.getBoneMealFeatures(nms); if (flowers.isEmpty()) { return null; } - RandomPatchConfiguration config = (RandomPatchConfiguration) flowers.getFirst().config(); - SimpleBlockConfiguration flower = (SimpleBlockConfiguration) config.feature().value().feature().value().config(); - Block block = flower.toPlace().getState(this.randomSource, new BlockPos(blockX, blockY, blockZ)).getBlock(); + SimpleBlockConfiguration flowerMap = (SimpleBlockConfiguration) flowers.getFirst().config(); + Block block = flowerMap.toPlace().getState(world.getLevel(), this.randomSource, new BlockPos(blockX, blockY, blockZ)).getBlock(); return getBlockRegistry().get(BuiltInRegistries.BLOCK.getKey(block).toString()); } diff --git a/core/src/main/java/net/pl3x/map/core/configuration/ColorsConfig.java b/core/src/main/java/net/pl3x/map/core/configuration/ColorsConfig.java index 16e770d0b..63265cdc0 100644 --- a/core/src/main/java/net/pl3x/map/core/configuration/ColorsConfig.java +++ b/core/src/main/java/net/pl3x/map/core/configuration/ColorsConfig.java @@ -373,6 +373,7 @@ Setting a color to black (#000000) will make it invisible.""") put("minecraft:glowstone", 0xAD8455); put("minecraft:gold_block", 0xF8D33E); put("minecraft:gold_ore", 0x938769); + put("minecraft:golden_dandelion", 0xA56D29); put("minecraft:granite", 0x956756); put("minecraft:granite_slab", 0x956756); put("minecraft:granite_stairs", 0x956756); @@ -690,6 +691,7 @@ Setting a color to black (#000000) will make it invisible.""") put("minecraft:potted_dead_bush", 0x6D5029); put("minecraft:potted_fern", 0x7EA44D); put("minecraft:potted_flowering_azalea_bush", 0x9D5CAB); + put("minecraft:potted_golden_dandelion", 0xA56D29); put("minecraft:potted_jungle_sapling", 0x305111); put("minecraft:potted_lily_of_the_valley", 0x7DB061); put("minecraft:potted_mangrove_propagule", 0x5FAF54); diff --git a/core/src/main/java/net/pl3x/map/core/world/Blocks.java b/core/src/main/java/net/pl3x/map/core/world/Blocks.java index 9b271e3bd..193021d77 100644 --- a/core/src/main/java/net/pl3x/map/core/world/Blocks.java +++ b/core/src/main/java/net/pl3x/map/core/world/Blocks.java @@ -1209,7 +1209,10 @@ public class Blocks { public static final Block PALE_OAK_SHELF = register(new Block(1165, "minecraft:pale_oak_shelf", 0xE4DAD8)); public static final Block SPRUCE_SHELF = register(new Block(1166, "minecraft:spruce_shelf", 0x815631)); public static final Block WARPED_SHELF = register(new Block(1167, "minecraft:warped_shelf", 0x3A8E8C)); - + + public static final Block GOLDEN_DANDELION = register(new Block(1168, "minecraft:golden_dandelion", 0xA56D29)); + public static final Block POTTED_GOLDEN_DANDELION = register(new Block(1169, "minecraft:potted_golden_dandelion", 0xA56D29)); + private static Block register(Block block) { blocks.put(block.getKey(), block); return block; diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index caaa21598..fdc8ad669 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -36,19 +36,18 @@ repositories { dependencies { minecraft(libs.minecraft) - mappings(loom.officialMojangMappings()) implementation(project(path = ":core", configuration = "shadow")) implementation(libs.jspecifyAnnotations) - modImplementation(libs.fabric.loader) - modImplementation(libs.fabric.api) + implementation(libs.fabric.loader) + implementation(libs.fabric.api) - modImplementation(libs.cloudFabric) + implementation(libs.cloudFabric) include(libs.cloudFabric) - modImplementation(libs.adventurePlatformFabric) { + implementation(libs.adventurePlatformFabric) { exclude("net.kyori", "ansi") // TODO: temporary } include(libs.adventurePlatformFabric) { @@ -56,20 +55,31 @@ dependencies { } } -tasks { - remapJar { - dependsOn(shadowJar) - inputFile.set(shadowJar.get().archiveFile) - - archiveClassifier = "" - } +// https://github.com/BlueMap-Minecraft/BlueMap/blob/master/implementations/fabric/build.gradle.kts#L95-L109 +val mergeShadowAndJarJar = tasks.register("mergeShadowAndJarJar") { + dependsOn( tasks.shadowJar, tasks.jar ) + from ( + zipTree( tasks.shadowJar.map { it.outputs.files.singleFile } ).matching { + exclude("fabric.mod.json") + }, + zipTree( tasks.jar.map { it.outputs.files.singleFile } ).matching { + include("META-INF/jars/**") + include("fabric.mod.json") + } + ).exclude( + "META-INF/services/net.kyori.adventure*" // not correctly relocated and not needed -> exclude + ) + archiveFileName = tasks.jar.map { it.outputs.files.singleFile.name + ".tmp"} +} +tasks { // needed for below jank compileJava { dependsOn(":core:jar") } shadowJar { + dependsOn(jar) mergeServiceFiles() dependencies { @@ -80,10 +90,11 @@ tasks { manifest { from(project(":core").tasks.named("shadowJar").get().manifest) } + } build { - dependsOn(remapJar) + dependsOn(mergeShadowAndJarJar) } processResources { diff --git a/fabric/src/main/java/net/pl3x/map/fabric/client/Pl3xMapFabricClient.java b/fabric/src/main/java/net/pl3x/map/fabric/client/Pl3xMapFabricClient.java index 52f1246f9..27cf0d062 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/client/Pl3xMapFabricClient.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/client/Pl3xMapFabricClient.java @@ -27,7 +27,7 @@ import java.util.concurrent.ExecutorService; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.fabricmc.fabric.api.client.keymapping.v1.KeyMappingHelper; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; @@ -84,12 +84,12 @@ public Pl3xMapFabricClient() { @Override public void onInitializeClient() { - KeyBindingHelper.registerKeyBinding(PL3XMAP_TOGGLE_KEYMAP); + KeyMappingHelper.registerKeyMapping(PL3XMAP_TOGGLE_KEYMAP); - PayloadTypeRegistry.playC2S().register(ServerboundServerPayload.TYPE, ServerboundServerPayload.STREAM_CODEC); - PayloadTypeRegistry.playS2C().register(ClientboundServerPayload.TYPE, ClientboundServerPayload.STREAM_CODEC); - PayloadTypeRegistry.playC2S().register(ServerboundMapPayload.TYPE, ServerboundMapPayload.STREAM_CODEC); - PayloadTypeRegistry.playS2C().register(ClientboundMapPayload.TYPE, ClientboundMapPayload.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(ServerboundServerPayload.TYPE, ServerboundServerPayload.STREAM_CODEC); + PayloadTypeRegistry.clientboundPlay().register(ClientboundServerPayload.TYPE, ClientboundServerPayload.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(ServerboundMapPayload.TYPE, ServerboundMapPayload.STREAM_CODEC); + PayloadTypeRegistry.clientboundPlay().register(ClientboundMapPayload.TYPE, ClientboundMapPayload.STREAM_CODEC); ClientPlayNetworking.registerGlobalReceiver(ClientboundServerPayload.TYPE, ClientboundServerPayload::handle); ClientPlayNetworking.registerGlobalReceiver(ClientboundMapPayload.TYPE, ClientboundMapPayload::handle); @@ -120,7 +120,7 @@ public void onInitializeClient() { this.isEnabled = !this.isEnabled; MutableComponent onOff = Component.translatable("pl3xmap.toggled." + (this.isEnabled ? "on" : "off")); MutableComponent component = Component.translatable("pl3xmap.toggled.response", onOff); - Minecraft.getInstance().player.displayClientMessage(component, true); + Minecraft.getInstance().player.sendSystemMessage(component); } if (this.tick++ >= 20) { this.tick = 0; diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricNetwork.java b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricNetwork.java index 319b2c61d..28ebaf42d 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricNetwork.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricNetwork.java @@ -52,10 +52,10 @@ public FabricNetwork(Pl3xMapFabricServer mod) { @Override public void register() { - PayloadTypeRegistry.playC2S().register(ServerboundServerPayload.TYPE, ServerboundServerPayload.STREAM_CODEC); - PayloadTypeRegistry.playS2C().register(ClientboundServerPayload.TYPE, ClientboundServerPayload.STREAM_CODEC); - PayloadTypeRegistry.playC2S().register(ServerboundMapPayload.TYPE, ServerboundMapPayload.STREAM_CODEC); - PayloadTypeRegistry.playS2C().register(ClientboundMapPayload.TYPE, ClientboundMapPayload.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(ServerboundServerPayload.TYPE, ServerboundServerPayload.STREAM_CODEC); + PayloadTypeRegistry.clientboundPlay().register(ClientboundServerPayload.TYPE, ClientboundServerPayload.STREAM_CODEC); + PayloadTypeRegistry.serverboundPlay().register(ServerboundMapPayload.TYPE, ServerboundMapPayload.STREAM_CODEC); + PayloadTypeRegistry.clientboundPlay().register(ClientboundMapPayload.TYPE, ClientboundMapPayload.STREAM_CODEC); ServerPlayNetworking.registerGlobalReceiver(ServerboundServerPayload.TYPE, (payload, context) -> { ServerPlayNetworking.send(context.player(), new ClientboundServerPayload(Constants.PROTOCOL, Constants.RESPONSE_SUCCESS, Config.WEB_ADDRESS)); diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java b/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java index 6fce97027..9c1e106cf 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/Pl3xMapFabricServer.java @@ -23,17 +23,21 @@ */ package net.pl3x.map.fabric.server; +import com.google.common.collect.ImmutableList; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import net.fabricmc.api.DedicatedServerModInitializer; import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLevelEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; @@ -41,8 +45,11 @@ import net.kyori.adventure.platform.modcommon.MinecraftServerAudiences; import net.minecraft.SharedConstants; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.features.VegetationFeatures; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.Identifier; import net.minecraft.server.MinecraftServer; @@ -53,14 +60,12 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.RedStoneWireBlock; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.pl3x.map.core.Pl3xMap; import net.pl3x.map.core.event.server.ServerLoadedEvent; -import net.pl3x.map.core.log.Logger; import net.pl3x.map.core.player.Player; import net.pl3x.map.core.player.PlayerListener; -import net.pl3x.map.core.registry.BlockRegistry; import net.pl3x.map.core.world.World; import net.pl3x.map.fabric.server.command.FabricCommandManager; import org.jspecify.annotations.NullMarked; @@ -75,6 +80,8 @@ public class Pl3xMapFabricServer extends Pl3xMap implements DedicatedServerModIn private MinecraftServer server; private ModContainer modContainer; private MinecraftServerAudiences adventure; + private Map>> biomeFeatureCache = new LinkedHashMap<>(); + ArrayList>> canSpawnFromBonemealList = new ArrayList<>(10); private boolean firstTick = true; @@ -96,6 +103,15 @@ public void onInitializeServer() { if (this.firstTick) { Pl3xMap.api().getEventRegistry().callEvent(new ServerLoadedEvent()); this.firstTick = false; + + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_DEFAULT); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_FLOWER_FOREST); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_SWAMP); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_PLAIN); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_MEADOW); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_CHERRY); + canSpawnFromBonemealList.add(VegetationFeatures.WILDFLOWER); + canSpawnFromBonemealList.add(VegetationFeatures.FLOWER_PALE_GARDEN); } getScheduler().tick(); }); @@ -114,14 +130,14 @@ public void onInitializeServer() { } }); - ServerWorldEvents.LOAD.register((server, level) -> { + ServerLevelEvents.LOAD.register((server, level) -> { if (isEnabled()) { String name = level.dimension().identifier().toString(); Pl3xMap.api().getWorldRegistry().getOrDefault(name, () -> new FabricWorld(level, name)); } }); - ServerWorldEvents.UNLOAD.register((server, level) -> { + ServerLevelEvents.UNLOAD.register((server, level) -> { String name = level.dimension().identifier().toString(); Pl3xMap.api().getWorldRegistry().unregister(name); }); @@ -210,6 +226,26 @@ public int getColorForPower(byte power) { return RedStoneWireBlock.getColorForPower(power); } + private List> getBoneMealFeatures(Biome biome) { + // https://github.com/Draradech/FlowerMap (CC0-1.0 license) + // the biomes created from the builtin registry are missing tags + // with the new can_spawn_from_bonemeal tag for vegetation features we can no longer just call getFlowerFeatures (now called getBonemealFeatures) + // iterate through the feature stream and collect matching features manually + if (!biomeFeatureCache.containsKey(biome)) { + biomeFeatureCache.put(biome, + biome.getGenerationSettings().features().stream() + .flatMap(HolderSet::stream) + .flatMap(feature -> ((PlacedFeature) feature.value()).getFeatures()) + .filter(feature -> { + Optional>> key = feature.unwrapKey(); + return key.isPresent() && canSpawnFromBonemealList.contains(key.get()); + }) + .map(Holder::value) + .collect(ImmutableList.toImmutableList())); + } + return biomeFeatureCache.get(biome); + } + @Override public net.pl3x.map.core.world.@Nullable Block getFlower(World world, net.pl3x.map.core.world.Biome biome, int blockX, int blockY, int blockZ) { // https://github.com/Draradech/FlowerMap (CC0-1.0 license) @@ -217,13 +253,12 @@ public int getColorForPower(byte power) { if (nms == null) { return null; } - List> flowers = nms.getGenerationSettings().getFlowerFeatures(); + List> flowers = this.getBoneMealFeatures(nms); if (flowers.isEmpty()) { return null; } - RandomPatchConfiguration config = (RandomPatchConfiguration) flowers.getFirst().config(); - SimpleBlockConfiguration flower = (SimpleBlockConfiguration) config.feature().value().feature().value().config(); - Block block = flower.toPlace().getState(this.randomSource, new BlockPos(blockX, blockY, blockZ)).getBlock(); + SimpleBlockConfiguration flowerMap = (SimpleBlockConfiguration) flowers.getFirst().config(); + Block block = flowerMap.toPlace().getState(world.getLevel(), this.randomSource, new BlockPos(blockX, blockY, blockZ)).getBlock(); return getBlockRegistry().get(BuiltInRegistries.BLOCK.getKey(block).toString()); } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index ab25cc382..2805186c2 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -34,9 +34,9 @@ "accessWidener": "pl3xmap.accesswidener", "depends": { "fabricloader": ">=${fabricLoaderVersion}", - "fabric": ">=${fabricApiVersion}", + "fabric-api": ">=${fabricApiVersion}", "minecraft": "~${minecraftVersion}", - "java": ">=21", + "java": ">=25", "cloud": "*", "adventure-platform-fabric": "*" }, diff --git a/fabric/src/main/resources/pl3xmap.accesswidener b/fabric/src/main/resources/pl3xmap.accesswidener index 83cd7cba9..be350fa11 100644 --- a/fabric/src/main/resources/pl3xmap.accesswidener +++ b/fabric/src/main/resources/pl3xmap.accesswidener @@ -1,4 +1,4 @@ -accessWidener v2 named +accessWidener v2 official # client accessible class net/minecraft/client/resources/MapTextureManager$MapInstance @@ -8,5 +8,5 @@ accessible field net/minecraft/client/resources/MapTextureManager maps Lit/unimi # server accessible class net/minecraft/world/level/biome/Biome$ClimateSettings accessible field net/minecraft/world/level/biome/Biome climateSettings Lnet/minecraft/world/level/biome/Biome$ClimateSettings; -accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/nio/file/Path; +accessible field net/minecraft/world/level/storage/SavedDataStorage dataFolder Ljava/nio/file/Path; accessible field net/minecraft/commands/CommandSourceStack source Lnet/minecraft/commands/CommandSource; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 92be64264..d9f9fe3b1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,29 +1,29 @@ [versions] -bukkit="1.21.11-R0.1-SNAPSHOT" -minecraft="1.21.11" +bukkit="26.1.2.build.+" +minecraft="26.1.2" # https://fabricmc.net/develop/ -fabricApi="0.139.5+1.21.11" -fabricLoader="0.18.2" -fabricLoom="1.14-SNAPSHOT" +fabricApi="0.145.4+26.1.2" +fabricLoader="0.19.1" +fabricLoom="1.16-SNAPSHOT" #forge="1.20.2-48.0.6" #forgeGradle="[6.0,6.2)" #forgeLoader="[48,)" minotaur="2.+" # https://github.com/modrinth/minotaur -paperweight="2.0.0-beta.19" # https://github.com/PaperMC/Paperweight +paperweight="2.0.0-beta.21" # https://github.com/PaperMC/Paperweight run-paper="3.0.2" # https://github.com/jpenilla/run-task indra-git="4.0.0" # https://github.com/KyoriPowered/indra shadowJar="8.3.9" # https://github.com/GradleUp/shadow adventure="5.0.0-SNAPSHOT" # https://github.com/KyoriPowered/adventure adventureBukkit="4.4.1" # https://github.com/KyoriPowered/adventure-platform -adventureFabric="6.8.0" # https://github.com/KyoriPowered/adventure-platform-fabric +adventureFabric="6.9.0-SNAPSHOT" # https://github.com/KyoriPowered/adventure-platform-fabric cloud="2.0.0" # https://github.com/incendo/cloud -cloud-minecraft="2.0.0-beta.14" # https://github.com/Incendo/cloud-minecraft -cloud-minecraft-modded="2.0.0-beta.15" # https://github.com/Incendo/cloud-minecraft-modded +cloud-minecraft="2.0.0-SNAPSHOT" # https://github.com/Incendo/cloud-minecraft +cloud-minecraft-modded="2.0.0-SNAPSHOT" # https://github.com/Incendo/cloud-minecraft-modded cloud-processors="1.0.0-rc.1" # https://github.com/Incendo/cloud-processors caffeine="3.2.3" # https://github.com/ben-manes/caffeine @@ -36,14 +36,14 @@ querzNbt="6.1" # https://github.com/Querz/NBT lz4Java="1.8.0" # https://github.com/lz4/lz4-java simpleYaml="1.8.4" # https://github.com/Carleslc/Simple-YAML slf4j="2.0.1" -undertow="2.4.0.Alpha1" # https://github.com/undertow-io/undertow +undertow="2.4.0.Beta1" # https://github.com/undertow-io/undertow #xnio="3.8.8.Final" [plugins] minotaur = { id = "com.modrinth.minotaur", version.ref = "minotaur" } shadow = { id = "com.gradleup.shadow", version.ref = "shadowJar" } -fabric-loom = { id = "fabric-loom", version.ref = "fabricLoom" } +fabric-loom = { id = "net.fabricmc.fabric-loom", version.ref = "fabricLoom" } indra-git = { id = "net.kyori.indra.git", version.ref = "indra-git" } paperweight-userdev = { id = "io.papermc.paperweight.userdev", version.ref = "paperweight" } run-paper = { id = "xyz.jpenilla.run-paper", version.ref = "run-paper" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f8e1ee312..d997cfc60 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c2462..dbc3ce4a0 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-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index adff685a0..0262dcbd5 100755 --- a/gradlew +++ b/gradlew @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/.