Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@


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.");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -124,6 +128,11 @@ public boolean isDebugLog() {
return debugLog;
}

@Override
public String getBiomeKeyFormat() {
return biomeKeyFormat;
}

@Override
public int getBiomeSearchResolution() {
return biomeSearch;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -28,15 +29,14 @@
import java.util.stream.Collectors;

import com.dfsek.terra.bukkit.world.BukkitPlatformBiome;
import com.dfsek.terra.registry.master.ConfigRegistry;


public class AwfulBukkitHacks {
private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class);

private static final Map<ResourceLocation, List<ResourceLocation>> terraBiomeMap = new HashMap<>();

public static void registerBiomes(ConfigRegistry configRegistry) {
public static void registerBiomes(PlatformImpl platform) {
try {
LOGGER.info("Hacking biome registry...");
MappedRegistry<Biome> biomeRegistry = (MappedRegistry<Biome>) RegistryFetcher.biomeRegistry();
Expand All @@ -45,7 +45,7 @@ public static void registerBiomes(ConfigRegistry configRegistry) {
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();
Expand All @@ -54,14 +54,13 @@ public static void registerBiomes(ConfigRegistry configRegistry) {

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<Biome> delegateKey = ResourceKey.create(Registries.BIOME, delegateMinecraftKey);

Reference<Biome> holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN);
Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder.
Reference<Biome> 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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
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());
}

Expand Down