minecraft-src/net/minecraft/world/level/levelgen/presets/WorldPreset.java
2025-07-04 01:41:11 +03:00

55 lines
2.2 KiB
Java

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<WorldPreset> DIRECT_CODEC = RecordCodecBuilder.<WorldPreset>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<Holder<WorldPreset>> CODEC = RegistryFileCodec.create(Registries.WORLD_PRESET, DIRECT_CODEC);
private final Map<ResourceKey<LevelStem>, LevelStem> dimensions;
public WorldPreset(Map<ResourceKey<LevelStem>, LevelStem> dimensions) {
this.dimensions = dimensions;
}
private ImmutableMap<ResourceKey<LevelStem>, LevelStem> dimensionsInOrder() {
Builder<ResourceKey<LevelStem>, 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<LevelStem> overworld() {
return Optional.ofNullable((LevelStem)this.dimensions.get(LevelStem.OVERWORLD));
}
private static DataResult<WorldPreset> requireOverworld(WorldPreset preset) {
return preset.overworld().isEmpty() ? DataResult.error(() -> "Missing overworld dimension") : DataResult.success(preset, Lifecycle.stable());
}
}