当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇单机Rangecheckerror报错定位与修复

热度:
一、这个报错到底是什么

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

•M2启动瞬间弹ExceptionERangeErrorinmoduleSystemModule.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或DBCommander打开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-8BOM

•别用UTF-16

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

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

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

七、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.控制面板看BDEAdministrator在不在,没有就重装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缺失会触发客户端侧Rangecheck

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

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

•清客户端Cache缓存

•装VC++2005/2008/2010x86运行库、.NET3.5、DirectX9.0c

十二、最小复现法

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

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

每次只动一项,好定位。

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

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

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

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

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

•客户端D:\LegendClient

•全英文无空格

数据库层:
•DBC200032位

•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开着、路径太长也会触发,关掉或缩短路径

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

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