Skip to content

指挥室装饰可用:家具套装、单件家具与海报全部持有并保存设置;新增 Mod 声明装饰 - #105

Merged
LunarConcerto merged 3 commits into
LunarConcerto:masterfrom
FrostFlops:feat/interaction-decorations
Oct 24, 2026
Merged

LunarConcerto merged 3 commits into
LunarConcerto:masterfrom
FrostFlops:feat/interaction-decorations

Conversation

@FrostFlops

Copy link
Copy Markdown
Collaborator

问题

离线服务端没有 interactionitem 模块(8 个方法都落到空应答),登录不推 interactionitem.RefreshInteractionItems,存档也没有装饰状态:

  • 背包「装飾」页是空的;
  • 装饰套装(祝100日記念、聖誕装飾品)开不了,主页摆不出家具;
  • 海报页保存提示「変更しました」,但什么都没存;
  • 获得的 25xxxx 装饰道具进了普通背包,成了没用的素材。

复现

打开背包「装飾」页 → 空;在海报页保存海报后重新登录 → 海报没了。

根因

见上:客户端只从 RefreshInteractionItems 推送里拿装饰的持有与状态,所有应答处理都不改本地数据。

修法

  • DecorCatalogLoader:从客户端配置载入装饰道具、套装与三个海报画框(参数 377),不写死行数(热更客户端 68 件,1.4.0 为 66 件)。
  • 与时装一样全部持有(EnsureAllDecor,两条账号加载路径),不设开关;装饰的来源几乎都是早已结束的活动、通行证与联动。
  • 登录同步推 RefreshInteractionItems,num、state、curSelect、posterId 全部显式写出;存档里失效的套装 id 重置为 0(客户端主页遇到未知套装会报错);只推客户端配置里有的 id。
  • InteractionItemModule:切换套装、显示/隐藏单件家具、挂海报在校验后存进 PlayerAccount.Decor(新的可空字段),变化放进 PrePushes;GetItemReward 对 type 1 等回错误(否则客户端会按奖励 0 查表报错);已结束活动的购买/领取回错误。
  • 背包里已有的 25xxxx 装饰迁出到装饰状态;之后 AddBagItem 遇到 25xxxx 直接计入装饰。
  • 新增 Mod 声明装饰 Mods/*/decorations.json:规则与 equipment.json 一致(mod.json 的 enabled 与 targetClients、按路径排序),与客户端配置或其他 Mod 撞号、引用客户端没有的装饰道具时拒绝;MOD_DEVELOPMENT.zh-CN.md 写明格式和启用状态不一致时的风险。
  • CHANGELOG、protocol-coverage.md 同步。

验证方式

  • dotnet build .\BlueOath.Local.sln:0 警告 0 错误(含 --no-incremental 全量重建)。
  • -- --decor:2/2(目录、编解码显式 0、三种设置的校验与持久化、失效套装重置、25xxxx 迁移、decorations.json 规则),-- --decor-integration:1/1(登录推送、推送先于应答、重新登录后状态保留、显示与海报往返);打过 2023-02 热更与未热更的 1.4.0 客户端都通过。
  • 默认用例与 --integration 只有已知基线失败。
  • 游戏内检查:「装飾」页出现两个套装与约 50 件其他道具和海报;开启套装后主页白天、清晨、夜晚都摆出家具;单件家具可在道具详情里切换显示;海报保存后重启仍在;点击 type 1 家具只弹提示。

已知限制

  • 活动商店里的装饰商品(101039、101166)照常扣费,但因为已全部持有,什么也不会多。
  • 水晶球摆件的选择列表依赖服务端从未下发的圣诞商店活动数据,暂时选不了(设置会保存)。

https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i

离线服务端没有 interactionitem 模块(8 个方法都落到空应答),登录不推 interactionitem.RefreshInteractionItems,存档也没有装饰状态:
背包「装飾」页是空的,切换套装没反应,保存海报只是假成功。

- DecorCatalogLoader:从客户端配置载入装饰道具、套装与海报画框(参数 377),不写死行数;两条账号加载路径里 EnsureAllDecor 持有全部装饰(与时装一致,不设开关)
- 登录同步推 RefreshInteractionItems(num、state、curSelect、posterId 等全部显式写出);存档里失效的套装 id 重置为 0(客户端主页遇到未知套装会报错)
- InteractionItemModule:SetMutexBagGroupState / SetBagItemVisible / SetPosterState 校验后存进 PlayerAccount.Decor,在 PrePushes 里推变化;
  GetItemReward 对 type 1 等回错误(否则客户端按奖励 0 查表报错),已关闭活动的购买/领取回错误
- 背包里的 25xxxx 装饰迁出到装饰状态,AddBagItem 遇到 25xxxx 直接计入装饰
- 新增 Mod 声明装饰:Mods/*/decorations.json(规则同 memory-chapters.json:mod.json enabled / targetClients、按路径排序、与客户端配置或其他 Mod 撞号即拒绝、
  引用客户端没有的装饰道具即拒绝),MOD_DEVELOPMENT 补说明
- 新增单元测试与集成测试(-- --decor、-- --decor-integration),热更前后两种客户端都通过

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
其他功能(如头像框)可能在时装与装饰推送之间插入自己的推送,客户端对这两条推送的先后没有要求。

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
@LunarConcerto

Copy link
Copy Markdown
Owner

合并冲突了

- PlayerAccount 末尾并列 Magazine 与 Decor 两个可空字段
- 登录同步:头像框推送之后推装饰推送
- MOD_DEVELOPMENT:装饰一节作为 11.5 放在第 12 章 cn-exclusive 之前,Mods 根目录引用改为 13.4
- CHANGELOG、protocol-coverage、测试列表两边都保留(集成测试顺序沿用上游)

Claude-Session: https://claude.ai/code/session_01Un89pGsMN2GvkT9jh5Nz5i
@LunarConcerto
LunarConcerto merged commit 923a9a3 into LunarConcerto:master Oct 24, 2026
2 checks passed
@FrostFlops
FrostFlops deleted the feat/interaction-decorations 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