Skip to content

新增 cn-exclusive.mod 恢复国服独有内容;头像框全部解锁;测试兼容 2023-02 热更客户端 - #103

Merged
LunarConcerto merged 6 commits into
LunarConcerto:masterfrom
FrostFlops:feat/cn-exclusive-content
Oct 24, 2026
Merged

LunarConcerto merged 6 commits into
LunarConcerto:masterfrom
FrostFlops:feat/cn-exclusive-content

Conversation

@FrostFlops

@FrostFlops FrostFlops commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

问题

国服有几项日服没有的内容,而它们需要的资源其实都在日服 1.4.0 客户端里,只是被配置关掉或者没有入口:

  • 吹雪春节时装「爆竹天女」:config_fashion 2013014 的 is_appear = 0,换装页不显示。
  • 春节风波(国服 2020 年春节活动剧情,节点 50301–50307,其中 50306 是战斗):剧情正文与触发在日服配置里都有,但日服把章节 12000 挪给了自己的活动,没有任何章节引用这 7 个节点。
  • 10 艘舰娘共 90 篇角色剧情(飞龙、苍龙、阿蒂格利埃尔、旧金山、海伦娜、克利夫兰、伏尔塔、阿拉斯加、川内、吹雪):触发与正文在日服配置里,config_building_character_story 没有列出。
  • 宁海、平海中文语音:客户端自带完整的中文语音库 c_cl_ninghai_bank / c_cl_pinghai_bank(38 / 37 条),但 C# 按模型名只加载 c_cl_*_jp_bank。
  • 奥克兰春节时装:日服没有国服的 click_fs02 触摸动作与语音(动作、语音、字幕资源都在)。

复现

日服客户端:吹雪换装页看不到「爆竹天女」;图鉴「回忆」里没有春节剧情;上面 10 艘舰娘在图鉴里没有角色剧情;宁海、平海只有日语语音。

根因

见上:内容都在客户端里,只是配置隐藏(is_appear)、章节 id 被复用、角色剧情表没有收录,或者语音按 _jp 模型名取库。国服 1.5.120 配置里除春节风波外没有别的节日剧情(端午、七夕、中秋、国庆只有签到、礼盒与头像框)。

修法

  • Mods/cn-exclusive.mod(客户端 Lua Mod,不带任何游戏资源)
    • 包装 configManager.GetData / GetDataById,按 expect 字段核对后原地修改日服行(时装、节点名称、誓约文本等),补入新行(章节 12010、90 篇角色剧情);注入的 id 先于 SQLite 查询直接回答。
    • 春节风波作为图鉴回忆章节 12010(memory_id 13);服务端没有登记时客户端不显示这一章。
    • 角色剧情由客户端自己并入 hero memory(服务端不推送:未装 Mod 的客户端收到未知舰娘的 HeroMemory 会让图鉴报错)。
    • 中文语音:登录阶段(SoundHelper.LoadSFX)读取客户端自带的中文语音库,改写库 ID、事件 ID 和 Play 动作里的库 ID,生成 c_cl_*_jp_bank 的中文版本(宿舍、情书两个共享库交换对应事件),打成 Wwise AKPK 文件包写到 Mods/cn-exclusive.mod/cache/ 并用 AkSoundEngine.LoadFilePackage 挂载(Windows 上 AddBasePath 是空实现)。挂载后用探测库自检;只有语音确实生效的舰娘才换国服字幕与誓约文本。
    • 每项都能在 main.lua 顶部的 SETTINGS 关闭;mod.json 的 enabled: false(启动器 Mod 页)关闭整个 Mod,客户端与服务端都跳过。
  • 服务端:新增 MemoryChapterModLoader,读取启用的 Mod 的 memory-chapters.json(规则同 EquipmentModLoader:mod.json 的 enabled 与 targetClients),拒绝与客户端已有章节或关卡冲突的声明,经 ChapterCopyLoader.RegisterModChapters 并入(illustrate.Memory 发送 (12010, 7),50301–50307 作为已通关 PlotCopy,50306 回忆战斗按 copy type 1 走)。没有声明文件时行为不变。
  • tools/export-cn-exclusive.py:从国服 1.5.120 与日服 1.4.0 配置生成 data.lua 与 memory-chapters.json(只含 id 与国服原文的标题、字幕、誓约文本),写出前回读校验,输出确定。
  • Publisher 打包时跳过 Mods/<mod>/cache;.gitignore 忽略它;docs/MOD_DEVELOPMENT.zh-CN.md 新增第 12 章说明做法;Mods/bootstrap.lua 加入口。

验证方式

  • dotnet build .\BlueOath.Local.sln:0 警告 0 错误。
  • dotnet run --project .\src\BlueOath.Tests\BlueOath.Tests.csproj --no-build -- --memory-chapter-mod:4 项全部通过(加载规则、幂等并入、随仓库的 Mod 数据一致、集成测试里登录推送与 50306 回忆战斗)。合入下面两项后,默认用例 79/79 全部通过(打过 2023-02 热更的客户端),--integration 只剩已知基线的 5 项。
  • Lua 离线测试:用游戏自带的 xlua.dll 与游戏原版字节码跑 23 个场景(补丁与 expect 跳过、注入行、与 future-chapter / custom-equipment 的钩子链、回忆章节隐藏、角色剧情合并、语音包构建与缓存、各种失败路径)。
  • 语音包:用游戏自带的 AkSoundEngine.dll 离线挂载,确认 c_cl_ninghai_jp_bank 等从包里读取、其他库仍从磁盘读取。
  • 实机:吹雪换装、奥克兰触摸、图鉴回忆里的春节风波(7/7 与 50306 战斗)、10 艘舰娘的角色剧情、宁海与平海的主界面/战斗/誓约中文语音和字幕都已确认。实机用的是打过 2023-02 热更的日服客户端;没打热更的客户端未实测,Mod 会跳过对不上的部分并写日志(例如宿舍语音库版本不同时该项保持日语)。

国服春节家具套装(b87a2de,依赖 #105)

同一 PR 合入的另外两项

头像框全部解锁(e6e82fb)

  • 问题:离线服务端从不下发 playerheadframe.RefreshPlayerHeadFrame,头像框页里所有头像框(包括默认头像框)都显示未拥有,确认时只提示未拥有,user.SetPlayerHeadFrame 根本不会发出。
  • 修法:启动时加载 config_player_head_frame,登录同步里紧跟时装推送下发全部头像框(与时装全部解锁一致,不写存档;重复字段逐条编码,因为客户端 protobuf.lua 的 packed 解码器注册有误)。user.SetPlayerHeadFrame 只保存配置里存在的 id,其余回 Err=1,两种情况都推 user.UpdateUserInfo。誓约头像框(2)的结婚条件由客户端页面检查。
  • 验证:新增单元测试与集成测试(-- --head-frame),热更前后两种客户端都通过;所有头像框图标在两种客户端里都存在。

测试兼容 2023-02 最终热更客户端;存档编辑中文名修复(3accb3d)

  • 问题:客户端打了日服 2023-02 最终热更后(商店 104→202、道具 +211),real shop stock ×2 与 item catalog Chinese names 失败;另外 tools/export-zh-names.py 只要国服有同 id 就取其官方名,而日服把不少 id 改作他用,存档编辑页出现「島風確定箱 → 鳌盲盒」这类错名。
  • 修法:
    • 商店测试改为与 config_shop.db 的商店 id 逐一比对(且至少 104);红改造商店 1110–1112 按 红改造商店打开时的异常报错 #82 的设计从货架取商品,测试按此断言并核对商品确实在该商店货架上。
    • 测试统一经 TestSupport.FindClientPath() 取客户端(支持 BLUEOATH_CLIENT_PATH)。
    • 中文名只在所在表、图标、盲盒内容与名称中的数字都一致时才用国服名,例外在脚本里逐条列出并注明理由;其余用 tools/zh-names-extra.json 的翻译(538→837 条),item-names-zh.json 按热更客户端重新生成(热更前的客户端是它的子集)。
  • 验证:热更客户端默认用例 75/75(合入本 PR 后 79/79);未热更的 1.4.0 客户端只有已知的 hero advance 失败;--shop-stock、--save-editor 等 13 组按主题的用例在两种客户端上都通过;改动的 167 个名称逐条复核。

未包含

只在国服客户端里的资源(节日头像框、表情、杂志第 6 期、国服版 CG 等)、国服宁海/平海模型、摆件与国服独有的活动系统。这些需要国服客户端文件或额外的服务端系统,不适合放进这个仓库。

https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i

- 吹雪春节时装「爆竹天女」:config_fashion 2013014 在日服被 is_appear=0 隐藏,服务端本来就发放全部时装;
  奥克兰春节时装恢复国服的 click_fs02 触摸动作与语音
- 春节风波(国服 2020 春节活动剧情,节点 50301-50307,剧情正文日服配置里已有)作为图鉴回忆章节 12010;
  服务端新增 MemoryChapterModLoader 读取 Mod 的 memory-chapters.json 登记章节(illustrate.Memory 与 PlotCopy),
  未登记时客户端不显示
- 10 艘舰娘共 90 篇国服独有角色剧情,客户端侧解锁(服务端不推送,避免未装 Mod 的客户端图鉴报错)
- 宁海、平海中文语音:登录阶段用客户端自带的中文语音库改写库 ID、事件 ID 与 Play 动作的库 ID,
  打成 AKPK 文件包写入 Mods/cn-exclusive.mod/cache 并挂载(Windows 上 AddBasePath 是空实现),
  附国服字幕与誓约文本,只在语音确实生效时替换
- tools/export-cn-exclusive.py 从国服 1.5.120 与日服 1.4.0 配置生成 data.lua 与 memory-chapters.json(只含 ID 与文本)
- Publisher 打包时跳过 Mods/<mod>/cache;MOD_DEVELOPMENT 第 12 章说明做法;新增 --memory-chapter-mod 测试

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
打了日服 2023-02 最终热更(商店 104→202、道具 +211 等)的客户端上,3 个测试失败,修复后在热更前后两种客户端上都通过:
- 商店目录测试不再写死 104 个商店,改为与 config_shop.db 的商店 id 逐一比对(且至少 104)
- 红改造商店 1110-1112 按上游 LunarConcerto#82 的设计从 config_shop 货架取商品,测试改为按此断言,并检查商品确实在该商店货架上
- 测试统一经 TestSupport.FindClientPath() 取客户端路径(支持 BLUEOATH_CLIENT_PATH),不再各自写死
- item-names-zh.json 按热更客户端重新生成,覆盖热更新增道具

另修存档编辑页中文名:日服把不少 id 改作他用,脚本原先只要国服有同 id 就取其官方名(如島風確定箱被叫成「鳌盲盒」)。
现在只在所在表、图标、盲盒内容与名称中的数字都一致时才用国服名,例外逐条列在脚本里;其余用 zh-names-extra.json 的翻译(538→837 条)。

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
离线服务端从不下发 playerheadframe.RefreshPlayerHeadFrame,客户端头像框页里所有头像框(包括默认头像框)都显示未拥有,
确认时只提示未拥有(290011),user.SetPlayerHeadFrame 根本不会发出。

- 启动时加载 config_player_head_frame(PlayerHeadFrameLoader,复用已有的 ConfigPlayerHeadFrame),登录同步里紧跟时装推送下发全部头像框
  (TPlayerHeadFrameRet.ownedHeadFrames,逐条编码:客户端 protobuf.lua 的 packed 解码器注册有误),与时装全部解锁一致,不写存档
- user.SetPlayerHeadFrame 只保存配置里存在的头像框,其余回 Err=1,两种情况都推 user.UpdateUserInfo
- 誓约头像框(2)的结婚条件由客户端页面检查,服务端不重复
- 新增单元测试与集成测试(-- --head-frame),protocol-coverage 文档同步

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
@FrostFlops FrostFlops changed the title 新增 cn-exclusive.mod:恢复国服独有内容(吹雪春节装、春节风波、角色剧情、宁海平海中文语音) 新增 cn-exclusive.mod 恢复国服独有内容;头像框全部解锁;测试兼容 2023-02 热更客户端 Oct 24, 2026
国服的春节家具套装(套装 5,家具 250041–250049)在日服客户端里模型齐全:9 件家具与日服装饰道具 36–44 是同一批模型(三个模型路径、类型、
位置都一致)。

- data.lua 插入套装行 5 与 9 行 config_interaction_item_bag(字段与日服行完全一致,show_type 0、reward 150172,名称保留国服中文);
  日服缺的 *_124 图标改用每件家具已有的 picture,封面用灯笼的 picture
- 新增 decorations.json,向服务端声明同样的套装与家具(指挥室装饰支持合入后生效,日志里出现 loaded 9 of 9 decorations and 1 of 1 sets)
- 新开关 SETTINGS.spring_furniture;关闭(或 Mod 未加载行)时 main.lua 从装饰推送里去掉本 Mod 的 id,避免客户端遇到没有配置行的 id 报错
- 生成脚本同时产出 decorations.json 并自检;新增一致性测试(-- --cn-exclusive-mod);README 与 MOD_DEVELOPMENT 12.8 说明

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
@LunarConcerto
LunarConcerto merged commit 499ed6f into LunarConcerto:master Oct 24, 2026
2 checks passed
FrostFlops added a commit to FrostFlops/BlueRebirth that referenced this pull request Oct 24, 2026
- PlayerAccount 末尾并列 Magazine 与 Decor 两个可空字段
- 登录同步:头像框推送之后推装饰推送
- MOD_DEVELOPMENT:装饰一节作为 11.5 放在第 12 章 cn-exclusive 之前,Mods 根目录引用改为 13.4
- CHANGELOG、protocol-coverage、测试列表两边都保留(集成测试顺序沿用上游)

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
@FrostFlops
FrostFlops deleted the feat/cn-exclusive-content branch October 25, 2026 00:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants