• Forge论坛

导航页

  • 主页
  • 向文档做出贡献
  • 入门
    • 概述
    • 模组文件
    • 规划你的模组结构
    • 版本号
  • 核心概念
    • 注册表
    • 端位(Sides)
    • 事件
    • 模组生命周期
    • 资源
    • 国际化与本地化
  • 方块
    • 概述
    • 方块状态
  • 物品
    • 概述
    • BlockEntityWithoutLevelRenderer
  • 网络
    • 概述
    • SimpleImpl
    • 实体的同步
  • 方块实体
    • 概述
    • BlockEntityRenderer
  • 游戏特效
    • 粒子效果
    • 音效
  • 数据储存
    • Capabilities
    • Saved Data
      • 声明
      • 附加到存档
    • 编解码器(Codecs)
  • 图形用户界面
    • 菜单(Menus)
    • 屏幕(Screens)
  • 渲染
    • 模型扩展
      • 概述
      • 根变换
      • 渲染类型
      • 部分可见度
      • 面数据
    • 模型加载器
      • 概述
      • 烘焙模型
      • 变换
      • 物品重载
  • 资源
    • 客户端资源(Assets)
      • 概述
      • 模型
        • 概述
        • 纹理色调
        • 物品属性
    • 服务端数据(Data)
      • 概述
      • 配方
        • 概述
        • 自定义配方
        • 原料
        • 非数据包配方
      • 战利品表
      • 全局战利品修改器
      • 标签
      • 进度
      • 条件性加载数据
  • 数据生成
    • 概述
    • 客户端资源(Assets)
      • 模型提供者
      • 语言提供者
      • 音效提供者
    • 服务端数据(Data)
      • 配方提供者
      • 战利品表提供者
      • 标签提供者
      • 进度提供者
      • 全局战利品修改器提供者
      • 数据包注册表对象提供者
  • 杂项功能
    • 配置
    • 键盘布局
    • 游戏测试
    • Forge更新检查器
    • 调试分析器
  • 进阶主题
    • 访问转换器
  • 向Forge做出贡献
    • 概述
    • Pull Request准则
  • 旧版本
    • 概述
    • 移植到当前版本

Saved Data

Saved Data(SD)系统是存档Capability功能的替代方案,可以按存档附加数据。

声明

Each SD implementation must subtype the SavedData class. There are two important methods to be aware of: 每个SD实现都必须继承SavedData类。有两种重要方法需要注意:

  • save:允许实现将NBT数据写入该存档。
  • setDirty:在更改数据后必须调用的方法,以通知游戏有需要写入的更改。如果未调用,将不会调用#save,并且现有数据将持久存在。

附加到存档

任何SavedData都是动态加载和/或附加到一个存档的。因此,如果一个SavedData从来没有在一个存档上创建过,那么它就不存在了。

SavedData是从DimensionDataStorage创建和加载的,借助ServerChunkCache#getDataStorage或ServerLevel#getDataStorage都可以访问该存储。从那里,您可以通过调用DimensionDataStorage#computeIfAbsent来获取或创建SD的实例。这将尝试获取SD的当前实例(如果存在),或者创建一个新实例并加载所有可用数据。

DimensionDataStorage#computeIfAbsent接受三个参数:一个将NBT数据加载到SD并返回它的函数,一个构造SD新实例的Supplier,以及存储在所实现的存档的data文件夹中的.dat文件的名称。

例如,如果一个SD在下界中被命名为”example”,那么一个文件将在./<level_folder>/DIM-1/data/example.dat创建并且将这样实现:

// 在某个类中
public ExampleSavedData create() {
  return new ExampleSavedData();
}

public ExampleSavedData load(CompoundTag tag) {
  ExampleSavedData data = this.create();
  // 加载saved data
  return data;
}

// 在该类的某个方法中
netherDataStorage.computeIfAbsent(this::load, this::create, "example");

要在多个存档之间保持SD,应将SD连接到主世界,其可以从MinecraftServer#overworld获得。主世界是唯一一个从未完全卸载的维度,因此非常适合在其上存储多存档数据。

Built with MkDocs using a custom theme. Hosted by Read the Docs.
Enable Dark Theme