#### 核心特性
- **极致精简**:全文件仅38MB,含出生地地图+2种怪物+2件装备
- **真免费商用**:无任何插件/后门,支持Win7-Win11系统
- **开箱即用**:整合17周年客户端+配套登录器(含PAK密码)
---
### 一、资源获取与验证
#### 1. 文件清单(评论区置顶获取)
| 文件 | 作用 | 校验码(MD5) |
|---------------------|-----------------------------|-----------------------|
| MirServer_UltraLite.rar | 服务端核心(38MB) | 8a3d5f7e1c2b9a0d4f6e |
| Client_Base.rar | 17周年纯净客户端(去魔改) | b5c8d3e9f1a7c2d4e6f0 |
| LoginGen_V5.7z | 绿盟登录器配置器(无广告) | 7e2d4f9a1c3b5d8e0f1 |
#### 2. 安全检测
- 用**Virustotal**扫描所有文件,确保0/72报毒
- 检查服务端`PlugList.txt`,仅保留IPLocal.dll(无商业插件)
---
### 二、服务端配置流程
#### 1. 数据库极致瘦身
1. 打开**DBC2000**,载入`MirServer\Mud2\DB\StdItems.DB`:
- 删除除以下行外的所有数据:
```
0;木剑;5;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;500;0;
1;布衣(男);0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;500;0;
```
2. 清理**Monster.DB**,仅保留:
```
鸡;0;10;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
鹿;0;15;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;
```
#### 2. 地图与NPC净化
1. 修改`MirServer\Mir200\Envir\MapInfo.txt`:
```
[0 比奇省] DARK NORECALL NODEARRECALL NOMasterRECALL NORANDOMMOVE
```
2. 清空`Npc_Def`文件夹,仅保留**新手村向导-0.txt**:
```lua
(@@buy @@sell)
%100
[@main]
欢迎来到极简传奇,这里只有最原始的冒险!
<退出/@exit>
```
---
### 三、客户端适配方案
#### 1. PAK密码与路径设置
1. 解压`Client_Base.rar`至**D:\MirClient**
2. 编辑`LoginGen\Pak.txt`:
```
Data\Items.pak | game\Data\Items.pak | V8M2
Data\Tiles.pak | game\Data\Tiles.pak | GOM
```
3. 生成登录器时勾选 **“纯净模式”** 和 **“屏蔽未知PAK”**
#### 2. 素材删减验证
1. 用**WIL编辑器**检查`Data\Items.pak`:
- 仅保留图片ID 0(木剑)和1(布衣)
2. 清理`Map\`文件夹,只保留`0.map`(比奇省)
---
### 四、启动与测试
#### 1. 服务端启动顺序
1. `DBServer.exe` → 确认无红色报错
2. `LoginGate.exe` → 端口设置为7000
3. `M2Server.exe` → 加载日志显示怪物数=2
#### 2. 客户端验证步骤
1. 双击`绿盟登录器.exe` → 服务器列表选择“极简复古”
2. 创建角色后出生在比奇省,检查:
- 背包仅有木剑+布衣
- 攻击鸡/鹿无其他怪物刷新
---
### 五、常见问题解决方案
| 问题现象 | 解决方法 |
|------------------------|------------------------------|
| 登录器黑屏 | 检查Client路径是否为英文 |
| 木剑/布衣不显示 | 重命名Items.pak为Items1.pak |
| 怪物无法攻击 | 在M2Server控制台输入“@重新加载怪物” |
| 地图花屏 | 将0.map复制到客户端Map目录 |
---
### 结语:怀旧极简版的深层价值
1. **教育用途**:适合学习GOM引擎基础架构
2. **MOD开发基板**:无冗余代码,二次开发友好
3. **性能标杆**:单核CPU可承载500+在线(理论值)
附赠工具包:
- 数据库一键清理工具
- PAK密码查看器
- 极简版GM命令集
按本文操作,20分钟内即可完成史上最小传奇世界的构建,体验2001年的原始乐趣。
#### 1. 准备工作
在开始之前,请确保你已经安装了GOM引擎,并且有一个基本的游戏框架搭建完成。此外,还需要准备好所有必要的客户端和服务器端文件。
#### 2. 下载并安装GOM引擎
##### 步骤一:下载GOM引擎
从可靠的来源下载GOM引擎的源代码和相关资源文件。确保下载的是开源或非商业版本。
##### 步骤二:解压文件
将下载的文件解压到一个合适的位置,例如`C:\legend_gom_engine`。
#### 3. 配置服务器端
##### 步骤一:准备基本文件
确保你有以下基本文件:
- `server.exe`: 服务器主程序。
- `client.exe`: 客户端主程序。
- `login_server.exe`: 登录服务器主程序。
- `data`目录: 包含游戏数据文件,如`char_proto.txt`, `mob_proto.txt`, `item_proto.txt`, `map_info.txt`等。
- `config`目录: 包含配置文件,如`server.conf`, `login_server.conf`等。
##### 步骤二:清理不必要的文件
删除或备份不需要的文件和目录,以确保环境干净。
```sh
cd C:\legend_gom_engine\data
rm -rf maps items quests scripts
```
##### 步骤三:创建最小化的数据文件
###### 3.3.1 创建角色模板 (`char_proto.txt`)
编辑`data\char_proto.txt`文件,添加一个基础的角色模板。
```plaintext
vnum class race gender str dex int con hit point attack_defense damage resist_magic magic_defense poison_resist hp_recovery sp_recovery special_effect skills
1 WARRIOR HUMAN MALE 20 20 10 15 100 100 10 10 0 0 0 0 0
```
###### 3.3.2 创建物品模板 (`item_proto.txt`)
编辑`data\item_proto.txt`文件,添加木剑和布衣。
```plaintext
vnum name type sub_type flag weight buy_price sell_price slot bitflag apply_type1 apply_value1 apply_type2 apply_value2 limit_level item_delay
1001 木剑 WEAPON SWORD ITEM_FLAG_WEARABLE 1 100 50 EQUIPMENT_WEAPON ITEM_APPLY_ATTACK_POWER 5 ITEM_APPLY_NONE 0 1 0
1002 布衣 ARMOR CLOTH ITEM_FLAG_WEARABLE 1 100 50 EQUIPMENT_ARMOR ITEM_APPLY_DEFENSE 3 ITEM_APPLY_NONE 0 1 0
```
###### 3.3.3 创建怪物模板 (`mob_proto.txt`)
编辑`data\mob_proto.txt`文件,添加鸡和鹿两种怪物。
```plaintext
vnum name level exp range attack_defense damage resist_magic magic_defense poison_resist hp_recovery sp_recovery special_effect ai_script
1001 鸡 1 10 5 5 10 0 0 0 1 1 0 chicken_ai.cpp
1002 鹿 1 15 5 5 15 0 0 0 1 1 0 deer_ai.cpp
```
###### 3.3.4 创建地图信息 (`map_info.txt`)
编辑`data\map_info.txt`文件,添加出生地地图。
```plaintext
index map_name file_name width height tile_width tile_height min_x max_x min_y max_y
1 出生地 start.map start.wld 200 200 16 16 0 200 0 200
```
###### 3.3.5 创建AI脚本
为鸡和鹿创建简单的AI脚本文件。
**chicken_ai.cpp**
```cpp
#include "monster.h"
class CChickenAI : public CMonsterAI
{
public:
void OnInit(CMonster* monster) override
{
// 初始化逻辑
}
void OnUpdate(CMonster* monster, float dt) override
{
// 更新逻辑
HandleMovement(monster);
HandleCombat(monster);
}
void HandleMovement(CMonster* monster)
{
CCharacter* player = GetNearestPlayer(monster);
if (player)
{
float distance = CalculateDistance(monster, player);
if (distance < MONSTER_RUN_AWAY_DISTANCE)
{
RunAway(monster, player);
}
else
{
ChaseTarget(monster, player);
}
}
}
void HandleCombat(CMonster* monster)
{
CCharacter* target = monster->GetTarget();
if (target)
{
AttackTarget(monster, target);
}
}
void RunAway(CMonster* monster, CCharacter* player)
{
Vector3f direction = CalculateRunDirection(monster, player);
monster->Move(direction.x, direction.y, direction.z);
}
void ChaseTarget(CMonster* monster, CCharacter* target)
{
Vector3f direction = CalculateChaseDirection(monster, target);
monster->Move(direction.x, direction.y, direction.z);
}
void AttackTarget(CMonster* monster, CCharacter* target)
{
monster->Attack(target);
}
};
extern "C" __declspec(dllexport) CMonsterAI* CreateChickenAI()
{
return new CChickenAI();
}
```
**deer_ai.cpp**
```cpp
#include "monster.h"
class CDeerAI : public CMonsterAI
{
public:
void OnInit(CMonster* monster) override
{
// 初始化逻辑
}
void OnUpdate(CMonster* monster, float dt) override
{
// 更新逻辑
HandleMovement(monster);
HandleCombat(monster);
}
void HandleMovement(CMonster* monster)
{
CCharacter* player = GetNearestPlayer(monster);
if (player)
{
float distance = CalculateDistance(monster, player);
if (distance < MONSTER_RUN_AWAY_DISTANCE)
{
RunAway(monster, player);
}
else
{
ChaseTarget(monster, player);
}
}
}
void HandleCombat(CMonster* monster)
{
CCharacter* target = monster->GetTarget();
if (target)
{
AttackTarget(monster, target);
}
}
void RunAway(CMonster* monster, CCharacter* player)
{
Vector3f direction = CalculateRunDirection(monster, player);
monster->Move(direction.x, direction.y, direction.z);
}
void ChaseTarget(CMonster* monster, CCharacter* target)
{
Vector3f direction = CalculateChaseDirection(monster, target);
monster->Move(direction.x, direction.y, direction.z);
}
void AttackTarget(CMonster* monster, CCharacter* target)
{
monster->Attack(target);
}
};
extern "C" __declspec(dllexport) CDeerAI* CreateDeerAI()
{
return new CDeerAI();
}
```
##### 步骤四:配置服务器启动参数
编辑`config\server.conf`文件,确保配置正确。
```plaintext
server_port = 11001
max_players = 100
pak_file_1 = data/game.pak
pak_password_1 = game_password
pak_file_2 = data/data.pak
pak_password_2 = data_password
```
##### 步骤五:配置登录服务器启动参数
编辑`config\login_server.conf`文件,确保配置正确。
```plaintext
listen_ip = 127.0.0.1
listen_port = 11000
server_ip = 127.0.0.1
server_port = 11001
max_clients = 100
```
#### 4. 配置客户端
##### 步骤一:修改客户端配置
编辑`config\client.conf`文件,确保配置正确。
```plaintext
server_ip = 127.0.0.1
server_port = 11000
```
##### 步骤二:打包客户端
将客户端相关的文件打包成可执行文件`client.exe`。
#### 5. 编译并测试
##### 步骤一:编译服务器端
确保所有修改后的代码都能成功编译。
```sh
g++ -o server src/server_main.cpp src/monster.cpp src/skill_manager.cpp -lengine
```
##### 步骤二:编译登录服务器
确保所有修改后的代码都能成功编译。
```sh
g++ -o login_server src/login_server_main.cpp src/network.cpp -lengine
```
##### 步骤三:启动服务器
启动登录服务器和游戏服务器。
```sh
start login_server.exe
start server.exe
```
##### 步骤四:启动客户端
启动客户端进行测试。
```sh
start client.exe
```
##### 调试技巧
- **检查错误日志**:如果编译失败,仔细查看错误日志,修复相应的语法错误。
- **逐步调试**:使用调试工具逐步执行代码,确保每一步都能按预期工作。
- **验证数据处理**:确认从服务器发送的数据是否正确解析并显示在界面上。
#### 6. 确认功能正常
##### 检查角色初始装备
确保玩家初始装备只有木剑和布衣。
##### 检查地图和怪物
确保地图只有出生地,并且只有鸡和鹿两种怪物。
##### 检查登录流程
确保登录器能够正常连接到服务器,并且玩家能够顺利进入游戏。
#### 7. 打包发布
##### 步骤一:整理文件
将所有必要的文件整理到一个目录中,包括:
- `server.exe`
- `login_server.exe`
- `client.exe`
- `data`目录
- `config`目录
##### 步骤二:压缩文件
将整理好的文件压缩成一个ZIP包。
```sh
zip -r legend_gom_pure.zip *
```
##### 步骤三:分发文件
将压缩包分发给需要的人。
#### 总结
通过以上步骤,你可以在GOM引擎中成功创建一个纯净版的传奇服务端,包含配套的登录器,并且只包含最基本的元素。这不仅有助于开发和测试,还能提供一个干净的基础平台供进一步扩展。希望这篇教程对你有所帮助!
---
以上就是关于如何创建传奇服务端纯净版(GOM引擎带配套登录器)的全部内容。如果你有任何疑问或建议,欢迎随时留言讨论。
创建传奇服务端纯净版:GOM引擎带配套登录器(1.75和1.85)
来源:
作者:
点击:

