传奇脚本老是停止运行:语法死循环编码资源全有关

来源: 作者: 点击:
脚本“停止运行”不是单一原因,是语法、逻辑、编码、引擎版本、资源引用、插件依赖、服务器资源这几块里至少有一块出问题。M2 报红字、NPC 点开没反应、任务跑到一半断掉、机器人脚本不执行、QFunction 卡死,根因都在这几类里。

一、语法和标点问题
传奇脚本只认英文半角。中文逗号、中文句号、中文括号、全角空格混进去,引擎按空格分词就会把命令拆坏。
常见写法:
• GIVE 金币 1000, 末尾中文逗号

• MAPMOVE 015 50 50 中间是全角空格

- [@main ] 标签后面带空格,跳转对不上
• #IF 下面写 GIVE,#ACT 下面写 CHECKGOLD

• 标签名 @领取奖励 和 GOTO @领取 对不上

- [@xxx] 少写方括号,或者 [@@InputInteger1] 回调标签不存在

Notepad++ 开“显示所有字符”能直接看到全角空格和制表符。

二、死循环和无条件跳转
这是“停止运行/脚本死循环/CPU 100%”的头号原因。
- [@Main] 里 #ACT GOTO @Main
• [@A] 跳 [@B],[@B] 又跳回 [@A]

• 回收脚本 GOTO @Recycle 但没先 CHECKITEM 判断背包还有没有东西

• [@KillMon] 里 CALL 的段又触发杀怪事件,形成递归

• 机器人脚本 Robot.txt 间隔 1 秒,执行内容还嵌套循环

引擎有 ScriptGotoCountLimit 一类保护,超过跳转次数就强行终止这段脚本;表现就是“点一下 NPC 没反应”“功能突然不跑了”“M2 刷脚本死循环”。

修法不是无脑调大限制,而是给循环加退出:

[@Recycle]
#IF
CHECKITEM 垃圾装备 1
#ACT
TAKE 垃圾装备 1
GIVE 金币 100
INC N$循环次数 1
#IF
LARGE N$循环次数 200
#ACT
MOV N$循环次数 0
BREAK
#ELSEACT
GOTO @Recycle
BREAK


三、文件编码
传奇主流引擎脚本要 ANSI。用系统记事本另存成 UTF-8 或 UTF-8 BOM,引擎读出来是乱码,命令全不认,表现就是 NPC 乱码、点不动、加载失败。
正确做法:Notepad++ 打开 → 编码 → 转为 ANSI → 保存。从网页复制来的脚本常带不可见字符,要重打一遍空格和换行。

四、变量类型和溢出
• 把字符串赋给数字变量

• INC N1 1 但 N1 根本没初始化

• 荣誉点/声望/元宝类变量老引擎是短整型,一次加几百万直接溢出

• G 系列全局变量和 N 系列私有变量混用,别的 NPC 改了同一个号

• HERO 里系统变量大小写敏感,写错就当没这个变量

五、跳转标签 / CALL 文件找不到
GOTO @领取奖励 但文件里没有 [@领取奖励];
#CALL [\QuestDiary\活动\转盘.txt] @Draw 但路径、文件名、标签名有一个不对;
Merchant.txt 里写的脚本文件名和磁盘文件差一个字母,NPC 直接加载失败。

六、引擎版本不兼容
HERO、GOM、GEE、BLUE、LEGEND 命令集不是完全互通。
• GEE 的 CHECKTEXTLIST 塞进 HERO 直接未知命令

- HERO 的 N$变量 老 GOM 不认
• 新版引擎的 OpenShopEx、HeroSkillCast 老引擎没有

跨引擎抄脚本,M2 启动或点 NPC 就报“未知命令/脚本错误”。

七、资源引用丢失
脚本里调的东西不存在也会中断:
• MAPMOVE 999 50 50 但 MapInfo 里没 999

• GIVE 屠龙 1 但 StdItems.DB 里没这物品

• MOB 祖玛教主 5 但 Monster.DB 没这怪

• 爆率文件 MonItems\XXX.txt 里 1/100 不存在的物品名

资源找不到时,触发到那一行就停。

八、插件 / DLL 依赖没了
自动拾取、光柱、会员系统、合击扩展、脚本加密插件,都是 DLL 提供新命令。
插件没放、没在 M2 插件列表勾选、授权过期、DLL 被杀软删了,脚本里一调 AddHeroSkill / OpenAutoPick 这种命令就整段崩。

九、机器人 / 定时器脚本太密
Robot.txt 里:

#AutoRunNPC
1
[@Bot]

1 秒跑一次复杂脚本,CPU 堆积,M2 自我保护,后续脚本不执行。
登录触发 [@Login]、攻击触发 [@Attack]、杀怪 [@KillMon] 里再套 GOTO/CALL,也会把主线程拖死。

十、内存和资源占用
低配机跑大版本:
• 同点刷 1000 只怪

• 地图事件每秒检测 BOSS

• 全局变量列表无限增长

日志出 Out of memory,M2 直接卡住,脚本当然“停止运行”。

十一、杀毒/系统干扰
M2Server.exe、LoginGate、DBServer、脚本里的外部调用被杀软隔离,文件半边被删,加载到某行就断。这不是脚本本身错,但表现一模一样。

十二、改完不重启
QuestDiary、QFunction、QManage 改了只重登客户端不重启 M2,服务端根本没重新读脚本,你以为“脚本停止运行”,其实是新逻辑没加载。

十三、快速定位顺序
1. 看 M2 红字:会写“某某.txt 第 38 行”
2. 进 Mir200\Log 看 ScriptLog / ErrorLog,找重复出现的文件名
3. 先查最近改过的:Market_Def、QuestDiary、QFunction-0.txt、Robot.txt
4. 把新加段注释掉,能跑就是这段问题
5. 查 GOTO / CALL / 循环段有没有终止条件
6. 查编码是不是 ANSI
7. 查命令在你引擎里存不存在
8. 查地图/物品/怪物 ID 是否存在
9. 查插件 DLL 是否加载
10. 改完重启 M2,不是重启游戏客户端

十四、最典型的几句病根
• “点 NPC 第一次行,第二次没反应” → 变量没清零 / 标志位没复位 / GOTO 没 BREAK

• “M2 CPU 拉满” → 死循环 / Robot 间隔太短 / QFunction 递归

• “NPC 显示乱码” → UTF-8 编码 / 全角字符

• “一进地图就卡” → MapQuest 触发里死跳 / 地图事件调了不存在标签

• “升级武器点下去没反应” → 回调标签 ~Upgradenow 新版不认 / 缺 takegold / 请求标签没接

• “任务做一半断了” → 变量被别的系统占用 / 存盘失败 / 条件符号写反

脚本停止运行,九成不是“引擎坏了”,是某行命令、某个跳转、某个编码、某个资源 ID 不对。先把死循环和编码这两块排掉,再查跨引擎命令和插件,基本都能定位到具体文件具体行。