Skip to content

新增「头像全部解锁」作弊(--cheat-heads,默认开):舰娘的表情、换装与活动头像都可选用 - #108

Merged
FrostFlops merged 2 commits into
LunarConcerto:masterfrom
FrostFlops:feat/cheat-heads
Oct 25, 2026
Merged

FrostFlops merged 2 commits into
LunarConcerto:masterfrom
FrostFlops:feat/cheat-heads

Conversation

@FrostFlops

Copy link
Copy Markdown
Collaborator

问题

资料页 → 头像 → 某艘舰娘的「アイコン一覧」:除了默认立绘头像,表情、换装与活动头像全部带锁,选中后只提示「このアイコンが解放されていません」(详情里的「戦姫未獲得」只是 config_profile 该行的说明文字,与是否拥有舰娘无关)。改造过的舰娘连默认头像都带锁。

复现

任意存档登录 → 资料 → 头像 → 戦姫一覧 → 朝日:只有第一个头像可用,「泣く子も黙る笑顔」等带锁。

根因

  • 客户端只从 user.NewHeadUnlockedList / user.NewHeadUnlock 推送得知哪些头像已解锁(HeadData.ShipHeadUnlockData)。服务端只在登录同步里推 NewHeadUnlockedList,每艘舰娘一个节点、ProfileID = (模板 − 1) / 10:只覆盖未改造舰娘的默认头像,改造后得到的是改造图鉴 id,config_profile 里没有这一行。
  • user.SetHead 不校验就保存任意非 0 id;存了客户端表里没有的头像时,资料页与头像框页的 IsSecretaryMarried 按它查 config_profile 不判空会报错。
  • user.BuyHead 回空的成功应答,客户端记一条购买成功却什么也没解锁;user.GetHeadBuyCount 总回 ShipFleetId=0。

修法

  • 新作弊 --cheat-heads「头像全部解锁」(默认开,与其他作弊一致)。开启:登录推送 config_profile 全表,按所属舰娘分组(ProfileID 逐条编码,客户端的 packed 解码器有问题);中途获得的舰娘也不用补推。关闭:船坞里舰娘的默认头像、已拥有换装的换装头像与当前头像。模板经 config_ship_main / config_ship_info 换算 sf_id。
  • config_profile 读不到(例如国服客户端)时保持原来的行为。
  • user.SetHead 改为在账号锁内校验,未解锁的 id 回 Err 3600006(客户端弹出与自己检查时相同的提示)且不改档;无论成败都在应答前推 user.UpdateUserInfo(应答处理器会立即按用户数据重画头像)。
  • 用户信息里的头像不在当前客户端的表里时改发秘书舰的默认头像,只改下发值、不改存档。
  • user.GetHeadBuyCount 回显请求的舰娘、次数 0;user.BuyHead 回 110025「機能はまだ開放されていません」,不扣货币(付费头像在作弊开启时本来就已解锁,购买按钮不会出现)。
  • 接线同 --cheat-magazine:CheatOptions、ServerOptions、ready JSON 回显 heads、启动器设置页「头像全部解锁」、launcher-settings.json、Publisher、run-game.bat / start-client.bat / debug-game.ps1(-CheatHeads / -NoCheatHeads)、README、CHANGELOG、time-and-options.md、protocol-coverage.md。

已知限制

  • 作弊关闭时,客户端的解锁状态是登录时的快照:中途获得的舰娘要重新登录头像才解锁;中途退役了最后一艘的舰娘,头像在重新登录前仍显示可选,选用时回 3600006。
  • 付费头像的购买与 [29, id] 头像奖励离线不实现(后者仍走普通背包道具路径,可另开修复)。
  • 2023-02 热更新增的表情头像(101–110)在原服的发放规则不明,作弊关闭时保持带锁。

验证方式

  • dotnet build .\BlueOath.Local.sln:0 警告 0 错误。
  • 默认用例全部通过;-- --heads、-- --heads-integration、-- --cheats 在打过热更(347 行 config_profile)与未热更的 1.4.0(307 行)客户端上都通过;--integration 只有已知基线的 5 项失败。
  • 新测试覆盖开关解析与默认值、推送编码(非 packed)、作弊开/关的头像集合、SetHead 接受与拒绝、头像回落、GetHeadBuyCount、BuyHead、表缺失时的旧行为;集成测试经真实服务端验证登录推送、SetHead 落盘、关闭作弊重启后拒绝未解锁的头像。
  • 实机(日服 1.4.0 打过最终热更的客户端):朝日的 3 个头像都能选用,选「泣く子も黙る笑顔」后资料页头像随之更新;启动器设置页出现「头像全部解锁」,默认勾选。

FrostFlops and others added 2 commits October 24, 2026 16:29
- 客户端只从登录同步的 user.NewHeadUnlockedList 得知哪些头像已解锁,服务端以前每艘舰娘只推一个
  (模板 − 1) / 10,改造过的舰娘连默认头像都对不上,表情与换装头像全部带锁(「未获得战姬」只是该行的说明文字)。
- 开启:推 config_profile 全表(按所属舰娘分组,ProfileID 逐条编码);关闭:船坞里舰娘的默认头像、已拥有换装的头像与当前头像。
  模板经 config_ship_main / config_ship_info 换算 sf_id;客户端没有 config_profile 时保持原来的行为。
- user.SetHead 改为加锁校验,未解锁的 id 回 3600006 且不改档,应答前推 user.UpdateUserInfo;
  用户信息里的头像不在当前客户端的表里时改发秘书舰的默认头像(不改存档)。
- user.GetHeadBuyCount 回显请求的舰娘;user.BuyHead 不再回假的成功(离线不实现购买,回 110025)。
- 开关接线同 --cheat-magazine:服务端、ready JSON、启动器设置页、Publisher、run-game.bat / debug-game.ps1 与文档。
- 测试:--heads、--heads-integration(也在 --integration 里),热更前后两版客户端都通过。
@FrostFlops
FrostFlops merged commit 584ddee into LunarConcerto:master Oct 25, 2026
1 check passed
@FrostFlops
FrostFlops deleted the feat/cheat-heads branch October 25, 2026 00:40
FrostFlops added a commit that referenced this pull request Oct 25, 2026
CHANGELOG:去掉合并 #108 时重复的测试主题行和过时的失败说明
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.

1 participant