原文:MinecraftForge/Documentation · 目标版本:Forge 1.20.1
存档数据(Saved Data)¶
存档数据(Saved Data,简称 SD)系统是关卡能力(level capability)的一种替代方案,它可以按关卡附加数据。
声明(Declaration)¶
每个 SD 实现都必须继承(subtype)SavedData 类。有两个需要注意的重要方法:
save:允许实现将 NBT 数据写入关卡。setDirty:在修改数据后必须调用的方法,用于通知游戏有需要写入的更改。如果不调用,#save将不会被调用,已有数据会继续保留。
附加到关卡(Attaching to a Level)¶
任何 SavedData 都会被动态加载和/或附加到关卡上。因此,如果从未在某个关卡上创建过它,它就不会存在。
SavedData 通过 DimensionDataStorage 创建和加载,可以通过 ServerChunkCache#getDataStorage 或 ServerLevel#getDataStorage 访问它。在那里,你可以通过调用 DimensionDataStorage#computeIfAbsent 获取或创建你的 SD 实例。该方法会尝试获取当前已存在的 SD 实例,若不存在则创建一个新的并加载所有可用数据。
DimensionDataStorage#computeIfAbsent 接收三个参数:一个将 NBT 数据加载到 SD 中并返回的函数、一个用于构造新 SD 实例的供给器(supplier),以及该关卡 data 文件夹中存储的 .dat 文件名。
例如,如果一个 SD 在下界(Nether)中名为 "example",那么将在 ./<level_folder>/DIM-1/data/example.dat 处创建文件,实现方式如下:
// 在某个类中
public ExampleSavedData create() {
return new ExampleSavedData();
}
public ExampleSavedData load(CompoundTag tag) {
ExampleSavedData data = this.create();
// 加载存档数据
return data;
}
// 在类中的某个方法内
netherDataStorage.computeIfAbsent(this::load, this::create, "example");
要跨关卡持久化 SD,应将 SD 附加到主世界(Overworld),可以通过 MinecraftServer#overworld 获取。主世界是唯一永远不会被完全卸载的维度,因此非常适合在上面存储跨关卡的数据。
待复核清单¶
- 按术语表校准:1.20.1 的 Saved Data 体系为
SavedData+DimensionDataStorage#computeIfAbsent(net.minecraft.world.level.storage),与原文一致,无需改动。 - 原文未提及
SavedData构造函数的#setDirty触发机制细节,按原文直译,未额外补充。 - 「关卡(Level)」「关卡能力(level capability)」沿用 05-menus.md 的「关卡」译法,若主会话想统一为「世界/维度」需全局替换。