Protobuf加载器

Protobuf加载器

运行时加载protobuf(.data)文件以避免冲突

工具

运行时加载 protobuf(.data)文件。
所有模组开源在 Github。
特别感谢 @chenstack 提供的 CSharpLoader。

以下内容主要面向开发者。
如果您是用户,其实不需要了解这个模组的细节。
只需要在其他作者说明需要本模组时,按照他的安装说明操作即可。
并记住 Ctrl+F7 是重载快捷键。

如何加载 .data 文件:

剧透:显示
  1. 安装 CSharpLoader 和本模组

  2. 使用 DataEditor 编辑任意有效 .data 文件
    重命名为 [表名]_[注释].data 格式
    例如:
    EquipAttrDesc_青田葫芦改为上限10口.data
    FUStSuitDesc_lalalalal_abcd_imgood.data
    FUStBuffDesc_MyMod.data(横线后的部分非必需。如修改“FUStBuffDesc-Item.data”可命名为“FUStBuffDesc_MyName.data”)

    错误示例:
    ABC_青田葫芦改为上限10口.data // 错误。必须以原表名开头(如 EquipAttrDesc)
    EquipAttrDesc_青田葫芦改为上限10口aabc // 错误。必须以 .data 结尾
    FUStSuitDesc_lalalalal_abcd_imgood.bak.data // 错误。“.bak.data”会被自动忽略

2.5. (可选)若将文件命名为 [表名]_[注释].insert.data,所有记录将插入首个空行并可能获得新 ID。

  1. 将数据文件放入文件夹后,复制到 BlackMythWukong\b1\Binaries\Win64\CSharpLoader\Mods\ProtobufLoader\[任意文件夹]
    例如:

    -- b1\Binaries\Win64\CSharpLoader\Mods\ProtobufLoader
    -- ProtobufLoader.dll
    -- 300_青田葫芦改为10口上限
       -- EquipAttrDesc_青田葫芦改为上限10口.data
    -- 200_锦鳞套加2条套装效果_日金乌套改为加大量攻防
       -- EquipAttrDesc_锦鳞套加2条效果_日金乌套改为加1800攻击2_修改属性.data
       -- FUStSuitDesc_锦鳞套加2条套装效果日金乌套装改为加1800攻击1_修改套装.data
    
  2. 运行游戏
    本模组会自动加载正确目录下的 .data 文件。

为何需要这个?

本模组支持逐条加载记录而非覆盖整张表。
若模组制作者发布 .data 格式而非 .pak 格式的模组,将极大降低冲突概率。
(本模组不会魔法消除已有冲突!即使安装后,原有 .pak 模组仍会如常冲突)。
对开发者而言,可实时修改 .data 文件并重载,节省打包、调试或为用户合并 pak 的时间。

注意: 不是说你装了这个 mod,原本冲突的 mod 就突然间不冲突了!!
意思是以后修改数据类的 mod 可以直接以 data 文件的形式发布并以该 mod 加载,就不会像以前 pak 文件那样极易冲突了。
还省了把 data 文件打包成 pak 的工夫。

注意事项:

0. 重载与重置

  • Ctrl+F7 重载数据文件

    • 内存数据将被重置(自 v1.1 起)
    • 但不可克隆的数据类型不会被重置
    • 重载时将同时修改 protobuf 并刷新 GameDB 缓存
  • Ctrl+F8 重置

    • 加载数据文件时,本模组会存储修改前的值
    • 重置时将写回存储的记录
    • 若其他模组在加载与重置间修改了相同记录,这些变更将丢失
    • 按 Ctrl+F7 重载时会自动先执行重置
  • Ctrl+F9 超级重置

    • 从虚拟文件完全重载所有内容
    • “重置”仅恢复被修改数据,“超级重置”会丢弃所有内容并从 .pak 文件重新加载(如同游戏启动时)
    • 若无 bug/加载失败/其他模组修改 protobuf,两种重置效果应完全相同

1. 加载顺序:

  • 按字典序加载子文件夹

    • 例如“100_abc”会先于“200_lalla”加载
    • 不递归搜索子目录。如“CSharpLoader/Mods/ProtobufLoader/BestSuit/MoreSuitSubDir/”下的文件不会被加载
    • 强烈建议使用 [数字]_[名称] 格式命名文件夹以便控制加载顺序
  • 同文件夹内文件:

    • 先按字典序加载所有“.data”(不含“.insert.data”和“.bak.data”)
    • 再按字典序加载所有“.insert.data”

2. 加载规则

  • 加载“.data”记录时:

    • 若内存表中不存在则添加
    • 若已存在则完全替换旧记录
    • 意味着可对同一表使用多个数据文件,只要不修改相同记录就不会冲突
    • 若修改相同记录,后加载者生效
  • 加载“.insert.data”记录时:

    • 若内存表中不存在则添加
    • 若已存在则递增 ID 直到获得新 ID,修改后插入新记录
  • 本模组会在本地化初始化后加载文件

    • 当 CSharpLoader 加载本模组时,若 GameInstance 和 GSLocalization 均已初始化则立即加载
    • 否则在 GSLocalization 初始化完成后加载

3. 本模组修改什么?

游戏数据通常存在于:
A) .pak 虚拟文件
B) 内存中的 GSProtobufRuntimeAPI/BG_ProtobufDataAPI 缓存
C) 内存中的 GameDBRuntime/BGW_GameDB 缓存
D) 内存中的其他实例

游戏启动时从 A 读取到 B,再构建部分数据到 C。
游戏过程中,部分实例直接从 B/C 读取,其他实例初始化时从 B/C 构建缓存到 D 后续使用。
传统 .pak 模组实际覆盖 A。
本模组加载时会修改 B 并强制重建 C。

4.2. 配置文件:

ProtobufLoader/Config.json

  • ShutUp:为 true 时减少日志输出。默认 false。如需加载大量数据文件,开启可提升性能。
  • ShuutUp:为 true 时进一步减少日志。默认 false。
  • ShuuutUp:为 true 时仅错误日志。默认 false。
  • EnableChineseConsoleLog:将 CSharpLoader 控制台编码设为 UTF-8 以正确显示中文日志。默认 true(如需显示其他字符可关闭)。

4.3. 重要提示:如需修改表中多条记录

数据文件应仅包含被修改的记录以避免冲突(这正是使用本加载器的意义)。
(若需 DataEditor 添加“删除除此记录外所有内容”功能,可等待 DataEditor 作者更新,或使用我修改的 Data Editor 分支)。

5. 以下表暂不支持

剧透:显示

UISettingControlDesc
ScrollDesc
ActivityTaskDesc
ActivityDesc
CombatSkillDesc
FUStCollectionSpawnInfoDesc

6. 注意同名不同 ID 的物品

例如:

  • 药品可能在物品表中有配方项和药品项同名但 ID 不同
  • 装备可能每个等级在装备表中有多条记录
  • 气势被动效果也可能分多级记录
  • 等等

7. 注意仅在初始化时读取的描述表数据

例如:
TransQiTianDaShengConfigDesc 表用于初始化 BUS_QiTianDaShengComp。
若在游戏启动后重载该表,可能因初始化函数未再次调用而不生效。