20 KiB
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 功能”。
- 用户提供的发布帖主页面直接读取返回 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; ScriptLib/StdAfx.h; UserInterface/UserInterface_VC90.vcxproj; game/src/Makefile
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; UserInterface/Packet.h; EterBase/ServiceDefs.h; EterBase/ServiceDefs.h; UserInterface/AccountConnector.cpp
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; UserInterface/Packet.h; UserInterface/GameType.h; UserInterface/GameType.h; UserInterface/Packet.h
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; common/length.h; common/length.h; GameLib/ItemData.h; common/length.h
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; UserInterface/UserInterface.cpp; UserInterface/UserInterface_VC90.vcxproj; game/src/Makefile
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; UserInterface/InstanceBaseBattle.cpp; UserInterface/PythonPlayer.cpp
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; EterPack/EterPackManager.cpp; GameLib/ItemManager.cpp; system.py
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. 打包源码中的不一致与未确认项
- 客户端
ENABLE_WOLFMAN_CHARACTER注释,服务端 CommonDefines.h 开启。该静态配置不一致值得检查,不能直接宣布狼人在提供的 exe 中可玩。 - 客户端
ENABLE_MANAGER_BANK_SYSTEM开启,服务端对应宏注释。不能把银行当作已经两端一致启用的系统。 - 客户端
ENABLE_SUPPORT_SYSTEM注释,服务端开启;角色支援代码/脚本存在,但入口和最终二进制需要核对。 - CShield 的宏关闭,但旧保护组件、相关静态库、反作弊源码仍在;移植时要检查活动构建,不宜按文件名一律迁移。
- 有
oldrendertarget、*_old.py、- Copy.cpp、copia、多套商城/宠物/离线商店实现。文件数量不能当系统数量。 Locale_inc.h有ENABLE_HIGHLIGHT_SYSTEM // disabled because its bug这样的注释与开关状态矛盾,表明注释不能替代实际预处理结果。- 未证明提供的 Windows exe 与这份 vcxproj/宏是同一次构建;源码宣告功能与成品实际功能要区分。
- 未做双方 GR2/地图/EPK-FoxFS 格式全量交叉读取、逐技能数值比较、任务语料比较或性能测量;不能据系统更多推断更稳定、更快、更省电。
证据:UserInterface/Locale_inc.h; common/CommonDefines.h; UserInterface/Locale_inc.h; common/CommonDefines.h
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,按“另一套客户端/服务端协议项目”估算,不能当成替换几个脚本的升级。