脚本死循环多发生在QFunction-0.txt、QManage.txt或自定义任务文件中,表现为NPC对话卡住、界面无响应、服务端CPU占用飙升。根本原因是标签跳转逻辑缺失出口或条件判断始终为真。
第一类:缺少终止条件的循环标签。例如:
[@LoopTest]
ACT
SENDMSG5测试消息
GOTO@LoopTest
此结构无限执行SENDMSG,必须加入判断中断。正确写法应为:
[@LoopTest]
IF
CHECKVARHUMANLoopCount<5
ACT
SENDMSG5测试消息
INCHUMANLoopCount1
GOTO@LoopTest
第二类:事件触发点重复调用自身。如在[@@Login]中直接跳转到另一个含@@Login调用的子脚本,形成嵌套递归。检查所有登录事件是否间接引用了自身标签,应改用一次性标志变量:
IF
EQUALHUMANGetGift0
ACT
SETHUMANGetGift1
GOTO@GiveQQGift
第三类:条件判断恒成立。例如使用CHECKITEM检测不可丢弃物品(如勋章),玩家无法移除该物品,导致每次对话都满足条件并重复执行动作。解决方法是执行后设置状态变量:
IF
CHECKITEM荣誉勋章1
EQUALHUMANMedalTalk0
ACT
SENDMSG5已领取勋章奖励
SETHUMANMedalTalk1
第四类:标签拼写错误导致跳转失效。如定义[@GetReward]但跳转写成GOTO@GetRewrd,引擎找不到目标标签,默认返回当前块开头,形成隐式循环。需逐行核对标签名称大小写与拼写。
第五类:QManage.txt任务索引冲突。多个任务绑定同一触发事件(如@@InPutString)且未用变量隔离,导致反复激活。应在每个任务入口设置唯一开关变量,避免交叉触发。
排查工具:开启服务端Debug模式,在Log目录查看QuestDiary.log,死循环脚本会高频重复记录同一标签名。临时解决方案是在可疑标签首行加入:
IF
LARGEHUMANDebugLoop10
ACT
RETURN
每执行一次INCHUMANDebugLoop1,超过10次强制退出。
修复后务必清除玩家角色中的相关HUMAN变量(如通过!CLEARHUMAN命令),否则旧状态可能再次触发异常逻辑。避免在[@main]中直接放置GOTO指令,应优先使用条件分支控制流程走向。
第一类:缺少终止条件的循环标签。例如:
[@LoopTest]
ACT
SENDMSG5测试消息
GOTO@LoopTest
此结构无限执行SENDMSG,必须加入判断中断。正确写法应为:
[@LoopTest]
IF
CHECKVARHUMANLoopCount<5
ACT
SENDMSG5测试消息
INCHUMANLoopCount1
GOTO@LoopTest
第二类:事件触发点重复调用自身。如在[@@Login]中直接跳转到另一个含@@Login调用的子脚本,形成嵌套递归。检查所有登录事件是否间接引用了自身标签,应改用一次性标志变量:
IF
EQUALHUMANGetGift0
ACT
SETHUMANGetGift1
GOTO@GiveQQGift
第三类:条件判断恒成立。例如使用CHECKITEM检测不可丢弃物品(如勋章),玩家无法移除该物品,导致每次对话都满足条件并重复执行动作。解决方法是执行后设置状态变量:
IF
CHECKITEM荣誉勋章1
EQUALHUMANMedalTalk0
ACT
SENDMSG5已领取勋章奖励
SETHUMANMedalTalk1
第四类:标签拼写错误导致跳转失效。如定义[@GetReward]但跳转写成GOTO@GetRewrd,引擎找不到目标标签,默认返回当前块开头,形成隐式循环。需逐行核对标签名称大小写与拼写。
第五类:QManage.txt任务索引冲突。多个任务绑定同一触发事件(如@@InPutString)且未用变量隔离,导致反复激活。应在每个任务入口设置唯一开关变量,避免交叉触发。
排查工具:开启服务端Debug模式,在Log目录查看QuestDiary.log,死循环脚本会高频重复记录同一标签名。临时解决方案是在可疑标签首行加入:
IF
LARGEHUMANDebugLoop10
ACT
RETURN
每执行一次INCHUMANDebugLoop1,超过10次强制退出。
修复后务必清除玩家角色中的相关HUMAN变量(如通过!CLEARHUMAN命令),否则旧状态可能再次触发异常逻辑。避免在[@main]中直接放置GOTO指令,应优先使用条件分支控制流程走向。

