[Feature] Double Height Nether (for amplified worlds)

This commit is contained in:
Frank 2022-11-16 12:03:07 +01:00
parent 1e968fafc7
commit 172737e0fa
8 changed files with 135 additions and 34 deletions

View file

@ -17,6 +17,8 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
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.data.worldgen.SurfaceRuleData;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
@ -24,13 +26,11 @@ import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.biome.BiomeGenerationSettings;
import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.biome.FeatureSorter; import net.minecraft.world.level.biome.FeatureSorter;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.chunk.ChunkGenerator; 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.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.*;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.RandomState;
import net.minecraft.world.level.levelgen.WorldGenSettings;
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;
@ -63,6 +63,12 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
.and(builderInstance.group(noiseGetter, biomeSourceCodec, settingsCodec)) .and(builderInstance.group(noiseGetter, biomeSourceCodec, settingsCodec))
.apply(builderInstance, builderInstance.stable(BCLChunkGenerator::new)); .apply(builderInstance, builderInstance.stable(BCLChunkGenerator::new));
}); });
protected static final NoiseSettings NETHER_NOISE_SETTINGS_AMPLIFIED = NoiseSettings.create(0, 256, 1, 4);
public static final ResourceKey<NoiseGeneratorSettings> AMPLIFIED_NETHER = ResourceKey.create(
Registry.NOISE_GENERATOR_SETTINGS_REGISTRY,
BCLib.makeID("amplified_nether")
);
public final BiomeSource initialBiomeSource; public final BiomeSource initialBiomeSource;
public BCLChunkGenerator( public BCLChunkGenerator(
@ -226,4 +232,24 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
// //
// return Holder.direct(noise); // return Holder.direct(noise);
} }
public static NoiseGeneratorSettings amplifiedNether() {
return new NoiseGeneratorSettings(
NETHER_NOISE_SETTINGS_AMPLIFIED,
Blocks.NETHERRACK.defaultBlockState(),
Blocks.LAVA.defaultBlockState(),
NoiseRouterData.noNewCaves(
BuiltinRegistries.DENSITY_FUNCTION,
NoiseRouterData.slideNetherLike(BuiltinRegistries.DENSITY_FUNCTION, 0, 256)
),
SurfaceRuleData.nether(),
List.of(),
32,
false,
false,
false,
true
);
}
} }

View file

@ -18,33 +18,38 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig<BCLibNether
NetherBiomeMapType.VANILLA, NetherBiomeMapType.VANILLA,
256, 256,
86, 86,
false,
false false
); );
public static final BCLNetherBiomeSourceConfig MINECRAFT_17 = new BCLNetherBiomeSourceConfig( public static final BCLNetherBiomeSourceConfig MINECRAFT_17 = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.SQUARE, NetherBiomeMapType.SQUARE,
256, 256,
86, 86,
true true,
false
); );
public static final BCLNetherBiomeSourceConfig MINECRAFT_18 = new BCLNetherBiomeSourceConfig( public static final BCLNetherBiomeSourceConfig MINECRAFT_18 = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.HEX, NetherBiomeMapType.HEX,
MINECRAFT_17.biomeSize, MINECRAFT_17.biomeSize,
MINECRAFT_17.biomeSizeVertical, MINECRAFT_17.biomeSizeVertical,
MINECRAFT_17.useVerticalBiomes MINECRAFT_17.useVerticalBiomes,
MINECRAFT_17.amplified
); );
public static final BCLNetherBiomeSourceConfig MINECRAFT_18_LARGE = new BCLNetherBiomeSourceConfig( public static final BCLNetherBiomeSourceConfig MINECRAFT_18_LARGE = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.HEX, NetherBiomeMapType.HEX,
MINECRAFT_18.biomeSize * 4, MINECRAFT_18.biomeSize * 4,
MINECRAFT_18.biomeSizeVertical * 2, MINECRAFT_18.biomeSizeVertical * 2,
MINECRAFT_18.useVerticalBiomes MINECRAFT_18.useVerticalBiomes,
MINECRAFT_17.amplified
); );
public static final BCLNetherBiomeSourceConfig MINECRAFT_18_AMPLIFIED = new BCLNetherBiomeSourceConfig( public static final BCLNetherBiomeSourceConfig MINECRAFT_18_AMPLIFIED = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.HEX, NetherBiomeMapType.HEX,
MINECRAFT_18.biomeSize, MINECRAFT_18.biomeSize,
MINECRAFT_18.biomeSizeVertical * 2, 128,
false true,
true
); );
public static final BCLNetherBiomeSourceConfig DEFAULT = MINECRAFT_18; public static final BCLNetherBiomeSourceConfig DEFAULT = MINECRAFT_18;
@ -61,7 +66,10 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig<BCLibNether
.forGetter(o -> o.biomeSizeVertical), .forGetter(o -> o.biomeSizeVertical),
Codec.BOOL.fieldOf("use_vertical_biomes") Codec.BOOL.fieldOf("use_vertical_biomes")
.orElse(DEFAULT.useVerticalBiomes) .orElse(DEFAULT.useVerticalBiomes)
.forGetter(o -> o.useVerticalBiomes) .forGetter(o -> o.useVerticalBiomes),
Codec.BOOL.fieldOf("amplified")
.orElse(DEFAULT.amplified)
.forGetter(o -> o.amplified)
) )
.apply(instance, BCLNetherBiomeSourceConfig::new)); .apply(instance, BCLNetherBiomeSourceConfig::new));
public final @NotNull NetherBiomeMapType mapVersion; public final @NotNull NetherBiomeMapType mapVersion;
@ -69,17 +77,20 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig<BCLibNether
public final int biomeSizeVertical; public final int biomeSizeVertical;
public final boolean useVerticalBiomes; public final boolean useVerticalBiomes;
public final boolean amplified;
public BCLNetherBiomeSourceConfig( public BCLNetherBiomeSourceConfig(
@NotNull NetherBiomeMapType mapVersion, @NotNull NetherBiomeMapType mapVersion,
int biomeSize, int biomeSize,
int biomeSizeVertical, int biomeSizeVertical,
boolean useVerticalBiomes boolean useVerticalBiomes,
boolean amplified
) { ) {
this.mapVersion = mapVersion; this.mapVersion = mapVersion;
this.biomeSize = Mth.clamp(biomeSize, 1, 8192); this.biomeSize = Mth.clamp(biomeSize, 1, 8192);
this.biomeSizeVertical = Mth.clamp(biomeSizeVertical, 1, 8192); this.biomeSizeVertical = Mth.clamp(biomeSizeVertical, 1, 8192);
this.useVerticalBiomes = useVerticalBiomes; this.useVerticalBiomes = useVerticalBiomes;
this.amplified = amplified;
} }
@Override @Override

View file

@ -61,6 +61,7 @@ public class WorldSetupScreen extends LayoutScreen {
Checkbox generateEndVoid; Checkbox generateEndVoid;
Checkbox netherLegacy; Checkbox netherLegacy;
Checkbox netherVertical; Checkbox netherVertical;
Checkbox netherAmplified;
public LayoutComponent<?, ?> netherPage(BCLNetherBiomeSourceConfig netherConfig) { public LayoutComponent<?, ?> netherPage(BCLNetherBiomeSourceConfig netherConfig) {
VerticalStack content = new VerticalStack(fill(), fit()).centerHorizontal(); VerticalStack content = new VerticalStack(fill(), fit()).centerHorizontal();
@ -78,6 +79,12 @@ public class WorldSetupScreen extends LayoutScreen {
netherConfig.mapVersion == BCLNetherBiomeSourceConfig.NetherBiomeMapType.SQUARE netherConfig.mapVersion == BCLNetherBiomeSourceConfig.NetherBiomeMapType.SQUARE
); );
netherAmplified = content.indent(20).addCheckbox(
fit(), fit(),
Component.translatable("title.screen.bclib.worldgen.nether_amplified"),
netherConfig.amplified
);
netherVertical = content.indent(20).addCheckbox( netherVertical = content.indent(20).addCheckbox(
fit(), fit(), fit(), fit(),
Component.translatable("title.screen.bclib.worldgen.nether_vertical"), Component.translatable("title.screen.bclib.worldgen.nether_vertical"),
@ -109,6 +116,7 @@ public class WorldSetupScreen extends LayoutScreen {
bclibNether.onChange((cb, state) -> { bclibNether.onChange((cb, state) -> {
netherLegacy.setEnabled(state); netherLegacy.setEnabled(state);
netherAmplified.setEnabled(state);
netherVertical.setEnabled(state); netherVertical.setEnabled(state);
netherBiomeSize.setEnabled(state); netherBiomeSize.setEnabled(state);
netherVerticalBiomeSize.setEnabled(state && netherVertical.isChecked()); netherVerticalBiomeSize.setEnabled(state && netherVertical.isChecked());
@ -234,6 +242,8 @@ public class WorldSetupScreen extends LayoutScreen {
private void updateSettings() { private void updateSettings() {
Map<ResourceKey<LevelStem>, ChunkGenerator> betterxDimensions = TogetherWorldPreset.getDimensionsMap( Map<ResourceKey<LevelStem>, ChunkGenerator> betterxDimensions = TogetherWorldPreset.getDimensionsMap(
PresetsRegistry.BCL_WORLD); PresetsRegistry.BCL_WORLD);
Map<ResourceKey<LevelStem>, ChunkGenerator> betterxAmplifiedDimensions = TogetherWorldPreset.getDimensionsMap(
PresetsRegistry.BCL_WORLD_AMPLIFIED);
Map<ResourceKey<LevelStem>, ChunkGenerator> vanillaDimensions = TogetherWorldPreset.getDimensionsMap( Map<ResourceKey<LevelStem>, ChunkGenerator> vanillaDimensions = TogetherWorldPreset.getDimensionsMap(
WorldPresets.NORMAL); WorldPresets.NORMAL);
BCLEndBiomeSourceConfig.EndBiomeMapType endVersion = BCLEndBiomeSourceConfig.DEFAULT.mapVersion; BCLEndBiomeSourceConfig.EndBiomeMapType endVersion = BCLEndBiomeSourceConfig.DEFAULT.mapVersion;
@ -271,10 +281,15 @@ public class WorldSetupScreen extends LayoutScreen {
: BCLNetherBiomeSourceConfig.NetherBiomeMapType.HEX, : BCLNetherBiomeSourceConfig.NetherBiomeMapType.HEX,
netherBiomeSize.getValue() * 16, netherBiomeSize.getValue() * 16,
netherVerticalBiomeSize.getValue() * 16, netherVerticalBiomeSize.getValue() * 16,
netherVertical.isChecked() netherVertical.isChecked(),
netherAmplified.isChecked()
); );
ChunkGenerator netherGenerator = betterxDimensions.get(LevelStem.NETHER); ChunkGenerator netherGenerator = (
netherAmplified.isChecked()
? betterxAmplifiedDimensions
: betterxDimensions
).get(LevelStem.NETHER);
((BCLibNetherBiomeSource) netherGenerator.getBiomeSource()).setTogetherConfig(netherConfig); ((BCLibNetherBiomeSource) netherGenerator.getBiomeSource()).setTogetherConfig(netherConfig);
updateConfiguration(LevelStem.NETHER, BuiltinDimensionTypes.NETHER, netherGenerator); updateConfiguration(LevelStem.NETHER, BuiltinDimensionTypes.NETHER, netherGenerator);

View file

@ -0,0 +1,36 @@
package org.betterx.bclib.mixin.common;
import org.betterx.bclib.api.v2.generator.BCLChunkGenerator;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(NoiseGeneratorSettings.class)
public abstract class NoiseGeneratorSettingsMixin {
@Shadow
static protected Holder<NoiseGeneratorSettings> register(
Registry<NoiseGeneratorSettings> registry,
ResourceKey<NoiseGeneratorSettings> resourceKey,
NoiseGeneratorSettings noiseGeneratorSettings
) {
return null;
}
;
@Inject(method = "bootstrap", at = @At("HEAD"))
private static void bcl_addNoiseGenerators(
Registry<NoiseGeneratorSettings> registry,
CallbackInfoReturnable<Holder<NoiseGeneratorSettings>> cir
) {
register(registry, BCLChunkGenerator.AMPLIFIED_NETHER, BCLChunkGenerator.amplifiedNether());
}
}

View file

@ -1,6 +1,7 @@
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.BCLChunkGenerator;
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.api.v2.levelgen.LevelGenUtil; import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
@ -19,6 +20,7 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import java.util.Map; import java.util.Map;
public class PresetsRegistry implements WorldPresetBootstrap { public class PresetsRegistry implements WorldPresetBootstrap {
public static ResourceKey<WorldPreset> BCL_WORLD; public static ResourceKey<WorldPreset> BCL_WORLD;
public static ResourceKey<WorldPreset> BCL_WORLD_LARGE; public static ResourceKey<WorldPreset> BCL_WORLD_LARGE;
public static ResourceKey<WorldPreset> BCL_WORLD_AMPLIFIED; public static ResourceKey<WorldPreset> BCL_WORLD_AMPLIFIED;
@ -31,9 +33,8 @@ public class PresetsRegistry implements WorldPresetBootstrap {
(overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) ->
buildPreset( buildPreset(
overworldStem, overworldStem,
netherContext, netherContext, BCLNetherBiomeSourceConfig.DEFAULT,
BCLNetherBiomeSourceConfig.DEFAULT, endContext, endContext, BCLEndBiomeSourceConfig.DEFAULT
BCLEndBiomeSourceConfig.DEFAULT
), ),
true true
); );
@ -56,23 +57,31 @@ public class PresetsRegistry implements WorldPresetBootstrap {
true true
); );
BCL_WORLD_AMPLIFIED = BCL_WORLD_AMPLIFIED = WorldPresets.register(
WorldPresets.register( BCLib.makeID("amplified"),
BCLib.makeID("amplified"), (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> {
(overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { Holder<NoiseGeneratorSettings> amplifiedBiomeGenerator = noiseSettings
Holder<NoiseGeneratorSettings> largeBiomeGenerator = noiseSettings .getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED);
.getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED);
return buildPreset( WorldGenUtil.Context amplifiedNetherContext = new WorldGenUtil.Context(
noiseBasedOverworld.make( netherContext.biomes,
overworldStem.generator().getBiomeSource(), netherContext.dimension,
largeBiomeGenerator netherContext.structureSets,
), netherContext.noiseParameters,
netherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED, Holder.direct(BCLChunkGenerator.amplifiedNether())
endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED );
);
}, return buildPreset(
true noiseBasedOverworld.make(
); overworldStem.generator().getBiomeSource(),
amplifiedBiomeGenerator
),
amplifiedNetherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED,
endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED
);
},
true
);
BCL_WORLD_17 = WorldPresets.register( BCL_WORLD_17 = WorldPresets.register(
BCLib.makeID("legacy_17"), BCLib.makeID("legacy_17"),

View file

@ -64,6 +64,7 @@
"title.screen.bclib.worldgen.nether_biome_size": "Größe", "title.screen.bclib.worldgen.nether_biome_size": "Größe",
"title.screen.bclib.worldgen.nether_vertical_biome_size": "Biomhöhe", "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biomhöhe",
"title.screen.bclib.worldgen.nether_vertical": "Biome auch vertikal verteilen", "title.screen.bclib.worldgen.nether_vertical": "Biome auch vertikal verteilen",
"title.screen.bclib.worldgen.nether_amplified": "Doppelte Höhe",
"title.screen.bclib.worldgen.land_biome_size": "Land-Biome", "title.screen.bclib.worldgen.land_biome_size": "Land-Biome",
"title.screen.bclib.worldgen.void_biome_size": "Kleine Inseln", "title.screen.bclib.worldgen.void_biome_size": "Kleine Inseln",
"title.screen.bclib.worldgen.center_biome_size": "Zentralbiome", "title.screen.bclib.worldgen.center_biome_size": "Zentralbiome",

View file

@ -67,6 +67,7 @@
"title.screen.bclib.worldgen.nether_biome_size": "Biome Size", "title.screen.bclib.worldgen.nether_biome_size": "Biome Size",
"title.screen.bclib.worldgen.nether_vertical_biome_size": "Biome Height", "title.screen.bclib.worldgen.nether_vertical_biome_size": "Biome Height",
"title.screen.bclib.worldgen.nether_vertical": "Generate vertical Biomes", "title.screen.bclib.worldgen.nether_vertical": "Generate vertical Biomes",
"title.screen.bclib.worldgen.nether_amplified": "Double Height",
"title.screen.bclib.worldgen.land_biome_size": "Land Biomes", "title.screen.bclib.worldgen.land_biome_size": "Land Biomes",
"title.screen.bclib.worldgen.void_biome_size": "Small Island Biomes", "title.screen.bclib.worldgen.void_biome_size": "Small Island Biomes",
"title.screen.bclib.worldgen.center_biome_size": "Central Biomes", "title.screen.bclib.worldgen.center_biome_size": "Central Biomes",

View file

@ -21,6 +21,8 @@ accessible method net/minecraft/world/entity/ai/village/poi/PoiTypes register (L
accessible method net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource <init> (Ljava/util/List;)V accessible method net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource <init> (Ljava/util/List;)V
accessible method net/minecraft/core/Registry registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/Registry$RegistryBootstrap;)Lnet/minecraft/core/Registry; accessible method net/minecraft/core/Registry registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/Registry$RegistryBootstrap;)Lnet/minecraft/core/Registry;
accessible method net/minecraft/world/entity/SpawnPlacements register (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/SpawnPlacements$Type;Lnet/minecraft/world/level/levelgen/Heightmap$Types;Lnet/minecraft/world/entity/SpawnPlacements$SpawnPredicate;)V accessible method net/minecraft/world/entity/SpawnPlacements register (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/SpawnPlacements$Type;Lnet/minecraft/world/level/levelgen/Heightmap$Types;Lnet/minecraft/world/entity/SpawnPlacements$SpawnPredicate;)V
accessible method net/minecraft/world/level/levelgen/NoiseRouterData nether (Lnet/minecraft/core/Registry;)Lnet/minecraft/world/level/levelgen/NoiseRouter;
accessible method net/minecraft/world/level/levelgen/NoiseRouterData noNewCaves (Lnet/minecraft/core/Registry;Lnet/minecraft/world/level/levelgen/DensityFunction;)Lnet/minecraft/world/level/levelgen/NoiseRouter;
accessible method net/minecraft/world/level/levelgen/NoiseRouterData slideNetherLike (Lnet/minecraft/core/Registry;II)Lnet/minecraft/world/level/levelgen/DensityFunction;
#Fields #Fields
accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map; accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map;