C#热血传奇服务端OpenMir2及LyoMir2再度开源更新架构拆解

来源: 作者: 点击:
C# 重写的热血传奇服务端近期持续迭代,主力项目集中在 OpenMir2(mirbeta / gh_mirrors 主线)与 LyoMir2(AndrewChien 系,dotnet8.0 + AOT)两条线,均彻底抛弃传统 Delphi 单进程 M2Server 模型,转用 .NET 多服务进程 + 三层网关架构,兼容原版 1.76 客户端与 Data/Map/Wav 资源结构 。

一、OpenMir2 本次更新核心落点
• 运行栈推进:主线程由 .NET 6/7 向 .NET 8 对齐,GameSrv 工程开启 AOT 预编译、禁用 Server GC 与并发 GC、关闭分层编译、单文件发布裁剪,降低高并发下 GC 暂停 。

- 服务拆分固化:src 目录下独立 csproj 包括 DBSrv、LoginSrv、GameSrv、LoginGate、SelGate、GameGate、BotSrv、ChatSrv;DBSrv 存储抽象接口 IPlayDataStorage 落地,MySQL(PlayRecordStorage)与 MongoDB(PlayDataStorage)可插拔切换 。
- 网络层换血:弃用老 Indy/IOCP 封装,接入 TouchSocket 高性能 TCP,自定义 ServerPacketFixedHeaderDataHandlingAdapter 做封包分帧,GameGate 内部 SessionContainer 支持万级并发会话,ClientMessageWorkThread 多线程并行解包 。
- 逻辑模块化解耦:GameSrv 内 M2Server 核心库拆出 SystemModule(ActorMgr、WorldEngine)、ScriptSystem(NPC/任务脚本)、CommandSystem(GM 命令)、MarketSystem(拍卖/行会)、RobotSystem(机器人)、PlanesSystem、ChatSystem、EventLogSystem 。
- 脚本与数据兼容:Envir 目录 StdItems、Magic、Monster、MapQuest、Market_Def、QuestDiary 沿用原版格式;NPC 脚本引擎重写,支持原 @段、#IF/#ACT 语义,新增 C# 侧钩子扩展 。
- 构建交付:GitHub Actions 对 master/dev 分支打 tag v* 自动 dotnet publish 出自包含包(DBSvr.zip / LoginSrv.zip / GameSrv.zip / LoginGate.zip / SelGate.zip / GameGate.zip),standard-version 生成 CHANGELOG,Conventional Commits 规范提交 。

二、LyoMir2 / LyoMir2Client 并行更新
• 服务端 LyoMir2:dotnet8.0 C# 重写,基于淡抹夕阳 06 年代码结构迁移,保留 Mir2 原生命周期;配套 LyoMirWorld(传奇世界 C# 端)、LyoConsole(多控制台一键启停管理器) 。

- 客户端 LyoMir2Client:dotnet8.0 + AOT,渲染层接 VorticeDX11 / D3D11,直接吃原版周年客户端 Data/Map/Wav 资源,双击 exe 进游戏;协议层 MirClient.Protocol 与原版 LoginGate 7000 / SelGate 7100 / GameGate 7200 对齐 。
- 授权:GPL-3.0 / MIT 双线,配套资源与补丁走社区群分发,源码全公开 。

三、三层网关数据流向(本次架构未变)
1. 客户端 TCP → LoginGate(7300 段)→ LoginSrv(5500 段):账号校验、注册、列表下发 。
2. 选角阶段 → SelGate(7200 段)→ DBSrv:角色增删查、装备/仓库/技能读取 。
3. 进图阶段 → GameGate(7100 段)→ GameSrv(5600 段):移动、战斗、技能、NPC、掉落、行会、攻城 。
DBSrv 落库 MySQL/MongoDB,GameSrv 不直连客户端,所有流量必须穿透网关,延续官服抗连接压力设计 。

四、编译与启动顺序(更新后依旧)
• 环境:.NET SDK 6.0+(推荐 8.0),MySQL 8.0,Git,VS2022 / Rider 。

- 拉源:git clone https://gitcode.com/gh_mirrors/op/OpenMir2 → 开 OpenMir2.sln → 还原 NuGet → 编整解 。
• 建库:sql/ 下 mir2_db.sql / mir2_account.sql / mir2_data.sql 顺序入 MySQL,库名 mir2 。

- 改配置:各 csproj 输出目录 appsettings.json 写连接串、内网地址、端口;单机锁 127.0.0.1 。
• 启动:DBSrv → LoginSrv → GameSrv → LoginGate → SelGate → GameGate,1.76 纯净客户端 Mir2.ini 指向 127.0.0.1:7000 。

五、相较老 Delphi 端实质差异
• 指针/结构体改为托管对象:PlayObject、MonsterObject、NormNpc 走 C# class + Span<T> 热路径,去掉 BDE/DBC2000 依赖 。

- 多进程替代单 M2Server:某网关崩不影响逻辑层,水平扩容只加 GameGate 实例 。
• 脚本系统双轨:原 Envir 文本脚本保留,新增 C# Attribute 路由命令(@Make / @Map / @MobPlace 可重载) 。

- 跨平台:Linux 下 dotnet DBSrv.dll 起服务,网关端口 iptables 放行即可,不再绑 Windows 消息循环 。

六、同源其他活跃仓
• HeroM2(Gitee,yeningning):C# 重制 M2 引擎,兼容原数据结构,多机负载/跨服切换实验中,木兰宽松许可 。

- LyoMirWorld:传奇世界 C# 服务端分支,复用 LyoMir2 核心 WorldEngine 。
更新主仓地址:https://gitcode.com/gh_mirrors/op/OpenMir2 、https://github.com/mirbeta/OpenMir2 、AndrewChien/LyoMir2 。