[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.Registry;
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.ResourceKey;
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.BiomeSource;
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.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
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.*;
import net.minecraft.world.level.levelgen.structure.StructureSet;
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))
.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 BCLChunkGenerator(
@ -226,4 +232,24 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
//
// 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,
256,
86,
false,
false
);
public static final BCLNetherBiomeSourceConfig MINECRAFT_17 = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.SQUARE,
256,
86,
true
true,
false
);
public static final BCLNetherBiomeSourceConfig MINECRAFT_18 = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.HEX,
MINECRAFT_17.biomeSize,
MINECRAFT_17.biomeSizeVertical,
MINECRAFT_17.useVerticalBiomes
MINECRAFT_17.useVerticalBiomes,
MINECRAFT_17.amplified
);
public static final BCLNetherBiomeSourceConfig MINECRAFT_18_LARGE = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.HEX,
MINECRAFT_18.biomeSize * 4,
MINECRAFT_18.biomeSizeVertical * 2,
MINECRAFT_18.useVerticalBiomes
MINECRAFT_18.useVerticalBiomes,
MINECRAFT_17.amplified
);
public static final BCLNetherBiomeSourceConfig MINECRAFT_18_AMPLIFIED = new BCLNetherBiomeSourceConfig(
NetherBiomeMapType.HEX,
MINECRAFT_18.biomeSize,
MINECRAFT_18.biomeSizeVertical * 2,
false
128,
true,
true
);
public static final BCLNetherBiomeSourceConfig DEFAULT = MINECRAFT_18;
@ -61,7 +66,10 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig<BCLibNether
.forGetter(o -> o.biomeSizeVertical),
Codec.BOOL.fieldOf("use_vertical_biomes")
.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));
public final @NotNull NetherBiomeMapType mapVersion;
@ -69,17 +77,20 @@ public class BCLNetherBiomeSourceConfig implements BiomeSourceConfig<BCLibNether
public final int biomeSizeVertical;
public final boolean useVerticalBiomes;
public final boolean amplified;
public BCLNetherBiomeSourceConfig(
@NotNull NetherBiomeMapType mapVersion,
int biomeSize,
int biomeSizeVertical,
boolean useVerticalBiomes
boolean useVerticalBiomes,
boolean amplified
) {
this.mapVersion = mapVersion;
this.biomeSize = Mth.clamp(biomeSize, 1, 8192);
this.biomeSizeVertical = Mth.clamp(biomeSizeVertical, 1, 8192);
this.useVerticalBiomes = useVerticalBiomes;
this.amplified = amplified;
}
@Override

View file

@ -61,6 +61,7 @@ public class WorldSetupScreen extends LayoutScreen {
Checkbox generateEndVoid;
Checkbox netherLegacy;
Checkbox netherVertical;
Checkbox netherAmplified;
public LayoutComponent<?, ?> netherPage(BCLNetherBiomeSourceConfig netherConfig) {
VerticalStack content = new VerticalStack(fill(), fit()).centerHorizontal();
@ -78,6 +79,12 @@ public class WorldSetupScreen extends LayoutScreen {
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(
fit(), fit(),
Component.translatable("title.screen.bclib.worldgen.nether_vertical"),
@ -109,6 +116,7 @@ public class WorldSetupScreen extends LayoutScreen {
bclibNether.onChange((cb, state) -> {
netherLegacy.setEnabled(state);
netherAmplified.setEnabled(state);
netherVertical.setEnabled(state);
netherBiomeSize.setEnabled(state);
netherVerticalBiomeSize.setEnabled(state && netherVertical.isChecked());
@ -234,6 +242,8 @@ public class WorldSetupScreen extends LayoutScreen {
private void updateSettings() {
Map<ResourceKey<LevelStem>, ChunkGenerator> betterxDimensions = TogetherWorldPreset.getDimensionsMap(
PresetsRegistry.BCL_WORLD);
Map<ResourceKey<LevelStem>, ChunkGenerator> betterxAmplifiedDimensions = TogetherWorldPreset.getDimensionsMap(
PresetsRegistry.BCL_WORLD_AMPLIFIED);
Map<ResourceKey<LevelStem>, ChunkGenerator> vanillaDimensions = TogetherWorldPreset.getDimensionsMap(
WorldPresets.NORMAL);
BCLEndBiomeSourceConfig.EndBiomeMapType endVersion = BCLEndBiomeSourceConfig.DEFAULT.mapVersion;
@ -271,10 +281,15 @@ public class WorldSetupScreen extends LayoutScreen {
: BCLNetherBiomeSourceConfig.NetherBiomeMapType.HEX,
netherBiomeSize.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);
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;
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.BCLNetherBiomeSourceConfig;
import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
@ -19,6 +20,7 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import java.util.Map;
public class PresetsRegistry implements WorldPresetBootstrap {
public static ResourceKey<WorldPreset> BCL_WORLD;
public static ResourceKey<WorldPreset> BCL_WORLD_LARGE;
public static ResourceKey<WorldPreset> BCL_WORLD_AMPLIFIED;
@ -31,9 +33,8 @@ public class PresetsRegistry implements WorldPresetBootstrap {
(overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) ->
buildPreset(
overworldStem,
netherContext,
BCLNetherBiomeSourceConfig.DEFAULT, endContext,
BCLEndBiomeSourceConfig.DEFAULT
netherContext, BCLNetherBiomeSourceConfig.DEFAULT,
endContext, BCLEndBiomeSourceConfig.DEFAULT
),
true
);
@ -56,23 +57,31 @@ public class PresetsRegistry implements WorldPresetBootstrap {
true
);
BCL_WORLD_AMPLIFIED =
WorldPresets.register(
BCLib.makeID("amplified"),
(overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> {
Holder<NoiseGeneratorSettings> largeBiomeGenerator = noiseSettings
.getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED);
return buildPreset(
noiseBasedOverworld.make(
overworldStem.generator().getBiomeSource(),
largeBiomeGenerator
),
netherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED,
endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED
);
},
true
);
BCL_WORLD_AMPLIFIED = WorldPresets.register(
BCLib.makeID("amplified"),
(overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> {
Holder<NoiseGeneratorSettings> amplifiedBiomeGenerator = noiseSettings
.getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED);
WorldGenUtil.Context amplifiedNetherContext = new WorldGenUtil.Context(
netherContext.biomes,
netherContext.dimension,
netherContext.structureSets,
netherContext.noiseParameters,
Holder.direct(BCLChunkGenerator.amplifiedNether())
);
return buildPreset(
noiseBasedOverworld.make(
overworldStem.generator().getBiomeSource(),
amplifiedBiomeGenerator
),
amplifiedNetherContext, BCLNetherBiomeSourceConfig.MINECRAFT_18_AMPLIFIED,
endContext, BCLEndBiomeSourceConfig.MINECRAFT_18_AMPLIFIED
);
},
true
);
BCL_WORLD_17 = WorldPresets.register(
BCLib.makeID("legacy_17"),

View file

@ -64,6 +64,7 @@
"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 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.void_biome_size": "Kleine Inseln",
"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_vertical_biome_size": "Biome Height",
"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.void_biome_size": "Small Island 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/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/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
accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map;