SnbtToNbt.java

net.minecraft.data.structures.SnbtToNbt

信息

  • 全限定名:net.minecraft.data.structures.SnbtToNbt
  • 类型:public class
  • 包:net.minecraft.data.structures
  • 源码路径:src/main/java/net/minecraft/data/structures/SnbtToNbt.java
  • 起始行号:L26
  • 实现:DataProvider
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • output

    • 类型: PackOutput
    • 修饰符: private final
    • 源码定位: L28
    • 说明:

      TODO

  • inputFolders

    • 类型: Iterable<Path>
    • 修饰符: private final
    • 源码定位: L29
    • 说明:

      TODO

  • filters

    • 类型: List<SnbtToNbt.Filter>
    • 修饰符: private final
    • 源码定位: L30
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.data.structures.SnbtToNbt.Filter

    • 类型: interface
    • 修饰符: public
    • 源码定位: L123
    • 说明:

      TODO

  • net.minecraft.data.structures.SnbtToNbt.StructureConversionException

    • 类型: class
    • 修饰符: private static
    • 源码定位: L127
    • 说明:

      TODO

  • net.minecraft.data.structures.SnbtToNbt.TaskResult

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

      TODO

构造器

public SnbtToNbt(PackOutput output, Path inputFolder) @ L32

  • 构造器名:SnbtToNbt
  • 源码定位:L32
  • 修饰符:public

参数:

  • output: PackOutput
  • inputFolder: Path

说明:

TODO

public SnbtToNbt(PackOutput output, Iterable<Path> inputFolders) @ L36

  • 构造器名:SnbtToNbt
  • 源码定位:L36
  • 修饰符:public

参数:

  • output: PackOutput
  • inputFolders: Iterable

说明:

TODO

方法

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

public SnbtToNbt addFilter(SnbtToNbt.Filter filter) @ L41

  • 方法名:addFilter
  • 源码定位:L41
  • 返回类型:SnbtToNbt
  • 修饰符:public

参数:

  • filter: SnbtToNbt.Filter

说明:

TODO

private CompoundTag applyFilters(String name, CompoundTag input) @ L46

  • 方法名:applyFilters
  • 源码定位:L46
  • 返回类型:CompoundTag
  • 修饰符:private

参数:

  • name: String
  • input: CompoundTag

说明:

TODO

public CompletableFuture<?> run(CachedOutput cache) @ L56

  • 方法名:run
  • 源码定位:L56
  • 返回类型:CompletableFuture<?>
  • 修饰符:public

参数:

  • cache: CachedOutput

说明:

TODO

public final String getName() @ L82

  • 方法名:getName
  • 源码定位:L82
  • 返回类型:String
  • 修饰符:public final

参数:

说明:

TODO

private String getName(Path root, Path path) @ L87

  • 方法名:getName
  • 源码定位:L87
  • 返回类型:String
  • 修饰符:private

参数:

  • root: Path
  • path: Path

说明:

TODO

private SnbtToNbt.TaskResult readStructure(Path path, String name) @ L92

  • 方法名:readStructure
  • 源码定位:L92
  • 返回类型:SnbtToNbt.TaskResult
  • 修饰符:private

参数:

  • path: Path
  • name: String

说明:

TODO

private void storeStructureIfChanged(CachedOutput cache, SnbtToNbt.TaskResult task, Path output) @ L112

  • 方法名:storeStructureIfChanged
  • 源码定位:L112
  • 返回类型:void
  • 修饰符:private

参数:

  • cache: CachedOutput
  • task: SnbtToNbt.TaskResult
  • output: Path

说明:

TODO

代码

public class SnbtToNbt implements DataProvider {
    private static final Logger LOGGER = LogUtils.getLogger();
    private final PackOutput output;
    private final Iterable<Path> inputFolders;
    private final List<SnbtToNbt.Filter> filters = Lists.newArrayList();
 
    public SnbtToNbt(PackOutput output, Path inputFolder) {
        this(output, List.of(inputFolder));
    }
 
    public SnbtToNbt(PackOutput output, Iterable<Path> inputFolders) {
        this.output = output;
        this.inputFolders = inputFolders;
    }
 
    public SnbtToNbt addFilter(SnbtToNbt.Filter filter) {
        this.filters.add(filter);
        return this;
    }
 
    private CompoundTag applyFilters(String name, CompoundTag input) {
        CompoundTag result = input;
 
        for (SnbtToNbt.Filter filter : this.filters) {
            result = filter.apply(name, result);
        }
 
        return result;
    }
 
    @Override
    public CompletableFuture<?> run(CachedOutput cache) {
        Path output = this.output.getOutputFolder();
        List<CompletableFuture<?>> tasks = Lists.newArrayList();
 
        for (Path input : this.inputFolders) {
            tasks.add(CompletableFuture.<CompletableFuture>supplyAsync(() -> {
                try {
                    CompletableFuture t$;
                    try (Stream<Path> files = Files.walk(input)) {
                        t$ = CompletableFuture.allOf(files.filter(path -> path.toString().endsWith(".snbt")).map(path -> CompletableFuture.runAsync(() -> {
                            SnbtToNbt.TaskResult structure = this.readStructure(path, this.getName(input, path));
                            this.storeStructureIfChanged(cache, structure, output);
                        }, Util.backgroundExecutor().forName("SnbtToNbt"))).toArray(CompletableFuture[]::new));
                    }
 
                    return t$;
                } catch (Exception var9) {
                    throw new RuntimeException("Failed to read structure input directory, aborting", var9);
                }
            }, Util.backgroundExecutor().forName("SnbtToNbt")).thenCompose(v -> v));
        }
 
        return Util.sequenceFailFast(tasks);
    }
 
    @Override
    public final String getName() {
        return "SNBT -> NBT";
    }
 
    private String getName(Path root, Path path) {
        String name = root.relativize(path).toString().replaceAll("\\\\", "/");
        return name.substring(0, name.length() - ".snbt".length());
    }
 
    private SnbtToNbt.TaskResult readStructure(Path path, String name) {
        try {
            SnbtToNbt.TaskResult var10;
            try (BufferedReader reader = Files.newBufferedReader(path)) {
                String input = IOUtils.toString(reader);
                CompoundTag updated = this.applyFilters(name, NbtUtils.snbtToStructure(input));
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                HashingOutputStream hos = new HashingOutputStream(Hashing.sha1(), bos);
                NbtIo.writeCompressed(updated, hos);
                byte[] bytes = bos.toByteArray();
                HashCode hash = hos.hash();
                var10 = new SnbtToNbt.TaskResult(name, bytes, hash);
            }
 
            return var10;
        } catch (Throwable var13) {
            throw new SnbtToNbt.StructureConversionException(path, var13);
        }
    }
 
    private void storeStructureIfChanged(CachedOutput cache, SnbtToNbt.TaskResult task, Path output) {
        Path destination = output.resolve(task.name + ".nbt");
 
        try {
            cache.writeIfNeeded(destination, task.payload, task.hash);
        } catch (IOException var6) {
            LOGGER.error("Couldn't write structure {} at {}", task.name, destination, var6);
        }
    }
 
    @FunctionalInterface
    public interface Filter {
        CompoundTag apply(final String name, final CompoundTag input);
    }
 
    private static class StructureConversionException extends RuntimeException {
        public StructureConversionException(Path path, Throwable t) {
            super(path.toAbsolutePath().toString(), t);
        }
    }
 
    private record TaskResult(String name, byte[] payload, HashCode hash) {
    }
}

引用的其他类

  • CachedOutput

    • 引用位置: 参数
  • DataProvider

    • 引用位置: 实现
  • PackOutput

    • 引用位置: 参数/字段
  • CompoundTag

    • 引用位置: 参数/返回值
  • NbtIo

    • 引用位置: 方法调用
    • 关联成员: NbtIo.writeCompressed()
  • NbtUtils

    • 引用位置: 方法调用
    • 关联成员: NbtUtils.snbtToStructure()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.backgroundExecutor(), Util.sequenceFailFast()