audit(movement.keyboard.motion): close Paralysis/Faint/Sleep gate as false positive
Investigated the prior round's flagged gap ("CanAct()'s Paralysis/Faint/Sleep
movement doors not wired into net_play.gd") via exhaustive reachability
tracing of the 40250 reference source. All three resolve to non-gaps:
- Paralysis: its only setter (__Shaman_SetParalysis, InstanceBaseEffect.cpp:821)
has zero callers anywhere in the reachable source -- dead code, never true
in live gameplay.
- Sleep: the AFFECT_SLEEP case in SetAffect() is commented out; the only live
setter is the AFFECT_STUN case (SetSleep(), InstanceBaseEffect.cpp:932-933),
i.e. IsSleep() is just an alias for AFFECT_STUN -- already covered by the
existing `stunned` field and _can_process_network_state()'s dead/stunned/
knock_down gate.
- Faint: only setter is chrFaintTest(), a debug-only Python binding operating
on GetSelectedInstancePtr(); unverifiable from the available 40250 checkout
(no root/ UI scripts) -- evidence-blocked, left unresolved per the skill's
reachability rule.
Byproduct finding while tracing IsStun(): main-character GC_STUN routes to
Die() in the reference (RecvStunPacket), not Stun(); verified this causes no
movement.keyboard.motion discrepancy since CanAct() blocks movement equally
on IsDead()/IsStun() and the current client already blocks movement equally
on dead/stunned. The Die()-vs-Stun() distinction only affects death-system
semantics, already tracked under combat.affect-status.md (Remaining #2, rows
63/67) -- not duplicated here.
No implementation code changed. Removed the resolved item from manifest.json
and movement.keyboard-motion.md's Remaining list; documented full evidence
in the contract doc and remediation roadmap. Contract stays PARTIAL
(AccumulationMovement root-motion, OnMove/OnMoving event-source parity,
sync/hit/death/warp gate stacking, and real-model bone-flip test remain open
for future rounds).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
7df97e01f9
commit
a4ac48db24
@@ -273,6 +273,35 @@ Paralysis/Faint/Sleep 移动门和真实模型姿态测试仍未闭合,下一
|
||||
继续(`AccumulationMovement` 根运动差异或 Paralysis/Faint/Sleep 移动门是其中两个具体、
|
||||
无需真实服务端/客户端证据即可推进的候选)。
|
||||
|
||||
### 2026-09-22T01:30Z:`movement.keyboard.motion/canact-paralysis-faint-sleep-gate` 调查关闭(无需修复)
|
||||
|
||||
对上一轮标记的两个候选之一(`Paralysis/Faint/Sleep` 移动门)做完整可达性追踪后确认它是
|
||||
**假阳性**,不是代码可执行的差异,本轮未改动 GDScript/C++ 实现:
|
||||
|
||||
- Paralysis:唯一 setter `__Shaman_SetParalysis`(`InstanceBaseEffect.cpp:821`)在整个可达
|
||||
40250 源码树中零调用点,是死代码,40250 客户端实际运行时 `IsParalysis()` 恒为 false。
|
||||
- Sleep:`SetAffect()` 的 `AFFECT_SLEEP` 分支已被注释掉,唯一存活路径是
|
||||
`AFFECT_STUN → SetSleep()`(`InstanceBaseEffect.cpp:932`),即 `IsSleep()` 实际上是
|
||||
AFFECT_STUN 的别名,已被当前端 `entity_store.h:119` 的 `stunned` 字段和
|
||||
`net_play.gd::_can_process_network_state()` 的 `dead/stunned/knock_down` 门覆盖。
|
||||
- Faint:唯一 setter `chrFaintTest()`(`PythonCharacterModule.cpp:1087`)是与
|
||||
`chrtestRestoreRenderMode` 并列的调试用 Python 绑定,作用于 `GetSelectedInstancePtr()`;
|
||||
现有 40250 检出没有 root/ Python 脚本可证明/证伪在线可达性,evidence-blocked,未修复。
|
||||
|
||||
调查过程中发现的衍生项(`IsStun()` 的 `RecvStunPacket()` 对主角 `GC_STUN` 走 `Die()`
|
||||
而非 `Stun()`)核实后确认**不是** `movement.keyboard.motion` 差异——`CanAct()` 对
|
||||
`IsDead()`/`IsStun()` 的移动阻断效果相同,当前端 `_can_process_network_state()` 也已对
|
||||
`dead`/`stunned` 同等阻断,移动结果已正确等价;`Die()`/`Stun()` 分流只影响死亡系统本身
|
||||
(EXP 掉落/尸体/复活),已在 `combat.affect-status.md` Remaining #2、分支矩阵第
|
||||
63/67 行登记,不在本合同重复记录。详见
|
||||
`audit/contracts/movement.keyboard-motion.md` 的「调查轮次 2026-09-22T」小节。
|
||||
**该分支已关闭,不要在没有新 live 证据的情况下重新调查 Paralysis/Faint/Sleep 或
|
||||
GC_STUN 主角分流。**
|
||||
|
||||
`movement.keyboard.motion` 下一轮候选收窄为:`AccumulationMovement` 固定 300cm
|
||||
根运动/连续速度替代差异、`OnMove/OnMoving/OnWaiting/OnStop` 资源事件源、同步/受击/
|
||||
死亡/传送门叠加顺序、真实模型骨骼快切不翻转的模型级测试——四者均仍未闭合。
|
||||
|
||||
`network.login.phase_flow` 的下一主候选仍保持文件前面记录的
|
||||
`network.login.phase_flow/auth-game-phase-matrix/live-package-order/server-initiated-phase-close`:
|
||||
本地结构和 owner 分支均已覆盖,只等新的真实服务端/Windows fixture;在没有新 fixture 前不要
|
||||
|
||||
Reference in New Issue
Block a user