package net.minecraft.data.info; import com.google.gson.JsonElement; import com.mojang.logging.LogUtils; import com.mojang.serialization.Codec; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.Encoder; import com.mojang.serialization.JsonOps; import com.mojang.serialization.MapCodec; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; import net.minecraft.data.PackOutput.Target; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.MultiNoiseBiomeSourceParameterList; import net.minecraft.world.level.biome.Climate.ParameterList; import org.slf4j.Logger; public class BiomeParametersDumpReport implements DataProvider { private static final Logger LOGGER = LogUtils.getLogger(); private final Path topPath; private final CompletableFuture registries; private static final MapCodec> ENTRY_CODEC = ResourceKey.codec(Registries.BIOME).fieldOf("biome"); private static final Codec>> CODEC = ParameterList.codec(ENTRY_CODEC).fieldOf("biomes").codec(); public BiomeParametersDumpReport(PackOutput output, CompletableFuture registries) { this.topPath = output.getOutputFolder(Target.REPORTS).resolve("biome_parameters"); this.registries = registries; } @Override public CompletableFuture run(CachedOutput output) { return this.registries .thenCompose( provider -> { DynamicOps dynamicOps = provider.createSerializationContext(JsonOps.INSTANCE); List> list = new ArrayList(); MultiNoiseBiomeSourceParameterList.knownPresets() .forEach((preset, parameterList) -> list.add(dumpValue(this.createPath(preset.id()), output, dynamicOps, CODEC, parameterList))); return CompletableFuture.allOf((CompletableFuture[])list.toArray(CompletableFuture[]::new)); } ); } private static CompletableFuture dumpValue(Path path, CachedOutput output, DynamicOps ops, Encoder encoder, E value) { Optional optional = encoder.encodeStart(ops, value).resultOrPartial(string -> LOGGER.error("Couldn't serialize element {}: {}", path, string)); return optional.isPresent() ? DataProvider.saveStable(output, (JsonElement)optional.get(), path) : CompletableFuture.completedFuture(null); } private Path createPath(ResourceLocation location) { return this.topPath.resolve(location.getNamespace()).resolve(location.getPath() + ".json"); } @Override public final String getName() { return "Biome Parameters"; } }