OverlayMetadataSection.java

net.minecraft.server.packs.OverlayMetadataSection

信息

  • 全限定名:net.minecraft.server.packs.OverlayMetadataSection
  • 类型:public record
  • 包:net.minecraft.server.packs
  • 源码路径:src/main/java/net/minecraft/server/packs/OverlayMetadataSection.java
  • 起始行号:L13
  • 职责:

    TODO

字段/常量

  • DIR_VALIDATOR

    • 类型: Pattern
    • 修饰符: private static final
    • 源码定位: L14
    • 说明:

      TODO

  • CLIENT_TYPE

    • 类型: MetadataSectionType<OverlayMetadataSection>
    • 修饰符: public static final
    • 源码定位: L15
    • 说明:

      TODO

  • SERVER_TYPE

    • 类型: MetadataSectionType<OverlayMetadataSection>
    • 修饰符: public static final
    • 源码定位: L18
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.server.packs.OverlayMetadataSection.OverlayEntry

    • 类型: record
    • 修饰符: public
    • 源码定位: L43
    • 说明:

      TODO

  • net.minecraft.server.packs.OverlayMetadataSection.OverlayEntry.IntermediateEntry

    • 类型: record
    • 修饰符: private
    • 源码定位: L70
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

private static DataResult<String> validateOverlayDir(String path) @ L20

  • 方法名:validateOverlayDir
  • 源码定位:L20
  • 返回类型:DataResult
  • 修饰符:private static

参数:

  • path: String

说明:

TODO

public static Codec<OverlayMetadataSection> codecForPackType(PackType packType) @ L24

  • 方法名:codecForPackType
  • 源码定位:L24
  • 返回类型:Codec
  • 修饰符:public static

参数:

  • packType: PackType

说明:

TODO

public static MetadataSectionType<OverlayMetadataSection> forPackType(PackType packType) @ L32

  • 方法名:forPackType
  • 源码定位:L32
  • 返回类型:MetadataSectionType
  • 修饰符:public static

参数:

  • packType: PackType

说明:

TODO

public List<String> overlaysForVersion(PackFormat version) @ L39

  • 方法名:overlaysForVersion
  • 源码定位:L39
  • 返回类型:List
  • 修饰符:public

参数:

  • version: PackFormat

说明:

TODO

代码

public record OverlayMetadataSection(List<OverlayMetadataSection.OverlayEntry> overlays) {
    private static final Pattern DIR_VALIDATOR = Pattern.compile("[-_a-zA-Z0-9.]+");
    public static final MetadataSectionType<OverlayMetadataSection> CLIENT_TYPE = new MetadataSectionType<>(
        "overlays", codecForPackType(PackType.CLIENT_RESOURCES)
    );
    public static final MetadataSectionType<OverlayMetadataSection> SERVER_TYPE = new MetadataSectionType<>("overlays", codecForPackType(PackType.SERVER_DATA));
 
    private static DataResult<String> validateOverlayDir(String path) {
        return !DIR_VALIDATOR.matcher(path).matches() ? DataResult.error(() -> path + " is not accepted directory name") : DataResult.success(path);
    }
 
    @VisibleForTesting
    public static Codec<OverlayMetadataSection> codecForPackType(PackType packType) {
        return RecordCodecBuilder.create(
            i -> i.group(OverlayMetadataSection.OverlayEntry.listCodecForPackType(packType).fieldOf("entries").forGetter(OverlayMetadataSection::overlays))
                .apply(i, OverlayMetadataSection::new)
        );
    }
 
    public static MetadataSectionType<OverlayMetadataSection> forPackType(PackType packType) {
        return switch (packType) {
            case CLIENT_RESOURCES -> CLIENT_TYPE;
            case SERVER_DATA -> SERVER_TYPE;
        };
    }
 
    public List<String> overlaysForVersion(PackFormat version) {
        return this.overlays.stream().filter(entry -> entry.isApplicable(version)).map(OverlayMetadataSection.OverlayEntry::overlay).toList();
    }
 
    public record OverlayEntry(InclusiveRange<PackFormat> format, String overlay) {
        private static Codec<List<OverlayMetadataSection.OverlayEntry>> listCodecForPackType(PackType packType) {
            int lastPreMinorVersion = PackFormat.lastPreMinorVersion(packType);
            return OverlayMetadataSection.OverlayEntry.IntermediateEntry.CODEC
                .listOf()
                .flatXmap(
                    list -> PackFormat.validateHolderList(
                        (List<OverlayMetadataSection.OverlayEntry.IntermediateEntry>)list,
                        lastPreMinorVersion,
                        (entry, formats) -> new OverlayMetadataSection.OverlayEntry(formats, entry.overlay())
                    ),
                    list -> DataResult.success(
                        list.stream()
                            .map(
                                entry -> new OverlayMetadataSection.OverlayEntry.IntermediateEntry(
                                    PackFormat.IntermediaryFormat.fromRange(entry.format(), lastPreMinorVersion), entry.overlay()
                                )
                            )
                            .toList()
                    )
                );
        }
 
        public boolean isApplicable(PackFormat formatToTest) {
            return this.format.isValueInRange(formatToTest);
        }
 
        private record IntermediateEntry(PackFormat.IntermediaryFormat format, String overlay) implements PackFormat.IntermediaryFormatHolder {
            private static final Codec<OverlayMetadataSection.OverlayEntry.IntermediateEntry> CODEC = RecordCodecBuilder.create(
                i -> i.group(
                        PackFormat.IntermediaryFormat.OVERLAY_CODEC.forGetter(OverlayMetadataSection.OverlayEntry.IntermediateEntry::format),
                        Codec.STRING
                            .validate(OverlayMetadataSection::validateOverlayDir)
                            .fieldOf("directory")
                            .forGetter(OverlayMetadataSection.OverlayEntry.IntermediateEntry::overlay)
                    )
                    .apply(i, OverlayMetadataSection.OverlayEntry.IntermediateEntry::new)
            );
 
            @Override
            public String toString() {
                return this.overlay;
            }
        }
    }
}

引用的其他类

  • PackType

    • 引用位置: 参数
  • MetadataSectionType

    • 引用位置: 字段/返回值
  • PackFormat

    • 引用位置: 参数/方法调用
    • 关联成员: PackFormat.IntermediaryFormat.fromRange(), PackFormat.lastPreMinorVersion(), PackFormat.validateHolderList()
  • TropicalFish

    • 引用位置: 字段/方法调用
    • 关联成员: Pattern.compile()