快速部署传奇游戏服务器:OpenMir2 实战指南
【免费下载链接】OpenMir2Legend of Mir 2 Game server项目地址: https://gitcode.com/gh_mirrors/op/OpenMir2
OpenMir2 是一个用 C# 编写的传奇 2 游戏服务器,基于早期 Delphi 版服务端逻辑重写,把账号、角色、游戏引擎拆成 6 个独立进程,让你能在一台普通机器上跑起一套完整的传奇游戏服务器,也适合想学习 MMORPG 后端(多人在线角色扮演游戏后端)架构的开发者。项目托管在 gitcode,支持用 .NET 8 SDK 直接编译运行。
第一步:把它跑起来 🚀
按下面四步走,每一步都有验证方法。
- 环境准备:安装 .NET 8 SDK(仓库的
global.json固定了 8.0.0,允许向上滚动大版本)、MySQL 5.7 以上、Git。验证:终端执行dotnet --version,输出 8.x 即通过。 - 获取代码:执行下面命令拉取仓库并还原依赖。
git clone https://gitcode.com/gh_mirrors/op/OpenMir2 cd OpenMir2 dotnet restore验证:dotnet build OpenMir2.sln编译通过、无报错。 3.初始化数据:sql/ 目录下有三个脚本,依次导入 MySQL:mir2_db.sql(角色表,如characters)、mir2_account.sql(账号表)、mir2_data.sql(交易、掉落等数据表)。验证:SHOW TABLES能看到characters、account等表。 4.启动服务:6 个服务按依赖顺序启动:DBSrv(数据库服务)→ LoginSrv(账号服务)→ GameSrv(游戏服务)→ GameGate(游戏网关)→ SelGate(角色网关)→ LoginGate(登录网关)。每个服务在其目录下执行dotnet run即可,例如 src/GameSrv/。验证:各进程控制台无异常输出,再用客户端连上 LoginGate 的端口,能看到登录界面。
第二步:看懂它怎么工作 🧩
跟着"登录 → 认证 → 选角 → 进游戏"这条主线,各服务的分工就清楚了:
- 客户端先连LoginGate(
src/LoginGate/),它只做转发,把登录、注册请求交给LoginSvr(src/LoginSrv/),账号和密码存在mir2_account库。 - 认证通过后进入选角界面,此时客户端连SelGate(
src/SelGate/)。建角、删角操作由它转给DBSvr(src/DBSrv/),角色数据读写mir2_db库的characters表。 - 点"进入游戏"后,连接切换到GameGate(
src/GameGate/),它负责收发包和基础过滤;真正处理走路、攻击、施法的是GameSrv(src/GameSrv/)。 - 游戏的核心逻辑不写在 GameSrv 里,而在它引用的 src/M2Server/ 工程中:
Actor/是角色对象,Monster/Monsters/是上百种怪物 AI,Maps/负责地图与寻路,Player/处理玩家行为。GameSrv 的Word/Threads/下还按线程拆分了用户、怪物、商店等处理器。 - 离线时,GameSrv 把角色数据交回 DBSvr 落库,下次上线再读回来——整条链路闭合。
第三步:调成你喜欢的样子 ⚙️
性能调优
各服务配置集中在自己目录的appsettings.json(如 src/GameGate/appsettings.json),日志统一用 Serilog 输出到控制台,可选写到 Seq 日志服务(默认地址localhost:5341)。常用调节点如下:
| 调整项 | 位置 | 说明 |
|---|---|---|
| 日志级别 | 各服务appsettings.json的LogLevel | 生产环境把Debug调回Information,减少 IO |
| 日志输出 | 同文件Serilog.WriteTo | 不用 Seq 可删掉对应项,只留 Console |
| .NET 版本 | 根目录global.json | 默认 8.0.0,改rollForward可换运行时 |
| 存储后端 | src/Storeages/ 各项目 | 换后端后重新编译 DBSrv |
另外根目录有nlog.config,用于部分组件的 NLog 输出,需要集中管理日志时一并处理。
功能扩展
- 加地图、加怪物:地图结构在
src/M2Server/Maps/(含MapPoint、寻路),怪物在src/M2Server/Monster/Monsters/,每个怪物一个类,继承MonsterObject即可定制 AI。 - 加游戏模块:src/Modules/ 下是可插拔模块,聊天(ChatSystem)、交易(MarketSystem)、GM 指令(GameCommand)、压测机器人(RobotSystem)、脚本引擎(ScriptEngine)都在里面。新模块照
ModuleInitializer.cs的模式写注册入口。 - 加管理员指令:
src/Modules/GameCommand/Commands/每个指令一个文件,仿照现有AddGoldCommand等类实现。 - 换存储后端:
src/Storeages/下已有 MySQL、MongoDB、Sqlite、本地文件四套实现,让 DBSrv 引用其中一个即可切换玩家数据的落地方式。
出问题时的处理路径 🛠️
- 现象:某个服务启动即退出。原因:数据库没起、库表没导、账号密码不对。解法:先用客户端工具手动连一遍 MySQL,再按上一步顺序重跑 SQL 脚本。
- 现象:客户端卡在登录界面。原因:6 个服务漏启动,或 LoginGate 端口被占用。解法:对照启动顺序逐个补起;用
ss -lntp或netstat查端口占用,改冲突服务的端口配置。 - 现象:选角界面一个角色都没有。原因:
mir2_db没导数据,或角色不属于该服。解法:确认characters表有记录,且LoginID与账号库对得上。 - 现象:挂机一段时间后再上线,装备金币丢了。原因:角色数据没落库,DBSrv 写库失败。解法:检查 DBSrv 引用的存储后端能否正常写,看控制台是否有异常堆栈。
- 现象:人多的地图明显卡顿。原因:同屏怪物过多、处理线程压力大。解法:调低刷新密度,必要时用 RobotSystem 压测定位瓶颈后再加机器或拆分地图。
从登录认证到怪物刷新的完整链路都在 src/ 里,源码结构清晰,是阅读 C# 游戏服务端的合适材料。遇到问题可在项目仓库提 Issue 或提交 PR 交流。
【免费下载链接】OpenMir2Legend of Mir 2 Game server项目地址: https://gitcode.com/gh_mirrors/op/OpenMir2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考