package net.minecraft.world.level.levelgen.presets; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.Lifecycle; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.Map; import java.util.Optional; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; import net.minecraft.resources.RegistryFileCodec; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.WorldDimensions; public class WorldPreset { public static final Codec DIRECT_CODEC = RecordCodecBuilder.create( instance -> instance.group( Codec.unboundedMap(ResourceKey.codec(Registries.LEVEL_STEM), LevelStem.CODEC).fieldOf("dimensions").forGetter(worldPreset -> worldPreset.dimensions) ) .apply(instance, WorldPreset::new) ) .validate(WorldPreset::requireOverworld); public static final Codec> CODEC = RegistryFileCodec.create(Registries.WORLD_PRESET, DIRECT_CODEC); private final Map, LevelStem> dimensions; public WorldPreset(Map, LevelStem> dimensions) { this.dimensions = dimensions; } private ImmutableMap, LevelStem> dimensionsInOrder() { Builder, LevelStem> builder = ImmutableMap.builder(); WorldDimensions.keysInOrder(this.dimensions.keySet().stream()).forEach(resourceKey -> { LevelStem levelStem = (LevelStem)this.dimensions.get(resourceKey); if (levelStem != null) { builder.put(resourceKey, levelStem); } }); return builder.build(); } public WorldDimensions createWorldDimensions() { return new WorldDimensions(this.dimensionsInOrder()); } public Optional overworld() { return Optional.ofNullable((LevelStem)this.dimensions.get(LevelStem.OVERWORLD)); } private static DataResult requireOverworld(WorldPreset preset) { return preset.overworld().isEmpty() ? DataResult.error(() -> "Missing overworld dimension") : DataResult.success(preset, Lifecycle.stable()); } }