传奇服务端运行异常时,脚本错误是常见根源。高效定位问题需结合日志分析、结构验证与逐段测试,以下提供一套系统性排查流程,适用于QFunction、NPC、自定义命令等主要脚本类型。
一、启用详细日志输出
在MirServer.ini或!Setup.txt中开启脚本调试模式,例如设置ScriptDebug=1。重启服务端后,所有脚本执行过程将记录至LogScriptLog.txt。重点关注“Error”“Failed to load”“Invalid command”等关键词,日志通常会标注具体文件名及行号。
二、检查基础语法格式
90%的脚本错误源于格式疏漏。确认以下要点:
所有标签如[@main]、[@Login]必须独占一行,前后无空格;
条件指令#IF、#ACT、#ELSE必须成对出现,且顶格书写;
变量使用格式,不可遗漏尖括号;
物品、地图、技能名称与数据库完全一致,区分大小写;
文件编码为ANSI,禁用UTF-8或带BOM格式。
三、隔离问题脚本文件
若服务端启动失败,先注释掉!NPC_def.txt中所有NPC引用,仅保留一个测试NPC。逐步取消注释,每加一个就重启服务端,直至复现错误,即可锁定问题文件。同理,可将QFunction-0.txt内容分段注释(用;开头),缩小错误范围。
四、验证高频触发事件
[@Login]、[@KillMonster]、[@MapMove]等事件在游戏过程中频繁调用,一旦存在逻辑漏洞易引发连锁错误。在这些标签开头添加临时日志输出,例如:
[@Login]
ACT
SENDMSG 0 "玩家已登录"
通过观察日志是否正常打印,判断脚本是否被执行到,进而定位卡点位置。
五、测试变量与条件分支
使用SENDMSG向GM发送变量值,验证逻辑是否按预期走通。例如:
IF
CHECKITEM 金条 1
ACT
SENDMSG 5 "检测到金条,准备给予奖励"
GIVE 黄金戒指 1
ELSE
SENDMSG 5 "未检测到金条,跳过奖励"
若GM未收到对应消息,说明条件判断未触发,需检查物品名或数量是否匹配。
六、核对数据库关联项
脚本中涉及的物品、怪物、地图必须存在于对应数据库。例如GIVE指令调用的“屠龙”,需确认StdItems.db中存在Name字段为“屠龙”的记录。可用数据库查看工具导出列表,与脚本逐项比对。
七、排除外部依赖缺失
部分脚本依赖自定义DLL或插件(如CallDll功能)。若未放置对应DLL文件或未在配置中启用,会静默失败。检查Plugins目录是否存在所需模块,并确认!RunGate.txt或!Abuse.txt中已加载。
八、使用最小化测试案例
新建一个独立NPC,仅包含待测功能代码。例如怀疑MAPMOVE指令异常,则创建:
[@main]
ACT
MAPMOVE 3 333 333
直接点击该NPC,观察是否传送成功。若失败,说明坐标无效或地图未加载;若成功,则原脚本问题出在其他逻辑环节。
九、对比标准模板文件
从稳定运行的服务端包中提取同名脚本(如QFunction-0.txt),用文本比较工具(如WinMerge)与当前文件逐行对比,快速发现多余符号、缺失指令或错位缩进。
十、监控内存与堆栈异常
若脚本导致服务端崩溃但无明确日志,可能是无限递归或变量溢出。在可疑循环处加入计数器限制,例如:
IF
EQUAL 0
ACT
INC PARAM0 1
CALL [@Loop]
防止无终止调用耗尽资源。
通过以上方法,可将模糊的“脚本出错”转化为具体文件、行号及逻辑断点。核心思路是:先看日志定位范围,再用隔离法缩小目标,最后以最小案例验证假设。坚持每次只改一处、及时备份原文件,能大幅缩短排错周期。

