您提供的脚本在执行时,MOV命令与GetListString命令均存在使用问题,导致读取文件异常。核心错误在于变量类型使用不当和文件路径格式不准确。
错误诊断与直接原因
首先,日志报错 [脚本错误] 脚本命令:MOV ... 参数1:<$STR(N主线段数)> 参数2:1 直接指明了问题。在传奇脚本中,N开头的变量(如N主线段数)是数字型变量。<$STR()>函数是用于获取字符串型变量(S变量)的值的。引擎试图将<$STR(N主线段数)>这个错误的格式解释为一个变量名,但无法识别,因此MOV命令的第一个参数报错。
脚本修正方案
您的原始脚本段落:
#IF
CHECK [102] 1
#ACT
MOV <$STR(N主线段数)> 1
GetListString ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt <$STR(N主线段数)> <$STR(S$主线名称)>
修正后的正确写法:
#IF
CHECK [102] 1
#ACT
MOV N主线段数 1
GetListString ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt <$STR(N主线段数)> S$主线名称
修正点详解:
1. MOV命令修正:MOV命令用于给变量赋值。给数字型变量N主线段数赋值应直接写作 MOV N主线段数 1。<$STR()>函数在此处是多余的且错误的。
2. GetListString命令修正:
◦ 第二个参数“行号”:要求传入一个数字。由于N主线段数是数字变量,需要将其值转换为字符串传入,因此应写作 <$STR(N主线段数)>。这一部分您原来的用法是对的,但前提是N主线段数这个变量必须已正确定义(即上一条MOV命令需正确执行)。
◦ 第三个参数“接收字符串的变量”:要求传入一个字符串型变量名。S$主线名称就是一个字符串变量(S$前缀表示私人字符串变量)。将其赋值给另一个变量时,直接写变量名 S$主线名称 即可,无需包裹<$STR()>。<$STR(S$主线名称)> 表示的是“获取变量S$主线名称的值”,而不是变量本身。
为什么总是读取第一行?
这是因为MOV命令因格式错误未能正确执行,导致N主线段数这个变量可能没有被成功赋值为1,或者其值在脚本其他部分被重置。当GetListString执行时,<$STR(N主线段数)>获取到的值可能是一个空值或无效值,引擎默认处理为读取第一行(行号1)。即使您尝试修改MOV N主线段数 2,如果这个MOV命令所在的脚本段因为其他错误(或条件不满足)没有执行,那么N主线段数的值依然是初始值或旧值,GetListString读取的行号也就不会改变。
路径与文件格式验证
您的文件路径 ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt 是相对路径。请确保:
1. 该路径相对于您的游戏服务器Mir200目录下的Envir文件夹是准确的。
2. 主线名称.txt文件确实存在于此路径,且内容格式为纯文本(ANSI编码),每行一条记录,格式如您所示:“被废弃的村庄1:皇族埋骨地一层1”。
完整排查与测试步骤
1. 备份脚本:修改前,备份您的QFunction-0.txt或其他包含此脚本的文件。
2. 修正语法:严格按照上述修正方案,修改脚本中的MOV和GetListString命令。
3. 检查关联脚本:检查脚本中所有修改N主线段数的地方(如使用INC、DEC、MOV等命令),确保语法都正确(直接使用N主线段数,而非<$STR(N主线段数)>进行赋值或计算)。
4. 添加调试信息:为了验证是否执行到该段脚本以及变量值,可以在命令后加入调试语句:
#ACT
MOV N主线段数 2 ;尝试修改为2或其他行号
GetListString ..\QuestDiary\二明专用\任务系统\任务变量\主线名称.txt <$STR(N主线段数)> S$主线名称
SENDMSG 6 【调试】当前读取行数:<$STR(N主线段数)>,获得内容:<$STR(S$主线名称)>
这样,如果脚本执行,游戏角色会收到一条提示信息,显示实际读取的行数和内容。
5. 重启并测试:修改保存后,重启M2服务器引擎(必要步骤),然后在游戏中触发执行该脚本的条件(例如完成标记[102]对应的任务)。观察M2控制台是否还有脚本错误,并查看游戏内的调试信息。
6. 检查文件:用记事本打开主线名称.txt,确认第二行确实有内容“被废弃的村庄1:皇族埋骨地一层2”。
GetListString命令标准用法归纳
• 功能:从指定文本文件中,读取某一行的内容,并将其赋值给一个字符串变量。
• 完整格式:GetListString 文件路径 行号 字符串变量
• 参数说明:
◦ 文件路径:文本文件的相对或绝对路径。推荐使用相对于Envir目录的相对路径。
◦ 行号:要读取的行数,从1开始计数。必须是一个能解析为数字的表达式,常用<$STR(N数字变量)>。
◦ 字符串变量:用于接收读取内容的字符串变量名,直接写变量名,如S$变量名、A变量名等。
遵循以上修正和排查步骤,即可解决脚本错误,并使GetListString命令能够正确读取指定文本文件的任意一行内容。

