These files were loaded only by their own test_*_parity.gd and never by the runtime (transitively checked, incl. client_phase_integration_system). Removes 76 manifest implementation/evidence references across 18 contracts; contract docs get a note that conclusions based on them are void. Live systems kept: chest, consumable, item_attr, metin_socket, whisper_chat. Full headless suite: no new failures (7 failing + 5 headless-hanging render tests are identical before the deletion). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
15 KiB
social.party_guild_messenger
Scope
审计组队邀请/接受/离队、队员状态/HP/角色、经验分配模式和组队技能;公会信息、成员/权限、技能、公告、公会战和邀请;好友/Messenger 在线与移动状态;以及会徽/战旗下载、缓存、上传和角色头顶徽章刷新。判断标准是当前端是否以 40250 的网络回包和资源服务为权威,并复现 UI 分支、协议副作用、失败清理和角色显示更新,而不是本地系统类能否独立模拟同样数值。
Reference call chain
UserInterface/PythonNetworkStreamPhaseGame.cpp/PythonNetworkStreamPhaseGameActor.cpp- 解析
GC_PARTY_*、GC_GUILD_*、GC_MESSENGER、GC_CHARACTER_*;组队邀请、加入、移除、角色/HP/affect、分配模式由服务器回包驱动。 - 公会
INFO/LIST/GRADE/GRADE_NAME/GRADE_AUTH/CHANGE_EXP/SKILL_INFO/COMMENTS/WAR/WAR_POINT/GUILD_NAME/MONEY_CHANGE都只更新CPythonGuild/窗口状态,客户端不计算经验、战绩奖励或权限结果。 - Messenger 通过
CPythonMessenger维护好友、公会和家族三组,登录/登出/移动回调 UI;添加/删除和邀请应答走CG_MESSENGER或/messenger_auth。
- 解析
UserInterface/PythonGuild.cpp/PythonMessenger.cpp/PythonCharacterManager.cpp- 公会成员、等级名称/权限、公告、技能、战争列表和角色 guild id 由网络同步;
ChangeGVG/RefreshAllGuildMark使角色关系和会徽资源刷新。 CPythonCharacterManager不负责本地结算公会战奖励或自动增长公会技能点;这些结果由服务器GC_GUILD/聊天提示给出。
- 公会成员、等级名称/权限、公告、技能、战争列表和角色 guild id 由网络同步;
UserInterface/GuildMarkDownloader.cpp/GuildMarkUploader.cpp/MarkManager.cpp- 会徽是独立连接和资源链:登录握手→mark index→本地 CRC 列表→压缩 block→拼接 mark image;符号另有 CRC/数据包;完成后通知角色刷新。
- 上传前检查会长/权限、BMP/尺寸和数据;成功以 mark server 回包为准,不是把像素写入一个脚本字典就完成。
Client/Eternexus/root/uiparty.py/uiguild.py/uimessenger.py/uiuploadmark.py- UI 只展示网络状态、发送请求和等待回包;队伍角色/affect、经验和公会战积分不能由客户端本地 authoritative 计算。
Current call chain
- native
M2Client/ClassicSession已提供 party invite/answer/remove/state/skill/parameter,friend add/remove/answer,guild 成员/权限/公告/技能/战争/邀请和 mark download/upload 等接口;EntityStore也有对应的 party/friend/guild/war/mark 状态、dirty 标记和事件队列。 project/ui/party_ui.gd、guild_ui.gd、friend_ui.gd已连接 live native signal/getter,主要操作会发送M2Client请求;这部分是当前实现中最接近 40250 的路径。project/party_management_system.gd是独立本地系统:直接创建队伍、计算按等级/均分经验、分配角色光环和数值加成;project/guild_skill_system.gd本地计算公会升级/技能点/技能 buff;project/guild_war_system.gd本地计算比分、目标分、天梯变化和 1,000,000 公会金币奖励。这些算法不是 40250 客户端的 authority 链,主要由 parity 测试使用。project/messenger_system.gd直接修改 friends/guild/family 字典并记录事件;liveFriendUI则使用 nativeget_friends、add_friend、remove_friend和friend_answer,两套状态源未统一。project/guild_mark_uploader_system.gd直接把上传数据写入本地cached_marks;livegame_scene.gd/GuildUI使用 native mark server 方法,且默认图源可能是res://ui/default_guild_mark.png或运行时生成的 16x12 占位图。extension/src/net/classic/classic_mark_client.*和M2Client已有独立 mark 连接/缓存/图片接口,app_flow.gd会在登录/选人后启动下载并在guild_mark_updated后重试;但现有自动测试主要用 fake client,缺真实 mark packet/压缩 block/CRC/断线恢复证明。
Branch matrix
| 场景 | 40250 | 当前端 | 结论 |
|---|---|---|---|
| 组队邀请/应答/移除 | CG 请求→GC 邀请/加入/移除;失败由服务器提示 | native 包、store、UI 对应存在 | PARTIAL:真实拒绝/重复/断线序列不足 |
| 队员状态/HP/affect/VID | GC_PARTY_ADD/UPDATE/LINK/UNLINK/PARAMETER 驱动 UI |
EntityStore 与 PartyUI 能展示 | PARTIAL:unordered map 顺序与重连恢复未验证 |
| 经验分配/角色光环 | 客户端只显示 server state/affects,结算在服务器 | 本地 helper 直接计算 exp 与 buff | GAP(helper 不等于 40250 implementation) |
| Messenger 好友 | server list/login/logout/mobile/remove,邀请用 auth 流程 | native live 路径完整,独立 helper 直接改字典 | PARTIAL:两套状态源及真实拒绝/恢复缺证据 |
| 公会 info/member/grade/auth | GC_GUILD 回包更新,权限由服务器执行 |
native parser/getter/UI 操作链存在 | PARTIAL:请求结果、顺序、权限拒绝和重连未完整覆盖 |
| 公会技能/捐献/公告 | client 发请求,skill/exp/point/comments 由 GC 回包提供 | live UI/native 请求存在;本地 GuildSkillSystem 另算升级/技能点 |
PARTIAL/GAP:本地 helper 不能作为 parity 证明 |
| 公会战声明/状态/列表/积分 | GC_WAR/WAR_LIST/WAR_POINT/END 驱动展示,结算权威在服务端 | native status/event/score 存在;本地 war system 自己结算奖励 | PARTIAL:live native 近似,helper 分支为 GAP |
| 公会邀请/创建 | 对话/确认后 CG_GUILD,结果 GC/command | UI/native 应答和创建请求存在 | PARTIAL:失败文案和回包清理不足 |
| 会徽下载 | 独立 mark session、index/CRC/block、解压/缓存、角色刷新 | classic mark client/native API/app_flow 与 Sprite3D 刷新存在 | PARTIAL:真实资源协议和损坏 block 恢复未测 |
| 会徽/战旗上传 | 权限、BMP/尺寸/实际数据→mark server 回包 | native upload 存在;本地 uploader 另有直接缓存 helper,默认可上传占位图 | PARTIAL/GAP:本地 helper 不是服务端上传结果 |
| 角色徽章刷新/移除 | RefreshAllGuildMark 与 guild id/mark 数据共同驱动 |
NetWorld 根据 mark image 创建/刷新 Sprite3D |
PARTIAL:实际角色模型/换图/死亡/重连资源生命周期未端到端验证 |
Implementation-equivalence matrix
| 项目 | 状态 | 证据/限制 |
|---|---|---|
| Preconditions | PARTIAL | native 对 VID/PID/阶段和部分字段做边界校验;本地 party/guild/mark helper 可绕过服务端权限、当前角色和会长身份 |
| Branch structure | PARTIAL | live party/guild/friend/mark 主干存在;helper 本地结算、公会战奖励、技能升级、Messenger 缓存和上传缓存形成额外旁路 |
| Algorithms/formulas | GAP | 40250 客户端不拥有经验分配、公会技能升级、公会战奖励公式;当前 helper 的计算不能宣称与 40250 客户端实现统一 |
| State transition order | PARTIAL | live native 是请求→GC 回包→dirty/signal→UI;本地系统是立即改字典/发 signal,未按权威回包顺序运行 |
| Constants/units | PARTIAL | PARTY 角色/affect槽、guild grade/skill、mark 16x12/64x128 和协议布局部分存在;本地 buff、奖励、等级阈值需由 server 数据证明 |
| Timing/event sources | PARTIAL | live signal/dirty/mark retry 存在;好友/公会/队伍登录、重连、mark block 分片和战争连续事件未完整验证 |
| Resource/data sources | PARTIAL | native mark store 与角色资源接口存在;默认上传图源和本地缓存 helper 可能取代真实用户资源/服务器 mark 数据 |
| Protocol side effects | PARTIAL | classic party/guild/friend/mark wire 基础存在;服务器错误、权限拒绝、命令提示和 mark 独立连接所有副作用缺完整测试 |
| Interruption/failure/cleanup | GAP | 本地 helper 可在无回包时进入成功状态;断线/换图/离会/好友清空/重复 mark 下载、坏 block、战争结束和 UI 弹窗清理未端到端覆盖 |
Regression evidence
project/test_party_management_parity.gd:30/30 通过,但验证的是本地队伍创建、经验和角色 buff helper,未启动服务端或消费GC_PARTY_*。project/test_messenger_parity.gd:27/27 通过,但验证的是独立messenger_system.gd字典/事件;live native Messenger list/login/logout/mobile/邀请回包未被此测试覆盖。project/test_guild_mark_uploader_parity.gd:12/12、project/guild_mark_test.gd和project/guild_mark_tail_test.gd通过;主要使用本地 uploader/fake client,未覆盖真实 mark server index/CRC/compressed block 和坏数据清理。project/test_guild_war_parity.gd:25/25、test_guild_war_observer_arena_parity.gd:21/21、test_guild_skill_parity.gd:31/31、guild_creation_ui_test.gd:通过;公会战/技能测试主要验证本地公式和状态机,不等价于 40250GC_GUILD权威结果。project/test_privilege_empire_guild_parity.gd、project/p8_test.gd:通过;覆盖 UI/辅助系统,不覆盖所有 social 回包拒绝/乱序/重连。build/extension/net_entity_test、build/extension/net_classic_session_test:party/messenger/guild 基础 parser/session 检查通过;没有完整GC_GUILD、GC_MESSENGER、GC_PARTY错误序列和 mark client packet 测试。
Deep audit round 2026-09-21
Fresh regression results
godot --headless --path project --script test_party_management_parity.gd:退出码 0,30/30 通过;覆盖本地队伍创建、离队、角色光环和经验分配 helper。godot --headless --path project --script test_messenger_parity.gd:退出码 0,27/27 通过;覆盖独立 messenger 字典/事件状态。godot --headless --path project --script test_guild_mark_uploader_parity.gd:退出码 0,12/12 通过;覆盖本地尺寸、权限和缓存 helper。godot --headless --path project --script guild_mark_test.gd、guild_mark_tail_test.gd:均退出码 0;会徽 UI/尾标局部路径通过。godot --headless --path project --script test_guild_war_parity.gd:退出码 0,25/25 通过;test_guild_war_observer_arena_parity.gd:21/21 通过;均主要验证本地战争/观察者状态机。godot --headless --path project --script test_guild_skill_parity.gd:退出码 0,31/31 通过;覆盖本地公会技能等级、消耗、buff 和 cooldown 公式。godot --headless --path project --script guild_creation_ui_test.gd、test_privilege_empire_guild_parity.gd、p8_test.gd:均退出码 0;UI/权限辅助路径通过。build/extension/net_entity_test与build/extension/net_classic_session_test:均退出码 0;基础 party/messenger/guild/mark parser/session 检查通过。
Static parity findings
- 40250 的队伍成员、经验分配、角色光环和公会技能/战争结果都由
GC_PARTY_*/GC_GUILD_*与服务器状态驱动;当前PartyManagementSystem、GuildSkillSystem、GuildWarSystem仍可在无回包时直接计算并发成功信号,不能作为等价实现。 - live
FriendUI使用 native friend list/请求,MessengerSystem却直接改本地 friends/guild/family 字典;两套状态源在拒绝、重复、离会、重连时可能分叉。 - 会徽 native mark client 已有独立连接、index/CRC/block 和缓存骨架,但当前测试没有真实 mark server 分片、压缩/CRC 失败、断线恢复和完成后所有角色刷新 fixture;本地 uploader helper 直接写
cached_marks仍是旁路。 - 公会创建、邀请、权限、公告、技能和战争的 live native 入口存在,但错误文本、权限拒绝、事件顺序、换图/离会清理和重复回包没有形成统一状态合同。
- 角色徽章/公会关系刷新当前由 NetWorld 的 Sprite3D 适配承接,没有证明与 40250
RefreshAllGuildMark、真实角色模型、死亡/重连/换图资源生命周期保持一致。
Round conclusion
本轮仍为 PARTIAL:native 社交协议和 UI 主干较完整,局部测试全部通过;但本地结算/缓存旁路、真实权限与错误回包、队伍/公会/好友重连清理以及会徽独立连接仍未与 40250 统一。本轮未修改实现代码。
Active UserInterface guild-mark and social-state review
GuildMarkDownloader.h的可达状态机是独立CNetworkStream:离线/登录/握手/ping/mark-index/mark-block/symbol/key-agreement/完成,并在请求前发送本地 mark CRC/index 列表;GuildMarkUploader.h还要求读取并校验 BMP/符号、发送 mark 或 symbol、等待完成后断开。MarkImage.cpp/h不是单个图片缓存:它按 mark/block 网格保存压缩块,使用 LZO 安全解压、CRC、差异 block 列表、空槽分配和本地持久化;MarkManager.h维护 guild id→mark id、index、图片文件和 block CRC 的持久映射。PythonGuild.h明确区分 guild 基础信息、等级/权限、成员 grade/job/level/offer、公告、技能点和敌对公会;PythonMessenger.h暴露好友、公会成员、登录/登出、移动状态和删除回调。这些都属于回包驱动状态,不是本地公会战或 messenger 字典的 authority。- 当前端虽有
classic_mark_client和 native guild/messenger 入口,但本地GuildMarkUploaderSystem、MessengerSystem仍可旁路直接写缓存/字典;真实分片、CRC/LZO 失败、权限拒绝、重连清理和完成后的全部角色刷新仍无等价证据,合同保持PARTIAL。
Static review evidence
已将 GuildMarkDownloader.h、GuildMarkUploader.h、MarkImage.cpp/h、MarkManager.h、PythonGuild.h、PythonMessenger.h 纳入本合同的 active source 证据;未因此提升状态。
Status
PARTIAL。当前端的 native 社交协议和主要 UI 已有较完整骨架,组队、公会、好友和会徽 live 主路径大体接上 40250;但本地 party/guild skill/war/messenger/mark helper 仍把服务端权威逻辑复制成直接状态机,且真实权限拒绝、回包顺序、重连清理和独立会徽连接缺端到端证据。因此不能把现有 parity 测试通过等同于实现统一。本轮完成审计并记录,未修改实现代码。
2026-09-22 死代码删除
以下文件只被自身测试引用、运行时从不加载,已删除;本文中以它们为实现或证据的结论作废,相关行为需按 40250 源码单元重新移植:guild_mark_uploader_system.gd, guild_skill_system.gd, guild_war_system.gd, messenger_system.gd, party_management_system.gd, test_guild_mark_uploader_parity.gd, test_guild_skill_parity.gd, test_guild_war_observer_arena_parity.gd, test_guild_war_parity.gd, test_messenger_parity.gd, test_party_management_parity.gd, test_privilege_empire_guild_parity.gd。