Removed WorldPresetSettings

This commit is contained in:
Frank 2022-06-24 01:56:25 +02:00
parent 877691011f
commit fb19ebaae6
23 changed files with 291 additions and 543 deletions

View file

@ -10,7 +10,6 @@ import org.betterx.worlds.together.biomesource.MergeableBiomeSource;
import org.betterx.worlds.together.chunkgenerator.EnforceableChunkGenerator; import org.betterx.worlds.together.chunkgenerator.EnforceableChunkGenerator;
import org.betterx.worlds.together.chunkgenerator.InjectableSurfaceRules; import org.betterx.worlds.together.chunkgenerator.InjectableSurfaceRules;
import org.betterx.worlds.together.chunkgenerator.RestorableBiomeSource; import org.betterx.worlds.together.chunkgenerator.RestorableBiomeSource;
import org.betterx.worlds.together.levelgen.WorldGenUtil;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
@ -109,9 +108,10 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
public void restoreInitialBiomeSource(ResourceKey<LevelStem> dimensionKey) { public void restoreInitialBiomeSource(ResourceKey<LevelStem> dimensionKey) {
if (initialBiomeSource != getBiomeSource()) { if (initialBiomeSource != getBiomeSource()) {
if (this instanceof ChunkGeneratorAccessor acc) { if (this instanceof ChunkGeneratorAccessor acc) {
BiomeSource bs = WorldGenUtil.getWorldSettings() if (initialBiomeSource instanceof MergeableBiomeSource bs) {
.addDatapackBiomes(initialBiomeSource, getBiomeSource().possibleBiomes()); acc.bcl_setBiomeSource(bs.mergeWithBiomeSource(getBiomeSource()));
acc.bcl_setBiomeSource(bs); }
rebuildFeaturesPerStep(getBiomeSource()); rebuildFeaturesPerStep(getBiomeSource());
} }
} }
@ -174,7 +174,7 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
} else { } else {
bs = referenceGenerator.getBiomeSource(); bs = referenceGenerator.getBiomeSource();
} }
InternalBiomeAPI.applyModifications(bs, dimensionKey); InternalBiomeAPI.applyModifications(bs, dimensionKey);
referenceGenerator = new BCLChunkGenerator( referenceGenerator = new BCLChunkGenerator(
generator.bclib_getStructureSetsRegistry(), generator.bclib_getStructureSetsRegistry(),

View file

@ -8,9 +8,7 @@ import org.betterx.bclib.config.ConfigKeeper.StringArrayEntry;
import org.betterx.bclib.config.Configs; import org.betterx.bclib.config.Configs;
import org.betterx.bclib.interfaces.BiomeMap; import org.betterx.bclib.interfaces.BiomeMap;
import org.betterx.bclib.interfaces.TheEndBiomeDataAccessor; import org.betterx.bclib.interfaces.TheEndBiomeDataAccessor;
import org.betterx.bclib.presets.worldgen.BCLWorldPresetSettings;
import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig; import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig;
import org.betterx.worlds.together.levelgen.WorldGenUtil;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
@ -158,12 +156,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
this.centerBiome = biomeRegistry.getOrCreateHolderOrThrow(Biomes.THE_END); this.centerBiome = biomeRegistry.getOrCreateHolderOrThrow(Biomes.THE_END);
this.barrens = biomeRegistry.getOrCreateHolderOrThrow(Biomes.END_BARRENS); this.barrens = biomeRegistry.getOrCreateHolderOrThrow(Biomes.END_BARRENS);
if (WorldGenUtil.getWorldSettings() instanceof BCLWorldPresetSettings settings this.endLandFunction = GeneratorOptions.getEndLandFunction();
&& !settings.useEndTerrainGenerator) {
this.endLandFunction = null;
} else {
this.endLandFunction = GeneratorOptions.getEndLandFunction();
}
this.pos = new Point(); this.pos = new Point();
if (initMaps) { if (initMaps) {

View file

@ -216,7 +216,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
@Override @Override
public void setTogetherConfig(BCLNetherBiomeSourceConfig newConfig) { public void setTogetherConfig(BCLNetherBiomeSourceConfig newConfig) {
this.config = config; this.config = newConfig;
initMap(currentSeed); initMap(currentSeed);
} }
} }

View file

@ -16,6 +16,12 @@ import java.util.Objects;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class BCLEndBiomeSourceConfig implements BiomeSourceConfig<BCLibEndBiomeSource> { public class BCLEndBiomeSourceConfig implements BiomeSourceConfig<BCLibEndBiomeSource> {
public static final BCLEndBiomeSourceConfig VANILLA = new BCLEndBiomeSourceConfig(
EndBiomeMapType.VANILLA,
EndBiomeGeneratorType.VANILLA,
true,
4096
);
public static final BCLEndBiomeSourceConfig MINECRAFT_17 = new BCLEndBiomeSourceConfig( public static final BCLEndBiomeSourceConfig MINECRAFT_17 = new BCLEndBiomeSourceConfig(
EndBiomeMapType.SQUARE, EndBiomeMapType.SQUARE,
EndBiomeGeneratorType.PAULEVS, EndBiomeGeneratorType.PAULEVS,

View file

@ -16,6 +16,9 @@ import java.util.Objects;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig<BCLibNetherBiomeSource> { public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig<BCLibNetherBiomeSource> {
public static final BCLNetherBiomeSourceConfig VANILLA = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.VANILLA
);
public static final BCLNetherBiomeSourceConfig MINECRAFT_17 = new BCLNetherBiomeSourceConfig( public static final BCLNetherBiomeSourceConfig MINECRAFT_17 = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.SQUARE NetherBiomeMapType.SQUARE
); );

View file

@ -10,16 +10,17 @@ import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI;
import org.betterx.bclib.registry.PresetsRegistry; import org.betterx.bclib.registry.PresetsRegistry;
import org.betterx.worlds.together.world.event.WorldEvents; import org.betterx.worlds.together.world.event.WorldEvents;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.WorldGenSettings;
import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -89,21 +90,20 @@ public class LevelGenEvents {
InternalBiomeAPI.initRegistry(a); InternalBiomeAPI.initRegistry(a);
} }
public static WorldPresetSettings prepareWorld( public static void prepareWorld(
LevelStorageSource.LevelStorageAccess storageAccess, LevelStorageSource.LevelStorageAccess storageAccess,
WorldPresetSettings settings, Map<ResourceKey<LevelStem>, ChunkGenerator> dimensions,
boolean isNewWorld boolean isNewWorld
) { ) {
setupWorld(); setupWorld();
if (isNewWorld) { if (isNewWorld) {
DataFixerAPI.initializePatchData(); DataFixerAPI.initializePatchData();
} }
return settings;
} }
public static WorldPresetSettings prepareServerWorld( public static void prepareServerWorld(
LevelStorageSource.LevelStorageAccess storageAccess, LevelStorageSource.LevelStorageAccess storageAccess,
WorldPresetSettings settings, Map<ResourceKey<LevelStem>, ChunkGenerator> dimensions,
boolean isNewWorld boolean isNewWorld
) { ) {
setupWorld(); setupWorld();
@ -113,9 +113,6 @@ public class LevelGenEvents {
} else { } else {
DataFixerAPI.fixData(storageAccess, false, (didFix) -> {/* not called when showUI==false */}); DataFixerAPI.fixData(storageAccess, false, (didFix) -> {/* not called when showUI==false */});
} }
return settings;
} }
public static void onWorldLoad() { public static void onWorldLoad() {

View file

@ -7,13 +7,11 @@ import org.betterx.bclib.api.v2.generator.BCLibEndBiomeSource;
import org.betterx.bclib.api.v2.generator.BCLibNetherBiomeSource; import org.betterx.bclib.api.v2.generator.BCLibNetherBiomeSource;
import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig; import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig;
import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig; import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig;
import org.betterx.bclib.presets.worldgen.BCLWorldPresetSettings;
import org.betterx.bclib.registry.PresetsRegistry; import org.betterx.bclib.registry.PresetsRegistry;
import org.betterx.worlds.together.levelgen.WorldGenUtil; import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.util.ModUtil; import org.betterx.worlds.together.util.ModUtil;
import org.betterx.worlds.together.world.WorldConfig; import org.betterx.worlds.together.world.WorldConfig;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import com.mojang.serialization.Lifecycle; import com.mojang.serialization.Lifecycle;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
@ -26,6 +24,7 @@ import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.WorldGenSettings;
import net.minecraft.world.level.levelgen.presets.WorldPreset;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@ -111,23 +110,23 @@ public class LevelGenUtil {
); );
} }
public static WorldGenSettings replaceStem( // public static WorldGenSettings replaceStem(
ResourceKey<LevelStem> dimensionKey, // ResourceKey<LevelStem> dimensionKey,
WorldGenSettings worldGenSettings, // WorldGenSettings worldGenSettings,
LevelStem levelStem // LevelStem levelStem
) { // ) {
Registry<LevelStem> newDimensions = withDimension( // Registry<LevelStem> newDimensions = withDimension(
dimensionKey, // dimensionKey,
worldGenSettings.dimensions(), // worldGenSettings.dimensions(),
levelStem // levelStem
); // );
return new WorldGenSettings( // return new WorldGenSettings(
worldGenSettings.seed(), // worldGenSettings.seed(),
worldGenSettings.generateStructures(), // worldGenSettings.generateStructures(),
worldGenSettings.generateBonusChest(), // worldGenSettings.generateBonusChest(),
newDimensions // newDimensions
); // );
} // }
public static Registry<LevelStem> withDimension( public static Registry<LevelStem> withDimension(
ResourceKey<LevelStem> dimensionKey, ResourceKey<LevelStem> dimensionKey,
@ -211,11 +210,11 @@ public class LevelGenUtil {
return referenceSettings.dimensions().getHolder(dimensionKey); return referenceSettings.dimensions().getHolder(dimensionKey);
} }
public static int getBiomeVersionForCurrentWorld(ResourceKey<LevelStem> key) { // public static int getBiomeVersionForCurrentWorld(ResourceKey<LevelStem> key) {
final CompoundTag settingsNbt = WorldGenUtil.getSettingsNbt(); // final CompoundTag settingsNbt = WorldGenUtil.getSettingsNbt();
if (!settingsNbt.contains(key.location().toString())) return BCLBiomeSource.DEFAULT_BIOME_SOURCE_VERSION; // if (!settingsNbt.contains(key.location().toString())) return BCLBiomeSource.DEFAULT_BIOME_SOURCE_VERSION;
return settingsNbt.getInt(key.location().toString()); // return settingsNbt.getInt(key.location().toString());
} // }
// private static int getDimensionVersion( // private static int getDimensionVersion(
// WorldGenSettings settings, // WorldGenSettings settings,
@ -242,7 +241,7 @@ public class LevelGenUtil {
if (settingsNbt.size() == 0) { if (settingsNbt.size() == 0) {
BCLib.LOGGER.info("Found World without generator Settings. Setting up data..."); BCLib.LOGGER.info("Found World without generator Settings. Setting up data...");
int biomeSourceVersion = BCLBiomeSource.DEFAULT_BIOME_SOURCE_VERSION; ResourceKey<WorldPreset> biomeSourceVersion = PresetsRegistry.BCL_WORLD;
final CompoundTag bclRoot = WorldConfig.getRootTag(BCLib.MOD_ID); final CompoundTag bclRoot = WorldConfig.getRootTag(BCLib.MOD_ID);
@ -254,32 +253,32 @@ public class LevelGenUtil {
if (isPre18) { if (isPre18) {
BCLib.LOGGER.info("World was create pre 1.18!"); BCLib.LOGGER.info("World was create pre 1.18!");
biomeSourceVersion = BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE; biomeSourceVersion = PresetsRegistry.BCL_WORLD_17;
} }
if (WorldConfig.hasMod("betternether")) { if (WorldConfig.hasMod("betternether")) {
BCLib.LOGGER.info("Found Data from BetterNether, using for migration."); BCLib.LOGGER.info("Found Data from BetterNether, using for migration.");
final CompoundTag bnRoot = WorldConfig.getRootTag("betternether"); final CompoundTag bnRoot = WorldConfig.getRootTag("betternether");
biomeSourceVersion = "1.17".equals(bnRoot.getString(TAG_BN_GEN_VERSION)) biomeSourceVersion = "1.17".equals(bnRoot.getString(TAG_BN_GEN_VERSION))
? BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE ? PresetsRegistry.BCL_WORLD_17
: BCLBiomeSource.BIOME_SOURCE_VERSION_HEX; : PresetsRegistry.BCL_WORLD;
} }
BCLib.LOGGER.info("Set world to BiomeSource Version " + biomeSourceVersion); Registry<LevelStem> dimensions = TogetherWorldPreset.getDimensions(biomeSourceVersion);
TogetherWorldPreset.writeWorldPresetSettings(new BCLWorldPresetSettings( if (dimensions != null) {
biomeSourceVersion, BCLib.LOGGER.info("Set world to BiomeSource Version " + biomeSourceVersion);
biomeSourceVersion, TogetherWorldPreset.writeWorldPresetSettings(dimensions);
true, } else {
true BCLib.LOGGER.error("Failed to set world to BiomeSource Version " + biomeSourceVersion);
)); }
} }
} }
/** // /**
* @deprecated Replace by {@link WorldGenUtil#getWorldSettings()} // * @deprecated Replace by {@link WorldGenUtil#getWorldSettings()}
*/ // */
@Deprecated(forRemoval = true) // @Deprecated(forRemoval = true)
public static WorldPresetSettings getWorldSettings() { // public static WorldPresetSettings getWorldSettings() {
return WorldGenUtil.getWorldSettings(); // return null;
} // }
} }

View file

@ -1,11 +1,13 @@
package org.betterx.bclib.client.gui.screens; package org.betterx.bclib.client.gui.screens;
import org.betterx.bclib.BCLib; import org.betterx.bclib.api.v2.generator.BCLibEndBiomeSource;
import org.betterx.bclib.api.v2.generator.BCLBiomeSource; import org.betterx.bclib.api.v2.generator.BCLibNetherBiomeSource;
import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig;
import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig;
import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
import org.betterx.bclib.client.gui.gridlayout.GridCheckboxCell; import org.betterx.bclib.client.gui.gridlayout.GridCheckboxCell;
import org.betterx.bclib.client.gui.gridlayout.GridLayout; import org.betterx.bclib.client.gui.gridlayout.GridLayout;
import org.betterx.bclib.presets.worldgen.BCLWorldPresetSettings; import org.betterx.bclib.registry.PresetsRegistry;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.WorldGenSettingsComponentAccessor; import org.betterx.worlds.together.worldPreset.WorldGenSettingsComponentAccessor;
@ -15,13 +17,16 @@ import net.minecraft.core.Holder;
import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.BuiltinDimensionTypes; import net.minecraft.world.level.dimension.BuiltinDimensionTypes;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.presets.WorldPresets;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -46,24 +51,25 @@ public class WorldSetupScreen extends BCLibScreen {
@Override @Override
protected void initLayout() { protected void initLayout() {
final int netherVersion; BCLEndBiomeSourceConfig endConfig = BCLEndBiomeSourceConfig.VANILLA;
final int endVersion; BCLNetherBiomeSourceConfig netherConfig = BCLNetherBiomeSourceConfig.VANILLA;
final boolean customEndGen;
final boolean haveEndVoid;
if (createWorldScreen.worldGenSettingsComponent instanceof WorldGenSettingsComponentAccessor acc if (createWorldScreen.worldGenSettingsComponent instanceof WorldGenSettingsComponentAccessor acc
&& acc.bcl_getPreset() && acc.bcl_getPreset()
.isPresent() && acc.bcl_getPreset() .isPresent() && acc.bcl_getPreset()
.get() .get()
.value() instanceof TogetherWorldPreset wp .value() instanceof TogetherWorldPreset wp) {
&& wp.settings instanceof BCLWorldPresetSettings settings) {
netherVersion = settings.netherVersion; LevelStem endStem = wp.getDimension(LevelStem.END);
endVersion = settings.endVersion; if (endStem != null && endStem.generator().getBiomeSource() instanceof BCLibEndBiomeSource bs) {
customEndGen = settings.useEndTerrainGenerator; endConfig = bs.getTogetherConfig();
haveEndVoid = settings.generateEndVoid; }
} else { LevelStem netherStem = wp.getDimension(LevelStem.NETHER);
throw new IllegalStateException("The WorldSetup Screen is only valid for BetterX Presets."); if (netherStem != null && netherStem.generator().getBiomeSource() instanceof BCLibNetherBiomeSource bs) {
netherConfig = bs.getTogetherConfig();
}
} }
final int BUTTON_HEIGHT = 20; final int BUTTON_HEIGHT = 20;
grid.addSpacerRow(20); grid.addSpacerRow(20);
@ -82,7 +88,7 @@ public class WorldSetupScreen extends BCLibScreen {
row.addSpacer(20); row.addSpacer(20);
netherLegacy = row.addCheckbox( netherLegacy = row.addCheckbox(
Component.translatable("title.screen.bclib.worldgen.legacy_square"), Component.translatable("title.screen.bclib.worldgen.legacy_square"),
endVersion == BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE, netherConfig.mapVersion == BCLNetherBiomeSourceConfig.NetherBiomeMapType.SQUARE,
1.0, 1.0,
GridLayout.GridValueType.PERCENTAGE, GridLayout.GridValueType.PERCENTAGE,
(state) -> { (state) -> {
@ -91,7 +97,7 @@ public class WorldSetupScreen extends BCLibScreen {
bclibNether = mainSettingsRow.addCheckbox( bclibNether = mainSettingsRow.addCheckbox(
Component.translatable( Component.translatable(
"title.screen.bclib.worldgen.custom_biome_source"), "title.screen.bclib.worldgen.custom_biome_source"),
netherVersion != BCLBiomeSource.BIOME_SOURCE_VERSION_VANILLA, netherConfig.mapVersion != BCLNetherBiomeSourceConfig.NetherBiomeMapType.VANILLA,
1.0, 1.0,
GridLayout.GridValueType.PERCENTAGE, GridLayout.GridValueType.PERCENTAGE,
(state) -> { (state) -> {
@ -111,7 +117,7 @@ public class WorldSetupScreen extends BCLibScreen {
row.addSpacer(20); row.addSpacer(20);
endCustomTerrain = row.addCheckbox( endCustomTerrain = row.addCheckbox(
Component.translatable("title.screen.bclib.worldgen.custom_end_terrain"), Component.translatable("title.screen.bclib.worldgen.custom_end_terrain"),
customEndGen, endConfig.generatorVersion != BCLEndBiomeSourceConfig.EndBiomeGeneratorType.VANILLA,
1.0, 1.0,
GridLayout.GridValueType.PERCENTAGE, GridLayout.GridValueType.PERCENTAGE,
(state) -> { (state) -> {
@ -122,7 +128,7 @@ public class WorldSetupScreen extends BCLibScreen {
row.addSpacer(20); row.addSpacer(20);
generateEndVoid = row.addCheckbox( generateEndVoid = row.addCheckbox(
Component.translatable("title.screen.bclib.worldgen.end_void"), Component.translatable("title.screen.bclib.worldgen.end_void"),
haveEndVoid, endConfig.withVoidBiomes,
1.0, 1.0,
GridLayout.GridValueType.PERCENTAGE, GridLayout.GridValueType.PERCENTAGE,
(state) -> { (state) -> {
@ -133,7 +139,7 @@ public class WorldSetupScreen extends BCLibScreen {
row.addSpacer(20); row.addSpacer(20);
endLegacy = row.addCheckbox( endLegacy = row.addCheckbox(
Component.translatable("title.screen.bclib.worldgen.legacy_square"), Component.translatable("title.screen.bclib.worldgen.legacy_square"),
endVersion == BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE, endConfig.mapVersion == BCLEndBiomeSourceConfig.EndBiomeMapType.SQUARE,
1.0, 1.0,
GridLayout.GridValueType.PERCENTAGE, GridLayout.GridValueType.PERCENTAGE,
(state) -> { (state) -> {
@ -143,7 +149,7 @@ public class WorldSetupScreen extends BCLibScreen {
bclibEnd = mainSettingsRow.addCheckbox( bclibEnd = mainSettingsRow.addCheckbox(
Component.translatable( Component.translatable(
"title.screen.bclib.worldgen.custom_biome_source"), "title.screen.bclib.worldgen.custom_biome_source"),
endVersion != BCLBiomeSource.BIOME_SOURCE_VERSION_VANILLA, endConfig.mapVersion != BCLEndBiomeSourceConfig.EndBiomeMapType.VANILLA,
1.0, 1.0,
GridLayout.GridValueType.PERCENTAGE, GridLayout.GridValueType.PERCENTAGE,
(state) -> { (state) -> {
@ -165,20 +171,48 @@ public class WorldSetupScreen extends BCLibScreen {
} }
private void updateSettings() { private void updateSettings() {
int endVersion = BCLBiomeSource.DEFAULT_BIOME_SOURCE_VERSION; Map<ResourceKey<LevelStem>, ChunkGenerator> betterxDimensions = TogetherWorldPreset.getDimensionsMap(
PresetsRegistry.BCL_WORLD);
Map<ResourceKey<LevelStem>, ChunkGenerator> vanillaDimensions = TogetherWorldPreset.getDimensionsMap(
WorldPresets.NORMAL);
BCLEndBiomeSourceConfig.EndBiomeMapType endVersion = BCLEndBiomeSourceConfig.DEFAULT.mapVersion;
if (bclibEnd.isChecked()) { if (bclibEnd.isChecked()) {
if (endLegacy.isChecked()) endVersion = BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE; BCLEndBiomeSourceConfig endConfig = new BCLEndBiomeSourceConfig(
else endVersion = BCLBiomeSource.BIOME_SOURCE_VERSION_HEX; endLegacy.isChecked()
? BCLEndBiomeSourceConfig.EndBiomeMapType.SQUARE
: BCLEndBiomeSourceConfig.EndBiomeMapType.HEX,
endCustomTerrain.isChecked()
? BCLEndBiomeSourceConfig.EndBiomeGeneratorType.PAULEVS
: BCLEndBiomeSourceConfig.EndBiomeGeneratorType.VANILLA,
generateEndVoid.isChecked(),
BCLEndBiomeSourceConfig.DEFAULT.innerVoidRadiusSquared
);
ChunkGenerator endGenerator = betterxDimensions.get(LevelStem.END);
((BCLibEndBiomeSource) endGenerator.getBiomeSource()).setTogetherConfig(endConfig);
updateConfiguration(LevelStem.END, BuiltinDimensionTypes.END, endGenerator);
} else { } else {
endVersion = BCLBiomeSource.BIOME_SOURCE_VERSION_VANILLA; ChunkGenerator endGenerator = vanillaDimensions.get(LevelStem.END);
updateConfiguration(LevelStem.END, BuiltinDimensionTypes.END, endGenerator);
} }
int netherVersion = BCLBiomeSource.DEFAULT_BIOME_SOURCE_VERSION;
if (bclibNether.isChecked()) { if (bclibNether.isChecked()) {
if (netherLegacy.isChecked()) netherVersion = BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE; BCLNetherBiomeSourceConfig netherConfig = new BCLNetherBiomeSourceConfig(
else netherVersion = BCLBiomeSource.BIOME_SOURCE_VERSION_HEX; netherLegacy.isChecked()
? BCLNetherBiomeSourceConfig.NetherBiomeMapType.SQUARE
: BCLNetherBiomeSourceConfig.NetherBiomeMapType.HEX
);
ChunkGenerator netherGenerator = betterxDimensions.get(LevelStem.NETHER);
((BCLibNetherBiomeSource) netherGenerator.getBiomeSource()).setTogetherConfig(netherConfig);
updateConfiguration(LevelStem.NETHER, BuiltinDimensionTypes.NETHER, netherGenerator);
} else { } else {
netherVersion = BCLBiomeSource.BIOME_SOURCE_VERSION_VANILLA; ChunkGenerator endGenerator = vanillaDimensions.get(LevelStem.NETHER);
updateConfiguration(LevelStem.NETHER, BuiltinDimensionTypes.NETHER, endGenerator);
} }
if (createWorldScreen.worldGenSettingsComponent instanceof WorldGenSettingsComponentAccessor acc if (createWorldScreen.worldGenSettingsComponent instanceof WorldGenSettingsComponentAccessor acc
@ -186,34 +220,31 @@ public class WorldSetupScreen extends BCLibScreen {
.isPresent() && acc.bcl_getPreset() .isPresent() && acc.bcl_getPreset()
.get() .get()
.value() instanceof TogetherWorldPreset worldPreset) { .value() instanceof TogetherWorldPreset worldPreset) {
acc.bcl_setPreset(Optional.of(Holder.direct(worldPreset.withSettings(new BCLWorldPresetSettings( acc.bcl_setPreset(Optional.of(Holder.direct(
netherVersion, worldPreset.withDimensions(
endVersion, createWorldScreen
endCustomTerrain.isChecked(), .worldGenSettingsComponent
generateEndVoid.isChecked() .settings()
))))); .worldGenSettings()
.dimensions()
)
)));
} }
BCLib.LOGGER.info("Custom World Versions: end=" + endVersion + ", nether=" + netherVersion);
updateConfiguration(LevelStem.END, BuiltinDimensionTypes.END, endVersion);
updateConfiguration(LevelStem.NETHER, BuiltinDimensionTypes.NETHER, netherVersion);
} }
private void updateConfiguration( private void updateConfiguration(
ResourceKey<LevelStem> dimensionKey, ResourceKey<LevelStem> dimensionKey,
ResourceKey<DimensionType> dimensionTypeKey, ResourceKey<DimensionType> dimensionTypeKey,
int biomeSourceVersion ChunkGenerator chunkGenerator
) { ) {
createWorldScreen.worldGenSettingsComponent.updateSettings( createWorldScreen.worldGenSettingsComponent.updateSettings(
(registryAccess, worldGenSettings) -> LevelGenUtil.replaceGenerator( (registryAccess, worldGenSettings) -> LevelGenUtil.replaceGenerator(
dimensionKey, dimensionKey,
dimensionTypeKey, dimensionTypeKey,
biomeSourceVersion,
registryAccess, registryAccess,
worldGenSettings worldGenSettings,
chunkGenerator
) )
); );
} }

View file

@ -13,6 +13,6 @@ public class DedicatedServerPropertiesMixin {
//Make sure the default server properties use our Default World Preset //Make sure the default server properties use our Default World Preset
@ModifyArg(method = "<init>", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties$WorldGenProperties;<init>(Ljava/lang/String;Lcom/google/gson/JsonObject;ZLjava/lang/String;)V")) @ModifyArg(method = "<init>", index = 3, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/dedicated/DedicatedServerProperties$WorldGenProperties;<init>(Ljava/lang/String;Lcom/google/gson/JsonObject;ZLjava/lang/String;)V"))
private String bcl_init(String levelType) { private String bcl_init(String levelType) {
return WorldPresets.DEFAULT.orElseThrow().location().toString(); return WorldPresets.DEFAULT.location().toString();
} }
} }

View file

@ -1,238 +0,0 @@
package org.betterx.bclib.presets.worldgen;
import org.betterx.bclib.api.v2.generator.BCLBiomeSource;
import org.betterx.bclib.api.v2.generator.BCLibEndBiomeSource;
import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig;
import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig;
import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.WorldGenSettings;
import java.util.Map;
import java.util.Set;
public class BCLWorldPresetSettings extends WorldPresetSettings {
public final static BCLWorldPresetSettings DEFAULT = new BCLWorldPresetSettings(BCLBiomeSource.DEFAULT_BIOME_SOURCE_VERSION);
public static final Codec<BCLWorldPresetSettings> CODEC = RecordCodecBuilder
.create((RecordCodecBuilder.Instance<BCLWorldPresetSettings> builderInstance) -> builderInstance.group(
Codec.INT
.fieldOf(LevelStem.NETHER.location().toString())
.forGetter(o -> o.netherVersion),
Codec.INT
.fieldOf(LevelStem.END.location().toString())
.forGetter(o -> o.endVersion),
Codec.BOOL
.fieldOf("custom_end_terrain")
.orElse(true)
.forGetter(o -> o.useEndTerrainGenerator),
Codec.BOOL
.fieldOf("generate_end_void")
.orElse(false)
.forGetter(o -> o.generateEndVoid)
)
.apply(
builderInstance,
builderInstance.stable(
BCLWorldPresetSettings::new)
));
public final int netherVersion;
public final int endVersion;
public final boolean useEndTerrainGenerator;
public final boolean generateEndVoid;
public BCLWorldPresetSettings(int version) {
this(version, version, true, false);
}
public BCLWorldPresetSettings(
int netherVersion,
int endVersion,
boolean useEndTerrainGenerator,
boolean generateEndVoid
) {
this.netherVersion = netherVersion;
this.endVersion = endVersion;
this.useEndTerrainGenerator = endVersion != BCLibEndBiomeSource.BIOME_SOURCE_VERSION_VANILLA && useEndTerrainGenerator;
this.generateEndVoid = generateEndVoid;
}
@Override
public Codec<? extends WorldPresetSettings> codec() {
return CODEC;
}
public TogetherWorldPreset buildPreset(
LevelStem overworldStem,
WorldGenUtil.Context netherContext,
WorldGenUtil.Context endContext
) {
return new TogetherWorldPreset(buildDimensionMap(overworldStem, netherContext, endContext), 1000, this);
}
private static BCLEndBiomeSourceConfig getEndConfigForVersion(int version) {
if (version == BCLBiomeSource.BIOME_SOURCE_VERSION_HEX)
return BCLEndBiomeSourceConfig.MINECRAFT_18;
if (version == BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE)
return BCLEndBiomeSourceConfig.MINECRAFT_17;
return BCLEndBiomeSourceConfig.DEFAULT;
}
private static BCLNetherBiomeSourceConfig getNetherConfigForVersion(int version) {
if (version == BCLBiomeSource.BIOME_SOURCE_VERSION_HEX)
return BCLNetherBiomeSourceConfig.MINECRAFT_18;
if (version == BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE)
return BCLNetherBiomeSourceConfig.MINECRAFT_17;
return BCLNetherBiomeSourceConfig.DEFAULT;
}
public Map<ResourceKey<LevelStem>, LevelStem> buildDimensionMap(
LevelStem overworldStem,
WorldGenUtil.Context netherContext,
WorldGenUtil.Context endContext
) {
return Map.of(
LevelStem.OVERWORLD,
overworldStem,
LevelStem.NETHER,
LevelGenUtil.getBCLNetherLevelStem(netherContext, getNetherConfigForVersion(netherVersion)),
LevelStem.END,
LevelGenUtil.getBCLEndLevelStem(endContext, getEndConfigForVersion(endVersion))
);
}
// public int getVersion(ResourceKey<LevelStem> key) {
// if (key == LevelStem.NETHER) return netherVersion;
// if (key == LevelStem.END) return endVersion;
//
// return BCLBiomeSource.BIOME_SOURCE_VERSION_VANILLA;
// }
public BiomeSource addDatapackBiomes(BiomeSource biomeSource, Set<Holder<Biome>> datapackBiomes) {
if (biomeSource instanceof BCLBiomeSource bs) {
return bs.createCopyForDatapack(datapackBiomes);
}
return biomeSource;
}
// private static Holder<NoiseGeneratorSettings> buildGeneratorSettings(
// Holder<NoiseGeneratorSettings> reference,
// Holder<NoiseGeneratorSettings> settings,
// BiomeSource biomeSource
// ) {
// //SurfaceRuleUtil.injectSurfaceRules(settings.value(), biomeSource);
// return settings;
//// NoiseGeneratorSettings old = settings.value();
//// NoiseGeneratorSettings noise = new NoiseGeneratorSettings(
//// old.noiseSettings(),
//// old.defaultBlock(),
//// old.defaultFluid(),
//// old.noiseRouter(),
//// SurfaceRuleRegistry.mergeSurfaceRulesFromBiomes(old.surfaceRule(), biomeSource),
//// //SurfaceRuleUtil.addRulesForBiomeSource(old.surfaceRule(), biomeSource),
//// old.spawnTarget(),
//// old.seaLevel(),
//// old.disableMobGeneration(),
//// old.aquifersEnabled(),
//// old.oreVeinsEnabled(),
//// old.useLegacyRandomSource()
//// );
////
////
//// return Holder.direct(noise);
// }
// /**
// * Datapacks can change the world's generator. This Method will ensure, that the Generators contain
// * the correct BiomeSources for this world
// *
// * @param dimensionKey
// * @param dimensionTypeKey
// * @param settings
// * @return
// */
// private WorldGenSettings fixSettingsInCurrentWorld(
// RegistryAccess access, ResourceKey<LevelStem> dimensionKey,
// ResourceKey<DimensionType> dimensionTypeKey,
// WorldGenSettings settings
// ) {
// Optional<Holder<LevelStem>> loadedStem = settings.dimensions().getHolder(dimensionKey);
// final ChunkGenerator loadedChunkGenerator = loadedStem.map(h -> h.value().generator()).orElse(null);
// final int loaderVersion = LevelGenUtil.getBiomeVersionForGenerator(loadedStem
// .map(h -> h.value().generator())
// .orElse(null));
//
// final int targetVersion = getVersion(dimensionKey);
// if (loaderVersion != targetVersion) {
// BCLib.LOGGER.info("Enforcing Correct Generator for " + dimensionKey.location().toString() + ".");
//
// Optional<Holder<LevelStem>> refLevelStem = LevelGenUtil.referenceStemForVersion(
// dimensionKey,
// targetVersion,
// access,
// settings.seed(),
// settings.generateStructures(),
// settings.generateBonusChest()
// );
//
// ChunkGenerator referenceGenerator = refLevelStem.map(h -> h.value().generator()).orElse(null);
// if (referenceGenerator == null) {
// BCLib.LOGGER.error("Failed to create Generator for " + dimensionKey.location().toString());
// return settings;
// }
//
// if (loadedChunkGenerator instanceof ChunkGeneratorAccessor generator) {
// if (loadedChunkGenerator instanceof NoiseGeneratorSettingsProvider noiseProvider) {
// if (referenceGenerator instanceof NoiseGeneratorSettingsProvider referenceProvider) {
// final Set<Holder<Biome>> biomes = loadedChunkGenerator.getBiomeSource().possibleBiomes();
// final BiomeSource bs = addDatapackBiomes(referenceGenerator.getBiomeSource(), biomes);
// InternalBiomeAPI.applyModifications(bs, dimensionKey);
// referenceGenerator = new BCLChunkGenerator(
// generator.bclib_getStructureSetsRegistry(),
// noiseProvider.bclib_getNoises(),
// bs,
// buildGeneratorSettings(
// referenceProvider.bclib_getNoiseGeneratorSettingHolders(),
// noiseProvider.bclib_getNoiseGeneratorSettingHolders(),
// bs
// )
// );
// }
// }
// }
//
// return LevelGenUtil.replaceGenerator(
// dimensionKey,
// dimensionTypeKey,
// access,
// settings,
// referenceGenerator
// );
// }
// return settings;
// }
public WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings) {
// settings = fixSettingsInCurrentWorld(registryAccess, LevelStem.NETHER, BuiltinDimensionTypes.NETHER, settings);
// settings = fixSettingsInCurrentWorld(registryAccess, LevelStem.END, BuiltinDimensionTypes.END, settings);
return settings;
}
}

View file

@ -1,15 +1,18 @@
package org.betterx.bclib.registry; package org.betterx.bclib.registry;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v2.generator.BCLBiomeSource; import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig;
import org.betterx.bclib.presets.worldgen.BCLWorldPresetSettings; import org.betterx.bclib.api.v2.generator.config.BCLNetherBiomeSourceConfig;
import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.WorldPresets; import org.betterx.worlds.together.worldPreset.WorldPresets;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.minecraft.world.level.levelgen.presets.WorldPreset;
import java.util.Optional; import java.util.Map;
public class PresetsRegistry { public class PresetsRegistry {
public static ResourceKey<WorldPreset> BCL_WORLD; public static ResourceKey<WorldPreset> BCL_WORLD;
@ -18,12 +21,13 @@ public class PresetsRegistry {
public static void onLoad() { public static void onLoad() {
BCL_WORLD = BCL_WORLD =
WorldPresets.register( WorldPresets.register(
BCLib.makeID("hex_map"), BCLib.makeID("normal"),
(overworldStem, netherContext, endContext) -> (overworldStem, netherContext, endContext) ->
new BCLWorldPresetSettings(BCLBiomeSource.BIOME_SOURCE_VERSION_HEX).buildPreset( buildPreset(
overworldStem, overworldStem,
netherContext, netherContext,
endContext BCLNetherBiomeSourceConfig.DEFAULT, endContext,
BCLEndBiomeSourceConfig.DEFAULT
), ),
true true
); );
@ -31,18 +35,47 @@ public class PresetsRegistry {
BCL_WORLD_17 = WorldPresets.register( BCL_WORLD_17 = WorldPresets.register(
BCLib.makeID("legacy_17"), BCLib.makeID("legacy_17"),
(overworldStem, netherContext, endContext) -> (overworldStem, netherContext, endContext) ->
new BCLWorldPresetSettings(BCLBiomeSource.BIOME_SOURCE_VERSION_SQUARE).buildPreset( buildPreset(
overworldStem, overworldStem,
netherContext, netherContext,
endContext BCLNetherBiomeSourceConfig.MINECRAFT_17, endContext,
BCLEndBiomeSourceConfig.MINECRAFT_17
), ),
false false
); );
WorldPresetSettings.DEFAULT = BCLWorldPresetSettings.DEFAULT; WorldPresets.DEFAULT = BCL_WORLD;
WorldPresets.DEFAULT = Optional.of(BCL_WORLD);
WorldPresetSettings.register(BCLib.makeID("bcl_world_preset_settings"), BCLWorldPresetSettings.CODEC);
} }
public static TogetherWorldPreset buildPreset(
LevelStem overworldStem,
WorldGenUtil.Context netherContext,
BCLNetherBiomeSourceConfig netherConfig,
WorldGenUtil.Context endContext,
BCLEndBiomeSourceConfig endConfig
) {
return new TogetherWorldPreset(buildDimensionMap(
overworldStem,
netherContext,
netherConfig, endContext,
endConfig
), 1000);
}
public static Map<ResourceKey<LevelStem>, LevelStem> buildDimensionMap(
LevelStem overworldStem,
WorldGenUtil.Context netherContext,
BCLNetherBiomeSourceConfig netherConfig,
WorldGenUtil.Context endContext,
BCLEndBiomeSourceConfig endConfig
) {
return Map.of(
LevelStem.OVERWORLD,
overworldStem,
LevelStem.NETHER,
LevelGenUtil.getBCLNetherLevelStem(netherContext, netherConfig),
LevelStem.END,
LevelGenUtil.getBCLEndLevelStem(endContext, endConfig)
);
}
} }

View file

@ -7,18 +7,12 @@ import org.betterx.worlds.together.world.BiomeSourceWithSeed;
import org.betterx.worlds.together.world.WorldConfig; import org.betterx.worlds.together.world.WorldConfig;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.WorldPresets; import org.betterx.worlds.together.worldPreset.WorldPresets;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import com.mojang.datafixers.util.Pair; import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Dynamic;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.Tag;
import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
@ -31,8 +25,6 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.StructureSet;
import net.minecraft.world.level.levelgen.synth.NormalNoise; import net.minecraft.world.level.levelgen.synth.NormalNoise;
import java.util.Optional;
public class WorldGenUtil { public class WorldGenUtil {
public static final String TAG_GENERATOR = "generator"; public static final String TAG_GENERATOR = "generator";
@ -65,7 +57,7 @@ public class WorldGenUtil {
boolean generateBonusChest boolean generateBonusChest
) { ) {
return createWorldFromPreset( return createWorldFromPreset(
WorldPresets.DEFAULT.orElseThrow(), WorldPresets.DEFAULT,
registryAccess, registryAccess,
seed, seed,
generateStructures, generateStructures,
@ -90,22 +82,12 @@ public class WorldGenUtil {
return WorldConfig.getCompoundTag(WorldsTogether.MOD_ID, TAG_GENERATOR); return WorldConfig.getCompoundTag(WorldsTogether.MOD_ID, TAG_GENERATOR);
} }
public static WorldPresetSettings getWorldSettings() {
final RegistryAccess registryAccess = BuiltinRegistries.ACCESS;
final RegistryOps<Tag> registryOps = RegistryOps.create(NbtOps.INSTANCE, registryAccess);
Optional<WorldPresetSettings> oLevelStem = WorldPresetSettings.CODEC
.parse(new Dynamic<>(registryOps, getSettingsNbt()))
.resultOrPartial(WorldsTogether.LOGGER::error);
return oLevelStem.orElse(WorldPresetSettings.DEFAULT);
}
public static class Context extends StemContext { public static class Context extends StemContext {
public final Registry<Biome> biomes; public final Registry<Biome> biomes;
public Context( public Context(
Registry<Biome> biomes, Holder<DimensionType> dimension, Registry<Biome> biomes,
Holder<DimensionType> dimension,
Registry<StructureSet> structureSets, Registry<StructureSet> structureSets,
Registry<NormalNoise.NoiseParameters> noiseParameters, Registry<NormalNoise.NoiseParameters> noiseParameters,
Holder<NoiseGeneratorSettings> generatorSettings Holder<NoiseGeneratorSettings> generatorSettings

View file

@ -46,7 +46,7 @@ public class CreateWorldScreenMixin {
//Change the WorldPreset that is selected by default on the Create World Screen //Change the WorldPreset that is selected by default on the Create World Screen
@ModifyArg(method = "openFresh", index = 1, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/WorldGenSettingsComponent;<init>(Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;Ljava/util/Optional;Ljava/util/OptionalLong;)V")) @ModifyArg(method = "openFresh", index = 1, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/worldselection/WorldGenSettingsComponent;<init>(Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext;Ljava/util/Optional;Ljava/util/OptionalLong;)V"))
private static Optional<ResourceKey<WorldPreset>> bcl_NewDefault(Optional<ResourceKey<WorldPreset>> preset) { private static Optional<ResourceKey<WorldPreset>> bcl_NewDefault(Optional<ResourceKey<WorldPreset>> preset) {
return WorldPresets.DEFAULT; return Optional.of(WorldPresets.DEFAULT);
} }
//Make sure the WorldGenSettings used to populate the create screen match the default WorldPreset //Make sure the WorldGenSettings used to populate the create screen match the default WorldPreset

View file

@ -20,6 +20,6 @@ public class WorldGenPropertiesMixin {
//Make sure Servers use our Default World Preset //Make sure Servers use our Default World Preset
@ModifyArg(method = "create", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/core/Registry;getHolder(Lnet/minecraft/resources/ResourceKey;)Ljava/util/Optional;")) @ModifyArg(method = "create", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/core/Registry;getHolder(Lnet/minecraft/resources/ResourceKey;)Ljava/util/Optional;"))
private ResourceKey<WorldPreset> bcl_foo(ResourceKey<WorldPreset> resourceKey) { private ResourceKey<WorldPreset> bcl_foo(ResourceKey<WorldPreset> resourceKey) {
return WorldPresets.DEFAULT.orElseThrow(); return WorldPresets.DEFAULT;
} }
} }

View file

@ -1,7 +1,6 @@
package org.betterx.worlds.together.mixin.common; package org.betterx.worlds.together.mixin.common;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import com.mojang.datafixers.kinds.App; import com.mojang.datafixers.kinds.App;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
@ -44,14 +43,8 @@ public class WorldPresetMixin {
? Optional.of(((TogetherWorldPreset) wp).sortOrder) ? Optional.of(((TogetherWorldPreset) wp).sortOrder)
: Optional.empty()); : Optional.empty());
RecordCodecBuilder<WorldPreset, Optional<WorldPresetSettings>> settingsBuilder = WorldPresetSettings.CODEC
.optionalFieldOf("settings")
.forGetter(wp -> (wp instanceof TogetherWorldPreset)
? Optional.of(((TogetherWorldPreset) wp).settings)
: Optional.empty());
return builderInstance return builderInstance
.group(dimensionsBuilder, sortBuilder, settingsBuilder) .group(dimensionsBuilder, sortBuilder)
.apply(builderInstance, TogetherWorldPreset::new); .apply(builderInstance, TogetherWorldPreset::new);
}; };

View file

@ -2,7 +2,6 @@ package org.betterx.worlds.together.mixin.common;
import org.betterx.worlds.together.levelgen.WorldGenUtil; import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.worldPreset.WorldPresets; import org.betterx.worlds.together.worldPreset.WorldPresets;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
@ -51,7 +50,6 @@ public abstract class WorldPresetsBootstrapMixin {
@ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;")) @ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;"))
private LevelStem bcl_getOverworldStem(LevelStem overworldStem) { private LevelStem bcl_getOverworldStem(LevelStem overworldStem) {
WorldPresetSettings.bootstrap();
WorldGenUtil.Context netherContext = new WorldGenUtil.Context( WorldGenUtil.Context netherContext = new WorldGenUtil.Context(
this.biomes, this.biomes,
this.netherDimensionType, this.netherDimensionType,

View file

@ -1,14 +1,17 @@
package org.betterx.worlds.together.world.event; package org.betterx.worlds.together.world.event;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource;
import java.util.Map;
@FunctionalInterface @FunctionalInterface
public interface BeforeServerWorldLoad { public interface BeforeServerWorldLoad {
void prepareWorld( void prepareWorld(
LevelStorageSource.LevelStorageAccess storageAccess, LevelStorageSource.LevelStorageAccess storageAccess,
WorldPresetSettings settings, Map<ResourceKey<LevelStem>, ChunkGenerator> dimension,
boolean isNewWorld boolean isNewWorld
); );
} }

View file

@ -1,13 +1,16 @@
package org.betterx.worlds.together.world.event; package org.betterx.worlds.together.world.event;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource;
import java.util.Map;
public interface BeforeWorldLoad { public interface BeforeWorldLoad {
void prepareWorld( void prepareWorld(
LevelStorageSource.LevelStorageAccess storageAccess, LevelStorageSource.LevelStorageAccess storageAccess,
WorldPresetSettings settings, Map<ResourceKey<LevelStem>, ChunkGenerator> settings,
boolean isNewWorld boolean isNewWorld
); );
} }

View file

@ -9,21 +9,24 @@ import org.betterx.worlds.together.world.WorldConfig;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset; import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.WorldGenSettingsComponentAccessor; import org.betterx.worlds.together.worldPreset.WorldGenSettingsComponentAccessor;
import org.betterx.worlds.together.worldPreset.WorldPresets; import org.betterx.worlds.together.worldPreset.WorldPresets;
import org.betterx.worlds.together.worldPreset.settings.VanillaWorldPresetSettings;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent; import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.WorldGenSettings;
import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.minecraft.world.level.storage.LevelResource; import net.minecraft.world.level.storage.LevelResource;
import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource;
import java.io.File; import java.io.File;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
@ -36,6 +39,11 @@ public class WorldBootstrap {
return LAST_REGISTRY_ACCESS; return LAST_REGISTRY_ACCESS;
} }
public static RegistryAccess getLastRegistryAccessOrElseBuiltin() {
if (LAST_REGISTRY_ACCESS == null) return BuiltinRegistries.ACCESS;
return LAST_REGISTRY_ACCESS;
}
public static class Helpers { public static class Helpers {
private static void initializeWorldConfig( private static void initializeWorldConfig(
LevelStorageSource.LevelStorageAccess levelStorageAccess, LevelStorageSource.LevelStorageAccess levelStorageAccess,
@ -63,31 +71,34 @@ public class WorldBootstrap {
private static Holder<WorldPreset> defaultServerPreset() { private static Holder<WorldPreset> defaultServerPreset() {
return WorldPresets.get( return WorldPresets.get(
LAST_REGISTRY_ACCESS, LAST_REGISTRY_ACCESS,
WorldPresets.DEFAULT.orElseThrow() WorldPresets.DEFAULT
); );
} }
private static WorldPresetSettings defaultServerSettings() { private static Map<ResourceKey<LevelStem>, ChunkGenerator> defaultServerDimensions() {
final Holder<WorldPreset> defaultPreset = defaultServerPreset(); final Holder<WorldPreset> defaultPreset = defaultServerPreset();
return defaultServerSettings(defaultPreset); return defaultServerDimensions(defaultPreset);
} }
private static WorldPresetSettings defaultServerSettings(Holder<WorldPreset> defaultPreset) { private static Map<ResourceKey<LevelStem>, ChunkGenerator> defaultServerDimensions(Holder<WorldPreset> defaultPreset) {
final WorldPresetSettings settings; final Map<ResourceKey<LevelStem>, ChunkGenerator> dimensions;
if (defaultPreset.value() instanceof TogetherWorldPreset t) { if (defaultPreset.value() instanceof TogetherWorldPreset t) {
settings = t.settings; dimensions = t.getDimensionsMap();
} else { } else {
settings = VanillaWorldPresetSettings.DEFAULT; dimensions = TogetherWorldPreset.getDimensionsMap(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL);
} }
return settings; return dimensions;
} }
private static Optional<Holder<WorldPreset>> presetFromDatapack(Optional<Holder<WorldPreset>> currentPreset) { private static Optional<Holder<WorldPreset>> presetFromDatapack(Optional<Holder<WorldPreset>> currentPreset) {
if (currentPreset.isPresent() && LAST_REGISTRY_ACCESS != null) { if (currentPreset.isPresent() && LAST_REGISTRY_ACCESS != null) {
Optional<Holder<WorldPreset>> newPreset = LAST_REGISTRY_ACCESS var presetKey = currentPreset.get().unwrapKey();
.registryOrThrow(Registry.WORLD_PRESET_REGISTRY) if (presetKey.isPresent()) {
.getHolder(currentPreset.map(h -> h.unwrapKey()).map(h -> h.orElseThrow()).orElseThrow()); Optional<Holder<WorldPreset>> newPreset = LAST_REGISTRY_ACCESS
if (newPreset.isPresent()) currentPreset = newPreset; .registryOrThrow(Registry.WORLD_PRESET_REGISTRY)
.getHolder(presetKey.get());
if (newPreset.isPresent()) currentPreset = newPreset;
}
} }
return currentPreset; return currentPreset;
} }
@ -104,7 +115,7 @@ public class WorldBootstrap {
File levelDat = levelStorageAccess.getLevelPath(LevelResource.LEVEL_DATA_FILE).toFile(); File levelDat = levelStorageAccess.getLevelPath(LevelResource.LEVEL_DATA_FILE).toFile();
if (!levelDat.exists()) { if (!levelDat.exists()) {
BCLib.LOGGER.info("Creating a new World, no fixes needed"); BCLib.LOGGER.info("Creating a new World, no fixes needed");
final WorldPresetSettings settings = Helpers.defaultServerSettings(); final Map<ResourceKey<LevelStem>, ChunkGenerator> settings = Helpers.defaultServerDimensions();
Helpers.initializeWorldConfig(levelStorageAccess, true); Helpers.initializeWorldConfig(levelStorageAccess, true);
WorldEventsImpl.BEFORE_SERVER_WORLD_LOAD.emit(e -> e.prepareWorld( WorldEventsImpl.BEFORE_SERVER_WORLD_LOAD.emit(e -> e.prepareWorld(
@ -114,7 +125,7 @@ public class WorldBootstrap {
Helpers.initializeWorldConfig(levelStorageAccess, false); Helpers.initializeWorldConfig(levelStorageAccess, false);
WorldEventsImpl.BEFORE_SERVER_WORLD_LOAD.emit(e -> e.prepareWorld( WorldEventsImpl.BEFORE_SERVER_WORLD_LOAD.emit(e -> e.prepareWorld(
levelStorageAccess, levelStorageAccess,
WorldGenUtil.getWorldSettings(), TogetherWorldPreset.getWorldDimensions(),
false false
)); ));
WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad); WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad);
@ -124,18 +135,13 @@ public class WorldBootstrap {
//Needs to get called after setupWorld //Needs to get called after setupWorld
public static void applyDatapackChangesOnNewWorld(WorldGenSettings worldGenSettings) { public static void applyDatapackChangesOnNewWorld(WorldGenSettings worldGenSettings) {
Optional<Holder<WorldPreset>> currentPreset = Optional.of(Helpers.defaultServerPreset()); Optional<Holder<WorldPreset>> currentPreset = Optional.of(Helpers.defaultServerPreset());
var settings = Helpers.defaultServerSettings(currentPreset.orElseThrow());
currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, worldGenSettings); currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, worldGenSettings);
if (currentPreset.map(h -> h.value()).orElse(null) instanceof TogetherWorldPreset t) {
settings = t.settings; if (currentPreset.map(Holder::value).orElse(null) instanceof WorldPresetAccessor acc) {
}
TogetherWorldPreset.writeWorldPresetSettings(settings);
if (currentPreset.map(h -> h.value()).orElse(null) instanceof WorldPresetAccessor acc) {
TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions()); TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions());
} else { } else {
WorldsTogether.LOGGER.error("Failed writing together File"); WorldsTogether.LOGGER.error("Failed writing together File");
//TogetherWorldPreset.writeWorldPresetSettings(worldGenSettings); TogetherWorldPreset.writeWorldPresetSettings(worldGenSettings.dimensions());
} }
WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad); WorldEventsImpl.ON_WORLD_LOAD.emit(OnWorldLoad::onLoad);
} }
@ -185,29 +191,28 @@ public class WorldBootstrap {
Helpers.initializeWorldConfig(levelStorageAccess, true); Helpers.initializeWorldConfig(levelStorageAccess, true);
final WorldPresetSettings settings; final Map<ResourceKey<LevelStem>, ChunkGenerator> dimensions;
if (currentPreset.map(Holder::value).orElse(null) instanceof TogetherWorldPreset t) { if (currentPreset.map(Holder::value).orElse(null) instanceof TogetherWorldPreset t) {
settings = t.settings; dimensions = t.getDimensionsMap();
} else { } else {
settings = VanillaWorldPresetSettings.DEFAULT; dimensions = TogetherWorldPreset.getDimensionsMap(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL);
} }
// Helpers.setupWorld(); // Helpers.setupWorld();
// DataFixerAPI.initializePatchData(); // DataFixerAPI.initializePatchData();
WorldEventsImpl.BEFORE_WORLD_LOAD.emit(e -> e.prepareWorld( WorldEventsImpl.BEFORE_WORLD_LOAD.emit(e -> e.prepareWorld(
levelStorageAccess, levelStorageAccess,
settings, dimensions,
true true
)); ));
currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, worldGenSettings); currentPreset = WorldEventsImpl.ADAPT_WORLD_PRESET.emit(currentPreset, worldGenSettings);
TogetherWorldPreset.writeWorldPresetSettings(currentPreset); if (currentPreset.map(Holder::value).orElse(null) instanceof WorldPresetAccessor acc) {
if (currentPreset.map(h -> h.value()).orElse(null) instanceof WorldPresetAccessor acc) {
TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions()); TogetherWorldPreset.writeWorldPresetSettings(acc.bcl_getDimensions());
} else { } else {
WorldsTogether.LOGGER.error("Failed writing together File"); WorldsTogether.LOGGER.error("Failed writing together File");
//TogetherWorldPreset.writeWorldPresetSettings(worldGenSettings); TogetherWorldPreset.writeWorldPresetSettings(worldGenSettings.dimensions());
} }
//LifeCycleAPI._runBeforeLevelLoad(); //LifeCycleAPI._runBeforeLevelLoad();
@ -230,7 +235,7 @@ public class WorldBootstrap {
//Helpers.setupWorld(); //Helpers.setupWorld();
WorldEventsImpl.BEFORE_WORLD_LOAD.emit(e -> e.prepareWorld( WorldEventsImpl.BEFORE_WORLD_LOAD.emit(e -> e.prepareWorld(
levelStorageAccess, levelStorageAccess,
WorldGenUtil.getWorldSettings(), TogetherWorldPreset.getWorldDimensions(),
false false
)); ));
levelStorageAccess.close(); levelStorageAccess.close();

View file

@ -5,8 +5,6 @@ import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.mixin.common.WorldPresetAccessor; import org.betterx.worlds.together.mixin.common.WorldPresetAccessor;
import org.betterx.worlds.together.world.WorldConfig; import org.betterx.worlds.together.world.WorldConfig;
import org.betterx.worlds.together.world.event.WorldBootstrap; import org.betterx.worlds.together.world.event.WorldBootstrap;
import org.betterx.worlds.together.worldPreset.settings.VanillaWorldPresetSettings;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.Dynamic; import com.mojang.serialization.Dynamic;
@ -29,7 +27,6 @@ import java.util.Optional;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class TogetherWorldPreset extends WorldPreset { public class TogetherWorldPreset extends WorldPreset {
public final WorldPresetSettings settings;
public final int sortOrder; public final int sortOrder;
private static final String TAG_GENERATOR = WorldGenUtil.TAG_GENERATOR; private static final String TAG_GENERATOR = WorldGenUtil.TAG_GENERATOR;
@ -38,41 +35,57 @@ public class TogetherWorldPreset extends WorldPreset {
public TogetherWorldPreset( public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map, Map<ResourceKey<LevelStem>, LevelStem> map,
Optional<Integer> sortOrder, Optional<Integer> sortOrder
Optional<WorldPresetSettings> settings
) { ) {
this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++), settings.orElse(VanillaWorldPresetSettings.DEFAULT)); this(map, sortOrder.orElse(NEXT_IN_SORT_ORDER++));
} }
public TogetherWorldPreset( public TogetherWorldPreset(
Map<ResourceKey<LevelStem>, LevelStem> map, Map<ResourceKey<LevelStem>, LevelStem> map,
int sortOrder, int sortOrder
WorldPresetSettings settings
) { ) {
super(map); super(map);
this.sortOrder = sortOrder; this.sortOrder = sortOrder;
this.settings = settings;
} }
public TogetherWorldPreset withSettings(WorldPresetSettings settings) { public TogetherWorldPreset withDimensions(Registry<LevelStem> dimensions) {
return new TogetherWorldPreset(getDimensions(), sortOrder, settings); Map<ResourceKey<LevelStem>, LevelStem> map = new HashMap<>();
for (var entry : dimensions.entrySet()) {
ResourceKey<LevelStem> key = entry.getKey();
LevelStem stem = entry.getValue();
map.put(key, stem);
}
return new TogetherWorldPreset(map, sortOrder);
} }
private Map<ResourceKey<LevelStem>, LevelStem> getDimensions() { private Map<ResourceKey<LevelStem>, LevelStem> getDimensions() {
return ((WorldPresetAccessor) this).bcl_getDimensions(); return ((WorldPresetAccessor) this).bcl_getDimensions();
} }
public Map<ResourceKey<LevelStem>, ChunkGenerator> getDimensionsMap() {
return DimensionsWrapper.build(getDimensions());
}
public LevelStem getDimension(ResourceKey<LevelStem> key) { public LevelStem getDimension(ResourceKey<LevelStem> key) {
return getDimensions().get(key); return getDimensions().get(key);
} }
public static void writeWorldPresetSettings(Registry<LevelStem> dimensions) {
DimensionsWrapper wrapper = new DimensionsWrapper(dimensions);
writeWorldPresetSettings(wrapper);
}
public static void writeWorldPresetSettings(Map<ResourceKey<LevelStem>, LevelStem> settings) { public static void writeWorldPresetSettings(Map<ResourceKey<LevelStem>, LevelStem> settings) {
DimensionsWrapper wrapper = new DimensionsWrapper(DimensionsWrapper.build(settings));
writeWorldPresetSettings(wrapper);
}
private static void writeWorldPresetSettings(DimensionsWrapper wrapper) {
final RegistryOps<Tag> registryOps = RegistryOps.create( final RegistryOps<Tag> registryOps = RegistryOps.create(
NbtOps.INSTANCE, NbtOps.INSTANCE,
WorldBootstrap.getLastRegistryAccess() WorldBootstrap.getLastRegistryAccess()
); );
DimensionsWrapper wrapper = new DimensionsWrapper(DimensionsWrapper.build(settings)); final var encodeResult = DimensionsWrapper.CODEC.encodeStart(registryOps, wrapper);
final var encodeResult = wrapper.CODEC.encodeStart(registryOps, wrapper);
if (encodeResult.result().isPresent()) { if (encodeResult.result().isPresent()) {
final CompoundTag settingsNbt = WorldConfig.getRootTag(WorldsTogether.MOD_ID); final CompoundTag settingsNbt = WorldConfig.getRootTag(WorldsTogether.MOD_ID);
@ -87,7 +100,6 @@ public class TogetherWorldPreset extends WorldPreset {
private static DimensionsWrapper DEFAULT_DIMENSIONS_WRAPPER = null; private static DimensionsWrapper DEFAULT_DIMENSIONS_WRAPPER = null;
public static @NotNull Map<ResourceKey<LevelStem>, ChunkGenerator> getWorldDimensions() { public static @NotNull Map<ResourceKey<LevelStem>, ChunkGenerator> getWorldDimensions() {
if (BuiltinRegistries.ACCESS == null) return null;
final RegistryAccess registryAccess; final RegistryAccess registryAccess;
if (WorldBootstrap.getLastRegistryAccess() != null) { if (WorldBootstrap.getLastRegistryAccess() != null) {
registryAccess = WorldBootstrap.getLastRegistryAccess(); registryAccess = WorldBootstrap.getLastRegistryAccess();
@ -104,7 +116,7 @@ public class TogetherWorldPreset extends WorldPreset {
DEFAULT_DIMENSIONS_WRAPPER = new DimensionsWrapper(WorldPresets DEFAULT_DIMENSIONS_WRAPPER = new DimensionsWrapper(WorldPresets
.get( .get(
registryAccess, registryAccess,
WorldPresets.DEFAULT.orElseThrow() WorldPresets.DEFAULT
) )
.value() .value()
.createWorldGenSettings(0, true, true) .createWorldGenSettings(0, true, true)
@ -114,6 +126,27 @@ public class TogetherWorldPreset extends WorldPreset {
return oLevelStem.orElse(DEFAULT_DIMENSIONS_WRAPPER).dimensions; return oLevelStem.orElse(DEFAULT_DIMENSIONS_WRAPPER).dimensions;
} }
public static Registry<LevelStem> getDimensions(ResourceKey<WorldPreset> key) {
RegistryAccess access = WorldBootstrap.getLastRegistryAccessOrElseBuiltin();
var preset = access.registryOrThrow(Registry.WORLD_PRESET_REGISTRY).getHolder(key);
if (preset.isEmpty()) return null;
return preset
.get()
.value()
.createWorldGenSettings(
0,
true,
true
)
.dimensions();
}
public static @NotNull Map<ResourceKey<LevelStem>, ChunkGenerator> getDimensionsMap(ResourceKey<WorldPreset> key) {
Registry<LevelStem> reg = getDimensions(key);
if (reg == null) return new HashMap<>();
return DimensionsWrapper.build(reg);
}
private static class DimensionsWrapper { private static class DimensionsWrapper {
public static final Codec<DimensionsWrapper> CODEC = RecordCodecBuilder.create(instance -> instance public static final Codec<DimensionsWrapper> CODEC = RecordCodecBuilder.create(instance -> instance
.group(Codec.unboundedMap( .group(Codec.unboundedMap(
@ -146,6 +179,7 @@ public class TogetherWorldPreset extends WorldPreset {
return map; return map;
} }
DimensionsWrapper(Registry<LevelStem> dimensions) { DimensionsWrapper(Registry<LevelStem> dimensions) {
this(build(dimensions)); this(build(dimensions));
} }

View file

@ -2,12 +2,10 @@ package org.betterx.worlds.together.worldPreset;
import org.betterx.bclib.registry.PresetsRegistry; import org.betterx.bclib.registry.PresetsRegistry;
import org.betterx.worlds.together.WorldsTogether; import org.betterx.worlds.together.WorldsTogether;
import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.tag.v3.TagManager; import org.betterx.worlds.together.tag.v3.TagManager;
import org.betterx.worlds.together.tag.v3.TagRegistry; import org.betterx.worlds.together.tag.v3.TagRegistry;
import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.worldPreset.client.WorldPresetsClient; import org.betterx.worlds.together.worldPreset.client.WorldPresetsClient;
import org.betterx.worlds.together.worldPreset.settings.VanillaWorldPresetSettings;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
@ -22,15 +20,13 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import java.util.Map; import java.util.Map;
import java.util.Optional;
public class WorldPresets { public class WorldPresets {
public static final TagRegistry.Simple<WorldPreset> WORLD_PRESETS = public static final TagRegistry.Simple<WorldPreset> WORLD_PRESETS =
TagManager.registerType(BuiltinRegistries.WORLD_PRESET, "tags/worldgen/world_preset"); TagManager.registerType(BuiltinRegistries.WORLD_PRESET, "tags/worldgen/world_preset");
private static Map<ResourceKey<WorldPreset>, PresetBuilder> BUILDERS = Maps.newHashMap(); private static Map<ResourceKey<WorldPreset>, PresetBuilder> BUILDERS = Maps.newHashMap();
private static final Map<ResourceKey<WorldPreset>, WorldPresetSettings> SETTINGS = Maps.newHashMap(); public static ResourceKey<WorldPreset> DEFAULT = net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL;
public static Optional<ResourceKey<WorldPreset>> DEFAULT = Optional.of(net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL);
public static Holder<WorldPreset> get(RegistryAccess access, ResourceKey<WorldPreset> key) { public static Holder<WorldPreset> get(RegistryAccess access, ResourceKey<WorldPreset> key) {
return ((access != null) ? access : BuiltinRegistries.ACCESS) return ((access != null) ? access : BuiltinRegistries.ACCESS)
@ -87,15 +83,11 @@ public class WorldPresets {
for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) { for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) {
TogetherWorldPreset preset = e.getValue().create(overworldStem, netherContext, endContext); TogetherWorldPreset preset = e.getValue().create(overworldStem, netherContext, endContext);
SETTINGS.put(e.getKey(), preset.settings);
BuiltinRegistries.register(presets, e.getKey(), preset); BuiltinRegistries.register(presets, e.getKey(), preset);
} }
BUILDERS = null; BUILDERS = null;
} }
public static WorldPresetSettings getSettingsForPreset(ResourceKey<WorldPreset> key) {
return SETTINGS.getOrDefault(key, VanillaWorldPresetSettings.DEFAULT);
}
@FunctionalInterface @FunctionalInterface
public interface PresetBuilder { public interface PresetBuilder {

View file

@ -1,30 +0,0 @@
package org.betterx.worlds.together.worldPreset.settings;
import com.mojang.serialization.Codec;
import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.levelgen.WorldGenSettings;
import java.util.Set;
public class VanillaWorldPresetSettings extends WorldPresetSettings {
public static final VanillaWorldPresetSettings DEFAULT = new VanillaWorldPresetSettings();
public static final Codec<VanillaWorldPresetSettings> CODEC = Codec.unit(VanillaWorldPresetSettings::new);
@Override
public Codec<? extends WorldPresetSettings> codec() {
return CODEC;
}
@Override
public WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings) {
return settings;
}
@Override
public BiomeSource addDatapackBiomes(BiomeSource biomeSource, Set<Holder<Biome>> datapackBiomes) {
return biomeSource;
}
}

View file

@ -1,56 +0,0 @@
package org.betterx.worlds.together.worldPreset.settings;
import org.betterx.worlds.together.WorldsTogether;
import com.mojang.serialization.Codec;
import com.mojang.serialization.Lifecycle;
import net.minecraft.core.Holder;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.levelgen.WorldGenSettings;
import java.util.Set;
import java.util.function.Function;
public abstract class WorldPresetSettings {
public static WorldPresetSettings DEFAULT = VanillaWorldPresetSettings.DEFAULT;
public static final ResourceKey<Registry<Codec<? extends WorldPresetSettings>>> WORLD_PRESET_SETTINGS_REGISTRY =
createRegistryKey(WorldsTogether.makeID("worldgen/world_preset_settings"));
public static final Registry<Codec<? extends WorldPresetSettings>> WORLD_PRESET_SETTINGS =
registerSimple(WORLD_PRESET_SETTINGS_REGISTRY);
public static final Codec<WorldPresetSettings> CODEC = WORLD_PRESET_SETTINGS
.byNameCodec()
.dispatchStable(WorldPresetSettings::codec, Function.identity());
private static <T> ResourceKey<Registry<T>> createRegistryKey(ResourceLocation location) {
return ResourceKey.createRegistryKey(location);
}
private static <T> Registry<T> registerSimple(ResourceKey<? extends Registry<T>> resourceKey) {
return new MappedRegistry<>(resourceKey, Lifecycle.stable(), null);
}
public static Codec<? extends WorldPresetSettings> register(
ResourceLocation loc,
Codec<? extends WorldPresetSettings> codec
) {
return Registry.register(WORLD_PRESET_SETTINGS, loc, codec);
}
public static void bootstrap() {
register(WorldsTogether.makeID("vanilla_world_preset_settings"), VanillaWorldPresetSettings.CODEC);
}
public abstract Codec<? extends WorldPresetSettings> codec();
public abstract WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings);
public abstract BiomeSource addDatapackBiomes(BiomeSource biomeSource, Set<Holder<Biome>> datapackBiomes);
}