From 8d8034d4e25c8ce876318d6d70e1d9ae1a0331a3 Mon Sep 17 00:00:00 2001 From: OakLoaf Date: Thu, 3 Jul 2025 21:37:45 +0100 Subject: [PATCH] Added biome-key-format configuration option to config.yml --- .../com/dfsek/terra/api/config/PluginConfig.java | 15 +++++++++++++++ .../dfsek/terra/api/registry/key/RegistryKey.java | 6 +++--- .../com/dfsek/terra/config/PluginConfigImpl.java | 9 +++++++++ .../base/src/main/resources/config.yml | 1 + .../bukkit/nms/v1_21_7/AwfulBukkitHacks.java | 15 +++++++-------- .../terra/bukkit/nms/v1_21_7/NMSInitializer.java | 2 +- 6 files changed, 36 insertions(+), 12 deletions(-) diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java b/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java index 95fbf296b..eea944a37 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/PluginConfig.java @@ -8,6 +8,7 @@ package com.dfsek.terra.api.config; import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.registry.key.RegistryKey; public interface PluginConfig { @@ -23,6 +24,20 @@ public interface PluginConfig { boolean isDebugLog(); + String getBiomeKeyFormat(); + + default RegistryKey getBiomeKey(ConfigPack pack, RegistryKey biomeKey) { + String format = this.getBiomeKeyFormat() + .replace("%pack_id%", pack.getID().toLowerCase()) + .replace("%biome_namespace%", biomeKey.getNamespace().toLowerCase()) + .replace("%biome_id%", biomeKey.getID().toLowerCase()); + if (format.contains(":")) { + return RegistryKey.parse(format); + } else { + return RegistryKey.of("terra", format); + } + } + int getBiomeSearchResolution(); int getStructureCache(); diff --git a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java index ebcf4b0a4..ca4352c81 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java +++ b/common/api/src/main/java/com/dfsek/terra/api/registry/key/RegistryKey.java @@ -5,20 +5,20 @@ import java.util.regex.Pattern; public final class RegistryKey implements StringIdentifiable, Namespaced { - private static final Pattern ID_PATTERN = Pattern.compile("^[a-zA-Z0-9_-]*$"); + private static final Pattern ID_PATTERN = Pattern.compile("^[a-zA-Z0-9/_-]*$"); private final String namespace; private final String id; private RegistryKey(String namespace, String id) { if(!ID_PATTERN.matcher(namespace).matches()) { throw new IllegalArgumentException( - "Namespace must only contain alphanumeric characters, hyphens, and underscores. \"" + namespace + + "Namespace must only contain alphanumeric characters, hyphens, underscores and forward slashes. \"" + namespace + "\" is not a valid namespace."); } if(!ID_PATTERN.matcher(id).matches()) { throw new IllegalArgumentException( - "ID must only contain alphanumeric characters, hyphens, and underscores. \"" + id + + "ID must only contain alphanumeric characters, hyphens, underscores and forward slashes. \"" + id + "\" is not a valid ID."); } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java index d22c2945f..ccb7b01a2 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/PluginConfigImpl.java @@ -55,6 +55,10 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig { @Default private boolean debugLog = false; + @Value("biome-key-format") + @Default + private String biomeKeyFormat = "%pack_id%/%biome_namespace%/%biome_id%"; + @Value("biome-search-resolution") @Default private int biomeSearch = 4; @@ -124,6 +128,11 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig { return debugLog; } + @Override + public String getBiomeKeyFormat() { + return biomeKeyFormat; + } + @Override public int getBiomeSearchResolution() { return biomeSearch; diff --git a/common/implementation/base/src/main/resources/config.yml b/common/implementation/base/src/main/resources/config.yml index 72dd67061..2d15ea64d 100644 --- a/common/implementation/base/src/main/resources/config.yml +++ b/common/implementation/base/src/main/resources/config.yml @@ -11,6 +11,7 @@ debug: profiler: false script: false dump-default: true +biome-key-format: "%pack_id%/%biome_namespace%/%biome_id%" biome-search-resolution: 4 cache: structure: 32 diff --git a/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/AwfulBukkitHacks.java index 42cb293eb..d06e3d0bd 100644 --- a/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/AwfulBukkitHacks.java @@ -1,5 +1,6 @@ package com.dfsek.terra.bukkit.nms.v1_21_7; +import com.dfsek.terra.bukkit.PlatformImpl; import com.dfsek.terra.bukkit.nms.v1_21_7.config.VanillaBiomeProperties; import com.dfsek.terra.bukkit.world.BukkitBiomeInfo; @@ -28,7 +29,6 @@ import java.util.Set; import java.util.stream.Collectors; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; -import com.dfsek.terra.registry.master.ConfigRegistry; public class AwfulBukkitHacks { @@ -36,7 +36,7 @@ public class AwfulBukkitHacks { private static final Map> terraBiomeMap = new HashMap<>(); - public static void registerBiomes(ConfigRegistry configRegistry) { + public static void registerBiomes(PlatformImpl platform) { try { LOGGER.info("Hacking biome registry..."); MappedRegistry biomeRegistry = (MappedRegistry) RegistryFetcher.biomeRegistry(); @@ -45,7 +45,7 @@ public class AwfulBukkitHacks { Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, false); // Register the terra biomes to the registry - configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { + platform.getRawConfigRegistry().forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { try { BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); @@ -54,14 +54,13 @@ public class AwfulBukkitHacks { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); - Biome platform = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), vanillaBiomeProperties); - - ResourceLocation delegateMinecraftKey = ResourceLocation.fromNamespaceAndPath("terra", NMSBiomeInjector.createBiomeID(pack, key)); + Biome nmsBiome = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), vanillaBiomeProperties); + ResourceLocation delegateMinecraftKey = ResourceLocation.tryParse(platform.getTerraConfig().getBiomeKey(pack, key).toString()); NamespacedKey delegateBukkitKey = NamespacedKey.fromString(delegateMinecraftKey.toString()); ResourceKey delegateKey = ResourceKey.create(Registries.BIOME, delegateMinecraftKey); - Reference holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN); - Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + Reference holder = biomeRegistry.register(delegateKey, nmsBiome, RegistrationInfo.BUILT_IN); + Reflection.REFERENCE.invokeBindValue(holder, nmsBiome); // IMPORTANT: bind holder. platformBiome.getContext().put(new BukkitBiomeInfo(delegateBukkitKey)); platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); diff --git a/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/NMSInitializer.java b/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/NMSInitializer.java index 18fac9845..c1e46ca71 100644 --- a/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/NMSInitializer.java +++ b/platforms/bukkit/nms/v1_21_7/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_7/NMSInitializer.java @@ -11,7 +11,7 @@ import com.dfsek.terra.bukkit.nms.Initializer; public class NMSInitializer implements Initializer { @Override public void initialize(PlatformImpl platform) { - AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry()); + AwfulBukkitHacks.registerBiomes(platform); Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin()); }