From 764a4fa5356e1f9bfc663f4ac86c55809165b89b Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 19 Dec 2022 01:27:35 -0700 Subject: [PATCH] continue registry wrangling --- .../java/com/dfsek/terra/mod/ModPlatform.java | 12 +++- .../com/dfsek/terra/mod/util/PresetUtil.java | 17 +++-- .../terra/lifecycle/LifecyclePlatform.java | 32 +++++++-- .../mixin/lifecycle/RegistryLoaderMixin.java | 65 +++++++++++++++++++ .../mixin/lifecycle/SaveLoadingMixin.java | 29 --------- .../dfsek/terra/lifecycle/util/BiomeUtil.java | 3 +- .../terra/lifecycle/util/LifecycleUtil.java | 11 ++-- .../resources/terra.lifecycle.mixins.json | 24 +++---- 8 files changed, 127 insertions(+), 66 deletions(-) create mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java delete mode 100644 platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java index 4fbd61b06..9f26738b1 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java @@ -6,6 +6,7 @@ import com.dfsek.tectonic.api.exception.LoadException; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.sound.BiomeAdditionsSound; @@ -14,13 +15,16 @@ import net.minecraft.sound.MusicSound; import net.minecraft.sound.SoundEvent; import net.minecraft.util.Identifier; import net.minecraft.village.VillagerType; +import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome.Precipitation; import net.minecraft.world.biome.Biome.TemperatureModifier; import net.minecraft.world.biome.BiomeEffects.GrassColorModifier; import net.minecraft.world.biome.BiomeParticleConfig; import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; +import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -58,7 +62,7 @@ public abstract class ModPlatform extends AbstractPlatform { public void registerWorldTypes(BiConsumer registerFunction) { getRawConfigRegistry() - .forEach(pack -> PresetUtil.createDefault(pack, getMinecraftRegistry()).apply(registerFunction)); + .forEach(pack -> PresetUtil.createDefault(pack, this).apply(registerFunction)); } @Override @@ -95,7 +99,7 @@ public abstract class ModPlatform extends AbstractPlatform { private ProtoPlatformBiome parseBiome(String id, DepthTracker tracker) throws LoadException { Identifier identifier = Identifier.tryParse(id); - if(getMinecraftRegistry().get(RegistryKeys.BIOME).get(identifier) == null) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. + if(!biomeRegistry().containsId(identifier)) throw new LoadException("Invalid Biome ID: " + identifier, tracker); // failure. return new ProtoPlatformBiome(identifier); } @@ -106,7 +110,9 @@ public abstract class ModPlatform extends AbstractPlatform { protected abstract BaseAddon getPlatformAddon(); - public abstract DynamicRegistryManager getMinecraftRegistry(); + public abstract Registry dimensionTypeRegistry(); + public abstract Registry biomeRegistry(); + public abstract Registry chunkGeneratorSettingsRegistry(); @Override public @NotNull WorldHandle getWorldHandle() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java index bbe9c78f2..5c7e8ce3d 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/PresetUtil.java @@ -1,5 +1,7 @@ package com.dfsek.terra.mod.util; +import com.dfsek.terra.mod.ModPlatform; + import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; @@ -33,19 +35,17 @@ public class PresetUtil { private static final Logger LOGGER = LoggerFactory.getLogger(PresetUtil.class); private static final List PRESETS = new ArrayList<>(); - public static Pair createDefault(ConfigPack pack, DynamicRegistryManager registryManager) { - Registry dimensionTypeRegistry = registryManager.get(RegistryKeys.DIMENSION_TYPE); - Registry chunkGeneratorSettingsRegistry = registryManager.get(RegistryKeys.CHUNK_GENERATOR_SETTINGS); - Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); - + public static Pair createDefault(ConfigPack pack, ModPlatform platform) { + Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); + Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); + RegistryEntry theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER).orElseThrow(); DimensionOptions netherDimensionOptions = new DimensionOptions(theNetherDimensionType, new NoiseChunkGenerator( MultiNoiseBiomeSource.Preset.NETHER.getBiomeSource( - registryManager.createRegistryLookup() - .getOrThrow(RegistryKeys.BIOME)), + platform.biomeRegistry().getReadOnlyWrapper()), netherChunkGeneratorSettings)); RegistryEntry theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry( @@ -53,8 +53,7 @@ public class PresetUtil { DimensionOptions endDimensionOptions = new DimensionOptions(theEndDimensionType, new NoiseChunkGenerator( TheEndBiomeSource.createVanilla( - registryManager.createRegistryLookup() - .getOrThrow(RegistryKeys.BIOME)), + platform.biomeRegistry().getReadOnlyWrapper()), endChunkGeneratorSettings)); RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java index 5ff1387a3..8efe9562c 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java @@ -4,7 +4,11 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import net.minecraft.MinecraftVersion; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registry; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,7 +20,6 @@ import java.util.concurrent.atomic.AtomicReference; import com.dfsek.terra.addon.EphemeralAddon; import com.dfsek.terra.api.addon.BaseAddon; -import com.dfsek.terra.lifecycle.util.BiomeUtil; import com.dfsek.terra.mod.CommonPlatform; import com.dfsek.terra.mod.ModPlatform; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; @@ -26,7 +29,9 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final Logger LOGGER = LoggerFactory.getLogger(LifecyclePlatform.class); private static MinecraftServer server; - private static final AtomicReference DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>(); + private static final AtomicReference> BIOMES = new AtomicReference<>(); + private static final AtomicReference> DIMENSIONS = new AtomicReference<>(); + private static final AtomicReference> SETTINGS = new AtomicReference<>(); public LifecyclePlatform() { CommonPlatform.initialize(this); @@ -54,7 +59,6 @@ public abstract class LifecyclePlatform extends ModPlatform { LOGGER.warn("Failed to execute reload", throwable); return null; }).join(); - BiomeUtil.registerBiomes(DYNAMIC_REGISTRY_MANAGER.get()); server.getWorlds().forEach(world -> { if(world.getChunkManager().getChunkGenerator() instanceof MinecraftChunkGeneratorWrapper chunkGeneratorWrapper) { getConfigRegistry().get(chunkGeneratorWrapper.getPack().getRegistryKey()).ifPresent(pack -> { @@ -67,8 +71,12 @@ public abstract class LifecyclePlatform extends ModPlatform { return succeed; } - public static void addRegistryManager(DynamicRegistryManager in) { - DYNAMIC_REGISTRY_MANAGER.set(Objects.requireNonNull(in)); + public static void setRegistries(Registry biomeRegistry, + Registry dimensionTypeRegistry, + Registry chunkGeneratorSettingsRegistry) { + BIOMES.set(biomeRegistry); + DIMENSIONS.set(dimensionTypeRegistry); + SETTINGS.set(chunkGeneratorSettingsRegistry); } @Override @@ -94,8 +102,18 @@ public abstract class LifecyclePlatform extends ModPlatform { } @Override - public DynamicRegistryManager getMinecraftRegistry() { - return DYNAMIC_REGISTRY_MANAGER.get(); + public Registry dimensionTypeRegistry() { + return DIMENSIONS.get(); + } + + @Override + public Registry biomeRegistry() { + return BIOMES.get(); + } + + @Override + public Registry chunkGeneratorSettingsRegistry() { + return SETTINGS.get(); } protected abstract Collection getPlatformMods(); diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java new file mode 100644 index 000000000..14a466dd4 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java @@ -0,0 +1,65 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + +import com.dfsek.terra.lifecycle.LifecyclePlatform; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.registry.MutableRegistry; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryLoader; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import org.checkerframework.checker.units.qual.C; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; +import java.util.function.Consumer; + +import com.dfsek.terra.lifecycle.util.LifecycleUtil; + + +@Mixin(RegistryLoader.class) +public class RegistryLoaderMixin { + @SuppressWarnings("unchecked") + @Redirect( + method = "load(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + + "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + at = @At( + value = "INVOKE", + target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V", + ordinal = 1 // we want right after the first forEach + ) + ) + private static void grabManager(List, Object>> instance, Consumer, Object>> consumer) { + MutableRegistry biomeMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.BIOME)) + .findFirst() + .orElseThrow(); + MutableRegistry worldPresetMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.WORLD_PRESET)) + .findFirst() + .orElseThrow(); + MutableRegistry dimensionTypeMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.DIMENSION_TYPE)) + .findFirst() + .orElseThrow(); + MutableRegistry chunkGeneratorSettingsMutableRegistry = (MutableRegistry) + instance.stream() + .map(Pair::getFirst) + .filter(r -> r.getKey().equals(RegistryKeys.CHUNK_GENERATOR_SETTINGS)) + .findFirst() + .orElseThrow(); + LifecyclePlatform.setRegistries(biomeMutableRegistry, dimensionTypeMutableRegistry, chunkGeneratorSettingsMutableRegistry); + LifecycleUtil.initialize(biomeMutableRegistry, worldPresetMutableRegistry); + instance.forEach(consumer); + } +} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java deleted file mode 100644 index cc3c63339..000000000 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.dfsek.terra.lifecycle.mixin.lifecycle; - -import com.dfsek.terra.lifecycle.util.LifecycleUtil; - -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.server.SaveLoading; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; - - -@Mixin(SaveLoading.class) -public class SaveLoadingMixin { - @ModifyArg( - method = "method_42097(Lnet/minecraft/registry/DynamicRegistryManager$Immutable;" + - "Lnet/minecraft/server/SaveLoading$SaveApplierFactory;Lnet/minecraft/resource/LifecycledResourceManager;" + - "Lnet/minecraft/registry/CombinedDynamicRegistries;Lnet/minecraft/server/SaveLoading$LoadContext;" + - "Lnet/minecraft/server/DataPackContents;)Ljava/lang/Object;", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/DataPackContents;refresh(Lnet/minecraft/registry/DynamicRegistryManager;)V" - ), - index = 0 - ) - private static DynamicRegistryManager grabManager(DynamicRegistryManager in) { - LifecycleUtil.initialize(in); - return in; - } -} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java index b01e4d808..633434a97 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java @@ -30,8 +30,7 @@ public final class BiomeUtil { } - public static void registerBiomes(DynamicRegistryManager registryManager) { - Registry biomeRegistry = registryManager.get(RegistryKeys.BIOME); + public static void registerBiomes(Registry biomeRegistry) { logger.info("Registering biomes..."); CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java index 1d0fbd7d6..70291458b 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/LifecycleUtil.java @@ -3,22 +3,25 @@ package com.dfsek.terra.lifecycle.util; import com.dfsek.terra.lifecycle.LifecyclePlatform; import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.MutableRegistry; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.mod.CommonPlatform; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.WorldPreset; + public final class LifecycleUtil { private LifecycleUtil() { } - public static void initialize(DynamicRegistryManager registryManager) { - LifecyclePlatform.addRegistryManager(registryManager); + public static void initialize(MutableRegistry biomeMutableRegistry, MutableRegistry worldPresetMutableRegistry) { CommonPlatform.get().getEventManager().callEvent(new PlatformInitializationEvent()); - BiomeUtil.registerBiomes(registryManager); - CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(registryManager.get(RegistryKeys.WORLD_PRESET), id, preset)); + BiomeUtil.registerBiomes(biomeMutableRegistry); + CommonPlatform.get().registerWorldTypes((id, preset) -> Registry.register(worldPresetMutableRegistry, id, preset)); } } diff --git a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json index 6d01c7ced..afc8050c2 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,20 +1,20 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ + "required" : true, + "minVersion" : "0.8", + "package" : "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel" : "JAVA_17", + "mixins" : [ "NoiseConfigMixin", "RegistryMixin", - "lifecycle.SaveLoadingMixin", - "lifecycle.MinecraftServerMixin" + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryLoaderMixin" ], - "client": [ + "client" : [ ], - "server": [ + "server" : [ ], - "injectors": { - "defaultRequire": 1 + "injectors" : { + "defaultRequire" : 1 }, - "refmap": "terra.lifecycle.refmap.json" + "refmap" : "terra.lifecycle.refmap.json" } \ No newline at end of file