一、这个报错到底是什么
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+限内存+日期格式三件套下去,十有八九直接消。
传奇单机Range check error报错定位与修复
来源:
作者:
点击:

