40250 classic: G1 integrate W2 (§2.1 data-layer EntityStore + net_world visibility, §2.3/§2.4/§2.5)
Doc conflicts in CLIENT-GAP.md / CLIENT-GAP-FIX.md resolved by W0: keep both 增量 50 W1 + W2 change-log bullets and C.5 batch records. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014yvAPqPivoY7vmBbzgqK4W
This commit is contained in:
+135
-2
@@ -690,6 +690,33 @@ CNetworkActorManager::UpdateActor / MoveActor / SyncActor / SetActorOwner
|
||||
`GC_CHARACTER_UPDATE`,断言 `EntityStore` 里字段已更新且没有场景节点;把主角挪近后
|
||||
断言节点出现且带更新后的装备。
|
||||
|
||||
**状态:✅ 完成(2026-09-02 / W2 / 增量 50)**
|
||||
|
||||
- **改动**
|
||||
- `extension/src/net/entity_store.cpp`:条目仅由 `mut_spawn` / `mut_spawn_full` /
|
||||
`mut_spawn_main` 创建、由 `mut_despawn` / 主 VID 清表删除。`mut_move` /
|
||||
`mut_set_position` / `mut_change_speed` / `mut_dead` / `mut_stun` / `mut_char_update` /
|
||||
`mut_char_info` / `mut_mount` / `mut_shop_sign` / `mut_affect_flags` 等对未知 VID 一律
|
||||
`m_ents.find == end → dbg_ignored() + return`,无 pending / 重放。新增匿名命名空间
|
||||
helper `dbg_ignored(what, vid)`(仅 `MT_NET_TRACE` 环境变量下打 stderr)。
|
||||
- `project/net_world.gd`:新增 `_update_visibility()`,每帧 `_process` 首行调用,对
|
||||
`client.get_entities()` 全表逐条判 `__IsVisibleActor`(主角 / `is_main` /
|
||||
`AFFECT_SHOW_ALWAYS`(bit 7) / `IsWall(race)` / 平面距离 `< CHAR_STAGE_VIEW_BOUND`):
|
||||
可见且无节点 → `_on_spawn(e)` 建节点;有节点且距离 `> CHAR_STAGE_VIEW_BOUND + 10` →
|
||||
`_fade_and_free(vid)`(保留数据行,节点 0.3s 缩放淡出后 `queue_free`,`_fading` 集合
|
||||
防止淡出途中重建)。常量 `const CHAR_STAGE_VIEW_BOUND := 200 * 100`(cm;px==cm)。
|
||||
`_on_spawn` 对信号路径新增 `_is_visible_entity(d)` 门禁;`drain_dirty` → `entity_info`
|
||||
仅刷新已存在节点。**留白**:数据层不可查询时(fake client 无 `get_entities` /
|
||||
`_main_vid == 0` / 缺 `pos_cm`)门禁 fail-open,信号驱动的 spawn 不受可见性限制——
|
||||
与参考端「信号即 `AppendActor`」有意偏差,仅在真实 `M2Client` 上启用逐帧管理。
|
||||
- **测试**:`ctest` 16/16(含 `net.entity_store` 新增 §2.1 断言:远端 `GC_CHARACTER_ADD`
|
||||
填充数据行 + 入队 Spawn;`UPDATE` 改写已有行;未知 VID 的 `mut_char_update` /
|
||||
`mut_move` / `mut_mount` / `mut_char_info` / `mut_shop_sign` 既不建行也不缓存)。
|
||||
新增 `project/net_world_vis_test.gd`:近实体 spawn 即建节点、远实体 spawn 不建节点、
|
||||
主角走近后逐帧管理补建一次、走远后淡出且数据行保留、`AFFECT_SHOW_ALWAYS` 与
|
||||
`race 14202` 常驻、走回后淡出结束再重建——全过。
|
||||
- **验收**:未验证(无真实 40250 服务端;真服端到端可见性 / VID 复用 / affect 表现待接线后验收)。
|
||||
|
||||
---
|
||||
|
||||
### 2.2 `GC_CHAR_ADDITIONAL_INFO` 早于 Spawn 时状态不会被待合并缓存
|
||||
@@ -749,6 +776,11 @@ else TraceError("TPacketGCCharacterAdditionalInfo name=%s vid=%d race=%d Error",
|
||||
隐身 race 丢弃 → 无 pending 的 additional-info 为 no-op”。`ctest` `net.classic_session` 通过。
|
||||
- 验收:未验证(两包合并需真实 40250 服务端 `GC_CHARACTER_ADD` + `GC_CHAR_ADDITIONAL_INFO` 序列)。
|
||||
|
||||
**步骤 4-5 状态:✅ 完成(2026-09-02 / W2 / 增量 50)**——`mut_char_info()` 改为
|
||||
`m_ents.find == end → dbg_ignored() + return`,命中则更新字段并无条件 `push {Info, vid}`;
|
||||
`mut_shop_sign()` 同样去掉裸 `Entity` 创建,未知 VID 直接 return。步骤 1-3(`m_pending_actor`
|
||||
两包合并、`GC_CHARACTER_ADD` 分流、`IsInvisibleRace`)属 W1 的 `ClassicParser` 范畴,未在本批次触碰。
|
||||
|
||||
---
|
||||
|
||||
### 2.3 VID 重用时旧状态可能污染新实体
|
||||
@@ -787,6 +819,23 @@ m_dwMountVnum, m_dwGuildID, m_dwLevel, m_stName`。
|
||||
3. `mut_spawn()` 旧签名保留给 `GC_MAIN_CHARACTER` 之外的老调用点,但内部改为委托
|
||||
`mut_spawn_full()`,避免两套覆盖规则。
|
||||
|
||||
**状态:✅ 完成(2026-09-02 / W2 / 增量 50)**
|
||||
|
||||
- **改动**
|
||||
- `extension/src/net/entity_store.cpp`:`mut_spawn_full(const Entity& src)` 实现为
|
||||
`Entity e = src; e.vid = src.vid; m_ents[src.vid] = e;`(整行替换,VID 复用时不保留
|
||||
任何在途移动状态——对齐 `SNetworkActorData::__copy__` 从 src 取 Src/Dst/Duration),
|
||||
`src.is_main` 时设 `m_main_vid`,无条件 `push {Spawn, vid}`。`mut_spawn(...)` 保留原
|
||||
签名,内部构造 `Entity e{}` 填 vid/race/ch_type/name/x/y/z/angle/speeds/`moving=false`
|
||||
后委托 `mut_spawn_full(e)`。
|
||||
- `project/net_world.gd`:`_on_spawn` 收到已有节点的 `vid` → `queue_free` 旧节点后重建
|
||||
(对齐 `DeleteInstance` + `CreateInstance`);例外:上/下马驱动的重建
|
||||
(`(old_mount == 0) != (new_mount == 0)`)用 `existing.global_position` 保留旧世界坐标。
|
||||
节点存 `mount_vnum` meta 供该判定。
|
||||
- **测试**:`ctest` 16/16(`net.entity_store` 现有 VID-复用 / loading-reset 断言不回归);
|
||||
`netbridge_test` / `gamescene_test` / `netplay_test` 全绿。
|
||||
- **验收**:未验证(VID 复用需真服)。
|
||||
|
||||
---
|
||||
|
||||
### 2.4 点数组可能残留旧值
|
||||
@@ -811,6 +860,21 @@ for (DWORD i = 0; i < POINT_MAX_NUM; ++i)
|
||||
3. `GC_POINT_CHANGE`(单点更新)保持只改一个下标——参考同样是单点
|
||||
(`PhaseSelect.cpp:129` 在 Select 阶段直接 `Recv` 丢弃,Game 阶段才处理)。
|
||||
|
||||
**状态:✅ 完成(2026-09-02 / W2 / 增量 50)**
|
||||
|
||||
- **改动**(`extension/src/net/entity_store.cpp`)
|
||||
- `mut_set_points(pts, n)`(全量快照):`if (!pts || n <= 0) return;`;`n > POINT_MAX_NUM`
|
||||
(255)时截断为 `POINT_MAX_NUM`;`memcpy` 之后 `for (i = n; i < POINT_MAX_NUM; ++i)
|
||||
m_points.v[i] = 0` 清尾,杜绝短包留下旧值。
|
||||
- `mut_set_point(type, value)`(单点):`if (type >= POINT_MAX_NUM) { dbg_ignored(...);
|
||||
return; }` 越界拒绝。
|
||||
- **W1 跟进项**:`wire_classic.h:606-607` 已有
|
||||
`struct GCPoints { uint8_t header; int32_t points[POINT_MAX_NUM]; }` +
|
||||
`static_assert(sizeof(GCPoints) == 1 + 255 * 4)`,本条要求的编译期断言已满足;运行期钳制
|
||||
仍在 `EntityStore` 侧独立加了一层。
|
||||
- **测试**:`ctest` 16/16(`net.entity_store` 点数断言不回归)。
|
||||
- **验收**:未验证(需真服 `GC_POINTS` / `GC_POINT_CHANGE` 流量)。
|
||||
|
||||
---
|
||||
|
||||
### 2.5 实体数据字段不完整
|
||||
@@ -848,6 +912,33 @@ affect 图标与剩余时间没有统一状态。
|
||||
5. 名字颜色 / 称号 / PK 颜色 / 目标框 属表现层,见 §8.8,数据源就是本节的
|
||||
`empire / guild / alignment / pk_mode / level`。
|
||||
|
||||
**状态:✅ 完成(2026-09-02 / W2 / 增量 50)**——affect 位拷贝 + 应用序落地;
|
||||
`empire` 字段由 §增量 49(W0)补齐,本批次不再重复。
|
||||
|
||||
- **改动**
|
||||
- `extension/src/net/entity_store.{h,cpp}`:新增
|
||||
`void mut_affect_flags(uint32_t vid, uint32_t lo, uint32_t hi)`——
|
||||
`v = (uint64_t)lo | ((uint64_t)hi << 32)`,命中且值变化时写 `affect_flags` 并
|
||||
`m_dirty.push_back(vid)`(去重刷新);未知 VID `dbg_ignored + return`。
|
||||
`mut_char_update()` 的 `guild / alignment / pk_mode` 变化现在也置 `changed` 并推
|
||||
`{Info, vid}`(原先漏推)。
|
||||
- `project/net_world.gd`:新增 `_apply_field_updates(n, d)`,严格按
|
||||
`NetworkActorManager.cpp:470` 调用序:ChangeArmor → ChangeWeapon → ChangeHair →
|
||||
ChangeGuild → SetAffectFlagContainer → SetMoveSpeed → SetAttackSpeed → SetAlignment →
|
||||
SetPKMode → SetStateFlags;每个 setter 用 `has_method` 守卫,占位胶囊与不建模该字段
|
||||
的视图自动跳过。`_on_spawn` / `_on_info` 末尾各调一次。
|
||||
`const AFFECT_SHOW_ALWAYS := 1 << 7`、`const WALL_RACES := [14201,14202,14203,14204]`。
|
||||
- **待读参考落定**:40250 `ClientVS22` 树的 `AffectFlagContainer.h` 未逐一拼出枚举成员;
|
||||
`AFFECT_SHOW_ALWAYS` = bit 7 取自 m2dev 姊妹源 `InstanceBase.h` 的 `enum EAffect`
|
||||
序号 7,已在 `net_world.gd` 注释标注为本地常量。
|
||||
- **W1 跟进项**:`GCCharacterAdd/Add2/Update` 都带 `uint32_t affect_flag[2]`,但
|
||||
`mut_char_update` 无 affect 形参——W1 需在 `classic_parser.cpp` 的
|
||||
`GC_CHARACTER_ADD` / `ADD2` / `GC_CHARACTER_UPDATE` 之后调
|
||||
`mut_affect_flags(vid, affect_flag[0], affect_flag[1])`。
|
||||
- **测试**:`ctest` 16/16;`netbridge_test` / `gamescene_test` / `combat_fx_test` /
|
||||
`player_motion_test` 全绿;新增 `net_world_vis_test` 覆盖 `AFFECT_SHOW_ALWAYS` 常驻。
|
||||
- **验收**:未验证(换装 / affect 表现需真服)。
|
||||
|
||||
---
|
||||
|
||||
### 2.6 一次性事件没有可靠的生命周期缓存
|
||||
@@ -2983,8 +3074,8 @@ var _pw := "123456789"
|
||||
| 工作流 | 当前状态 | 已有证据 | 下一批次 |
|
||||
|---|---|---|---|
|
||||
| W0 公共基础 / 集成 | 🟡 开发中 | DirectEnter、Classic Warp endpoint、`world_reset`、场景重建首版;增量 49 接口冻结批次(`Entity` 字段 + `mut_spawn_full/mut_ownership/mut_map_bgm/drain_dirty` + `bgm_changed` 信号 + `bgm_director.gd` + §8.6 键位入口)已提交,C++ `ctest` 16/16 + 9 项 GDScript 回归通过 | 接收 Phase 1 W1/W2/W3/W4 批次并执行 G1 |
|
||||
| W1 协议 / 账号会话 | 🟡 开发中(增量 50:§1.5 / §1.10 / §2.2 已落地,待真实验收) | 角色槽地址透传、发送结果、unknown / unhandled 错误链路、断线回 LOGIN;§1.5 locale 分支 + `CGClientVersion2`(0xf1);§1.10 `text_codec.h` + `to_wire` 路由 + `net_text_codec_test`(套件 16→17);§2.2 `GC_CHARACTER_ADD` 隐身丢弃 / PC·NPC 暂存 / 其余按 `npclist.txt` 命名立即 spawn,`GC_CHAR_ADDITIONAL_INFO` 无 pending 丢弃、命中则 `mut_spawn_full` 合并 | locale 代码页转码(CP949/CP1252)、真实双连接、进场延迟、GDScript 名字校验统一(Phase 2 / W3);`M2Client` 接线 `set_executable_name` / `set_npclist_path` |
|
||||
| W2 实体 / 世界 / 战斗 | 🟡 开发中 | 地图实体 / 掉落清理、地图重建首版、实体测试和场景测试;`drain_dirty` / `mut_spawn_full` 骨架可用 | §2.1 两层模型 + 可见性、§2.3 `mut_spawn→mut_spawn_full`、§2.4 点数数组尾部、§2.5 应用顺序 + affect_flags |
|
||||
| W1 协议 / 账号会话 | 🟡 开发中(增量 50:§1.5 / §1.10 / §2.2 已落地,待真实验收) | 角色槽地址透传、发送结果、unknown / unhandled 错误链路、断线回 LOGIN;§1.5 locale 分支 + `CGClientVersion2`(0xf1);§1.10 `text_codec.h` + `to_wire` 路由 + `net_text_codec_test`(套件 16→17);§2.2 `GC_CHARACTER_ADD` 隐身丢弃 / PC·NPC 暂存 / 其余按 `npclist.txt` 命名立即 spawn,`GC_CHAR_ADDITIONAL_INFO` 无 pending 丢弃、命中则 `mut_spawn_full` 合并;G1 已接线 `set_executable_name` / `set_npclist_path` / `mut_affect_flags` | locale 代码页转码(CP949/CP1252)、真实双连接、进场延迟 |
|
||||
| W2 实体 / 世界 / 战斗 | 🟡 开发中(Phase 1 批次已交) | 增量 50:§2.1 两层模型(`EntityStore` 纯数据层 + `net_world._update_visibility()` 按 `CHAR_STAGE_VIEW_BOUND` / `AFFECT_SHOW_ALWAYS` / `IsWall` 建 / 淡出节点)、§2.3(`mut_spawn`→`mut_spawn_full` 整行替换 + 节点重建 + 上下马保坐标)、§2.4(点数快照清尾 / 单索引边界)、§2.5(`mut_affect_flags` 两段拼装 + 参考调用序刷新)已落地;`ctest` 16/16 + 7 项 GDScript 回归 + 新增 `net_world_vis_test` 全绿 | 远服端到端可见性 / VID 复用 / affect 表现验收;`state_flags` 表现层枚举 |
|
||||
| W3 玩法 UI / 输入 | 🟡 已有首版 | 多数窗口、背包 / 任务 / 社交、键位和输入已有回归;§8.6 数字键 / F1–F4 / Ctrl+数字入口已收敛 | §8.3 帮助窗;§8.6 剩余逐行键位、LSHIFT 翻页、表情包 |
|
||||
| W4 渲染 / 资产 / 音频 | 🟡 已有首版 | GR2 / `.msa` / `.mse`、地图 / 水体 / 天气 / BGM 部分链路已有;`bgm_director.gd` 消费点就位 | §9.1 地图 BGM 曲目解析 + 音量、§9.2 后台恢复曲目、§9.3 生命周期单一属主 |
|
||||
| W5 打包 / 发布 / 验收 | ⬜ 未开始 | 已有 Godot 导出配置和构建入口 | 自包含资源包、Intel / Apple Silicon、签名和 Mac App 验收 |
|
||||
@@ -3083,3 +3174,45 @@ var _pw := "123456789"
|
||||
下一批次:Phase 2 —— W0 执行 G1 集成,接线 set_executable_name / set_npclist_path,
|
||||
合并 §2.2 步骤 4–5,统一 GDScript 名字校验;真实 40250 服务端到位后做 §1.5/§1.10/§2.2 真服验收
|
||||
```
|
||||
|
||||
```text
|
||||
批次:2026-09-02 / W2 / §2.1 §2.3 §2.4 §2.5(含 §2.2 步骤 4-5 清理)
|
||||
状态:✅ 完成(代码 + 回归);🔎 真服端到端待验收
|
||||
参考:REF/UserInterface/NetworkActorManager.cpp:53/409/456/470;
|
||||
REF/.../PythonCharacterManager.cpp:13/182;REF/.../PhaseLoading.cpp:325;
|
||||
m2dev src/UserInterface/InstanceBase.h enum EAffect(bit 7 = AFFECT_SHOW_ALWAYS)
|
||||
改动:
|
||||
extension/src/net/entity_store.cpp —— 全部 mut_* 未知 VID → dbg_ignored()+return(无
|
||||
pending/重放);条目仅 mut_spawn/mut_spawn_full/mut_spawn_main 建、mut_despawn/主 VID
|
||||
清表删;mut_spawn_full() 整行替换 m_ents[vid]=e 并无条件 push {Spawn};mut_spawn()
|
||||
委托 mut_spawn_full();mut_set_points() 短包清尾 + n>255 截断、空指针/n<=0 早退;
|
||||
mut_set_point() type>=255 拒绝;mut_char_info()/mut_shop_sign()/mut_mount() 去掉裸
|
||||
Entity 创建,find-or-return;mut_char_update() guild/alignment/pk_mode 变化也推 {Info};
|
||||
+mut_affect_flags(vid,lo,hi)(v=lo|(hi<<32),变化则 m_dirty);+匿名 dbg_ignored 助手
|
||||
extension/src/net/entity_store.h —— +mut_affect_flags 声明
|
||||
extension/tests/net_entity_test.cpp —— +§2.1 数据层断言块(远端 ADD 填行+入队 Spawn、
|
||||
UPDATE 改写、未知 VID 五个 mut_* 既不建行也不缓存)
|
||||
project/net_world.gd —— +CHAR_STAGE_VIEW_BOUND/AFFECT_SHOW_ALWAYS/WALL_RACES 常量;
|
||||
+_update_visibility()(每帧 __IsVisibleActor 判定,建/淡出节点,_fading 防抖);
|
||||
+_is_visible_entity/_planar_cm/_show_always/_is_wall/_fade_and_free;
|
||||
+_apply_field_updates()(NetworkActorManager.cpp:470 调用序,has_method 守卫);
|
||||
_on_spawn 支持已有节点销毁重建 + 上下马保留 global_position;_on_info 末尾刷字段;
|
||||
clear_for_map_change/_on_despawn 清 _fading
|
||||
project/net_world_vis_test.gd(新)—— 两层可见性 headless 自检
|
||||
测试:./build.sh Debug 退出 0;cd build && ctest --output-on-failure → 16/16 全过
|
||||
(net.entity_store 含新断言);godot --headless --script 逐个:net_world_vis_test、
|
||||
netbridge_test、gamescene_test、netplay_test、p9_test、combat_fx_test、player_motion_test
|
||||
全绿;无 skip。(注:干净 worktree 需先跑一次 `godot --headless --editor --quit` 生成
|
||||
global_script_class_cache 才能解析 MapCoord/AssetRoot 全局类)
|
||||
验收:未验证(无真实 40250 服务端)
|
||||
风险与依赖:
|
||||
- W1 需在 classic_parser.cpp 的 GC_CHARACTER_ADD/ADD2/UPDATE 之后调
|
||||
mut_affect_flags(vid, affect_flag[0], affect_flag[1])——mut_char_update 无 affect 形参
|
||||
- §2.2 步骤 1-3(m_pending_actor 两包合并、IsInvisibleRace 分流)属 W1,未触碰
|
||||
- net_world.gd 可见性门禁对无 pos_cm 的 fake client fail-open:信号驱动 spawn 不受
|
||||
距离限制,且逐帧管理会主动建节点——与参考「信号即 AppendActor」的有意偏差
|
||||
- AFFECT_SHOW_ALWAYS=1<<7 源自 m2dev InstanceBase.h(40250 树 AffectFlagContainer.h
|
||||
未逐一拼出成员);WALL_RACES=[14201..14204] 源自 InstanceBase.cpp IsWall
|
||||
- m2dev apply() 内联 touch() 路径(GC_CHARACTER_ADD 等旧协议分支)不在 §2.2 范围,未改
|
||||
下一批次:W1 接线 mut_affect_flags + §2.2 两包合并;Phase 2 由 W0 执行 G1 集成
|
||||
```
|
||||
|
||||
+23
-2
@@ -56,8 +56,8 @@
|
||||
| 工作流 | 状态 | 当前已知进展 | 下一步 |
|
||||
|---|---|---|---|
|
||||
| W0 公共基础 / 集成 | 🟡 | DirectEnter、Classic Warp endpoint、`world_reset`、场景重建首版已落地;增量 49 接口冻结批次(`Entity` 补字段 + `mut_spawn_full/mut_ownership/mut_map_bgm/drain_dirty`、`bgm_changed` 信号、`bgm_director.gd`、§8.6 键位收敛)已提交 | Phase 1 4 工作流并行完成后执行 G1 集成 |
|
||||
| W1 协议 / 账号会话 | 🟡 | 增量 50:§1.5 版本包按 locale 分支(EUROPE 发 `CG_CLIENT_VERSION2` 0xf1 + `"1215955205"`,其余发 0xfd + `MT_BUILD_TIMESTAMP`)、可执行名 setter;§1.10 `text_codec.h` UTF-8 安全定长文本裁剪 + `net_text_codec_test`,会话侧所有定长 name/sign/comment 填充改走 `to_wire()`;§2.2 `GC_CHARACTER_ADD` 按 invisible-race 丢弃 / PC·NPC 暂存 `m_pending_actor` / 其余即时 `mut_spawn`(名字取自 npclist.txt),`GC_CHAR_ADDITIONAL_INFO` 无暂存则记录并丢弃、命中则合并 9 字段 `mut_spawn_full` 后清表 | 真实 locale codepage 转码、真实双连接、enter delay;GDScript 名称长度校验统一(Phase 2/W3) |
|
||||
| W2 实体 / 世界 / 战斗 | 🟡 | 地图实体 / 掉落清理、地图重建首版及离线回归已覆盖;`drain_dirty` / `mut_spawn_full` 骨架可用 | §2.1 两层模型 + 可见性、§2.3 `mut_spawn→mut_spawn_full`、§2.4 点数数组尾部、§2.5 应用顺序 + affect_flags |
|
||||
| W1 协议 / 账号会话 | 🟡 | 增量 50:§1.5 版本包按 locale 分支(EUROPE 发 `CG_CLIENT_VERSION2` 0xf1 + `"1215955205"`,其余发 0xfd + `MT_BUILD_TIMESTAMP`)、可执行名 setter;§1.10 `text_codec.h` UTF-8 安全定长文本裁剪 + `net_text_codec_test`,会话侧所有定长 name/sign/comment 填充改走 `to_wire()`;§2.2 `GC_CHARACTER_ADD` 按 invisible-race 丢弃 / PC·NPC 暂存 `m_pending_actor` / 其余即时 `mut_spawn`(名字取自 npclist.txt),`GC_CHAR_ADDITIONAL_INFO` 无暂存则记录并丢弃、命中则合并 9 字段 `mut_spawn_full` 后清表 | 真实 locale codepage 转码、真实双连接、enter delay;GDScript 名称长度校验统一(G1 已收) |
|
||||
| W2 实体 / 世界 / 战斗 | 🟡 | §2.1 两层模型(`EntityStore` 纯数据层 + `net_world.gd` 每帧 `_update_visibility()` 按 `CHAR_STAGE_VIEW_BOUND` / `AFFECT_SHOW_ALWAYS` / `IsWall` 建 / 淡出节点)、§2.3(`mut_spawn`→`mut_spawn_full` 整行替换 + 节点销毁重建 + 上下坐骑保坐标)、§2.4(点数快照截断 / 尾部清零 + 单索引边界)、§2.5(`mut_affect_flags` 两段拼装 + 参考调用序节点刷新)已落地并回归(增量 50) | 远服 40250 端到端可见性 / VID 复用 / affect 表现验收;`state_flags` 表现层枚举与眩晕 / 隐身等表现 |
|
||||
| W3 玩法 UI / 输入 | 🟡 | 多数窗口、背包 / 任务 / 社交、键位和输入已有首版;§8.6 数字键 / F1–F4 / Ctrl+数字入口已收敛 | §8.3 帮助窗;§8.6 剩余逐行键位与表情包 |
|
||||
| W4 渲染 / 资产 / 音频 | 🟡 | GR2 / `.msa` / `.mse`、地图 / 水体 / 天气 / BGM 部分链路已有;`bgm_director.gd` 消费点已就位 | §9.1 地图 BGM 曲目解析 + 音量、§9.2 后台恢复曲目、§9.3 生命周期单一属主 |
|
||||
| W5 打包 / 发布 / 验收 | ⬜ | 已有 Godot 导出配置和构建入口 | 自包含资源包、Intel / Apple Silicon、签名和 Mac App 验收 |
|
||||
@@ -141,6 +141,27 @@
|
||||
> 依赖 W2 §2.2 步骤 4–5(`mut_char_info` touch-create / `mut_shop_sign` 裸 `Entity` 清理)——
|
||||
> 本次合并逻辑与当前 W2 代码兼容。C++ `ctest` 17/17(原 16 + `net.text_codec`)、`netbridge_test`、
|
||||
> `p10_test` 全绿。
|
||||
> - **2026-09-02 增量 50(Phase 1 W2:实体两层模型 + 可见性 / 单次覆盖 / 点数边界 / 应用顺序)**:
|
||||
> 把可见性从 `EntityStore` 彻底移到 `net_world.gd`。**§2.1**:`EntityStore` 只做数据层——
|
||||
> 仅 `mut_spawn / mut_spawn_full / mut_spawn_main` 建行,`mut_mount / mut_char_info /
|
||||
> mut_shop_sign` 遇未知 VID 只 `dbg_ignored()`(`MT_NET_TRACE` 门控)后返回,不再 `touch()`
|
||||
> 出半行、不做 replay 缓冲;`net_world.gd` 每帧 `_update_visibility()` 按
|
||||
> `is_main / AFFECT_SHOW_ALWAYS(bit7) / IsWall(14201–14204) / 平面距主角 <
|
||||
> CHAR_STAGE_VIEW_BOUND(200*100 cm)` 决定建节点,超 `+10` 淡出并保留数据行(`_fading` 集合
|
||||
> 防淡出中重建),只在主角坐标已知时启用、否则沿用 `entity_spawned` 建节点。**§2.3**:
|
||||
> `mut_spawn()` 改为委托 `mut_spawn_full()`,后者整行值替换(`m_ents[vid] = e`,不再保留旧
|
||||
> move 状态,对齐 `SNetworkActorData::__copy__`);`net_world._on_spawn` 对已有节点的 vid
|
||||
> 先销毁再重建,上/下坐骑触发的重建复用旧世界坐标。**§2.4**:`mut_set_points()` 全量快照
|
||||
> `> POINT_MAX_NUM(255)` 截断、`< 255` 清零尾部;`mut_set_point()` 索引 `>= 255` 拒绝。
|
||||
> **§2.5**:新增 `EntityStore::mut_affect_flags(vid, lo, hi)`(`v = lo | (hi<<32)` 两段拼装),
|
||||
> `mut_char_update()` 的 guild/alignment/pk 变化也触发 Info;`net_world._apply_field_updates()`
|
||||
> 按参考调用序(`NetworkActorManager.cpp:470`:Armor→Weapon→Hair→Guild→AffectFlag→MoveSpeed→
|
||||
> AttackSpeed→Alignment→PKMode→StateFlags)刷新节点。C++ `ctest` 16/16(`net.entity_store`
|
||||
> 加 §2.1 数据层断言)、新增 `net_world_vis_test.gd`、`netbridge_test` / `gamescene_test` /
|
||||
> `netplay_test` / `p9_test` / `combat_fx_test` / `player_motion_test` 全绿。待 W1 跟进:
|
||||
> `wire_classic.h` 的 `GCPoints` 已有 `static_assert(sizeof == 1 + 255*4)`;`ClassicParser`
|
||||
> 需在 `GC_CHARACTER_ADD[2]` / `GC_CHARACTER_UPDATE` 后调用 `mut_affect_flags()` 把
|
||||
> `affect_flag[2]` 送进实体(`mut_char_update` 无 affect 形参,未接线)。G1 集成已接线(见下)。
|
||||
> - **2026-09-02 增量 49(W0 接口冻结批次)**:为 Phase 1 的 4 个并行工作流一次性落地跨工作流
|
||||
> 共享文件的骨架,冻结接口后再拆分。`EntityStore`:`Entity` 补 `empire / affect_flags /
|
||||
> owner_vid / state_flags` 字段;新增 `mut_spawn_full()`(§2.3 两包合并的单次落地入口)、
|
||||
|
||||
Reference in New Issue
Block a user