传奇单机Range check error报错定位与修复

来源: 作者: 点击:
一、这个报错到底是什么

Range check error 在老 Delphi 引擎(HERO、3K、GOM 早期、Blue 分支)里就是“数值越界”。程序往一个定长变量(Byte/Word/SmallInt 或定长数组下标)里写了超范围的值,SystemModule.dll 直接抛异常,表现可能是:

• M2 启动瞬间弹 Exception ERangeError in module SystemModule.dll

• 加载到“物品数据库/魔法数据库/地图”某一行卡死

• 进游戏点某个 NPC、用某个技能、捡某件装备时崩

• 登录器刚点连接就弹窗

它不是网络问题,也不是列表问题,核心是“数据超出程序允许范围”。单机架设按下面顺序查,不用重装系统。

二、第一优先:系统日期格式

老引擎读系统时间做种子运算,中文日期格式会直接撑爆缓冲区。

控制面板→区域→更改日期、时间或数字格式→其他设置→日期:
• 短日期改成 yyyy-M-d 或 yyyy-MM-dd

• 时间改成 HH:mm:ss

• 别用“2026年10月23日”这种中文格式

改完重启电脑再起 M2。这一步能解决一半以上的 ERangeError。

三、第二优先:大内存冲突

32 位 M2 吃不满 4G,物理内存加到 4G/8G/16G 后,SystemModule.dll 分配连续内存块失败就会报这个错。

临时解法(三选一):
1. Win+R 输 msconfig→引导→高级选项→勾“最大内存”填 2048→重启,架完再取消
2. M2Server.exe 快捷方式目标末尾加 -maxmem2048
3. 换同版本“大内存适配版”SystemModule.dll(必须同引擎 revision,HERO 的不能套 GOM 的)

M2Server.ini 里 MaxMemory 别瞎填,默认 1024/512 就够单机,别填 4096 以上。

四、第三优先:看 M2 红字定位具体行

弹错之前 M2 黑窗口最后几行红字最关键,按红字指向分四类:

1. 卡在“加载物品数据库”
用 DBC2000 或 DB Commander 打开 Mud2\DB\StdItems.DB:
• 物品 ID(Idx)不能大于 65535,不能有字母、空格、不可见符号

• 重量、攻击、魔法、道术、持久、外观编号不能填负数或超大值

• 空字段保持空白,别敲空格

• 检查有没有重复 Idx

• 用 Notepad++ 以 ANSI 打开导出的 StdItems.txt,开“显示所有字符”看有没有隐藏符

2. 卡在“加载魔法数据库”
打开 Magic.DB:
• MagicId 不能重复

• MagicName 不能空

• Spell 列不能是负数

• Effect 特效编号要和客户端 Magic.wil 索引对得上

合击端还要看 Skill.DB 在不在,纯 1.76 端没这张表就别勾“启用英雄”。

3. 卡在“加载地图”
打开 Envir\MapInfo.txt:
• 地图号第一列不能超过 65535

• 别用负数、别用 999999 这种离谱值

• 0-50 是系统保留主城区,自定义地图从 51 往后排

• 地图尺寸别超 1500×1500

4. 卡在“加载怪物”
Monster.txt、MonGen.txt:
• 怪物 ID 不超范围

• X/Y 坐标别大于 10000

• 刷怪数量别写 99999,先控在 100 以内测试

五、配置文件参数越界

打开 M2Server.ini / Mir200.ini / !Setup.txt,重点核对:

• MaxMemory:保持默认,别超设备内存一半

• MaxOnline:默认 500-1000,单机填 10-50 足够

• ServerPort / GatePort:1024-65535,别重复

• DataPath、MapPath、CastleFile 路径:优先用相对路径(如 .\Mud2\DB\),别写死盘符

• 路径里别带中文、空格、括号

如果最近移动过服务端目录,把所有绝对路径改成相对路径,不然资源定位错乱也会抛越界。

六、文件编码统一 ANSI

所有 Envir 下的 txt 配置、列表文件、脚本文件,保存时必须 ANSI。

• 别用 UTF-8

• 别用 UTF-8 BOM

• 别用 UTF-16

• Excel 存过的 dbf 会破坏 BDE 头,回原包覆盖

• Notepad++ 批量转码:编码→转为 ANSI 编码→保存

编码错会让引擎把文本字节流误读成大数值,表现就是莫名其妙 Range check。

七、SystemModule.dll 状态

进 Mir200 目录:
• 文件在不在,大小正常吗(通常 1-4MB)

• 被杀软隔离的话只剩几 KB 残片,去 Defender/360 隔离区恢复并加白名单

• 覆盖前关杀软,覆盖后右键文件属性→常规最底下若显示“此文件来自其他计算机”点“解除阻止”

• 只从同版本完整引擎包复制覆盖,严禁跨引擎换 DLL

八、脚本层越界(改过 NPC/活动脚本才查这)

如果 M2 能起来,但点某个 NPC、跑某个活动才崩,问题在脚本。

开脚本日志先定位:
• GOM:Mir200\Log\ScriptRun.log,控制器→参数设置→脚本设置→勾记录脚本执行日志

• GEE:Setup.txt 里 ScriptLog=1,看 Log\ScriptLog.txt

重点查:
• MOV/CALCVAR 赋了超出范围的数值

• 数组下标写死超过定义长度

• 循环 FOR/WHILE 边界没封死,死循环撑爆栈

• AddHP/AddGold 传了负数或天文数字

• 最近新加的爆率文件、任务脚本先整段注释掉回滚测试

九、插件冲突

打开 Mir200\PlugList.txt,暂时只保留基础插件(如 IPLocal.dll),把其他第三方插件全注释掉,重启 M2。

报错消失就逐个加回,定位是哪个插件不兼容。老插件套新引擎特别容易在 SystemModule 调用时越界。

十、DBC 与数据库环境

1. 控制面板看 BDE Administrator 在不在,没有就重装 DBC2000(用 32 位版,老引擎只认 32 位 BDE)
2. 数据库别名一般是 HeroDB,PATH 指向 D:\MirServer\Mud2\DB,纯英文
3. 右键 DB 目录取消只读,给 Everyone 完全控制
4. 用 DBC 排序器对 StdItems.DB、Magic.DB 排一次序
5. 角色数据表 CurrMap 字段若存了 -1 或 70000 这种非法地图号,加载角色就崩,清测试账号重建

十一、客户端/登录器侧(进游戏后才报才查这)

• 登录器必须用服务端自带配置器生成,别混用

• 补丁不完整、PAK 密码错、NewopUI.pak 缺失会触发客户端侧 Range check

• 客户端路径纯英文,如 D:\LegendClient

• 登录器右键属性:管理员运行、Win7 兼容、禁用全屏优化

• 清客户端 Cache 缓存

• 装 VC++ 2005/2008/2010 x86 运行库、.NET 3.5、DirectX 9.0c

十二、最小复现法

不想挨个查就这样缩范围:

1. 把 Mud2\DB 换成同引擎原包纯净库→能起说明原库坏/字段错
2. 把 Envir 里自己加的 NPCScript、QuestDiary 临时移走→能起说明脚本问题
3. 把 PlugList.txt 清空到只留基础插件→能起说明插件问题
4. 换原版登录器→能进说明登录器/补丁不匹配
5. 限内存 2048 重启→能起说明大内存冲突

每次只动一项,好定位。

十三、单机架设推荐一套稳的配置

系统层:
• 短日期 yyyy-M-d

• 内存限制 2048MB(架完恢复)

• 关 Defender 实时防护或加白名单

路径层:
• 服务端 D:\MirServer

• 客户端 D:\LegendClient

• 全英文无空格

数据库层:
• DBC2000 32位

• HeroDB 指向 Mud2\DB

• StdItems/Magic/Monster 字段不超 65535、无负数、无重复 ID

引擎层:
• M2Server.ini 用默认内存参数

• 插件只留必要的

• SystemModule.dll 同版本覆盖

脚本层:
• 所有 txt 配置 ANSI 编码

• 地图号从 51 起

• 循环脚本加边界保护

十四、排错顺序速查

1. 改系统日期格式→重启
2. 限内存 2048→重启
3. 看 M2 红字最后一行,定位到具体库/地图/脚本
4. 查 StdItems/Magic/Monster/MapInfo 越界值
5. 配置文全部 ANSI,路径改相对
6. 覆盖同版本 SystemModule.dll
7. 清插件、回滚脚本
8. 换原版登录器+纯客户端补丁
9. 装运行库、关杀软、管理员权限

十五、几个容易忽略的坑

• 昨天还好好的今天报:先查磁盘空间(低于 1GB 会写不进临时数据)、查服务端目录有没有被移动过

• 加内存后突然报:基本就是大内存冲突,限内存立刻好

• 改完数据库用 Excel 存过:dbf 头已坏,只能从原包覆盖

• 跨引擎换 DLL:HERO 的 dll 套 GOM 必崩,看着像同一个文件其实内部偏移不同

• 脚本里 CALCVAR 算出来的中间值没做上下限裁剪,人数/倍数一高就溢出

• 登录器 Config.ini 里 PathCheck 开着、路径太长也会触发,关掉或缩短路径

Range check error 不是玄学,本质就是“某个值超出了程序预留的空间”。先改日期和内存这两步最快,不行再看 M2 红字行号往数据库和脚本里戳,基本都能在半小时内定位。改任何文件前把 Mud2\DB、Envir、Mir200.ini、PlugList.txt 各备一份,改崩了直接拖回来。

真遇到 SystemModule.dll 00079691 这种带偏移地址的,不用管那个数字,它只是 dll 内部抛出点,换同版本干净 dll+限内存+日期格式三件套下去,十有八九直接消。