一、死循环根源与代码诊断
M2提示“脚本死循环”并定位到 QFunction 的 @宗派经验 标签,原因是脚本逻辑存在无限递归调用。每次执行 [@GetExp] 段落后,程序都会无条件跳转到 @宗派经验 标签,而该标签内部没有退出机制,导致每次获得经验都重复触发,形成1秒1次的循环调用。
核心问题代码分析:
[@GetExp] ; 获得经验时自动触发
#act
goto @宗派经验 ; 无条件跳转
goto @烽火001 ; 此句永远不会执行
goto @冲级赛 ; 此句永远不会执行
break ; 此句永远不会执行
脚本引擎执行到 goto @宗派经验 后会立即跳转,后续的 goto @烽火001 和 break 永远不会被执行。只要玩家持续获得经验(例如挂机打怪),就会反复触发 [@GetExp] 段落,造成服务器资源耗尽。
二、死循环修复方案(三选一)
方案A:增加触发冷却标识(推荐)
为 [@宗派经验] 段落增加一个冷却时间检查,防止同一秒内重复执行。
修改后的代码:
[@GetExp]
#IF
LARGE <$GLOBAL(经验冷却标识)> <$DATETIME> ; 检查冷却时间是否大于当前时间
#ACT
break ; 如果在冷却中,则停止执行
#ELSEACT
MOV GLOBAL(经验冷却标识) = <$STR(N$DATETIME+5)> ; 设置冷却标识为当前时间+5秒
goto @宗派经验
goto @烽火001
goto @冲级赛
break
[@宗派经验]
#if
CHECKNAMELIST ..\QuestDiary\宗师系统\宗主名单.txt
#ACT
GetRandomName ..\QuestDiary\宗师系统\经验\<$USERNAME>.txt S28
mov d21 <$STR(S28)>
MOV d22 <$GETEXP>
INC d21 <$STR(d22)>
MOV S27 <$STR(d21)>
DelTextList <$STR(S28)> ..\QuestDiary\宗师系统\经验\<$USERNAME>.txt
AddTextList <$STR(S27)> ..\QuestDiary\宗师系统\经验\<$USERNAME>.txt
break
修改说明:
• 新增 GLOBAL(经验冷却标识) 全局变量,每次触发后设置为“当前时间+5秒”。
• 在 [@GetExp] 开头检查冷却标识,若未过期则直接 break,防止频繁触发。
方案B:增加执行条件限制
在 [@GetExp] 触发时,增加一个随机概率或等级条件,降低触发频率。
修改后的代码:
[@GetExp]
#IF
Random 5 ; 20%概率触发
CHECKLEVELEX > 40 ; 等级大于40级才触发
#ACT
goto @宗派经验
goto @烽火001
goto @冲级赛
break
修改说明:
• Random 5 表示20%的概率(1/5)才会执行后续跳转。
• CHECKLEVELEX > 40 限制了低级玩家不会触发此脚本。
方案C:优化跳转逻辑
将多个 goto 调用整合到同一个条件分支内,避免逻辑冲突。
修改后的代码:
[@GetExp]
#if
CHECKNAMELIST ..\QuestDiary\宗师系统\宗主名单.txt
#ACT
GetRandomName ..\QuestDiary\宗师系统\经验\<$USERNAME>.txt S28
mov d21 <$STR(S28)>
MOV d22 <$GETEXP>
INC d21 <$STR(d22)>
MOV S27 <$STR(d21)>
DelTextList <$STR(S28)> ..\QuestDiary\宗师系统\经验\<$USERNAME>.txt
AddTextList <$STR(S27)> ..\QuestDiary\宗师系统\经验\<$USERNAME>.txt
#ELSEACT
; 非宗主的经验处理
break
; 独立出其他经验触发模块
[@GetExp_2]
#IF
CHECK 其他条件
#ACT
goto @烽火001
goto @冲级赛
break
三、文件操作性能优化
原 [@宗派经验] 段落中存在频繁的文件读写操作,是导致性能瓶颈的潜在原因。
优化建议:
1. 减少文件操作频率:将经验累加到变量,每60秒写入一次文件,而非每次获得经验都读写。
2. 使用内存变量:将玩家经验数据存储在 GLOBAL 或 P-Variable 变量中,下线时再统一写入文件。
3. 检查文件路径:确认 ..\QuestDiary\宗师系统\经验\<$USERNAME>.txt 路径存在且可写。如果文件路径错误,脚本可能陷入异常循环。
四、修复操作步骤
1. 备份文件:打开 D:\MirServer\Mir200\Envir\QuestDiary\QFunction-0.txt,复制备份。
2. 定位代码:查找 [@GetExp] 段落,通常位于文件中部。
3. 修改代码:根据上述方案A、B、C选择一种进行修改。推荐方案A,可有效防止死循环。
4. 验证语法:确保修改后的脚本语法正确,特别是条件判断的括号和标签格式。
5. 重载脚本:修改完成后,在M2控制台输入 @重读QF 命令,或点击“重新加载”->“重读QFunction脚本”。
6. 观察日志:查看M2控制台是否还有“脚本死循环”提示。玩家获得经验时,观察脚本是否按预期频率执行。
注意事项:
• 修改前关闭服务端,防止脚本缓存导致修改不生效。
• 如果对脚本不熟悉,建议采用方案A(增加冷却标识),此方案改动最小且最安全。
• 修改后需在游戏中实际测试获得经验时脚本的触发情况。

