Deploy传奇athome
Background
七八年前的时候给家父在家里部署过mir2,让他找回找回年轻的感觉,最近他又想玩了
GPT的调研报告
两条主轴: 一条是以 GOM、翎风、BLUE、GEE 等中文商用/半商用引擎为核心的“整合包—登录器—脚本—版本库”路线,强调尽快开玩、低门槛改表改脚本;
- 翎风作为默认起点,把 BLUE 作为“你非常在意假人/假人 AI NPC 时”的备选,把 Crystal 作为后续进入代码层的第二阶段,而不是一开始就直接上 Crystal。原因很简单:翎风官网到 2026 年 5 月仍在发包,且直接提供 1.80基础服务端 MirServer,同时官方协议明确“个人学习研究及单机娱乐”场景;BLUE 则在公开论坛层面提供了更强的教程面和更明确的假人相关公开痕迹;Crystal 虽然是当前最强的开源扩展底座之一,但其构建、数据库、资源链路明显更偏开发者工作流。
另一条是以 Crystal、mir2x、OpenMir2、mir-eternal、Zircon 为代表的开源怀旧重建路线,强调源代码可控、长期可扩展、适合程序员深改。这两条路线目前都仍在更新,只是目标用户不同:前者更适合“今晚就要玩起来”,后者更适合“以后要自己改系统、改协议、改工具链”。
- 如果目标是长期可维护、可读代码、可版本管理,Crystal 和 OpenMir2 仍是最值得优先看的开源方案;如果目标是研究协议、现代化重构或跨平台实验,mir2x 与 Unity/C++ 重建路线更有技术价值。AI 挂机与自动化在技术上完全可行,
| 路线 | 现状判断 | 代表项目/引擎 | 典型用户规模与场景 | 主要技术栈 | 优点 | 短板与风险 | 可信度与证据 |
|---|---|---|---|---|---|---|---|
| 传统复古单机 | 仍是中文圈主流入口 | 翎风、GOM、BLUE、GEE、V8/HERO 遗留生态 | 个人怀旧、局域网、两三人小圈子;B 站相关教程常见 1k–1.5 万播放 | Windows、本地 DB/网关/登录/游戏进程、登录器、微端、完整客户端 | 上手快、资料多、改表改脚本门槛低 | 黑盒多、版本包来源复杂、资产版权风险高 | 高 / 中 |
| 单机化客户端 | 技术存在,但多数仍是“本地化网游” | localhost 配置、微端、本地登录器、本地服务端 | 演示、调试、离线体验、局域网测试 | 客户端连 127.0.0.1,本地 DB/Login/Gate/Game 服务 | 体验贴近官服/私服,迁移成本低 | 很少是真正纯离线;客户端分发与素材复制风险高 | 高 |
| 开源服务端 | 当前最稳健的“可维护路线” | Crystal、OpenMir2、mir2x | 开发者、小型社区服、协议研究与二开 | C#/.NET、C++23/SDL/Lua/FLTK、Git、编译链、数据库 | 代码可读、便于协作与版本管理 | 编译与资产链更复杂;开源代码不等于拥有官方资产权利 | 高 |
| AI 与自动化 | 技术可行,但公网服风险最高 | OpenCV / YOLO / OCR / LLM + 截屏 / 输入注入 | 本地刷图试验、辅助脚本、研究型 PoC | MSS / 截屏、模板匹配、目标检测、OCR、PyAutoGUI / SendInput | 降低重复劳动,可做 PoC | UI 脆弱、延迟与误识别明显;易触发行为分析与反作弊 | 高 / 中 |
| 怀旧重建 | 仍活跃但明显小众 | Unity 重建、mir2x、各类 alt versions | 协议 / 渲染研究、跨平台实验、学术 / 工程练手 | C++ / Unity / C#、自定义工具链、重建客户端 / 协议 / 资源格式 | 技术价值最高、可摆脱传统黑盒引擎 | 工时大、反馈慢;若混用原始资产仍有授权风险 | 高 |
flowchart LR
A[传统复古单机] --> B[本地服务端栈]
B --> C[DB / Login / Gate / Game]
A --> D[完整客户端与补丁]
E[单机化客户端] --> B
E --> F[127.0.0.1 回环]
G[开源服务端] --> H[Crystal / OpenMir2 / mir2x]
H --> B
O[怀旧重建] --> P[协议/资源/渲染重写]
O --> Q[Unity / C++ / C#]
| 项目名 | 类型 | 语言/引擎 | 仓库/官网名称 | 最近可见活动 | Star / 下载 / 热度 | 主要贡献者 / 团队 | 证据 |
|---|---|---|---|---|---|---|---|
| GOM 引擎 | 商业 | GameOfMir | GameOfMir 官网 | 2026-05-18 有“最新免费引擎(922京版)更新” | 官方未公开 Star;官网仍持续更新 | GameOfMir 团队 | 26 |
| 翎风引擎 | 商业 | LFM2 | 翎风官网 | 下载页显示 翎风引擎 [20260508],并持续维护更新日志 | 官方未公开 Star;中文资料与迁移教程仍多 | 翎风团队 | 27 |
| BLUE 引擎 | 商业 | BlueM2 | BLUE 官方论坛 | 2026-05-19 仍有签到与技术答疑;2026-03-20 仍发布 SQL 搭建教程 | 2026-05-19 签到帖有数千级回复;论坛日更明显 | BLUE 官方论坛 / 版主群体 | 28 |
| Crystal | 开源 | C# / .NET | Suprcode/Crystal | 2026-05-06 提交 | 1.6k★ / 848 forks | Suprcode、JevLOMCN、daneo1989 | 3 |
| mir2x | 开源 | C++23 / SDL / Lua / FLTK | etorth/mir2x | 2026-04-25 提交 | 494★ / 214 forks | etorth | 29 |
| OpenMir2 | 开源 | C# | mirbeta/OpenMir2 | 2024-02-14 最后一批高密度提交可见 | 344★ / 148 forks | mirbeta | 30 |
| Crystal.Database | 开源资料库 | 数据库 / 资源配套 | Suprcode/Crystal.Database | 2024-08-30 提交 | 154★ / 150 forks | JevLOMCN | 31 |
| GEE 引擎 | 商业 | GeeM2 | GEE 官网 / GEE 助手生态 | 官方站点仍可见;外围更新列表到 2024-07-10 | 官方未公开 Star;聚合站转载有 3.31K 浏览 | GEE 团队 | 32 |
| V8M2 社区 | 遗留商业 / 社区 | V8M2 | v8m2.com / LSP 社区 | 社区站点可见 2025 年帖子;B 站相关教程约 1.5 万播放 | 玩法资料仍活跃,但更多作为迁移目标存在 | 社区维护者 | 33 |
| HERO 引擎 | 遗留商业 | HeroM2 | HERO 官网导览 / 教程生态 | 2024 年公开资料显示官网重新可见、支持三端与 Lua;教程仍在更新 | 2024 教程约 2.8k 阅读、相关文章约 3.98K 浏览 | HERO 团队 | 34 |
需求
- 老头想立刻玩
- 老头要游戏里有假人
落地
客户端和服务端
既然着急玩,自然先搞最简单的方式了
| 方案 | 数据库与免 SQL | 是否含登录器 | Windows / 安卓 | 公开体积 | 常见问题 | 可信来源 |
|---|---|---|---|---|---|---|
| 翎风官方引擎 + 官方 1.80 基础服务端 | 通常按 SQLite .db 路线使用,适合免外置数据库;公开页没有逐字写默认库型,但官方页直接提供 SQLite 编辑器,社区实操也围绕该路线展开 |
通常有,社区实操里可直接打开登录器配置器 | Win:是;安卓:未明确 | 引擎 201.59M + 基础服务端 54.8M;另需官方客户端下载器 123.7M | 登录器配置、补丁路径、客户端版本对应问题较常见 | 官方下载页、社区教程与实操帖 |
https://www.lfm2.com/?utm_source=chatgpt.com 下载: 引擎 基础服务端 登录器 SQLite工具
https://mir2.sdo.com/?utm_source=chatgpt.com
假人
| 公开实现/模块 | 是否存在 | 代表证据 | 实现方式判断 | 适配引擎 | 扩展性与二开难度 | 典型场景 | 可信度 |
|---|---|---|---|---|---|---|---|
| BLUE 官方假人/辅机/真人假人数据 | 存在 | 官方帖提到“真人数据、假人数据无缝转换”,更新日志出现 DummyOptionMask;7bbz 教程列出 OFFLINEPLAYEX、GuardPos、FakePlayer。3 | 典型为脚本命令 + 定时器 + 角色数据复用 + 行为开关 | BLUE | 扩展性高于纯整合包,二开中等;需要熟悉命令体系和数据库 | 造人气、攻沙、离线打怪、陪练、交易市场氛围 | 高 |
| 翎风 Dummy 假人系统 | 存在 | 2024/2025 两篇中文教程公开展示 DummyNameList.txt、LOADDUMMYCONFIGFILE、攻击模式切换、读取配置文件。17 | 明显属于“配置文件 + QManage 脚本 + 行为参数”模式 | 翎风 | 扩展性较好,二开中等偏低;适合脚本党 | 单机陪玩、练级、攻城热闹感、自动捡物 | 中高 |
| 翎风假人捡物/穿戴扩展 | 存在 | 公开教程展示 SetDummyPickItemFile、SetDummyPickItem 等命令。18 | 规则列表 + 开关控制 + 指定对象定制 | 翎风 | 很适合局部扩展,难度低于重写 AI | 提升假人“像真人”的拾取与养成行为 | 中 |
| 巅峰假人第二季等打包式假人系统 | 存在,但多为整合包 / 销售页证据 | 销售页写有默认 400 假人、内置 1000 名单、组队交易、后台控制;B 站与 NGA 有用户讨论“巅峰 2 代假人”。19 | 更像完整脚本产品而非公开仓库;核心逻辑未开源 | 常见于 V8M2 / GOM / 复古整合包 | 能用但黑盒;二开难度取决于是否带明文脚本 | 想快速得到“城里很热闹”的本地怀旧体验 | 低至中 |
| GOM 假人相关系统 | 存在,但近三年原始公开证据弱于 BLUE / 翎风 | 旧有 GOM 假人脚本与 64GM 推荐位存在,但近三年更常见的是版本库“带假人”标签,而非官方公开文档。20 | 多半仍是脚本 / 控制后台 / 配置文件体系 | GOM | 取决于你拿到的是明文脚本还是黑盒包 | 本地热闹感、自动回收、组队打怪 | 中低 |
2026-06-01 翎风本地假人实测
这套 D:\MirServer 的翎风服务端已经自带 Dummy 假人系统,不需要额外下载假人插件。核心文件如下:
1 | |
本次测试用 DummyNameList.txt 放了 3 个测试假人:
1 | |
并新建了一个最小配置文件:
1 | |
登录触发放在 QManage.txt 的 [@Login] 最前面:
1 | |
DUMMYSTART 会让假人开始自动打怪和移动,所以假人不一定会停在登录坐标。测试时用的是:
1 | |
其中 3 是盟重省,330 330 是初始坐标,最后的 3 是登录 3 个假人。实测上线后服务器在线人数会多 3 个,但假人可能已经走开。
为了方便手动测试,额外在 UserCmd.txt 加了:
1 | |
并在 QFunction-0.txt 加了:
1 | |
进游戏后可以用管理员角色执行:
1 | |
如果 @假人 生效,会提示“已请求登录3个测试假人”。如果重读没有生效,重启一次 M2Server 后再执行 @假人。
定位或管理假人可以用现有 GM 命令:
1 | |
含义分别是查看、飞到角色身边、把角色拉到身边、踢下线。
注意:测试时曾在 AutoRunRobot.txt 加过自动触发行:
1 | |
对应 RobotManage.txt:
1 | |
这会每 15 秒刷一次全服消息 Test dummy login requested.。正式使用时建议删除或注释 AutoRunRobot.txt 里的这行,只保留 @假人 手动命令,避免反复刷屏和重复请求登录。
方案2
GEE 引擎 + Mir2-GeeM2 GitHub 配置仓,更适合“我要 1.76 怀旧味道,而且希望我的底版不是纯黑箱”的用户。Mir2-GeeM2 仓库明确写了它是基于官方 2005 年泄露的 1.76 服务端制作的配置文件,遵照官方/韩服思路扩展,适合单机或小圈子,而且 README 直接给了单机测试方法。
按公开资料可执行的步骤如下:
从 GEE 官方页获取最新引擎包。当前搜索可见官方页给出的版本是 GEE v4.8.2(稳定版);同时,公开帮助文档示例又持续引用 geem2.com,所以实践中建议把官方搜索结果页 + 官方帮助文档页一起留档,避免只认一个域名。
下载 Mir2-GeeM2 GitHub 仓库。仓库作者给出的单机测试方法非常明确:下载任意 GeeM2/V8M2/翎风 引擎服务端;替换 Mir200 文件夹为仓库目录;把 GEEM2.db 复制到 Mud2/DB 并覆盖;在引擎控制台的配置向导重新保存并生成配置文件;启动服务器;下载官方客户端;把登录器放进客户端并覆盖 map 文件夹;然后注册角色开玩。
如果你更想减少 GEE 官方站访问波动带来的干扰,也可以用翎风引擎承载这套 Mir2-GeeM2 配置,因为该仓库说明本来就把 GeeM2/V8M2/翎风都列为可选承载引擎。这也是为什么这条路线在“怀旧 + 可改造”上会比纯闭源一键端更强。
GEE 路线的首次备份建议更保守:在任何转换数据库、升级 64 位引擎、重做登录器前,先存一份“全量 MirServer 压缩包 + 客户端补丁包 + 当前 GEEM2.db 哈希记录”。GEE 帮助文档和社区资料都表明,新版引擎经常伴随 UI、数据库驱动和登录器配置器一起变,混搭极易出错。
一个很全的MIR工具网站
https://www.mircoding.com/download/diban
############### 以下为codex帮忙记录的过程 ###############
2026-05-31 本地部署排障记录
这次把服务端彻底重新部署到 D:\MirServer,客户端使用 D:\work_console\MirDev\传奇1.80客户端,确认服务端和客户端都走 1.80,不再混用 1.76 或 17 周年客户端。
今天踩到的坑
-
不要盲目把所有绝对路径改成相对路径。翎风这一套老工具链里,DBServer、LoginSrv、GameCenter、登录器配置器等组件对工作目录和绝对路径很敏感。路径要按文档和实际配置项逐个确认,不能批量替换。
-
ExtIPaddr不是摆设。D:\MirServer\Config.ini里的外网 IP 会被 GameCenter 用来生成网关信息,例如DBServer\!serverinfo.txt。本机测试时如果它生成成127.0.0.1 192.168.0.1 7200,客户端选完角色后就可能跳去连192.168.0.1:7200,表现就是能登录、能选人,但进游戏黑屏。单机本机测试应确保对客户端下发的是127.0.0.1。 -
登录器配置里的客户端文件名要和真实文件一致。当前登录器配置使用的是
Client.dat,所以客户端目录里必须有Client.dat。这次用Mir.exe复制出Client.dat后,登录器才能正常启动到后续流程。 -
mir.dat、Client.dat、登录器 exe 和服务端版本要成套。只要其中一个是旧包、空文件、或者来自另一个客户端,就会出现“登录器找不到东西”“选人后黑屏”“点提交无反应”等看起来很玄学的问题。 -
账号注册、角色创建、进入游戏是三段链路,不是一个动作。账号在
Account.DB,角色在ApexMir.DB,真正出生点、血蓝、等级等数据通常要等 M2 成功初始化并保存后才完整。只看注册界面成功不代表角色已经能进游戏。 -
新角色默认无敌的根因是
D:\MirServer\Mir200\!setup.txt里的StartPermission=10。Command.ini中@无敌、@管理、@观察等 GM 指令权限也是 10,所以新角色一出生就是 GM 权限。登录脚本里还有ISADMIN分支,因此新角色会被当管理员处理。把StartPermission改成0后,新建角色才是普通玩家。 -
AdminList.txt仍然会让指定角色拥有管理员行为。以后如果某个角色异常无敌、能用 GM 指令,要同时查StartPermission、Command.ini的权限配置、以及Mir200\Envir\AdminList.txt。
以后排障的闭环顺序
-
先看进程和端口:
DBServer、LoginSrv、LoginGate、SelGate、RunGate、M2Server、GameCenter是否都来自同一个D:\MirServer,端口 7000、7100、7200、5000、5100/6000、5500/5600 是否正常。 -
再看登录器配置:客户端目录、
Client.dat、mir.dat、登录器 exe 是否在同一个 1.80 客户端目录下。 -
再看服务端下发地址:检查
Config.ini、DBServer\!serverinfo.txt,本机测试不要让客户端跳到不可达的局域网或外网 IP。 -
最后查数据库和脚本:账号查
DBServer\FDB\Account.DB,角色查DBServer\FDB\ApexMir.DB,出生和权限查Mir200\!setup.txt、Mir200\Command.ini、Mir200\Envir\AdminList.txt、Mir200\Envir\QuestDiary\游戏登陆\登陆脚本.txt。
这次留下的经验
老传奇服务端的问题不能只看一个界面现象。点登录没反应、选人后黑屏、注册成功但角色异常、挨打不掉血,背后分别可能是登录器文件、网关地址、M2 初始化、GM 权限脚本的问题。以后每次改配置都要确认“配置文件 -> 生成文件 -> 进程日志/端口 -> 客户端表现 -> 数据库结果”这一整条链路,不能只改一个 ini 就认为生效。
当前 Command.ini 指令权限速查
来源:D:\MirServer\Mir200\Command.ini。下表只列出在 [Permission] 中明确配置了权限的指令,按权限从低到高排序。当前已经把 StartPermission 改为 0,所以新建普通角色默认只能使用权限 0 的指令。
| 权限 | 配置项 | 游戏内命令 |
|---|---|---|
| 0 | AddFriend |
@AddFriend |
| 0 | AllowMsg |
@拒绝私聊 |
| 0 | BanNationChat |
@允许国家聊天 |
| 0 | Date |
@查看时间 |
| 0 | DelFriend |
@DelFriend |
| 0 | Friend |
@Friend |
| 0 | LetNation |
@加入国家 |
| 0 | LockLogin |
@锁定 |
| 0 | PrvMsg |
@拒绝 |
| 0 | SendTopChatBoardMsg |
@传1 |
| 0 | SETCOLORSAY |
@设置聊天字体颜色 |
| 0 | 表情 |
@表情 |
| 0 | 留言 |
@留言 |
| 3 | Map |
@Map |
| 3 | Who |
@Who |
| 5 | Total |
@Total |
| 6 | GMRedMsgCmd |
@! |
| 6 | MoveMax |
未在 [Command] 配置别名 |
| 6 | PositionMoveMax |
未在 [Command] 配置别名 |
| 10 | AddGameGold |
未在 [Command] 配置别名 |
| 10 | AddGold |
@加钱 |
| 10 | AddGuild |
@创建行会 |
| 10 | AddToItemEvent |
@AddToItemEvent |
| 10 | AddToItemEventAspieces |
@AddToItemEventAsPieces |
| 10 | AdjuestExp |
@调整经验 |
| 10 | AdjuestTestLevel |
@AdjustTestLevel |
| 10 | AdjuestTLevel |
@调级 |
| 10 | Announcement |
@Announcement |
| 10 | Attack |
@Attack |
| 10 | BackStep |
@弹开 |
| 10 | Ball |
@Ball |
| 10 | BonusPoint |
@调整属性点 |
| 10 | ChangeDearName |
@DearName |
| 10 | ChangeGameDiamond |
@调整金刚石 |
| 10 | ChangeGameGird |
@调整灵符 |
| 10 | ChangeGameGlory |
@调整荣誉值 |
| 10 | ChangeGate |
@整体切换连接 |
| 10 | ChangeGender |
@改变性别 |
| 10 | ChangeItemName |
@ChangeItemName |
| 10 | ChangeJob |
@改变职业 |
| 10 | ChangeLuck |
@ChangeLuck |
| 10 | ChangeMasterName |
@MasterName |
| 10 | ChangeNGLevel |
@调整内功等级 |
| 10 | ChangeSabukLord |
@改变城主 |
| 10 | ChangeUserFull |
@CHGUSERFULL |
| 10 | ChangeWeaponDura |
@ChangeWeaponDura |
| 10 | ChangeZenFastStep |
@CHGZENFASTSTEP |
| 10 | ClearBag |
@清理垃圾 |
| 10 | ClearMission |
@清除标志 |
| 10 | ClearMon |
@ClearMon |
| 10 | ClearPlacingItem |
@ClearPlacingItem |
| 10 | CloseUserShop |
@CloseUserShop |
| 10 | ColorSay |
@允许彩色字体聊天 |
| 10 | ContestPoint |
@ContestPoint |
| 10 | CreditPoint |
@调整声望 |
| 10 | DelBonuPoint |
@删除属性点 |
| 10 | DelDenyAccountLogon |
@DelDenyAccountLogon |
| 10 | DelDenyCharNameLogon |
@DelDenyCharNameLogon |
| 10 | DelDenyIPLocalLogon |
@DelDenyIPLocalLogon |
| 10 | DelDenyIPLogon |
@DelDenyIPLogon |
| 10 | DeleteAllItemEvent |
@DeleteAllItemEvent |
| 10 | DeleteItem |
@删除物品 |
| 10 | DeleteSkill |
@删除技能 |
| 10 | DelGameGold |
@DelGamePoint |
| 10 | DelGold |
@减钱 |
| 10 | DelGuild |
@删除行会 |
| 10 | DelMachineIDLogon |
@DelMachineIDLogon |
| 10 | DelNpc |
@DelNpc |
| 10 | DelSellPlayer |
@DelSellPlayer |
| 10 | DelUserShop |
@DelUserShop |
| 10 | DenyAccountLogon |
@DenyAccountLogon |
| 10 | DenyCharNameLogon |
@DenyCharNameLogon |
| 10 | DenyIPaddrLogon |
@DenyIPLogon |
| 10 | DenyIPLocalLogon |
@DenyIPLocalLogon |
| 10 | DenyMachineIDLogon |
@DenyMachineIDLogon |
| 10 | DisableFilter |
@禁用脏话 |
| 10 | DisableSendMsg |
@DisableSendMsg |
| 10 | DisableSendMsgList |
@DisableSendMsgList |
| 10 | EnableSendMsg |
@EnableSendMsg |
| 10 | EndContest |
@EndContest |
| 10 | FireBurn |
@FireBurn |
| 10 | Flag |
@showflag |
| 10 | ForcedWallConQuestWar |
@攻城 |
| 10 | FreePenalty |
@清除PK |
| 10 | GameGold |
@调整元宝 |
| 10 | GameGoldEx |
@GameGoldEx |
| 10 | GameMaster |
@管理 |
| 10 | GamePoint |
@调整泡点 |
| 10 | GameWen |
@GameWen |
| 10 | GiveMine |
@GiveMine |
| 10 | Gsa |
@gsa |
| 10 | Hair |
@发型 |
| 10 | HumanCount |
@附近人数 |
| 10 | HumanLocal |
@IP |
| 10 | Hunger |
@Hunger |
| 10 | IncPkPoint |
@增加PK |
| 10 | Info |
@查看 |
| 10 | ItemEventList |
@ItemEventList |
| 10 | ItemEventTerm |
@ItemEventTerm |
| 10 | Kick |
@T |
| 10 | Kill |
@干掉 |
| 10 | Level |
@Level |
| 10 | Level0 |
@Level0 |
| 10 | LotteryTicket |
@LotteryTicket |
| 10 | LoyaltyPoint |
@调整忠诚度 |
| 10 | LuckPoint |
@LuckyPoint |
| 10 | MachineID |
@机器码 |
| 10 | MakeMax |
未在 [Command] 配置别名 |
| 10 | MakeMin |
未在 [Command] 配置别名 |
| 10 | MapInfo |
@MapInfo |
| 10 | MapMove |
@移动地图 |
| 10 | Mission |
@Mission |
| 10 | Mob |
@Mob |
| 10 | MobCount |
@查看怪物 |
| 10 | MobLevel |
@附近玩家 |
| 10 | MobNpc |
@MobNpc |
| 10 | MobPlace |
@MobPlace |
| 10 | MoveMin |
未在 [Command] 配置别名 |
| 10 | NameColor |
@NameColor |
| 10 | NGLevel |
@NGLevel |
| 10 | NpcScript |
@NpcScript |
| 10 | ObServer |
@观察 |
| 10 | OpDeleteSkill |
@OPDeleteSkill |
| 10 | OpenUserShop |
@OpenUserShop |
| 10 | OpTraining |
@增加技能 |
| 10 | OXQuizRoom |
@OXQuizRoom |
| 10 | PkPoint |
@查看PK |
| 10 | PositionMoveMin |
未在 [Command] 配置别名 |
| 10 | ReAlive |
@复活 |
| 10 | Recall |
@传唤 |
| 10 | RecallMob |
@BB |
| 10 | ReConnection |
@切换连接 |
| 10 | RefineWeapon |
@刀 |
| 10 | ReGoto |
@跟踪 |
| 10 | ReleaseShutup |
@ReleaseShutup |
| 10 | ReloadAbuse |
@重读脏话 |
| 10 | ReloadAdmin |
@重读管理 |
| 10 | ReloadChatbox |
@ReloadChatbox |
| 10 | ReloadDiary |
@ReloadDiary |
| 10 | ReloadFunction |
@ReloadFunction |
| 10 | ReloadGuild |
@ReloadGuild |
| 10 | ReloadGuildAll |
@ReloadGuildAll |
| 10 | ReloadItemDB |
@重读物品数据库 |
| 10 | ReloadLineNotice |
@重读公告 |
| 10 | ReloadMagicDB |
@重读技能数据库 |
| 10 | ReloadManage |
@重读登陆 |
| 10 | ReloadMonitems |
@重读爆率 |
| 10 | ReloadMonsterDB |
@重读怪物数据库 |
| 10 | ReloadNpc |
@重读商人 |
| 10 | ReloadRobot |
@重读机器人脚本 |
| 10 | ReloadRobotManage |
@重读机器人配置 |
| 10 | RemoteMsg |
@RemoteMsg |
| 10 | ReNewLevel |
@转生 |
| 10 | RestBonuPoint |
@还原属性点 |
| 10 | SabukWallGold |
@SabukWallGold |
| 10 | SbkDoor |
@SbkDoor |
| 10 | SetFlag |
@setflag |
| 10 | SetMapMode |
@SetMapMode |
| 10 | SetOpen |
@setopen |
| 10 | SetPermission |
@给予权限 |
| 10 | SetUnit |
@setunit |
| 10 | SetUserShopName |
@SetUserShopName |
| 10 | ShowDenyAccountLogon |
@ShowDenyAccountLogon |
| 10 | ShowDenyCharNameLogon |
@ShowDenyCharNameLogon |
| 10 | ShowDenyIPLocalLogon |
@ShowDenyIPLocalLogon |
| 10 | ShowDenyIPLogon |
@ShowDenyIPLogon |
| 10 | ShowEffect |
@ShowEffect |
| 10 | ShoweMapMode |
@ShowMapMode |
| 10 | ShowMachineIDLogon |
@ShowMachineIDLogon |
| 10 | ShowMapMode |
@ShowMapMode |
| 10 | ShowOpen |
@showopen |
| 10 | ShowUnit |
@showunit |
| 10 | Shutup |
@Shutup |
| 10 | ShutupList |
@ShutupList |
| 10 | SpiritStart |
@祈祷生效 |
| 10 | SpiritStop |
@停止叛变 |
| 10 | StartContest |
@StartContest |
| 10 | StartIngGiftNO |
@StartingGiftNo |
| 10 | StartItemEvent |
@StartItemEvent |
| 10 | StartQuest |
@开始提问 |
| 10 | StorageClearPassword |
@清除玩家仓库密码 |
| 10 | SuperMake |
@Supermake |
| 10 | SuperMan |
@无敌 |
| 10 | SuperTing |
@移动范围 |
| 10 | TakeUserItem |
@TakeUserItem |
| 10 | TestGa |
@Testga |
| 10 | TestGoldChange |
@Test_GOLD_Change |
| 10 | TestStatus |
@TestStatus |
| 10 | Ting |
@Ting |
| 10 | Training |
@技能等级 |
| 10 | Transparecy |
@Transparency |
| 10 | UnlockSellPlayer |
@UnlockSellPlayer |
| 10 | ViewWhisper |
@私聊 |
另外,[Command] 中还有一些只配置了命令别名、没有在 [Permission] 中显式声明权限的项。排障时不要默认它们就是 GM 指令,需要结合引擎默认规则或实测确认。
| 未显式权限配置项 | 游戏内命令 |
|---|---|
AddGamePoint |
@AddGamePoint |
AllowDearRecall |
@允许夫妻传送 |
AllowFarMsg |
@拒绝千里传音 |
AllowGroupCall |
@允许天地合一 |
AllowGuildReCall |
@允许行会合一 |
AllowMasterRecall |
@允许师徒传送 |
AllSysMsg |
@传 |
AttackMode |
@AttackMode |
Auth |
@联盟 |
AuthAlly |
@允许联盟 |
AuthCancel |
@取消联盟 |
BanGuildChat |
@允许行会聊天 |
ChangeMasterrName |
@MasterName |
CHGUSERFULL |
@CHGUSERFULL |
CHGZENFASTSTEP |
@CHGZENFASTSTEP |
CryChat |
@CryChat |
Dear |
@查询伴侣 |
DearRecall |
@夫妻传送 |
DisableHorseInvite |
@禁止邀请上马 |
EndGuild |
@退出门派 |
GroupCall |
@天地合一 |
GuildReCall |
@行会合一 |
HeroFealty |
@改变忠诚 |
HeroLevel |
@HeroLevel |
LetChallenge |
@允许挑战 |
LetGuild |
@允许加入门派 |
LetShout |
@拒绝组队聊天 |
LetTrade |
@允许交易 |
Make |
@make |
Master |
@查询师徒 |
MasterRecall |
@师徒传送 |
MemberFunc |
@MemberFunc |
MemberFuncEx |
@MemberFuncEx |
Move |
@gmov |
OpenSellPlayer |
@角色交易 |
PasswordLock |
@PasswordLock |
PasswordUnLock |
@开锁 |
PositionMove |
@gmmove |
PublicChat |
@PublicChat |
RELOADMINMAP |
@重读小地图 |
Rest |
@rest |
RestHero |
@RestHero |
Searching |
@探测 |
SHOWFLAG |
@showflag |
SignMove |
@SignMove |
StorageChgPassword |
@修改密码 |
StorageLock |
@锁定仓库 |
StorageSetPassword |
@设置密码 |
StorageUnLock |
@仓库开锁 |
StorageUserClearPassword |
@清除密码 |
TakeOffHorse |
@下马 |
TakeOnHorse |
@骑马 |
TESTFIRE |
@TestFire |
UserMove |
@Move |
ViewDiary |
@Diary |
招募队员 |
@招募队员 |
NPC 新建与调整记录

这次新增了一个名为 二福 的 NPC,用来验证服务端自定义链路,并作为后续本地测试助手。NPC 声明和脚本分离:声明负责让 NPC 出现在地图上,脚本负责点击后的对话与功能。
| 文件 | 作用 | 本次改动 |
|---|---|---|
Mir200\Envir\MerChant.txt |
声明可点击 NPC 的脚本路径、地图、坐标、显示名、外观 | 新增 测试/二福 0 333 270 二福 0 1 0 |
Mir200\Envir\Market_Def\测试\二福-0.txt |
二福 在地图 0 上的对话脚本 |
增加状态查看、回比奇、礼包、测试传送 |
Mir200\Envir\QuestDiary\数据文件\二福礼包.TXT |
记录已领取礼包的角色名 | 用于保证每个角色只能领一次礼包 |
MerChant.txt 的基本格式可以按当前服务端理解为:
1 | |
脚本文件命名规则是:脚本路径 + "-" + 地图号 + ".txt"。例如 测试/二福 放在地图 0,对应脚本就是:
1 | |
当前 二福 支持四个功能:
| 功能 | 脚本入口 | 说明 |
|---|---|---|
| 查看状态 | @status |
显示角色名、等级、经验、PK 值、声望、登录时间、在线时长、在线人数 |
| 回到比奇 | @home |
执行 MAPMOVE 0 333 270 4,回到 NPC 附近 |
| 领取新手礼包 | @gift / @getgift |
背包至少 5 格;给金币、红蓝药、木剑、蜡烛;用名单文件限制每角色一次 |
| 测试传送 | @teleport |
提供比奇、边界村、银杏山谷、盟重、白日门几个测试传送点 |
调整 NPC 后,最稳的生效方式是重启 M2。调试时也可以在游戏内用 GM 指令:
1 | |
这条指令对应 Command.ini 中的 ReloadNpc=重读商人,权限是 10。如果只是改脚本内容,通常重读商人即可;如果涉及地图、坐标、NPC 声明行为异常,重启 M2 更稳。
这次的 Git 提交记录:
1 | |
二福之家地图修改记录
地图部分先到这里。本轮在原有“二福”测试 NPC 的基础上,补了一张独立的自定义测试地图 ERFU_HOME,用来验证地图注册、NPC 挂载、跨地图传送、即时刷怪和清怪脚本这些基础链路。
| 文件 | 作用 | 本次改动 |
|---|---|---|
Mir200\Map\ERFU_HOME.map |
自定义地图文件 | 新增“二福之家”测试地图 |
Mir200\Envir\MapInfo.txt |
地图注册表 | 新增 [ERFU_HOME 二福之家] DAY FIGHT,让服务端识别并加载该地图 |
Mir200\Envir\MerChant.txt |
NPC 声明 | 在 ERFU_HOME 的 10,11 增加 NPC“二福”,脚本路径仍为 测试/二福 |
Mir200\Envir\Market_Def\测试\二福-0.txt |
比奇地图上的二福脚本 | 增加“进入二福之家”入口,执行 MAPMOVE ERFU_HOME 10 13 1 |
Mir200\Envir\Market_Def\测试\二福-ERFU_HOME.txt |
二福之家内的二福脚本 | 新增地图内菜单、讲笑话、召唤鸡、开启稻草人训练、清理怪物和返回主城传送 |
MapInfo.txt 中的地图声明格式这次可以先按下面理解:
1 | |
所以:
1 | |
表示新增一个编号为 ERFU_HOME、显示名为“二福之家”的地图,并打开白天与可战斗参数。地图文件名需要和地图编号对应,也就是:
1 | |
这里最开始踩过一个坑:只把地图放进服务端的 Mir200\Map 还不够,客户端也必须有同名地图文件。否则服务端已经能执行 MAPMOVE ERFU_HOME,但客户端没有对应地图资源,进图时就会表现为地图加载异常、黑屏或看不到正确地形。
本地测试时需要同时确认两边:
1 | |
如果修改了地图文件本身,也要同步更新客户端 Map 目录里的副本;只改 MapInfo.txt、NPC 脚本或刷怪逻辑时,通常不需要重新复制地图文件。
NPC 脚本命名仍然沿用之前总结的规则:脚本路径 + "-" + 地图编号 + ".txt"。因此同一个 测试/二福 NPC 放到 ERFU_HOME 后,对应脚本就是:
1 | |
当前“二福之家”内的二福支持这些测试功能:
| 功能 | 脚本入口 | 说明 |
|---|---|---|
| 讲个笑话 | @joke |
验证普通 NPC 对话跳转 |
| 召唤几只鸡 | @spawn_chicken |
执行 MONGENEX ERFU_HOME 10 15 鸡 4 5,验证即时刷怪 |
| 开启稻草人小活动 | @event_straw |
先 CLEARMAPMON ERFU_HOME 清图,再刷 8 个稻草人 |
| 清理本地图怪物 | @clear_mobs |
执行 CLEARMAPMON ERFU_HOME |
| 传送菜单 | @teleport |
可回比奇、盟重、白日门 |
原比奇二福 NPC 增加了入口:
1 | |
这张地图现在更像一个可控的小实验室:玩家从比奇二福进入,在地图里直接验证刷怪、清怪、传送和 NPC 脚本跳转。后续如果继续扩展,可以在这里加固定刷怪点、活动奖励、触发器或完整任务链。
这次地图相关的 Git 提交记录:
1 | |
自定义装备测试记录
本轮验证了装备库新增、NPC 发放、穿戴属性、装备外观和衣服翅膀特效。实际使用的物品库是 SQLite:
1 | |
修改时需要同时写入源码库和运行库。运行中的服务端测试前至少执行:
1 | |
NPC 脚本改动则执行:
1 | |
如果涉及 UserCmd.txt 这类命令映射,重启 M2 最稳。
已验证物品
| 物品 | Idx | StdMode | 关键字段 | 结论 |
|---|---|---|---|---|
| 二福木剑 | 324 | 5 | Shape=1, Looks=30 |
可作为普通自定义武器发放和穿戴 |
| 二福试炼剑 | 325 | 5 | Shape=26, Looks=57, HP=50, MP=30, Light=1 |
可复用屠龙外观,并带基础数值 |
| 二福传送戒指 | 326 | 22 | Shape=112, Looks=172 |
可复用传送戒指特殊壳 |
| 云影战衣(男) | 510 | 10 | Shape=6, Looks=85, Anicount=1002 |
普通衣服位可穿,可触发外观链路 |
| 云影战衣(女) | 511 | 11 | Shape=6, Looks=88, Anicount=1002 |
普通衣服位可穿,可触发外观链路 |
字段经验
StdMode 决定物品类型。武器用 5,男衣服用 10,女衣服用 11,戒指用 22。这几个在当前端上已验证可用。
Shape 控制穿戴后的外观。武器、衣服最直接;首饰类则常用于特殊功能壳。
Looks 控制背包和装备栏图标。
Anicount 可用于衣服/武器外观特效。衣服翅膀特效按本地 LFM2 文档走 HumEffect*.wzl/wil,例如 HumEffect2 对应 1000-1024,本次 1002 验证成功。
Light 用于装备栏内观发光,不等同于人物外观翅膀。
Job 建议显式设置。普通全职业可用 99,避免空值导致部分装备类型判断异常。
翅膀素材经验
只改 DB 的 Anicount 不够,客户端必须有对应素材文件。最初只改:
1 | |
没有效果,原因是客户端 Data 目录缺少 HumEffect2 资源。
本次从本机大客户端包中抽取:
1 | |
提取并放入当前客户端:
1 | |
当前客户端本身是 .wil/.wix 体系;只放 .wzl/.wzx 时未生效。额外复制成 .wil/.wix 后,云影战衣 的 Anicount=1002 翅膀效果生效。
测试翅膀时必须关闭并重新打开客户端。客户端资源通常启动时加载,只重读服务端数据库不够。
给翅膀测试装备
翅膀不是单独挂载的道具,本次走的是“普通衣服 + Anicount 特效”的方式。给玩家测试时实际发的是衣服:
1 | |
NPC 脚本里发放可以写:
1 | |
关键点:
- 男衣服必须是
StdMode=10,女衣服必须是StdMode=11。 Anicount=1002只负责触发翅膀特效,客户端仍必须有HumEffect2.wil/.wix或对应资源。- 改 DB 后需要
@重读物品数据库;改客户端素材后必须重开客户端。

装备传送经验
武器双击优先是穿戴,不适合直接做双击使用触发。保留 二福试炼剑 为武器时,采用自定义命令实现:
1 | |
对应 QFunction-0.txt:
1 | |
玩家佩戴 二福试炼剑 后输入:
1 | |
即可传送到 ERFU_HOME。
不通的路径
StdMode=66/67 时装衣服在当前客户端/登录器上没有成功穿戴。ShowFashion 1、GiveOnItem 18、补齐 Job=99 后仍不通。当前结论是:时装栏链路未接通,后续不要优先走这条路。
要快速验证新衣服外观,优先用普通衣服位:
1 | |
再改 Shape、Looks、Anicount。
引擎内置提示与显示类问题怎么改
遇到游戏里反复出现某类系统提示、显示文案不合适、数值显示不符合预期时,优先按这个顺序排查:
- 先搜脚本目录,看是不是 NPC、机器人或触发脚本发出来的。
1 | |
- 如果脚本里搜不到,再搜引擎配置和字符串模板。
1 | |
- 找到开关、间隔、倍率、模板后,再决定是关掉、调频率、改倍率,还是只改显示文字。
这次“当前在线人数”就是典型的引擎内置提示,不是假人脚本触发。配置在:
1 | |
相关项:
1 | |
含义:
1 | |
如果不想一直刷,把开关关掉:
1 | |
如果只是想显示真实人数,保留提示但把倍率改成 1 倍:
1 | |
这类倍率在当前引擎里通常按 10 = 1倍 理解,所以 20 = 2倍。例如 M2 日志真实统计是:
1 | |
游戏里可能显示为:
1 | |
这不是人数真的翻倍,而是显示倍率造成的。
相关文字模板在:
1 | |
对应行:
1 | |
本次实际处理是不让它刷,因此已把 !setup.txt 改成:
1 | |
只关闭提示,不改倍率和文字。修改前备份:
1 | |
这类 !setup.txt 配置通常需要重启 M2Server 后生效;String.ini 文案修改也建议重启或使用引擎支持的重读命令后再验证。
智能假人:妮娅交互拟真性记录
当前已验证翎风端内置 Dummy 假人可用,妮娅能作为服务端假人出现在游戏里。
不要把 @妮娅 + SENDMSG 当成正式聊天方案。实机表现是系统消息样式,例如聊天框里显示“系统:妮娅:…”,并不会像普通玩家一样从妮娅头顶冒字。
当前更适合的路线:
1 | |
关键文件:
1 | |
测试期把 Nia.txt 里的发言频率调高,便于观察:
1 | |
@妮娅 目前只保留为调试入口:记录一次玩家互动事件,并提示观察假人头顶随机说话。正式方向应继续研究 Dummy 自身 [Say]、行为配置和假人生命周期事件,而不是继续堆 SENDMSG。
2026-06-05 更正:妮娅头顶说话的稳定方式
前面关于 SENDMSG 的判断需要更正。实机反复验证后,当前翎风端可以直接让假人以角色身份冒头顶字:
1 | |
已验证现象:
- 玩家自己执行
SENDMSG 8 ...时,玩家头顶会显示文字。 - 脚本执行
妮娅.SENDMSG 8 ...时,妮娅头顶会显示文字。 - 这条链路不依赖怪物、不依赖 DummyConfig 的
[Say]战斗触发,也不依赖自定义插件。
@妮娅 当前绑定在:
1 | |
当前稳定写法是:首句直接执行,后续句子用 DELAYGOTO 链接。不要先 GOTO 到另一个标签再发第一句,因为这条路径在当前脚本上下文里曾出现不触发。
1 | |
生效方式:
1 | |
如果角色权限不够或重读无效,就一键重启服务端。@重读商人 不会刷新这个用户命令脚本。
结论:妮娅的短期交互出口先定为 假人名.SENDMSG 8 文本。DummyConfig/Nia.txt 的 [Say] 仍可用于战斗/巡逻时的环境台词,但不再作为玩家主动互动的主路径。
2026-06-05 妮娅交互:前缀变量化与台词池
@妮娅 已从固定三句改成脚本内随机台词池。当前仍使用已验证的说话出口:
1 | |
为了避免以后多假人时把名字写死在每句台词里,脚本现在先设置显示名变量:
1 | |
注意:妮娅.SENDMSG 这个对象命令目标仍暂时保留硬编码,因为还没验证对象名前缀是否支持变量。当前可维护边界是:
- 发言目标:仍用已验证的
妮娅.SENDMSG 8。 - 显示前缀:统一用
MOV S90 妮娅。 - 台词正文:不再写假人名。
当前新增维护文件:
1 | |
NiaReplyPool.txt 是台词维护清单。当前没有找到并验证稳定的“从文本随机读行”脚本命令,所以 QFunction-0.txt 里暂时手动镜像这些台词,用引擎原生 RANDOM 做随机分支。
NiaMemoryPlan.txt 记录事件字段设计。当前 @妮娅 会向:
1 | |
追加结构化事件:
1 | |
后续外部智能层按 agent + player 聚合互动次数、最近地图和回复类型,再生成下一轮候选台词。短期原则:游戏内脚本负责可靠触发和记录,复杂记忆不要塞进 QFunction。
2026-06-05 更正:SENDMSG 文本不展开字符串变量
实测发现:
1 | |
头顶字只显示冒号及之后内容,说明 SENDMSG 8 的文本参数里不能依赖 <$STR(S90)> 展开。后续不要再把显示前缀变量直接塞进 SENDMSG 文本。
当前改为生成器方案:
1 | |
用法:
1 | |
生成器会读取:
1 | |
然后重写 QFunction-0.txt 的 @妮娅 段,生成稳定的运行脚本:
1 | |
这样运行脚本里虽然是实际名字,但名字来源集中在一键生成入口。以后换假人名,不要手改每句台词,直接运行生成器。
注意:生成器内部已避免在 PowerShell 源码中直接写 数据文件 这类中文路径,防止脚本源码编码导致路径乱码。最终 QFunction-0.txt 里应检查为:
1 | |
2026-06-05 妮娅记忆 V0 闭环
已完成第一版外部智能层闭环,不接 LLM、不接客户端、不改协议。
当前数据流:
1 | |
一键同步入口:
1 | |
当前已实测从 NiaEvents.txt 聚合出玩家 二福 的互动次数,并生成记忆台词:
1 | |
玩家侧验证流程:
1 | |
如果 @重读功能 权限不够或没有刷新,就一键重启服务端后再试。
已知限制:当前事件里的地图坐标仍记录为 %m/%x/%y,外部智能层会显示为“未知位置”。后续需要单独验证翎风脚本里正确的地图/坐标变量写法。
2026-06-05 妮娅主动性 V0:想法入口
新增游戏内命令:
1 | |
命令映射:
1 | |
对应脚本入口:
1 | |
当前用途:让妮娅说出自己的当前目标、关系判断和最近位置记忆。例如:
1 | |
台词来源:
1 | |
外部智能层生成该文件后,仍由:
1 | |
统一写回 QFunction-0.txt。当前实机运行脚本已生成成功;运行目录下的 D:\MirServer\Set-NiaAgent.ps1 曾因文件占用未能同步覆盖,但不影响当前实机脚本,server\_fake\_ai 默认使用工作副本里的生成器。
@妮娅想法 会写入事件:
1 | |
这两个事件只表示玩家查看妮娅想法,不增加 player\_contacts.interaction\_count。普通关系互动仍然只由 @妮娅 的 player\_interaction phase=start 计数。
2026-06-05 规则式智能假人里程碑与下一阶段
当前可以把妮娅定义为:
1 | |
已验证能力:
1 | |
新增文档:
1 | |
下一阶段优先做感知能力,而不是先堆行为能力。原因是:
1 | |
Milestone 2 暂定为:
1 | |
目标是生成统一的 WorldSnapshot,至少包含:
1 | |
脚本事件里地图坐标必须使用:
1 | |
不要再用 %m/%x/%y 写入 AddTextList,否则会原样写进事件文件。
2026-06-05 WorldSnapshot V0
Milestone 2 已开始落地,新增统一世界快照输出:
1 | |
生成命令:
1 | |
或者随主循环生成:
1 | |
当前 world_snapshot.json 已能输出:
1 | |
当前实测状态示例:
1 | |
当前仍明确标记未知:
1 | |
这一步的意义是:后续 LLM 不直接读原始日志,而是读 world_snapshot.json 和 planner_brief,再生成计划或台词。未知字段保持 null,不编造。
2026-06-05 DB 感知 V0
ApexMir.DB 已确认是 SQLite:
1 | |
可只读访问,主要表:
1 | |
已接入 WorldSnapshot:
1 | |
当前能读取最近互动玩家 二福 的角色状态:
1 | |
物品名解析方式:
1 | |
当前结论:没有在 Human 表里找到 妮娅,说明翎风内置假人不一定作为普通角色持久化进 Human/HumanAbil/HumanItems。
因此当前 WorldSnapshot 中:
1 | |
注意不要把“玩家 DB 可读”误认为“假人 DB 一定可读”。下一步如果要拿妮娅 HP/MP,需要继续找假人运行态来源,例如 M2 内部状态、脚本变量、假人专用命令或可控探针。