传奇服务端架构模块化拆解:DBServer到M2Server五脏六腑全解析

来源: 作者: 点击:
热血传奇服务端是一套多进程协同的分布式架构,每个进程各司其职,通过TCP长连接与共享数据库交换数据。拆解引擎控制器下的核心模块,能看清从账号验证到战斗结算的完整链路。

一、DBServer(数据库网关)
DBServer 是服务端唯一直接读写 DBC2000/HeroDB 的进程,负责把 M2Server 的内存请求翻译成数据库操作。核心功能:
• 角色管理:创建角色时校验 Sid 唯一性、名称敏感词过滤、职业与性别合法性;删除角色标记 IsDel 字段而非物理删除

• 数据加载:启动时从 Mud2\DB 加载 StdItems.db(物品库)、Magic.db(技能库)、Monster.DB(怪物库)到内存缓存,减少实时查询开销

• 读写代理:M2 请求查物品属性、存角色数据,DBServer 转发给 BDE/HeroDB,返回结果集

• 并发控制:用队列串行化写操作,防止多角色同时存盘导致数据覆盖

端口默认 5600/5601,配置在 DBSrc\DBService.ini,日志在 DBSrc\Log。

二、LoginSrv(登录网关)
处理客户端登录器的账号验证与服务器列表分发:
• 账号验证:校验用户名密码哈希(早期明文/简单异或,后期加盐),查 Account.DB 的 IsBanned/IsPay 状态

• 会话分配:验证通过后分配 SessionId,返回游戏网关(LoginGate)IP和端口,客户端跳转

• 在线统计:维护当前在线账号数,超最大连接数返回"服务器满"

• 心跳维持:每30秒检测连接存活,超时踢出释放资源

端口默认 5500/5501,配置文件 LoginSrv.ini。

三、LoginGate(登录网关/游戏网关)
客户端连接的第一道入口,负责协议解包与连接复用:
• 多路复用:单个 LoginGate 进程可承载数百客户端连接,把数据包转发给后端 M2Server

• 协议解析:拆 TCP 流为固定长度数据包(标准传奇协议头含包头标识、长度、命令字、数据体)

• 防封包攻击:校验包长度上限、命令字白名单、频率限制(每秒最多N个包)

• 负载均衡:多开 LoginGate 绑定不同端口,配合 DNS 轮询分散连接压力

端口默认 7000(游戏网关),日志在 Gate\LoginGate\Log。

四、RunGate / SalGate(游戏数据网关)
RunGate 是 M2Server 与客户端之间的数据中转层,SalGate 为备用/第二组网关:
• 加解密:传奇协议使用异或加密(早期固定密钥,后期动态密钥握手),Gate 负责解密上行包、加密下行包

• 连接映射:维护 ClientSocket ↔ UserSocket 映射表,M2 只认 UserSocket 标识

• 流量整形:限制单IP连接数、单连接发包速率,拦截异常大数据包

• 断线处理:客户端断开时通知 M2 清理对应玩家对象

端口默认 7100~7200 区间,RunGate.ini 配最大用户数和过滤规则。

五、M2Server(游戏世界核心)
M2Server 是整个服务端的大脑,承载全部游戏逻辑:
• 对象管理:维护在线玩家列表(TUserHuman 数组)、怪物实例池、NPC 脚本引擎、掉落物实体列表

• 地图引擎:加载 Mir200\Map\*.map 文件,维护每个地图的阻挡表、对象容器(按坐标索引加速视野查询)

• 战斗计算:近战命中判定(攻击-防御差值随机)、魔法伤害公式、技能 CD 与 MP 消耗、Buff/状态机

• 技能系统:解析 Magic.db 参数,执行技能效果(火墙持续伤害 tick、冰咆哮 AOE 范围判定、召唤物生命周期)

• 物品系统:背包增删查改、装备穿戴属性叠加、持久度扣减、物品绑定状态

• 任务/NPC:运行 QFunction-0.txt 触发脚本、商人 NPC 买卖逻辑、任务条件判定

• 定时任务:刷怪定时器(读 MonGen.txt)、存档定时器(默认10~15分钟自动存盘)、行会/沙城状态维护

• 视野广播:以玩家坐标为中心九宫格(或圆形半径)筛选可见对象,只向该范围内客户端发送状态更新包,大幅节省带宽

配置文件集中在 Mir200\Envir\,含 AdminList.txt(GM列表)、StartPoint.txt(出生点)、MapInfo.txt(地图属性)、Shop.txt(商城)等。

六、LogServer / LogData(日志服务)
• 记录角色登录/登出时间IP、物品流通(捡取/丢弃/交易/掉落)、金币变动、命令执行

• 聊天日志按频道分文件存储,便于回溯违规发言

• 异常日志(M2报错、Gate异常断开)单独归档,排查问题用

七、共享数据与文件交互
• Mud2\DB:角色数据 .db 文件(Hum.db/DB/DBIdx)、行会 .Guild 文件、排行榜快照

• Envir 目录:脚本(QManage.txt/QFunction-0.txt)、爆率(MonItems\*.txt)、刷怪(MonGen.txt)、商店(NpcDef/)、地图参数

• Notice 目录:M2启动公告、滚动提示、系统广播文本

• Castle 目录:沙巴克攻城状态、占领行会、税收记录

八、进程间通信拓扑

客户端 → LoginGate(7000) → LoginSrv(5500) → 返回网关地址
客户端 → RunGate(7100+) → M2Server(内部端口)
M2Server ↔ DBServer(5600) ↔ HeroDB(BDE)
M2Server → LogServer(独立端口或文件直写)

M2Server 不直接暴露给客户端,所有流量经 Gate 中转做协议清洗;DBServer 不对外监听,只接受本机/内网 M2 连接。

九、模块故障表现对照
• DBServer 未启动/红字 → M2 报"数据库连接失败",所有角色数据读写卡死,进不了游戏

• LoginSrv 异常 → 登录器报"链接服务器失败"或一直停在验证账号界面

• LoginGate 端口被占 → 客户端点登录无反应或提示"服务器未响应"

• RunGate 崩溃 → 已在线玩家全部掉线,M2 显示"用户连接断开"刷屏

• M2Server 内存溢出/死循环 → 全服卡顿、技能放不出、怪物不动,Gate 显示大量超时包

• LogServer 满盘 → 写入失败但一般不阻断游戏,仅丢日志

十、引擎控制器(GameCenter)
GEE/GOM/HERO 的 GameCenter.exe 本质是进程管理器,按顺序拉起 DBServer → LoginSrv → LoginGate → RunGate → M2Server,监控各自窗口输出,任一进程异常退出可配置自动重启。配置文件 GameCenter.ini 记录各模块路径、启动参数、自动重启开关。

这套架构把"数据存取、连接接入、逻辑运算"三层彻底分离,Gate 层挡协议攻击、DB层挡脏数据、M2 层专注玩法,单机千人在线靠加 Gate 实例和调 M2 线程参数就能撑住。