用户反馈脚本出现死循环错误,触发点为NPC:RobotManage的@开始登录标签。错误日志如下:
[2018-11-28下午01:01:29][脚本死循环]NPC:RobotManage位置:0(0:0)命令:GOTO@开始登录
死循环原因分析
跳转逻辑闭环:
[@假人登录]中若条件满足(假人开关开启且未达上限),会执行GOTO@开始登录。
@开始登录标签内无论执行哪个分支,最终都会触发DUMMYLOGON(假人登录)并BREAK(跳出当前段)。
问题在于:执行完@开始登录后没有更新假人计数或状态,导致下次触发@假人登录时条件再次满足,形成循环跳转。
触发机制漏洞:
假设@假人登录被定时器(如每分钟1次)调用,每次触发都会尝试登录假人。
若脚本未更新全局假人计数(如递增计数变量),CHECKDUMMYCOUNT<<$GLOBAL(JRDLL)>会永远成立,循环永不停止。
脚本冗余问题:
@开始登录中有重复的#ACT标签(如RANDOM100分支),可能引发解析错误。
最后一个分支无#IF条件,成为“兜底执行项”,容易失控。
解决方案(修复死循环)
修改后的安全脚本:
[@假人登录]
IF
CHECKVARGLOBALJRKG=开
CHECKDUMMYCOUNT<<$GLOBAL(JRDLL)>
ACT
CALCVARGLOBALJRDLL_COUNT+1;递增假人计数
SAVEVARGLOBALJRDLL_COUNT;保存变量
CALL@开始登录;调用登录逻辑(非跳转!)
BREAK
[@开始登录]
...(原有登录逻辑,但修正以下问题)...
IF
RANDOM100
ACT;删除多余的#ACT
MOVRP020
INCP0640
MOVRP920
INCP9621
DUMMYLOGON<GLOBAL(VBQC)><STR(P0)><$STR(P9)>1
BREAK
IF
ACT
此处添加#ELSEACT更安全,避免无条件执行
MOVRP020
INCP0320
MOVRP920
INCP9320
DUMMYLOGON<GLOBAL(VMZC)><STR(P0)><$STR(P9)>1
BREAK
关键修改点:
用CALCVAR更新计数:
每次登录后递增JRDLL_COUNT变量,确保下次检查CHECKDUMMYCOUNT时可能条件不成立。
CALL替代GOTO:
CALL调用后会返回原位置继续执行,避免形成闭环。
清理语法错误:
删除重复的#ACT标签,最后一个分支改为#ELSEACT明确逻辑。
HERO引擎添加假人全流程
若需从头添加假人系统,按以下步骤操作:
配置假人开关和数量
在QManage.txt(全局脚本)中初始化变量:
[@Login]
IF
ACT
VARGLOBALJRKG开;假人开关
VARGLOBALJRDLL50;假人总数上限
VARGLOBALJRDLL_COUNT0;当前假人数
SAVEVARGLOBALJRDLLJRDLL_COUNT
创建假人登录脚本
在RobotManage.txt(机器人管理)中部署:
定时器触发(示例:每30秒登录一批)
[@DummyLoginTimer]
IF
ACT
GOTO@假人登录
[@假人登录]
IF
CHECKVARGLOBALJRKG=开
CHECKDUMMYCOUNT<<$GLOBAL(JRDLL)>
ACT
CALCVARGLOBALJRDLL_COUNT+1
SAVEVARGLOBALJRDLL_COUNT
GOTO@开始登录
BREAK
[@开始登录]
...(参考前文修正后的登录逻辑)...
假人行为控制(移动/说话)
在AutoRunRobot.txt中设置假人活动:
AutoRunNPCT530@DummyAction;每30秒触发
[@DummyAction]
IF
IsDummy;检查是否为假人
RANDOM3;随机概率
ACT
MOVRP0100;随机移动
MOVRP1100
MAPMOVE<Map><STR(P0)><$STR(P1)>
BREAK
IF
IsDummy
RANDOM5;20%概率说话
ACT
SENDMSG0假人[<$USERNAME>]:兄弟们一起攻沙啊!
BREAK
避坑指南
死循环预防:
所有跳转(GOTO/CALL)后必须更新状态变量。
用#ELSEACT替代无条件的#ACT分支。
假人数量控制:
通过CHECKDUMMYCOUNT和全局变量双重验证,避免超限。
引擎兼容性:
HERO引擎需确认DUMMYLOGON命令支持的地图编号格式(如3开头的数字)。
[2018-11-28下午01:01:29][脚本死循环]NPC:RobotManage位置:0(0:0)命令:GOTO@开始登录
死循环原因分析
跳转逻辑闭环:
[@假人登录]中若条件满足(假人开关开启且未达上限),会执行GOTO@开始登录。
@开始登录标签内无论执行哪个分支,最终都会触发DUMMYLOGON(假人登录)并BREAK(跳出当前段)。
问题在于:执行完@开始登录后没有更新假人计数或状态,导致下次触发@假人登录时条件再次满足,形成循环跳转。
触发机制漏洞:
假设@假人登录被定时器(如每分钟1次)调用,每次触发都会尝试登录假人。
若脚本未更新全局假人计数(如递增计数变量),CHECKDUMMYCOUNT<<$GLOBAL(JRDLL)>会永远成立,循环永不停止。
脚本冗余问题:
@开始登录中有重复的#ACT标签(如RANDOM100分支),可能引发解析错误。
最后一个分支无#IF条件,成为“兜底执行项”,容易失控。
解决方案(修复死循环)
修改后的安全脚本:
[@假人登录]
IF
CHECKVARGLOBALJRKG=开
CHECKDUMMYCOUNT<<$GLOBAL(JRDLL)>
ACT
CALCVARGLOBALJRDLL_COUNT+1;递增假人计数
SAVEVARGLOBALJRDLL_COUNT;保存变量
CALL@开始登录;调用登录逻辑(非跳转!)
BREAK
[@开始登录]
...(原有登录逻辑,但修正以下问题)...
IF
RANDOM100
ACT;删除多余的#ACT
MOVRP020
INCP0640
MOVRP920
INCP9621
DUMMYLOGON<GLOBAL(VBQC)><STR(P0)><$STR(P9)>1
BREAK
IF
ACT
此处添加#ELSEACT更安全,避免无条件执行
MOVRP020
INCP0320
MOVRP920
INCP9320
DUMMYLOGON<GLOBAL(VMZC)><STR(P0)><$STR(P9)>1
BREAK
关键修改点:
用CALCVAR更新计数:
每次登录后递增JRDLL_COUNT变量,确保下次检查CHECKDUMMYCOUNT时可能条件不成立。
CALL替代GOTO:
CALL调用后会返回原位置继续执行,避免形成闭环。
清理语法错误:
删除重复的#ACT标签,最后一个分支改为#ELSEACT明确逻辑。
HERO引擎添加假人全流程
若需从头添加假人系统,按以下步骤操作:
配置假人开关和数量
在QManage.txt(全局脚本)中初始化变量:
[@Login]
IF
ACT
VARGLOBALJRKG开;假人开关
VARGLOBALJRDLL50;假人总数上限
VARGLOBALJRDLL_COUNT0;当前假人数
SAVEVARGLOBALJRDLLJRDLL_COUNT
创建假人登录脚本
在RobotManage.txt(机器人管理)中部署:
定时器触发(示例:每30秒登录一批)
[@DummyLoginTimer]
IF
ACT
GOTO@假人登录
[@假人登录]
IF
CHECKVARGLOBALJRKG=开
CHECKDUMMYCOUNT<<$GLOBAL(JRDLL)>
ACT
CALCVARGLOBALJRDLL_COUNT+1
SAVEVARGLOBALJRDLL_COUNT
GOTO@开始登录
BREAK
[@开始登录]
...(参考前文修正后的登录逻辑)...
假人行为控制(移动/说话)
在AutoRunRobot.txt中设置假人活动:
AutoRunNPCT530@DummyAction;每30秒触发
[@DummyAction]
IF
IsDummy;检查是否为假人
RANDOM3;随机概率
ACT
MOVRP0100;随机移动
MOVRP1100
MAPMOVE<Map><STR(P0)><$STR(P1)>
BREAK
IF
IsDummy
RANDOM5;20%概率说话
ACT
SENDMSG0假人[<$USERNAME>]:兄弟们一起攻沙啊!
BREAK
避坑指南
死循环预防:
所有跳转(GOTO/CALL)后必须更新状态变量。
用#ELSEACT替代无条件的#ACT分支。
假人数量控制:
通过CHECKDUMMYCOUNT和全局变量双重验证,避免超限。
引擎兼容性:
HERO引擎需确认DUMMYLOGON命令支持的地图编号格式(如3开头的数字)。

