docs: 文档审计——修正失效链接与过期结论
按 docs/ 目录逐篇核对,只改与事实/路径不符的部分,不动尚未验证的计划条目: - `docs/steps/**` 在早前整理时已迁到 `docs/reference/steps/**`,全仓的旧路径 引用(PLAN.md / README.md / M0-gr2-reader.md 及 libgr2 的头注释)一并改正。 - CLIENT-GAP.md / CLIENT-GAP-FIX.md / BACKLOG.md / MIDREVIEW.md:把已经落地的 条目从「待办」改为已完成,删掉与代码现状矛盾的描述。 - ANDROID-TESTING.md / CLIENT-PORT.md / CLIENT-ROADMAP.md / GODOT-POC-PLAN.md / SHINSOO-WORLD-RENDERING.md / PARITY-GAP.md:同上,另补当前实际的构建/测试入口。 - THIRD-PARTY.md:补齐实际在用的第三方来源与许可说明。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJugvEJwz3FK4hw9ti3SRb
This commit is contained in:
+46
-46
@@ -1,4 +1,4 @@
|
||||
# 40250/ClientVS22 → mtgodot-poc 1:1 功能差距
|
||||
# 40250/ClientVS22 → metin2-client 1:1 功能差距
|
||||
|
||||
> 对照范围:`../40250/ClientVS22/`(40250 客户端源码及其运行时模块)以及本工程当前实现。
|
||||
> 当前工程默认运行 `MT_PROTOCOL=classic`;`extension/src/net/wire.h` 仅属于显式选择的 m2dev
|
||||
@@ -9,7 +9,7 @@
|
||||
> 渲染细节另见 `PARITY-GAP.md`,动画、材质和资产管线另见 `BACKLOG.md`,网络实现另见
|
||||
> `CLIENT-PORT.md`。
|
||||
>
|
||||
> **本文末「ClientVS22 实现细节审计(2026-09-04)」每一条的具体修改细节见
|
||||
> **本文末「ClientVS22 实现细节审计(2026-09-02)」每一条的具体修改细节见
|
||||
> [`CLIENT-GAP-FIX.md`](CLIENT-GAP-FIX.md)**(逐条给出 40250/ClientVS22 的参考
|
||||
> 源码位置、常量与算法,以及本工程要改的文件/函数;其附录 A 列出本节中
|
||||
> 需要订正的条目,分「参考行为不符 / 表述需加限定 / 低估了当前差距」三档)。
|
||||
@@ -1848,7 +1848,7 @@
|
||||
|
||||
## 结论
|
||||
|
||||
`mtgodot-poc` 已经不是早期“只能登录、移动和攻击”的骨架:登录到 PHASE_GAME、基础战斗、
|
||||
`metin2-client` 已经不是早期“只能登录、移动和攻击”的骨架:登录到 PHASE_GAME、基础战斗、
|
||||
背包 / 装备、技能 UI、任务、聊天、组队 / 好友、商店 / 交易 / 仓库、精炼,
|
||||
地图和部分特效都已有可运行首版。
|
||||
|
||||
@@ -2065,7 +2065,7 @@ enum,不存在 `namespace CG` / `namespace GC`。本文此前的“68 + 109 =
|
||||
|
||||
### 审计口径
|
||||
|
||||
本节以当前 `mtgodot-poc` 源码和 `40250/ClientVS22` 源码做静态对照,重点检查
|
||||
本节以当前 `metin2-client` 源码和 `40250/ClientVS22` 源码做静态对照,重点检查
|
||||
`UserInterface`、`GameLib`、`EffectLib`、`MilesLib`、`EterLib`、`EterGrnLib`、
|
||||
`SpeedTreeLib` 和 `PRTerrainLib` 中承担实际运行时语义的模块。
|
||||
它不是简单的功能勾选表,而是把问题分成四类:
|
||||
@@ -2091,14 +2091,14 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
角色列表保存每槽 `lAddr/wPort` 后,`M2Client.enter_game(index)` 会断开第一条游戏连接,
|
||||
按角色槽地址重连,并在 DirectEnter 的 SELECT 阶段发送 `CG_CHARACTER_SELECT`。
|
||||
`MT_CLASSIC_ENTER_DELAY` 和真实两次 TCP 连接验收仍待完成。见
|
||||
[`classic_session.cpp`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/classic/classic_session.cpp)、
|
||||
[`m2_client.cpp`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/m2_client.cpp)。
|
||||
[`classic_session.cpp`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/classic/classic_session.cpp)、
|
||||
[`m2_client.cpp`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/m2_client.cpp)。
|
||||
|
||||
2. **游戏中断线的回登录链路已接入,真实 TCP 断线仍待验收。** 已建立游戏连接后的
|
||||
Classic 失败发 `disconnected`,`AppFlow` 无条件回 LOGIN;认证 / 游戏连接建立前的失败仍发
|
||||
`login_failed`。`ReconnectUI` 已从 AppFlow 主流程移除,但独立文件仍保留作旧测试 / 可选增强。
|
||||
见 [`m2_client.cpp`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/m2_client.cpp)、
|
||||
[`app_flow.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/app_flow.gd)。
|
||||
见 [`m2_client.cpp`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/m2_client.cpp)、
|
||||
[`app_flow.gd`](/Users/shenlei/Work/mt/metin2-client/project/app_flow.gd)。
|
||||
|
||||
3. **跨服或换图的场景重建已完成首版,但还没有真实服务器验收。** Classic `GC_WARP` 已按
|
||||
`lAddr:wPort` 重连;`world_reset` 会清理旧实体、掉落物、PVP / 决斗、目标和交互窗,
|
||||
@@ -2108,11 +2108,11 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
4. **选人和进入游戏吞掉底层发送失败(已修复第一批)。** `select_char()` / DirectEnter
|
||||
选人 / `enter_game()` 现在透传 `send_fixed()` 结果,`CG_ENTERGAME` 成功后执行 flush;
|
||||
GDScript 入口优先调用 `enter_game(index)`。失败提示和真实发送失败注入仍待补充。
|
||||
见 [`classic_session.cpp`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/classic/classic_session.cpp)。
|
||||
见 [`classic_session.cpp`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/classic/classic_session.cpp)。
|
||||
|
||||
5. **客户端版本包是硬编码的。** 当前固定发送 `metin2.bin` 和旧 timestamp,未读取实际
|
||||
构建版本、文件时间或资源包版本。服务端开启版本校验时,更新客户端后仍可能被当成旧客户端。
|
||||
见 [`classic_session.cpp:335`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/classic/classic_session.cpp:335)。
|
||||
见 [`classic_session.cpp:335`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/classic/classic_session.cpp:335)。
|
||||
|
||||
6. **Passpod、HackShield、XTrap、StateChecker 等兼容路径没有实现。** 当前选择了不伪造
|
||||
这些回应;如果目标 40250 服务端启用了其中任意一项,登录或进场可能被断开。应把“不支持”
|
||||
@@ -2121,12 +2121,12 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
7. **未知包的 Loading 重同步问题已修复第一批。** 当前不再扫描后续字节寻找
|
||||
`GC_CHARACTER_ADD` 边界;未知 header 记录最近包、清空缓冲并断开,保留 `header == 0`
|
||||
填充跳过。真实加密流验收仍待完成。见
|
||||
[`classic_stream.cpp`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/classic/classic_stream.cpp)。
|
||||
[`classic_stream.cpp`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/classic/classic_stream.cpp)。
|
||||
|
||||
8. **已知但没有业务处理的包静默丢弃问题已修复第一批。** `ClassicParser` 现在记录阶段 /
|
||||
header 并返回失败,连接层清空缓冲并断开;可选集成包不会再静默成功。按阶段拆分处理表和
|
||||
全量业务覆盖仍待完成。见
|
||||
[`classic_parser.cpp`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/classic/classic_parser.cpp)。
|
||||
[`classic_parser.cpp`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/classic/classic_parser.cpp)。
|
||||
|
||||
9. **封包覆盖仍停留在结构和尺寸层。** 还需要逐包核对 sub-header、动态 body、实体状态、
|
||||
UI 消费、发送后的锁定状态、失败回滚和重连恢复,不能仅以 `Packet.h` 中存在 header 作为完成。
|
||||
@@ -2144,17 +2144,17 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
`mut_dead`、`mut_stun`、物品更新等路径遇到未知实体直接返回,没有 pending state 或重放机制。
|
||||
角色添加顺序变化时,位置、HP、死亡、动作和装备信息会丢失;`GC_SHOP_SIGN` 当前有独立的
|
||||
招牌 fallback,不能与普通 Actor 更新混为一谈。见
|
||||
[`entity_store.cpp:123`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/entity_store.cpp:123)。
|
||||
[`entity_store.cpp:123`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/entity_store.cpp:123)。
|
||||
|
||||
2. **`GC_CHAR_ADDITIONAL_INFO` 早于 Spawn 时状态不会被待合并缓存。** `mut_char_info()` 可以
|
||||
创建 / 更新 Entity,但新建时不发送 Spawn change;如果后续 Spawn 正常到达,NetWorld 仍会
|
||||
创建节点,若 Spawn 丢失或顺序异常则实体会长期只有数据没有表现层节点。见
|
||||
[`entity_store.cpp:458`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/entity_store.cpp:458)、
|
||||
[`net_world.gd:128`](/Users/shenlei/Work/mt/mtgodot-poc/project/net_world.gd:128)。
|
||||
[`entity_store.cpp:458`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/entity_store.cpp:458)、
|
||||
[`net_world.gd:128`](/Users/shenlei/Work/mt/metin2-client/project/net_world.gd:128)。
|
||||
|
||||
3. **VID 重用时旧状态可能污染新实体。** `mut_spawn()` 没有完整重置 dead、stunned、mount、
|
||||
guild、pk、alignment、parts、shop sign、affect 和上一动作状态,只覆盖了基础出生字段。
|
||||
见 [`entity_store.cpp:75`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/entity_store.cpp:75)。
|
||||
见 [`entity_store.cpp:75`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/entity_store.cpp:75)。
|
||||
|
||||
4. **点数组 API 对部分更新可能残留旧值。** `mut_set_points()` 只复制本次传入数量,不清理
|
||||
上一次更长数组的尾部;不过当前固定长度 Classic 包路径传入 `POINT_MAX_NUM`,该路径不会
|
||||
@@ -2163,7 +2163,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
5. **实体数据字段不完整。** empire、称号、公会名、公会徽章、名字颜色、alignment 颜色、
|
||||
target highlight、attackable、weapon mode、sex/job/race motion mode、affect 图标和
|
||||
剩余时间没有形成完整统一的实体状态。`mut_char_info()` 当前还明确忽略 `empire`。
|
||||
见 [`entity_store.cpp:477`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/entity_store.cpp:477)。
|
||||
见 [`entity_store.cpp:477`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/entity_store.cpp:477)。
|
||||
|
||||
6. **一次性事件没有可靠的生命周期缓存。** 聊天、脚本、特效、飞行物、任务提示等事件主要
|
||||
通过 drain queue 即时消费;如果 UI 或 GameScene 尚未完成装配,事件可能被消费后无法补发。
|
||||
@@ -2185,7 +2185,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
`isLock` / `IsUsingMovingSkill`)未过时存 `_reserved_ground` + `RESERVED_GROUND_DELAY` 0.1 s
|
||||
延迟重试(≈ `__ReserveClickGround` / `NEW_IsEmptyReservedDelayTime`),`moving_skill` 只转向。
|
||||
WASD 分支置 `_is_going = false`(≈ `NEW_MoveToDirection`)。见
|
||||
[`player_controller.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/player_controller.gd) +
|
||||
[`player_controller.gd`](/Users/shenlei/Work/mt/metin2-client/project/player_controller.gd) +
|
||||
`project/player_move_test.gd`。**增量 93 补完 Actor-Actor 碰撞 + 坐骑转向速度**:
|
||||
`player_controller._actor_blocked(next_pos)` 近似 `CActorInstance::TestActorCollision`
|
||||
(`ActorInstanceCollisionDetection.cpp`)+ `CInstanceBase::CheckAdvancing`
|
||||
@@ -2243,7 +2243,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
+ `CInstanceBase::__GetBowRange` `InstanceBase.cpp:694`)。仍未接:
|
||||
`AttackingData` / `HitPosition` 驱动的命中帧 / 硬直 / 无敌帧的真实动态圆柱扫掠(§3.5,
|
||||
当前 reach + 正面弧近似)、mount 与武器规则、服务端合法性校准。见
|
||||
[`net_play.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/net_play.gd:200)。
|
||||
[`net_play.gd`](/Users/shenlei/Work/mt/metin2-client/project/net_play.gd:200)。
|
||||
|
||||
4. **自动攻击目标预留逻辑已移植(增量 75)。** ~~当前主要是检测距离后发攻击包~~ —— `net_play.gd`
|
||||
新增 `enum ReservedMode` + `_update_auto_attack()`(照 `PythonPlayer.cpp:207`,检查目标存在 /
|
||||
@@ -2362,8 +2362,8 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
`vel.y`= `-Y`;怪物球体碰撞 / `CullingMgr.ForInRange` / 建筑体素 r=1 判定未移植(客户端
|
||||
飞行物只做命中"时机",伤害服务端裁决);无 `.fly` 数据文件加载器 → 合成箭参数。仍待:真服
|
||||
`CG_FLY_TARGETING` z 分量、`.fly` 数据文件解析。见
|
||||
[`fly_object.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/fly_object.gd) /
|
||||
[`game_scene.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/game_scene.gd)
|
||||
[`fly_object.gd`](/Users/shenlei/Work/mt/metin2-client/project/fly_object.gd) /
|
||||
[`game_scene.gd`](/Users/shenlei/Work/mt/metin2-client/project/game_scene.gd)
|
||||
`_queue_shot` / `_on_local_motion_event`。
|
||||
|
||||
7. **受击状态分裂。** ~~`EntityStore.stunned` 和 `NetPlay._hitstun_until` 是两套互不统一的状态~~
|
||||
@@ -2443,7 +2443,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
`mtnet::bounds::skill_index`(与 `use_skill` 同一谓词)。升级结果由 `GC_SKILL_LEVEL`
|
||||
经 `skills_changed` 驱动刷新,不本地伪造。`skill_test.gd` +`§3.10` 段。
|
||||
C++ **21/21** + **13** GDScript 全绿。见
|
||||
[`m2_client.cpp:961`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/net/m2_client.cpp:961)、
|
||||
[`m2_client.cpp:961`](/Users/shenlei/Work/mt/metin2-client/extension/src/net/m2_client.cpp:961)、
|
||||
参考 [`PythonSkill.cpp:1833`](/Users/shenlei/Work/mt/40250/ClientVS22/source/UserInterface/PythonSkill.cpp:1833)、
|
||||
[`CLIENT-GAP-FIX.md`](CLIENT-GAP-FIX.md) §3.10 / C.5。
|
||||
|
||||
@@ -2505,10 +2505,10 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
`game_scene` 对 `ch_type==0` 创建 `RemotePlayerView`,复用真实 `PlayerView` race / GR2 / MSA;
|
||||
远端 `EquipModel` 只消费 `awPart[ARMOR,WEAPON,HEAD,HAIR]`,`net_world` 按四字段调用 setter,
|
||||
不读取本地 `get_equipment()`。所有职业 / race、变身字段、远端真服换装和精确视觉仍待验收。见
|
||||
[`inventory_ui.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/inventory_ui.gd) /
|
||||
[`equip_rules.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/equip_rules.gd) /
|
||||
[`part_hiding.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/part_hiding.gd) /
|
||||
[`equip_model.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/equip_model.gd),详见
|
||||
[`inventory_ui.gd`](/Users/shenlei/Work/mt/metin2-client/project/ui/inventory_ui.gd) /
|
||||
[`equip_rules.gd`](/Users/shenlei/Work/mt/metin2-client/project/equip_rules.gd) /
|
||||
[`part_hiding.gd`](/Users/shenlei/Work/mt/metin2-client/project/part_hiding.gd) /
|
||||
[`equip_model.gd`](/Users/shenlei/Work/mt/metin2-client/project/ui/equip_model.gd),详见
|
||||
[`CLIENT-GAP-FIX.md`](CLIENT-GAP-FIX.md) §4.1 / C.5。
|
||||
|
||||
2. **物品拖放已有全局首版,但还不是完整原版鼠标物品态。** 已有全局持有物品、鼠标跟随图标、
|
||||
@@ -2529,7 +2529,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
`/safebox_close`(`cmd.cpp:350`,对齐原版关窗即服务器侧关闭);改密走
|
||||
`/safebox_change_password <old> <new>`(`cmd.cpp:354`,各 1..6 位)三段密码 ConfirmationDialog;
|
||||
`mall_ui.close()` 同步补 `/mall_close`。仍缺 45 格网格、分页、指定目标格、仓库内移动、重试
|
||||
限制和原版互斥规则。见 [`safebox_ui.gd:7`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/safebox_ui.gd:7)。
|
||||
限制和原版互斥规则。见 [`safebox_ui.gd:7`](/Users/shenlei/Work/mt/metin2-client/project/ui/safebox_ui.gd:7)。
|
||||
|
||||
5. **交易结束 / 失败提示已补(增量 129),事务状态仍缺。** 已核实 `GC_END` 对成功与取消发同码
|
||||
(`exchange.cpp` `EXCHANGE_END`→`Cancel()`),包级不可区分——`EntityStore.ExchangeState` 新增
|
||||
@@ -2551,7 +2551,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
置灰 + 激活守卫)、`affect_added`/`affect_removed`(affect 220 = 变身,技能槽置灰)、
|
||||
`inventory_changed`(物品槽 `get_item` 为空 / vnum==0 时置灰并显示 `×vnum`,覆盖换武器 /
|
||||
服务器回收)。仍缺特殊技能冷却。见
|
||||
[`quickbar.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/quickbar.gd)。
|
||||
[`quickbar.gd`](/Users/shenlei/Work/mt/metin2-client/project/ui/quickbar.gd)。
|
||||
|
||||
9. **组队状态是近似定义。** affect 标签仍有暂定映射,队伍技能冷却、队长权限动态变化、离线、
|
||||
死亡、距离状态和多账号行为还未完成真实验收。
|
||||
@@ -2599,8 +2599,8 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
`iConfirmEndTime` 的 `timeGetTime`、`.msc` 事件文件加载(`RUN_CINEMA` 换文件)、`MakeNextButton`
|
||||
NEXT vs DONE 文案区分 + `DoneEvent()` 回调、`camera_event_requested` / `fade_event_requested` /
|
||||
`cinema_requested` 消费端与 §7.6 相机模式对接、物品名颜色 `(1.0,0.2,0.2)`。见
|
||||
[`quest_dialog.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/quest_dialog.gd) /
|
||||
[`quest_event_test.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/quest_event_test.gd)。
|
||||
[`quest_dialog.gd`](/Users/shenlei/Work/mt/metin2-client/project/ui/quest_dialog.gd) /
|
||||
[`quest_event_test.gd`](/Users/shenlei/Work/mt/metin2-client/project/quest_event_test.gd)。
|
||||
|
||||
2. **任务日志已补 5 行窗口、滚动、默认图标、倒计时和独立 QuestButton 条带,但不是完整 Quest
|
||||
系统。** 增量 101 按参考端 `QUEST_MAX_NUM=5` 固定显示 5 行;超过 5 条滚动到离散的
|
||||
@@ -2899,13 +2899,13 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
|
||||
1. **本地角色先显示胶囊占位体。** GameScene 初始化阶段先创建 Capsule,真实角色稍后加载,
|
||||
会造成模型闪烁、相机目标高度变化、碰撞体和阴影重新挂接。见
|
||||
[`game_scene.gd:136`](/Users/shenlei/Work/mt/mtgodot-poc/project/game_scene.gd:136)、
|
||||
[`game_scene.gd:811`](/Users/shenlei/Work/mt/mtgodot-poc/project/game_scene.gd:811)。
|
||||
[`game_scene.gd:136`](/Users/shenlei/Work/mt/metin2-client/project/game_scene.gd:136)、
|
||||
[`game_scene.gd:811`](/Users/shenlei/Work/mt/metin2-client/project/game_scene.gd:811)。
|
||||
|
||||
2. **SpeedTree 仍是程序化代理。** 当前只嗅探 bark/composite 贴图,叶簇 UV 和枝干使用 proxy,
|
||||
没有真实 `.spt` 几何、leaf table、LOD、impostor、风参数和原始阴影。见
|
||||
[`tree_placeholder.cpp:190`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/tree_placeholder.cpp:190)、
|
||||
[`PARITY-GAP.md:77`](/Users/shenlei/Work/mt/mtgodot-poc/docs/PARITY-GAP.md:77)。
|
||||
[`tree_placeholder.cpp:190`](/Users/shenlei/Work/mt/metin2-client/extension/src/tree_placeholder.cpp:190)、
|
||||
[`PARITY-GAP.md:77`](/Users/shenlei/Work/mt/metin2-client/docs/PARITY-GAP.md:77)。
|
||||
|
||||
3. **EffectLib 已从粒子近似推进到 `.mde` 网格子集。** `.mse` Particle 已映射到
|
||||
`GPUParticles3D`,现在会读取首个 `TextureFiles` 的实际 `.dds`、位置、发射形状、方向 / 速度;
|
||||
@@ -2914,8 +2914,8 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
接入 SimpleLight 的范围 / 生命周期曲线和 TexAni 基础帧延迟 / 顺逆序;增量 66 接入统一的
|
||||
MovingType 直接段 / 二次 Bezier 位置曲线,并让粒子、网格、Light 共用。仍缺 TexAni 随机起始帧 /
|
||||
每粒子语义、完整 emitter advanced / cycle、完整时间轴、骨骼挂点和真实资源逐项验收。见
|
||||
[`effect_player.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/fx/effect_player.gd)、
|
||||
[`mde.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/fx/mde.gd)。
|
||||
[`effect_player.gd`](/Users/shenlei/Work/mt/metin2-client/project/fx/effect_player.gd)、
|
||||
[`mde.gd`](/Users/shenlei/Work/mt/metin2-client/project/fx/mde.gd)。
|
||||
|
||||
4. **GR2 运行时不是完整 ActorInstance。** 缺 race/weapon/sex motion mode、loop/interrupt/
|
||||
accumulation、action reservation、mount motion、武器轨迹、击退、倒地、起身和完整死亡动作。
|
||||
@@ -2926,18 +2926,18 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
|
||||
6. **材质是固定功能近似。** 缺精确 alpha-test ref、多贴图 stage、color operation、透明排序、
|
||||
角色专属光照和逐 surface 状态;sphere-map 默认 `spec_power = 0`,没有完整由装备数据驱动。
|
||||
见 [`m2_material.h:39`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/m2_material.h:39)。
|
||||
见 [`m2_material.h:39`](/Users/shenlei/Work/mt/metin2-client/extension/src/m2_material.h:39)。
|
||||
|
||||
### 7. P1/P2:地图、环境和相机
|
||||
|
||||
1. **静态地图只完整接入 Building / DungeonBlock。** Effect、Ambience、地图机关、透明物排序、
|
||||
portal/area、对象脚本状态和对象 LOD 没有完整迁移。见
|
||||
[`metin2_world.cpp:367`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/metin2_world.cpp:367)。
|
||||
[`metin2_world.cpp:367`](/Users/shenlei/Work/mt/metin2-client/extension/src/metin2_world.cpp:367)。
|
||||
|
||||
2. **Pack 资源读取没有统一。** 虽然 `AssetSource`/`PackMount` 已存在,World、terrain、tree、
|
||||
water 和 static object 仍有直接 `AssetResolver::resolve()` 的路径,散文件和 `.epk/.eix` 运行
|
||||
结果可能不同。见 [`metin2_world.cpp:380`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/metin2_world.cpp:380)、
|
||||
[`terrain_splat.cpp:133`](/Users/shenlei/Work/mt/mtgodot-poc/extension/src/terrain_splat.cpp:133)。
|
||||
结果可能不同。见 [`metin2_world.cpp:380`](/Users/shenlei/Work/mt/metin2-client/extension/src/metin2_world.cpp:380)、
|
||||
[`terrain_splat.cpp:133`](/Users/shenlei/Work/mt/metin2-client/extension/src/terrain_splat.cpp:133)。
|
||||
|
||||
3. **地形 splat 虽已支持 16 层,仍非完整固定功能复现。** alpha 含义、texture wrap/filter、
|
||||
多 stage、patch geometry LOD、skirt、patch 碰撞和 baked shadow mask 叠加规则仍未完成。
|
||||
@@ -2954,7 +2954,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
|
||||
6. **相机不是固定基线机位。** 当前依赖脚本中的 FOV、yaw、pitch、距离和 AABB 射线,缺
|
||||
`CameraProcedure` 等价模式、灵敏度持久化、平滑碰撞、树木遮挡淡出、目标 Actor 状态和可回放
|
||||
的受控机位。见 [`PARITY-GAP.md:195`](/Users/shenlei/Work/mt/mtgodot-poc/docs/PARITY-GAP.md:195)。
|
||||
的受控机位。见 [`PARITY-GAP.md:195`](/Users/shenlei/Work/mt/metin2-client/docs/PARITY-GAP.md:195)。
|
||||
|
||||
### 8. P1/P2:UI、输入和本地化
|
||||
|
||||
@@ -2968,7 +2968,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
|
||||
3. **帮助窗口已有首版,仍缺视觉等价验收。** `help_ui.gd` 已装载 `helpwindow.py` 的布局和帮助
|
||||
文案,H 键及 ESC 菜单入口已接通;仍需 `.sub` 贴图、字体描边和真分辨率视觉验收。见
|
||||
[`help_ui.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/help_ui.gd)。
|
||||
[`help_ui.gd`](/Users/shenlei/Work/mt/metin2-client/project/ui/help_ui.gd)。
|
||||
|
||||
4. **系统设置部分只是保存数值。** CPU/GPU tiling 不会改变实际渲染,BGM 更换按钮 disabled,
|
||||
部分画质设置没有完整接入渲染侧;名字颜色本身已 1:1(增量 110)、头顶称号色 / 公会名 /
|
||||
@@ -2980,7 +2980,7 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
「empire 名字颜色」开关尚未接到 `net_world.set_empire_name_mode(bool)`(默认关)、
|
||||
`EnablePKTitle` 开关尚未接到 `net_world.set_pk_title_enabled(bool)`(默认开)、
|
||||
`TextTail_SetLivingTime`(气泡停留秒数)尚无运行期钩子(默认 5000)。见
|
||||
[`system_option_ui.gd:143`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/system_option_ui.gd:143)。
|
||||
[`system_option_ui.gd:143`](/Users/shenlei/Work/mt/metin2-client/project/ui/system_option_ui.gd:143)。
|
||||
|
||||
5. **鼠标物品态和光标已有首版,复杂窗口语义仍不完整。** `mouse_controller.gd` 已提供鼠标跟随
|
||||
物品、投放到背包 / 快捷栏、无效区域 / 右键 / ESC / 失焦取消;`cursor_manager.gd` 已提供
|
||||
@@ -3152,19 +3152,19 @@ Python 脚本;文档中出现的 `assets/root/*.py` 均属于本工程迁移
|
||||
|
||||
9. **任务导航和完整资源视觉仍未完成。** 增量 101 已接入默认 / 服务端 icon、5 行滚动、倒计时和
|
||||
QuestButton 事件参数;仍缺世界箭头、屏幕边缘指示、多列定位、真实 `.sub` 状态图和服务端
|
||||
`iStartTime` 生命周期。见 [`quest_log.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/ui/quest_log.gd)。
|
||||
`iStartTime` 生命周期。见 [`quest_log.gd`](/Users/shenlei/Work/mt/metin2-client/project/ui/quest_log.gd)。
|
||||
|
||||
### 9. P1/P2:音频和应用生命周期
|
||||
|
||||
1. **地图 BGM 已有首版消费,仍缺真服 / 完整 MilesLib 验收。** `GC_MAIN_CHARACTER3_BGM` 和
|
||||
`GC_MAIN_CHARACTER4_BGM_VOL` 已路由到 `bgm_changed`,`bgm_director.gd` 按服务端名称、
|
||||
`musicInfo.fieldMusic` 回落和默认音量选曲;仍缺完整声音事件模型及真实 40250 地图验证。见
|
||||
[`bgm_director.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/bgm_director.gd)。
|
||||
[`bgm_director.gd`](/Users/shenlei/Work/mt/metin2-client/project/bgm_director.gd)。
|
||||
|
||||
2. **后台 BGM 恢复已有首版,仍缺真机验收。** `AppLifecycle` 后台保存并静音音量,回前台恢复
|
||||
音量和当前曲目状态,不再清空 `_bgm_name`;Android/iOS 前后台切换和系统回收 TCP 后的恢复
|
||||
仍未在真机验证。见
|
||||
[`app_lifecycle.gd`](/Users/shenlei/Work/mt/mtgodot-poc/project/app_lifecycle.gd)。
|
||||
[`app_lifecycle.gd`](/Users/shenlei/Work/mt/metin2-client/project/app_lifecycle.gd)。
|
||||
|
||||
3. **生命周期单一属主代码已完成,仍缺平台验收。** 生产入口由 `AppFlow` 持有唯一
|
||||
`AppLifecycle`,`GameScene` 不再创建,`M2Client` 不再直接处理应用暂停 / 恢复通知;旧
|
||||
|
||||
Reference in New Issue
Block a user