From 9a5c1302ac32bd28b38056828a2eb18c3d024900 Mon Sep 17 00:00:00 2001 From: C_Corp2002 Date: Wed, 12 Apr 2023 00:51:12 -0700 Subject: [PATCH] Fixing...? We gottem. --- .../bukkit/nms/v1_19_R3/AwfulBukkitHacks.java | 1 + .../nms/v1_19_R3/AwfulBukkitHacks.java.txt | 100 ++++++++++++++++++ .../bukkit/nms/v1_19_R3/NMSBiomeInjector.java | 2 + 3 files changed, 103 insertions(+) create mode 100644 platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java index d5ab4b3d2..6ce0cc9a5 100644 --- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java @@ -98,3 +98,4 @@ public class AwfulBukkitHacks { } } } + diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt new file mode 100644 index 000000000..d5ab4b3d2 --- /dev/null +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/AwfulBukkitHacks.java.txt @@ -0,0 +1,100 @@ +package com.dfsek.terra.bukkit.nms.v1_19_R3; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.Holder; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.WritableRegistry; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.bukkit.NamespacedKey; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +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> terraBiomeMap = new HashMap<>(); + + public static void registerBiomes(ConfigRegistry configRegistry) { + try { + LOGGER.info("Hacking biome registry..."); + WritableRegistry biomeRegistry = (WritableRegistry) RegistryFetcher.biomeRegistry(); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, false); + + configRegistry.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(); + ResourceLocation vanillaMinecraftKey = new ResourceLocation(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); + Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + + ResourceKey delegateKey = ResourceKey.create( + Registries.BIOME, + new ResourceLocation("terra", NMSBiomeInjector.createBiomeID(pack, key)) + ); + + Reference holder = biomeRegistry.register(delegateKey, platform, Lifecycle.stable()); + Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder. + + platformBiome.getContext().put(new NMSBiomeInfo(delegateKey)); + + terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location()); + + LOGGER.debug("Registered biome: " + delegateKey); + } catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException(e); + } + })); + + Reflection.MAPPED_REGISTRY.setFrozen((MappedRegistry) biomeRegistry, true); // freeze registry again :) + + LOGGER.info("Doing tag garbage...."); + Map, List>> collect = biomeRegistry + .getTags() // streamKeysAndEntries + .collect(HashMap::new, + (map, pair) -> + map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), + HashMap::putAll); + + terraBiomeMap + .forEach((vb, terraBiomes) -> + NMSBiomeInjector.getEntry(biomeRegistry, vb).ifPresentOrElse( + vanilla -> terraBiomes.forEach( + tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse( + terra -> { + LOGGER.debug("{} (vanilla for {}): {}", + vanilla.unwrapKey().orElseThrow().location(), + terra.unwrapKey().orElseThrow().location(), + vanilla.tags().toList()); + vanilla.tags() + .forEach(tag -> collect + .computeIfAbsent(tag, t -> new ArrayList<>()) + .add(terra)); + }, + () -> LOGGER.error("No such biome: {}", tb))), + () -> LOGGER.error("No vanilla biome: {}", vb))); + + biomeRegistry.resetTags(); + biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + + } catch(SecurityException | IllegalArgumentException exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java index 11b309ea6..f7bedfd0f 100644 --- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/v1_19_R3/NMSBiomeInjector.java @@ -16,6 +16,7 @@ import java.util.function.Function; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.bukkit.config.VanillaBiomeProperties; +import static net.minecraft.world.level.biome.Biome.ClimateSettings; import static net.minecraft.world.level.biome.Biome.Precipitation; public class NMSBiomeInjector { @@ -31,6 +32,7 @@ public class NMSBiomeInjector { Biome.BiomeBuilder builder = new Biome.BiomeBuilder(); builder + .downfall(vanilla.climateSettings.downfall()) .temperature(vanilla.getBaseTemperature()) .mobSpawnSettings(vanilla.getMobSettings()) .generationSettings(vanilla.getGenerationSettings());