package net.minecraft.server.packs; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.List; import java.util.regex.Pattern; import net.minecraft.server.packs.metadata.MetadataSectionType; import net.minecraft.util.InclusiveRange; public record OverlayMetadataSection(List overlays) { private static final Pattern DIR_VALIDATOR = Pattern.compile("[-_a-zA-Z0-9.]+"); private static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group(OverlayMetadataSection.OverlayEntry.CODEC.listOf().fieldOf("entries").forGetter(OverlayMetadataSection::overlays)) .apply(instance, OverlayMetadataSection::new) ); public static final MetadataSectionType TYPE = new MetadataSectionType<>("overlays", CODEC); private static DataResult validateOverlayDir(String directoryName) { return !DIR_VALIDATOR.matcher(directoryName).matches() ? DataResult.error(() -> directoryName + " is not accepted directory name") : DataResult.success(directoryName); } public List overlaysForVersion(int version) { return this.overlays.stream().filter(overlayEntry -> overlayEntry.isApplicable(version)).map(OverlayMetadataSection.OverlayEntry::overlay).toList(); } public record OverlayEntry(InclusiveRange format, String overlay) { static final Codec CODEC = RecordCodecBuilder.create( instance -> instance.group( InclusiveRange.codec(Codec.INT).fieldOf("formats").forGetter(OverlayMetadataSection.OverlayEntry::format), Codec.STRING.validate(OverlayMetadataSection::validateOverlayDir).fieldOf("directory").forGetter(OverlayMetadataSection.OverlayEntry::overlay) ) .apply(instance, OverlayMetadataSection.OverlayEntry::new) ); public boolean isApplicable(int version) { return this.format.isValueInRange(version); } } }