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 bfb517804..48ec43721 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 @@ -21,6 +21,7 @@ import net.minecraft.world.biome.BiomeParticleConfig; import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.biome.SpawnSettings.SpawnEntry; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; +import net.minecraft.world.dimension.DimensionOptions; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -62,7 +63,7 @@ public abstract class ModPlatform extends AbstractPlatform { public void registerWorldTypes(BiConsumer registerFunction) { getRawConfigRegistry() .forEach(pack -> PresetUtil.createDefault(pack, this).apply(registerFunction)); - getRawMetaConfigRegistry().forEach(pack -> PresetUtil.createMetaPack(pack, this).apply(registerFunction)); + getRawMetaConfigRegistry().forEach(pack -> PresetUtil.createMetaPackPreset(pack, this).apply(registerFunction)); } @Override 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 eb586efbc..a053b792f 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,7 +1,31 @@ package com.dfsek.terra.mod.util; -import com.dfsek.terra.api.config.MetaPack; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.dimension.DimensionTypes; +import net.minecraft.world.gen.WorldPreset; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.MetaPack; +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.mod.ModPlatform; +import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; +import com.dfsek.terra.mod.generation.TerraBiomeSource; import net.minecraft.registry.Registry; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; @@ -31,6 +55,8 @@ import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; import com.dfsek.terra.mod.generation.TerraBiomeSource; + + public class PresetUtil { private static final Logger LOGGER = LoggerFactory.getLogger(PresetUtil.class); private static final List PRESETS = new ArrayList<>(); @@ -52,85 +78,99 @@ public class PresetUtil { PRESETS.add(generatorID); - RegistryEntry registryEntry = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); - RegistryEntry.Reference reference = multiNoiseBiomeSourceParameterLists.getEntry( - MultiNoiseBiomeSourceParameterLists.NETHER).orElseThrow(); - RegistryEntry registryEntry2 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER) - .orElseThrow(); - - RegistryEntry registryEntry3 = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); - RegistryEntry registryEntry4 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.END) - .orElseThrow(); - TerraBiomeSource biomeSource = new TerraBiomeSource(pack); ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, overworld); DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, generator); - DimensionOptions netherDimensionOptions = new DimensionOptions(registryEntry, - new NoiseChunkGenerator(MultiNoiseBiomeSource.create(reference), - registryEntry2)); - DimensionOptions endDimensionOptions = new DimensionOptions(registryEntry3, new NoiseChunkGenerator( - TheEndBiomeSource.createVanilla(platform.biomeRegistry().getReadOnlyWrapper()), registryEntry4)); - WorldPreset preset = createPreset(dimensionOptions, netherDimensionOptions, endDimensionOptions); + HashMap, DimensionOptions> dimensionMap = new HashMap<>(); + + dimensionMap.put(DimensionOptions.OVERWORLD, dimensionOptions); + + insertDefaults(dimensionTypeRegistry, chunkGeneratorSettingsRegistry, multiNoiseBiomeSourceParameterLists, platform.biomeRegistry(), dimensionMap); + + WorldPreset preset = new WorldPreset(dimensionMap); LOGGER.info("Created world type \"{}\"", generatorID); return Pair.of(generatorID, preset); } - public static Pair createMetaPack(MetaPack pack, ModPlatform platform) { + public static Pair createMetaPackPreset(MetaPack metaPack, ModPlatform platform) { Registry dimensionTypeRegistry = platform.dimensionTypeRegistry(); Registry chunkGeneratorSettingsRegistry = platform.chunkGeneratorSettingsRegistry(); Registry multiNoiseBiomeSourceParameterLists = platform.multiNoiseBiomeSourceParameterListRegistry(); - - RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); - RegistryEntry overworld = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.OVERWORLD) - .orElseThrow(); - - - Identifier generatorID = Identifier.of("terra", pack.getID().toLowerCase(Locale.ROOT) + "/" + pack.getNamespace().toLowerCase( + Identifier generatorID = Identifier.of("terra", metaPack.getID().toLowerCase(Locale.ROOT) + "/" + metaPack.getNamespace().toLowerCase( Locale.ROOT)); PRESETS.add(generatorID); - RegistryEntry registryEntry = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); - RegistryEntry.Reference reference = multiNoiseBiomeSourceParameterLists.getEntry( - MultiNoiseBiomeSourceParameterLists.NETHER).orElseThrow(); - RegistryEntry registryEntry2 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER) - .orElseThrow(); + HashMap, DimensionOptions> dimensionMap = new HashMap<>(); - RegistryEntry registryEntry3 = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); - RegistryEntry registryEntry4 = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.END) - .orElseThrow(); + metaPack.packs().forEach((key, pack) -> { + Identifier demensionIdentifier = new Identifier(key); + DimensionType dimensionType = dimensionTypeRegistry.get(demensionIdentifier); + RegistryEntry dimensionTypeRegistryEntry = dimensionTypeRegistry.getEntry(dimensionType); - ConfigPack overWorldPack = pack.packs().get("minecraft:overworld"); - TerraBiomeSource owBiomeSource = new TerraBiomeSource(overWorldPack); - ChunkGenerator owGenerator = new MinecraftChunkGeneratorWrapper(owBiomeSource, overWorldPack, overworld); + TerraBiomeSource biomeSource = new TerraBiomeSource(pack); - ConfigPack netherPack = pack.packs().get("minecraft:nether"); - TerraBiomeSource neBiomeSource = new TerraBiomeSource(netherPack); - ChunkGenerator neGenerator = new MinecraftChunkGeneratorWrapper(neBiomeSource, netherPack, registryEntry2); + RegistryEntry generatorSettings = chunkGeneratorSettingsRegistry.getEntry(chunkGeneratorSettingsRegistry.get(demensionIdentifier)); + if (key.equals("minecraft:the_nether") || key.equals("minecraft:the_end")) { //TODO REMOVE WHEN ADDING CUSTOM GEN SETTINGS + Identifier demensionIdentifier2 = new Identifier(key.replace("the_", "")); + generatorSettings = chunkGeneratorSettingsRegistry.getEntry(chunkGeneratorSettingsRegistry.get(demensionIdentifier2)); + } - ConfigPack endPack = pack.packs().get("minecraft:the_end"); - TerraBiomeSource endBiomeSource = new TerraBiomeSource(netherPack); - ChunkGenerator endGenerator = new MinecraftChunkGeneratorWrapper(endBiomeSource, endPack, registryEntry4); + ChunkGenerator generator = new MinecraftChunkGeneratorWrapper(biomeSource, pack, generatorSettings); - DimensionOptions dimensionOptions = new DimensionOptions(overworldDimensionType, owGenerator); - DimensionOptions netherDimensionOptions = new DimensionOptions(registryEntry, neGenerator); - DimensionOptions endDimensionOptions = new DimensionOptions(registryEntry3, endGenerator); + DimensionOptions dimensionOptions = new DimensionOptions(dimensionTypeRegistryEntry, generator); + RegistryKey dimensionOptionsRegistryKey = RegistryKey.of(RegistryKeys.DIMENSION, demensionIdentifier); + dimensionMap.put(dimensionOptionsRegistryKey, dimensionOptions); + }); - WorldPreset preset = createPreset(dimensionOptions, netherDimensionOptions, endDimensionOptions); + insertDefaults(dimensionTypeRegistry, chunkGeneratorSettingsRegistry, multiNoiseBiomeSourceParameterLists, platform.biomeRegistry(), dimensionMap); + + WorldPreset preset = new WorldPreset(dimensionMap); LOGGER.info("Created world type \"{}\"", generatorID); return Pair.of(generatorID, preset); } - private static WorldPreset createPreset(DimensionOptions dimensionOptions, DimensionOptions netherDimensionOptions, - DimensionOptions endDimensionOptions) { - return new WorldPreset( - Map.of(DimensionOptions.OVERWORLD, dimensionOptions, DimensionOptions.NETHER, netherDimensionOptions, DimensionOptions.END, - endDimensionOptions) - ); + private static void insertDefaults(Registry dimensionTypeRegistry, Registry chunkGeneratorSettingsRegistry, Registry multiNoiseBiomeSourceParameterLists, Registry biomeRegistry, HashMap, DimensionOptions> map) { + if (!map.containsKey(DimensionOptions.OVERWORLD)) { + RegistryEntry overworldDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.OVERWORLD).orElseThrow(); + + RegistryEntry.Reference overworldChunkBiomeReference = multiNoiseBiomeSourceParameterLists.getEntry( + MultiNoiseBiomeSourceParameterLists.OVERWORLD).orElseThrow(); + + RegistryEntry overworldChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.OVERWORLD) + .orElseThrow(); + + + DimensionOptions overworldDimensionOptions = new DimensionOptions(overworldDimensionType, (new NoiseChunkGenerator(MultiNoiseBiomeSource.create(overworldChunkBiomeReference), overworldChunkGeneratorSettings))); + map.put(DimensionOptions.OVERWORLD, overworldDimensionOptions); + } + if (!map.containsKey(DimensionOptions.NETHER)) { + RegistryEntry netherDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_NETHER).orElseThrow(); + + RegistryEntry.Reference netherChunkBiomeReference = multiNoiseBiomeSourceParameterLists.getEntry( + MultiNoiseBiomeSourceParameterLists.NETHER).orElseThrow(); + + RegistryEntry netherChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.NETHER) + .orElseThrow(); + + + DimensionOptions overworldDimensionOptions = new DimensionOptions(netherDimensionType, (new NoiseChunkGenerator(MultiNoiseBiomeSource.create(netherChunkBiomeReference), netherChunkGeneratorSettings))); + map.put(DimensionOptions.NETHER, overworldDimensionOptions); + } + if (!map.containsKey(DimensionOptions.END)) { + RegistryEntry endDimensionType = dimensionTypeRegistry.getEntry(DimensionTypes.THE_END).orElseThrow(); + + RegistryEntry endChunkGeneratorSettings = chunkGeneratorSettingsRegistry.getEntry(ChunkGeneratorSettings.END) + .orElseThrow(); + + + DimensionOptions overworldDimensionOptions = new DimensionOptions(endDimensionType, (new NoiseChunkGenerator(TheEndBiomeSource.createVanilla(biomeRegistry.getReadOnlyWrapper()), endChunkGeneratorSettings))); + map.put(DimensionOptions.END, overworldDimensionOptions); + } } public static List getPresets() { diff --git a/platforms/mixin-common/src/main/resources/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener index d638bbf45..77e5ad4b6 100644 --- a/platforms/mixin-common/src/main/resources/terra.accesswidener +++ b/platforms/mixin-common/src/main/resources/terra.accesswidener @@ -1,3 +1,4 @@ accessWidener v1 named accessible class net/minecraft/world/biome/Biome$Weather accessible class net/minecraft/world/gen/WorldPresets$Registrar +accessible field net/minecraft/world/dimension/DimensionOptionsRegistryHolder VANILLA_KEYS Ljava/util/Set; 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 18ff9570c..2cde477f3 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,11 +4,15 @@ import ca.solostudios.strata.Versions; import ca.solostudios.strata.parser.tokenizer.ParseException; import ca.solostudios.strata.version.Version; import net.minecraft.MinecraftVersion; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; import net.minecraft.server.MinecraftServer; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; +import net.minecraft.world.dimension.DimensionOptions; +import net.minecraft.world.dimension.DimensionOptionsRegistryHolder; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import org.slf4j.Logger; @@ -34,6 +38,8 @@ public abstract class LifecyclePlatform extends ModPlatform { private static final AtomicReference> DIMENSIONS = new AtomicReference<>(); private static final AtomicReference> SETTINGS = new AtomicReference<>(); private static final AtomicReference> NOISE = new AtomicReference<>(); + + private static final AtomicReference DYNAMIC_REGISTRY_MANAGER = new AtomicReference<>(); private static MinecraftServer server; public LifecyclePlatform() { @@ -51,6 +57,10 @@ public abstract class LifecyclePlatform extends ModPlatform { NOISE.set(multiNoiseBiomeSourceParameterListRegistry); } + public static void setDynamicRegistryManager(DynamicRegistryManager.Immutable dynamicRegistryManager) { + DYNAMIC_REGISTRY_MANAGER.set(dynamicRegistryManager); + } + @Override public MinecraftServer getServer() { return server; 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 index 052598ac2..e409ea0cb 100644 --- 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 @@ -7,6 +7,7 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryLoader; import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList; +import net.minecraft.world.dimension.DimensionOptions; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.WorldPreset; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -64,6 +65,9 @@ public class RegistryLoaderMixin { @SuppressWarnings("unchecked") private static Optional> extractRegistry(List, Object>> instance, RegistryKey> key) { + instance.stream().forEach(k -> { + LOGGER.error(k.toString()); + }); List> matches = instance .stream() .map(Pair::getFirst)