传奇脚本死循环详解与假人添加指南,HERO引擎必看

来源: 作者: 点击:
用户反馈脚本出现死循环错误,触发点为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开头的数字)。
[顶部]