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

20 KiB
Raw Blame History

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. 打包源码中的不一致与未确认项

  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; 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,按“另一套客户端/服务端协议项目”估算,不能当成替换几个脚本的升级。