package net.minecraft.world.level.biome; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.registries.Registries; import net.minecraft.resources.RegistryFileCodec; import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; public class MultiNoiseBiomeSourceParameterList { public static final Codec DIRECT_CODEC = RecordCodecBuilder.create( p_275469_ -> p_275469_.group( MultiNoiseBiomeSourceParameterList.Preset.CODEC.fieldOf("preset").forGetter(p_275196_ -> p_275196_.preset), RegistryOps.retrieveGetter(Registries.BIOME) ) .apply(p_275469_, MultiNoiseBiomeSourceParameterList::new) ); public static final Codec> CODEC = RegistryFileCodec.create(Registries.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST, DIRECT_CODEC); private final MultiNoiseBiomeSourceParameterList.Preset preset; private final Climate.ParameterList> parameters; public MultiNoiseBiomeSourceParameterList(MultiNoiseBiomeSourceParameterList.Preset p_275275_, HolderGetter p_275192_) { this.preset = p_275275_; this.parameters = p_275275_.provider.apply(p_275192_::getOrThrow); } public Climate.ParameterList> parameters() { return this.parameters; } public static Map>> knownPresets() { return MultiNoiseBiomeSourceParameterList.Preset.BY_NAME .values() .stream() .collect( Collectors.toMap( p_275210_ -> (MultiNoiseBiomeSourceParameterList.Preset)p_275210_, p_275480_ -> p_275480_.provider().apply(p_275406_ -> p_275406_) ) ); } public record Preset(ResourceLocation id, MultiNoiseBiomeSourceParameterList.Preset.SourceProvider provider) { public static final MultiNoiseBiomeSourceParameterList.Preset NETHER = new MultiNoiseBiomeSourceParameterList.Preset( ResourceLocation.withDefaultNamespace("nether"), new MultiNoiseBiomeSourceParameterList.Preset.SourceProvider() { @Override public Climate.ParameterList apply(Function, T> p_275356_) { return new Climate.ParameterList<>( List.of( Pair.of(Climate.parameters(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), p_275356_.apply(Biomes.NETHER_WASTES)), Pair.of(Climate.parameters(0.0F, -0.5F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), p_275356_.apply(Biomes.SOUL_SAND_VALLEY)), Pair.of(Climate.parameters(0.4F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F), p_275356_.apply(Biomes.CRIMSON_FOREST)), Pair.of(Climate.parameters(0.0F, 0.5F, 0.0F, 0.0F, 0.0F, 0.0F, 0.375F), p_275356_.apply(Biomes.WARPED_FOREST)), Pair.of(Climate.parameters(-0.5F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.175F), p_275356_.apply(Biomes.BASALT_DELTAS)) ) ); } } ); public static final MultiNoiseBiomeSourceParameterList.Preset OVERWORLD = new MultiNoiseBiomeSourceParameterList.Preset( ResourceLocation.withDefaultNamespace("overworld"), new MultiNoiseBiomeSourceParameterList.Preset.SourceProvider() { @Override public Climate.ParameterList apply(Function, T> p_275530_) { return MultiNoiseBiomeSourceParameterList.Preset.generateOverworldBiomes(p_275530_); } } ); static final Map BY_NAME = Stream.of(NETHER, OVERWORLD) .collect(Collectors.toMap(MultiNoiseBiomeSourceParameterList.Preset::id, p_275365_ -> (MultiNoiseBiomeSourceParameterList.Preset)p_275365_)); public static final Codec CODEC = ResourceLocation.CODEC .flatXmap( p_275567_ -> Optional.ofNullable(BY_NAME.get(p_275567_)) .map(DataResult::success) .orElseGet(() -> DataResult.error(() -> "Unknown preset: " + p_275567_)), p_275325_ -> DataResult.success(p_275325_.id) ); static Climate.ParameterList generateOverworldBiomes(Function, T> p_277826_) { Builder> builder = ImmutableList.builder(); new OverworldBiomeBuilder().addBiomes(p_275579_ -> builder.add(p_275579_.mapSecond(p_277826_))); return new Climate.ParameterList<>(builder.build()); } public Stream> usedBiomes() { return this.provider.apply(p_275429_ -> p_275429_).values().stream().map(Pair::getSecond).distinct(); } @FunctionalInterface interface SourceProvider { Climate.ParameterList apply(Function, T> p_275485_); } } }