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/.