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) {
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
实现
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
NbtIo.writeCompressed()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
NbtUtils.snbtToStructure()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.backgroundExecutor(), Util.sequenceFailFast()
- 引用位置: