continue registry wrangling

This commit is contained in:
dfsek
2022-12-19 01:27:35 -07:00
parent 5dd5c37055
commit 764a4fa535
8 changed files with 127 additions and 66 deletions

View File

@@ -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<Identifier, WorldPreset> 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<DimensionType> dimensionTypeRegistry();
public abstract Registry<Biome> biomeRegistry();
public abstract Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry();
@Override
public @NotNull WorldHandle getWorldHandle() {

View File

@@ -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<Identifier> PRESETS = new ArrayList<>();
public static Pair<Identifier, WorldPreset> createDefault(ConfigPack pack, DynamicRegistryManager registryManager) {
Registry<DimensionType> dimensionTypeRegistry = registryManager.get(RegistryKeys.DIMENSION_TYPE);
Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry = registryManager.get(RegistryKeys.CHUNK_GENERATOR_SETTINGS);
Registry<Biome> biomeRegistry = registryManager.get(RegistryKeys.BIOME);
public static Pair<Identifier, WorldPreset> createDefault(ConfigPack pack, ModPlatform platform) {
Registry<DimensionType> dimensionTypeRegistry = platform.dimensionTypeRegistry();
Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry();
RegistryEntry<DimensionType> theNetherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow();
RegistryEntry<ChunkGeneratorSettings>
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<DimensionType> theEndDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow();
RegistryEntry<ChunkGeneratorSettings> 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<DimensionType> overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow();

View File

@@ -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<DynamicRegistryManager> DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>();
private static final AtomicReference<Registry<Biome>> BIOMES = new AtomicReference<>();
private static final AtomicReference<Registry<DimensionType>> DIMENSIONS = new AtomicReference<>();
private static final AtomicReference<Registry<ChunkGeneratorSettings>> 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<Biome> biomeRegistry,
Registry<DimensionType> dimensionTypeRegistry,
Registry<ChunkGeneratorSettings> 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<DimensionType> dimensionTypeRegistry() {
return DIMENSIONS.get();
}
@Override
public Registry<Biome> biomeRegistry() {
return BIOMES.get();
}
@Override
public Registry<ChunkGeneratorSettings> chunkGeneratorSettingsRegistry() {
return SETTINGS.get();
}
protected abstract Collection<BaseAddon> getPlatformMods();

View File

@@ -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<Pair<MutableRegistry<?>, Object>> instance, Consumer<Pair<MutableRegistry<?>, Object>> consumer) {
MutableRegistry<Biome> biomeMutableRegistry = (MutableRegistry<Biome>)
instance.stream()
.map(Pair::getFirst)
.filter(r -> r.getKey().equals(RegistryKeys.BIOME))
.findFirst()
.orElseThrow();
MutableRegistry<WorldPreset> worldPresetMutableRegistry = (MutableRegistry<WorldPreset>)
instance.stream()
.map(Pair::getFirst)
.filter(r -> r.getKey().equals(RegistryKeys.WORLD_PRESET))
.findFirst()
.orElseThrow();
MutableRegistry<DimensionType> dimensionTypeMutableRegistry = (MutableRegistry<DimensionType>)
instance.stream()
.map(Pair::getFirst)
.filter(r -> r.getKey().equals(RegistryKeys.DIMENSION_TYPE))
.findFirst()
.orElseThrow();
MutableRegistry<ChunkGeneratorSettings> chunkGeneratorSettingsMutableRegistry = (MutableRegistry<ChunkGeneratorSettings>)
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);
}
}

View File

@@ -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;
}
}

View File

@@ -30,8 +30,7 @@ public final class BiomeUtil {
}
public static void registerBiomes(DynamicRegistryManager registryManager) {
Registry<net.minecraft.world.biome.Biome> biomeRegistry = registryManager.get(RegistryKeys.BIOME);
public static void registerBiomes(Registry<net.minecraft.world.biome.Biome> biomeRegistry) {
logger.info("Registering biomes...");
CommonPlatform.get().getConfigRegistry().forEach(pack -> { // Register all Terra biomes.
pack.getCheckedRegistry(Biome.class)

View File

@@ -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<Biome> biomeMutableRegistry, MutableRegistry<WorldPreset> 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));
}
}

View File

@@ -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"
}