传奇OpenMir2服务器完整部署指南:从源码编译到服务启动

来源: 作者: 点击:
OpenMir2是基于C#开发的开源传奇2游戏服务器框架,项目源自对网络泄露Delphi代码的翻译与重构,托管在GitHub公共存储库。这套框架采用现代分布式架构设计,将传统单体服务拆解为多个独立模块,支持1.10至1.76版本的核心游戏功能。下面从环境准备、源码编译、数据库配置到服务启动,按操作顺序拆解整个部署流程。

### 环境准备与源码获取

部署OpenMir2之前,需要在本地搭建开发环境。推荐使用Visual Studio 2022或Visual Studio Code作为集成开发环境,安装.NET Core SDK 6.0及以上版本,数据库选用MySQL 8.0,版本控制工具使用Git。

通过Git将项目源码克隆到本地工作目录:

```
git clone https://github.com/mirbeta/OpenMir2.git
cd OpenMir2
```

项目采用模块化架构,主要目录结构包含src/目录存放核心服务代码,sql/目录存放数据库初始化脚本,OpenMir2.sln为Visual Studio解决方案文件。使用Visual Studio打开解决方案文件后,系统会自动还原NuGet依赖包,也可通过命令行手动执行还原与编译:

```
dotnet restore OpenMir2.sln
dotnet build OpenMir2.sln -c Release
```

编译成功后,各服务模块的可执行文件生成在对应项目的bin/Release/net6.0/目录下。

### 数据库配置与初始化

OpenMir2采用分层存储设计,通过DBSrv模块作为数据访问层,使用ADO.NET连接MySQL数据库处理所有数据持久化操作。数据库配置分为两个步骤:执行初始化脚本和修改连接参数。

进入项目根目录下的sql文件夹,按顺序执行三个SQL脚本:

```
mysql -u root -p
CREATE DATABASE mir2;
USE mir2;
SOURCE sql/mir2_db.sql; -- 创建数据库结构
SOURCE sql/mir2_account.sql; -- 初始化账号系统
SOURCE sql/mir2_data.sql; -- 导入游戏基础数据
```

脚本执行顺序不能颠倒,mir2_db.sql定义玩家数据、物品信息等核心表结构,mir2_account.sql创建默认管理员账号和测试账号,mir2_data.sql导入物品、怪物等基础游戏数据。

数据库脚本执行完成后,编辑src/DBSrv/appsettings.json文件,配置数据库连接字符串:

```json
{
"ConnectionStrings": {
"Default": "server=localhost;port=3306;database=mir2;uid=root;pwd=yourpassword;charset=utf8mb4;Allow User Variables=True"
},
"DbType": "MySql",
"PoolSize": 20,
"ConnectTimeout": 30
}
```

server和port参数根据实际数据库地址调整,uid和pwd替换为正确的数据库用户名和密码。添加Allow User Variables=True参数可避免存储过程中变量使用问题。

### 服务模块启动顺序

OpenMir2采用微服务架构,各服务模块独立运行并通过内部网络通信协同工作。服务之间存在依赖关系,必须按照正确的顺序依次启动,否则客户端无法正常连接。

**启动顺序如下**:

1. **DBSrv(数据库服务)**:负责玩家数据、游戏状态的持久化存储与读取。这是最底层的服务,必须先启动。
2. **LoginSrv(登录认证服务)**:处理账号注册、登录验证、服务器选择等认证功能。
3. **GameSrv(游戏逻辑服务)**:游戏核心引擎,负责战斗计算、技能释放、玩家移动、NPC交互等核心逻辑。
4. **GameGate(游戏网关)**:负责将玩家数据转发至游戏引擎,玩家交互的数据都经过此服务。
5. **SelGate(角色选择网关)**:负责角色查询、创建、删除等操作,由DBSrv处理。此服务未启动时,客户端登录后无法获取角色数据。
6. **LoginGate(登录网关)**:负责将登录数据转发至LoginSrv处理。此服务未启动时,客户端无法连接到游戏。

在独立终端窗口中启动各服务,以确认每个模块的运行状态:

```
# 启动数据库服务
cd src/DBSrv/bin/Release/net6.0
./DBSrv
# 控制台显示"Database connection established"表示成功

# 启动登录服务
cd src/LoginSrv/bin/Release/net6.0
./LoginSrv

# 启动游戏逻辑服务
cd src/GameSrv/bin/Release/net6.0
./GameSrv

# 依次启动三个网关
cd src/GameGate/bin/Release/net6.0
./GameGate
cd src/SelGate/bin/Release/net6.0
./SelGate
cd src/LoginGate/bin/Release/net6.0
./LoginGate
```

所有服务启动成功后,客户端即可通过配置的IP和端口连接服务器进行测试。

### 游戏参数调整

部署完成后,可以通过修改配置文件调整游戏规则,实现个性化定制。核心参数集中在src/GameSrv/appsettings.json文件中:

- **经验倍率(ExpRate)**:调整玩家打怪获得的经验倍数
- **物品掉落概率(DropRate)**:调整怪物掉落物品的概率
- **最大在线人数(MaxOnline)**:限制服务器同时在线玩家数量
- **PK惩罚开关(PKPenalty)**:控制是否开启PK惩罚机制
- **多开限制(AllowMultiClient)**:控制是否允许同一设备登录多个账号

怪物刷新配置和地图设置分别在对应的配置目录中调整。OpenMir2还支持插件机制,可以在src/Modules/目录下创建新的模块项目,实现功能扩展。

### 常见问题排查

服务启动失败时,首先检查数据库连接配置是否正确,确认端口未被占用。客户端连接不上服务器时,验证LoginGate和GameGate服务状态,检查防火墙设置是否拦截了服务端口。编译报错时,确认.NET Core SDK版本符合6.0及以上要求,并确保NuGet包已完整还原。