Files
metin2-client/docs/AVA2-40250-COMPARISON.md
T

190 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AVA2 与 40250 客户端差异审查
日期:2026-10-03。结论:同源引擎上的大幅功能分支,协议与数据不兼容;不是当前跨平台客户端的可直接替换升级版。
## 范围与证据边界
- AVA2 客户端:`AVA2/TEST/3. Source BIN/Client`;脚本和解包资源:`AVA2/TEST/1. Client DEV/pack_maker`。
- 40250 客户端:`40250/Server Client TMP4/ClientVS22/source`;原始 Python:`40250/Server Client TMP4/Client/Eternexus/root`。
- AVA2 服务端:只读取 `FILES+SRC.tgz`,将 Server 源码提取到 `metin2-client/build/ava2-comparison/server`,没有执行包内脚本、启动服务器或导入数据库。
- 40250 服务端:`40250/Server Client TMP4/Server/metin2/src/server`。
- 当前项目与原始 40250 分开说明:当前项目已经是 SDL3/Vulkan arm64,并有 5 页背包、中文、移动操作、自动狩猎等扩展,不能把这些算成“原始 40250 功能”。
- 用户提供的[发布帖](https://metin2hub.com/threads/ava2-org-serverfiles-and-source-full-version.1269/)主页面直接读取返回 403;搜索索引能找到同一帖标题及 2023-01-15 的发帖信息,但未据此认定功能完整性。以下功能结论来自本地源码。
- 本次完成目录清点、文件内容比较、主要编译开关及构建列表核对、重点协议/数据/碰撞/拾取路径审阅。没有逐函数证明两个客户端等价,也没有运行 AVA2 Windows 客户端。因此“源码接入”不等于“真机稳定”。
## 1. 差异规模
| 清点项 | AVA2 | 40250 | 说明 |
|---|---:|---:|---|
| 客户端 `.h/.cpp/.c/.py` 文件 | 738 | 651 | 递归清点,含备份与非活动代码 |
| 同相对路径文件 | 639 | 639 | 其中 150 个只归一化 CRLF 后完全相同,489 个不同 |
| AVA2 独有源码文件 | 99 | — | 含新增功能、反作弊、Discord、备份文件,不是 99 个功能 |
| root 顶层 Python 文件 | 162 | 74 | AVA2 新增 88 个同名比较中不存在的文件,含旧版/备份脚本 |
| AVA2 uiscript Python 文件 | 166 | — | 递归统计;未用此数量推断全部界面已启用 |
| 服务端 `.h/.cpp` 文件 | 571 | 513 | 442 个同路径文件,其中 120 个归一化后相同、322 个不同;含第三方 Lua 头文件 |
文件不同包括注释、编码、功能分支和实质逻辑;不能将 489/639 当成功能变化比例。机器可读清单在 `build/ava2-comparison`。
## 2. 底层架构:延续旧引擎,没有升级到新引擎
| 项目 | 原始 40250 | AVA2 | 当前 metin2-client |
|---|---|---|---|
| 客户端平台 | Windows C++ | Windows C++ | macOS/Android arm64 |
| 图形接口 | Direct3D 8 | 仍引用 Direct3D 8 | SDL3 + Vulkan,macOS 经 MoltenVK |
| Python | 2.7 系列 | 活动 ScriptLib 引用 Python2,头文件为 2.7.6 | 内嵌 2.7.18 |
| 构建 | Windows 工程 | Win32 工程,v142 工具链 | CMake / Android Gradle |
| 客户端二进制 | 原版 Windows 路线 | `bin_ava2.exe` 实测 PE32 Intel 80386 | 当前产物 arm64 64 位 |
| 服务端部署 | 原版 FreeBSD 路线 | README 指定 FreeBSD 11 x32 + MySQL 5.6;game Makefile 为 g++11、`-m32`、C++14 | 现有 203 为已适配 40250 服务端 |
AVA2 目录额外包含 Python22(2.2.3),但当前 ScriptLib 实际 include 指向 Python2(2.7.6);不能据目录名误认活动解释器是 2.2。工程叫 VC90/VC100 也不能直接认定当前工具集版本,活动 vcxproj 里是 v142。
证据:[EterLib/StdAfx.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/EterLib/StdAfx.h:23>); [ScriptLib/StdAfx.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/ScriptLib/StdAfx.h:12>); [UserInterface/UserInterface_VC90.vcxproj](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/UserInterface_VC90.vcxproj:38>); [game/src/Makefile](</Users/shen/Work/Code/Metin2/metin2-client/build/ava2-comparison/server/game/src/Makefile:33>)
## 3. 协议:基础编号已经不同
| 封包 | 40250 | AVA2 |
|---|---:|---:|
| CG_ATTACK | 2 | 225 |
| CG_CHAT | 3 | 231 |
| CG_ITEM_DROP | 12 | 224 |
| CG_USE_SKILL | 52 | 233 |
| CG_FISHING | 82 | 222 |
| CG_STATE_CHECKER | 206 | 94 |
上述 AVA2 attack/chat/skill/state 数字在其服务端 packet.h 中也有对应定义。这不是只有客户端 UI 的改动。
原始头文件文字扫描:AVA2 找到 267 个显式赋值的 CG/GC 名称,40250 为 217;同名 6 个编号改变,AVA2 独有名称 51 个。此统计含条件关闭的声明,而且不能替代预处理后的实际封包注册表。
新增代表:离线商店 CG57/58、商店搜索 CG143、洗属性 CG171、肩带 CG211、副本信息 CG213、掉落信息 CG215、合成 CG216、日历 CG220、战令 CG230、批量拾取 CG235;相应新增 GC 返回包。关闭的 combat zone/CShield/element spell 也有声明,不能全部当成活动功能。
加密同样不同:40250 `ServiceDefs.h` 开启 `_IMPROVED_PACKET_ENCRYPTION_`;AVA2 客户端与服务端 service.h 都将它注释掉,AccountConnector 中保留并选择旧的 `SetSecurityMode` 分支。当前跨平台项目使用的 DH2/CTR 路线不能原样接 AVA2。
证据:[UserInterface/Packet.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/Packet.h:33>); [UserInterface/Packet.h](</Users/shen/Work/Code/Metin2/40250/Server Client TMP4/ClientVS22/source/UserInterface/Packet.h:31>); [EterBase/ServiceDefs.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/EterBase/ServiceDefs.h:4>); [EterBase/ServiceDefs.h](</Users/shen/Work/Code/Metin2/40250/Server Client TMP4/ClientVS22/source/EterBase/ServiceDefs.h:4>); [UserInterface/AccountConnector.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/AccountConnector.cpp:245>)
## 4. 相同编号的封包,也可能完全不同
| 结构/常量 | 40250 | AVA2 | 影响 |
|---|---|---|---|
| `TPacketGCPoints.points` | Windows 32 位 long | long long | 属性数组元素变 8 字节 |
| `TPacketGCPointChange` | amount/value 为 long | amount/value 为 long long | 同名同编号不能照原长度分帧 |
| `TPacketGCItemSet2.count` | BYTE | DWORD | 物品数量字段扩宽 |
| 物品 socket 数组 | 3 | 8 | 结构长度、特殊物品 socket 索引变化 |
| 物品属性数组 | 7 | 15 | 网络/数据库/角色物品结构变化 |
| 物品附加字段 | 无 AVA2 扩展 | glove randomAttr[7]、自定义 name[25] 等 | 依启用开关继续变长 |
| `TPacketGCDead` | header + vid | 增加复活类型数组 | 死亡/复活处理变化 |
| 每账号角色 | 4 | 开关启用后 5 | 选角数组与登录成功包改变 |
| 金钱/交易/商店价格 | 32 位相关字段 | 多处 long long | 必须连同 DB、Python 接口和格式化迁移 |
**15 个属性数组不等于每件装备能正常洗出 15 条普通属性**:AVA2 仍定义普通 5 条、稀有 2 条,另外扩展槽的用途要按对应系统检查。**8 个 socket 也不等于能镶 8 颗石头**;唯一物品计时等也使用 socket。
证据:[UserInterface/Packet.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/Packet.h:2133>); [UserInterface/Packet.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/Packet.h:2275>); [UserInterface/GameType.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/GameType.h:536>); [UserInterface/GameType.h](</Users/shen/Work/Code/Metin2/40250/Server Client TMP4/ClientVS22/source/UserInterface/GameType.h:299>); [UserInterface/Packet.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/Packet.h:1833>)
## 5. 背包、装备与角色成长
| 项目 | 原始 40250 | AVA2 |
|---|---|---|
| 背包 | 2 页、90 格 | 开启扩展,4 页、180 格 |
| 特殊收纳 | 原版背包/龙魂/腰带等 | 新增专门收纳窗口与特殊库存常量 |
| 装备 | 原版身体/武器/首饰等,预留 32 槽 | 肩带及肩带时装、武器/坐骑时装、手套、护符、宠物槽、发光槽、坐骑皮肤等 |
| 服务端装备槽上限 | 32 | 新增槽后枚举至 36;需要核对客户端映射,不可依注释复制 |
| 普通等级源码上限 | 120 | 250 |
| 征服者等级 | 无此分支 | 宏开启,源码上限 30,Sungma/Yohara 相关字段 |
| 龙魂 | 原版等级体系 | 增加神话等级、洗属性和效果控制 |
| 货币上限常量 | 2,000,000,000 | 2,000,000,000,000,000LL |
| 技能 | 原版 | 7/8 技能扩展、额外元素相关字段 |
这里是源码常量,不代表打包服实际经验表、任务或地图支持玩家练到 250。当前 metin2-client 已是 5 页、225 格,**AVA2 的默认 4 页并不是对当前项目的背包容量升级**。
客户端 `CItemData::WEAR_MAX_NUM` 仍显式写 32,但服务端 wear 枚举新增项后到 36,客户端也存在独立的新装备计数/槽映射。此处需要专项逐槽核对;静态看到差异不能直接宣称已产生越界。
证据:[UserInterface/GameType.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/GameType.h:44>); [common/length.h](</Users/shen/Work/Code/Metin2/metin2-client/build/ava2-comparison/server/common/length.h:84>); [common/length.h](</Users/shen/Work/Code/Metin2/metin2-client/build/ava2-comparison/server/common/length.h:113>); [GameLib/ItemData.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/GameLib/ItemData.h:495>); [common/length.h](</Users/shen/Work/Code/Metin2/metin2-client/build/ava2-comparison/server/common/length.h:309>)
## 6. 新增玩法系统及接入证据
下表比较的是原始 40250;现有项目自定义扩展另算。
| 系统 | AVA2 证据 | 状态/边界 |
|---|---|---|
| 离线商店、跨商店搜索 | 客户端 PythonPrivateShopSearch / uiofflineshop;服务端 offlineshop_manager/search;DB ClientManagerOfflineshop | 客户端/服务端宏开启,必须迁移 DB 表和协议 |
| 自动洗属性 switchbot | PythonSwitchbot、uiswitchbot;服务端 new_switchbot;CG/GC171 | 有真实编译接入,不是只有脚本 |
| 5+2 属性加成操作、属性锁定/复制 | __BL_67_ATTR__、ENABLE_LOCK_ATTR、ENABLE_COPY_ATTR_ITEM,uiAttr67Add | 不等于扩展数组每一槽都有普通洗属性入口 |
| Wiki / 掉落查询 / 宝箱预览 | PythonWiki、PythonDropItem、uiwiki、uiChestDrop,target/drop 包 | 依赖资料和服务端返回,不是界面贴图即可 |
| 模型预览 | CPythonRenderTargetModule、EterLib CRenderTarget、uirendertarget | 需要离屏渲染、相机和资源绑定 |
| 副本资料/计时/排名 | PythonDungeonInfo、dungeon_info、uidungeoninfo | 服务端和 Python 互相依赖 |
| 战令 Battle Pass | PythonBattlePass、uibattlepass、battlepass、questlua_battlepass | 宏开启并加入构建 |
| 生物学家任务 UI | biolog、uibiyolog / uiprofessionalbiolog | 扩展任务及网络/UI 配合 |
| 宠物成长、孵化、喂养、技能 | New_PetSystem、PythonSkillPet、多个宠物 UI | 比原版 PetSystem 更丰富;包里也有 old/copia 版本,不能全算启用 |
| 肩带吸收/时装 | PythonSash、uisash、服务端 __SASH_SYSTEM__ | 增加物品、装备槽和封包 |
| 日历、活动、帝国战争 | char_event_calendar、new_events、uicalendar/uikingdomswar | 多种活动实现并存,需确认实际入口 |
| 小游戏 | fishgame、Catch King,对应脚本/包/宏 | 普通钓鱼也改了包头 |
| 新副本内容 | Meley、Zodiac、船防御相关宏及源码/资源 | 静态存在,不等于每个副本任务流程已实测 |
| 便捷操作 | 换线、批量精炼、合成改版、反经验、自选技能、装扮隐藏、装备切换、排序 | 有独立宏/源码/脚本,迁移复杂度不同 |
| Discord | discord_rpc、ENABLE_DISCORD_RPC | 活动宏开启,但 app ID 配置值为 0,不能称现成可用集成 |
| 银行/支援/狼人与战斗区 | 代码或脚本存在 | 开关不一致或关闭,不能列为无条件可用功能,见后文 |
证据:[UserInterface/Locale_inc.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/Locale_inc.h:86>); [UserInterface/UserInterface.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/UserInterface.cpp:697>); [UserInterface/UserInterface_VC90.vcxproj](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/UserInterface_VC90.vcxproj:361>); [game/src/Makefile](</Users/shen/Work/Code/Metin2/metin2-client/build/ava2-comparison/server/game/src/Makefile:156>)
## 7. 与近期自动狩猎问题直接相关的差异
### 7.1 敌对怪物碰撞被忽略
AVA2 启用 `ENABLE_MOBS_WITHOUT_COLLISIONS`。`CActorInstance::IsIgnoreCollision` 对 enemy 返回 TRUE,也对特定 race 和 campfire 返回 TRUE;InstanceBaseBattle 的角色碰撞检测在这个返回值为真时跳过该 actor。
这会让客户端移动不被敌对怪群实体碰撞阻挡,是更改基础碰撞规则;我们的当前优化保留碰撞,通过近身清怪、拾取抢占和停止补拉解围。这两个方案的手感与语义不同,不能将 AVA2 的开关称作同一套自动狩猎修复。它也不代表忽略墙、地图阻挡或所有服务器校验。
### 7.2 自动拾取是批量协议扩展
AVA2 的 `CPythonPlayer::SendPickUPItemPacket` 收集物品 VID,500 ms 节流、过滤归属后调用 `SendItemsPickUpPacket`,新增 CG235。它不同于当前项目基于单个物品、路径、预约和超时的拾取。
本次没有找到与当前项目同名的完整 `AutoHunt` 状态机;原版已有的 `__Update_AutoAttack` 不能当成新增完整挂机系统。自动拾取、技能流派选择、自动洗属性也不等于具备当前自动狩猎的引怪、寻路、恢复和配置能力。进一步核对 `uiautoskill.py`:其窗口仅在技能流派尚未选择时打开,按钮发送选择流派命令;`ENABLE_AUTO_SELECT_SKILL` 不是自动循环施法。
证据:[GameLib/ActorInstanceCollisionDetection.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/GameLib/ActorInstanceCollisionDetection.cpp:777>); [UserInterface/InstanceBaseBattle.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/InstanceBaseBattle.cpp:524>); [UserInterface/PythonPlayer.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/PythonPlayer.cpp:1510>)
## 8. 资源、Python 与渲染
- AVA2 活动 `USE_FOX_FS` 走 FoxFS API(FoxFS_Create/LoadA/GetA),包索引按每行一个包名读取;包里提供 FoxFS Windows `.lib`,本地 pack 名称也不走普通成对 EIX/EPK 清单。这是当前 EPK 加载器不能直接替换的依赖。
- 存在大量已解包目录,因此可以挑选资源复用;没有必要为了导入一个模型就先移植 FoxFS。
- pack_maker 清点得到 45 个资源目录、93,874 个文件,含重复/备份、工具或压缩文件,不是 93,874 个独立游戏资产。
- 增加 Yohara/征服者地图、Zodiac、Meley、新宠物、装扮、离线商店、掉落查询、新选角等资源目录。目录存在不等于所有模型格式都经过当前 libgr2 验证。
- Python root 仍用 Python 2 语法和 `app/net/player/item` 一类原版 C++ 模块,但接口已扩展;复制整个 root 会遇到缺少 C++ 方法、常量、封包和数据等问题。
- ItemManager 支持 MIPX/MIPT 和结构自动检测,PythonNonPlayer 也有 mob_proto 结构兼容分支;这些是 proto 表结构转换能力,**不是服务器协议自动兼容能力**。
- EterLib 仍 D3D8,新增 offscreen RenderTarget,用于 Wiki/商店/NPC 模型预览;大量闪光、特效、缩放和显示选项属于旧引擎扩展,没有证据表明换成现代渲染引擎。
证据:[UserInterface/UserInterface.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/UserInterface.cpp:547>); [EterPack/EterPackManager.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/EterPack/EterPackManager.cpp:299>); [GameLib/ItemManager.cpp](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/GameLib/ItemManager.cpp:269>); [system.py](</Users/shen/Work/Code/Metin2/AVA2/TEST/1. Client DEV/pack_maker/root/system.py:62>)
## 9. 数据库与文件包的区别
`MYSQL56.tgz` 实际主要是 MySQL 数据目录备份,不是通用 SQL 导出:清点 252 个 `.frm`、193 对 `.MYI/.MYD`、5 个 `.ibd` 等。存在 `offline_shop_item/npc/search/log`、`battle_pass`、`new_petsystem`、`ranking_dungeon`、`date_dungeon`、`itemshop` 等表。
因此不能简单把它当 `.sql` 导入现有 MySQL 8,更不能覆盖当前账号/人物/物品数据库。选移功能时应从源码 SQL 读写和隔离的原运行环境还原 schema,编写逐表迁移。当前版本没有导入、启动或验证该备份,表名清点不代表 schema 已校验。
AVA2 item/proto/player 表还需要匹配 8 sockets、15 attrs、glove randomAttr、long long gold、conqueror 等结构。我们当前给“11”配置的 7 条属性和 +6 石头无需因比较而修改;本次未连接 203。
## 10. 打包源码中的不一致与未确认项
1. 客户端 `ENABLE_WOLFMAN_CHARACTER` 注释,服务端 CommonDefines.h 开启。该静态配置不一致值得检查,不能直接宣布狼人在提供的 exe 中可玩。
2. 客户端 `ENABLE_MANAGER_BANK_SYSTEM` 开启,服务端对应宏注释。不能把银行当作已经两端一致启用的系统。
3. 客户端 `ENABLE_SUPPORT_SYSTEM` 注释,服务端开启;角色支援代码/脚本存在,但入口和最终二进制需要核对。
4. CShield 的宏关闭,但旧保护组件、相关静态库、反作弊源码仍在;移植时要检查活动构建,不宜按文件名一律迁移。
5. 有 `oldrendertarget`、`*_old.py`、`- Copy.cpp`、`copia`、多套商城/宠物/离线商店实现。文件数量不能当系统数量。
6. `Locale_inc.h` 有 `ENABLE_HIGHLIGHT_SYSTEM // disabled because its bug` 这样的注释与开关状态矛盾,表明注释不能替代实际预处理结果。
7. 未证明提供的 Windows exe 与这份 vcxproj/宏是同一次构建;源码宣告功能与成品实际功能要区分。
8. 未做双方 GR2/地图/EPK-FoxFS 格式全量交叉读取、逐技能数值比较、任务语料比较或性能测量;不能据系统更多推断更稳定、更快、更省电。
证据:[UserInterface/Locale_inc.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/Locale_inc.h:131>); [common/CommonDefines.h](</Users/shen/Work/Code/Metin2/metin2-client/build/ava2-comparison/server/common/CommonDefines.h:99>); [UserInterface/Locale_inc.h](</Users/shen/Work/Code/Metin2/AVA2/TEST/3. Source BIN/Client/UserInterface/Locale_inc.h:155>); [common/CommonDefines.h](</Users/shen/Work/Code/Metin2/metin2-client/build/ava2-comparison/server/common/CommonDefines.h:171>)
## 11. 对当前项目的迁移建议
| 目标 | 建议 | 主要依赖 |
|---|---|---|
| 只想改善打怪体验 | 保留当前主线;按需要评估是否采用“怪物无碰撞”作为单独玩法变更 | 碰撞规则和真服移动验证 |
| 换地图、怪物、特效、装扮 | 先离线导入少量已解包资源 | 资源读取、race/MSM/MSA、proto、挂点 |
| Wiki、宝箱掉落、副本资料 UI | 适合分模块引入 | 服务端查询、Python 接口、UI 和数据 |
| 模型预览 | 可移植,改写 D3D 离屏渲染为现有 Vulkan 目标 | 相机、RT、材质和 UI 合成 |
| 换线、批量精炼、自动洗属性 | 分别立功能,不搬整个 AVA2 root | 服务端处理、封包、状态安全与 UI |
| 离线商店、宠物成长、肩带、征服者/手套/护符 | 重型系统迁移,需要独立设计和验收 | 协议、DB、数值、资源、逻辑和 UI 全链 |
| 直接连接 AVA2 服务器 | 单独协议后端或专用分支 | 旧加密、包号/长度、角色/物品/金钱、Python 接口 |
| 将 AVA2 当作新底座替换当前项目 | 不建议直接替换 | 会重新承担 Win32→arm64、专有库、运行时和完整回归成本 |
最合理的用法:把 AVA2 当作功能及资源参考库,选择少数实际需要的系统逐个移植。若目标是完整兼容 AVA2,按“另一套客户端/服务端协议项目”估算,不能当成替换几个脚本的升级。