热血传奇NPC脚本死循环修复与人物两点来回跑随机走动脚本写法范例

来源: 作者: 点击:
一、NPC脚本死循环原因与修复

传奇脚本死循环(M2提示Script Dead Loop或NPC对话卡死)基本都是GOTO无出口、标签互相调用、条件恒真导致。引擎默认ScriptGotoCountLimit=10~50次,超了直接报错。

典型错误写法:

[@Loop]
#ACT
SENDMSG 5 测试中
GOTO @Loop ← 无条件跳回自己,必死循环


正确加终止条件(计数器法):

[@Loop]
#IF
CHECKVAR HUMAN S0 < 5 ; 小于5次才继续
#ACT
SENDMSG 5 执行第<S0>次
CALCVAR HUMAN S0 + 1
SAVEVAR HUMAN S0 ..\QuestDiary\测试\计数.txt
GOTO @Loop
#ELSEACT
SENDMSG 5 循环结束
CLOSE

登录时在[@Login]或NPC的[@main]先MOV S0 0再进循环。

常见死循环坑位排查:
• @A跳@B,@B又跳@A 形成闭环→任一边加变量判断断环

• #IF条件永远为真(如检测不可丢弃物品、CHECKVAR=常量)且无#ELSEACT跳出→执行后设标记变量

- 标签名拼错(GOTO @GetRewrd 实际标签是@GetReward)→引擎找不到标签默认重跑当前段,表现为隐式死循环
• QFunction-0.txt里@@OnDie之类事件脚本含GOTO回自身→改成交互式触发或加次数限制

临时放宽限制可改Mir200\!Setup.txt中ScriptGotoCountLimit=5000(改完重启M2),但这只是掩盖问题,脚本本身必须加终止条件。

二、人物两点来回跑脚本(NPC触发型)

放在Mir200\Envir\QuestDiary\功能\来回跑.txt,NPC用#CALL调用或在对话里给按钮触发:

[@main]
#IF
#ACT
MOV S0 0 ; 跑动次数计数器
MOV S1 330 ; A点X
MOV S2 330 ; A点Y(盟重示例)
MOV S3 400 ; B点X
MOV S4 400 ; B点Y(土城示例)
MOV S5 0 ; 0=去B 1=去A
GOTO @DoRun

[@DoRun]
#IF
EQUAL S5 0
#ACT
MAPMOVE 3 <$STR(S3)> <$STR(S4)> ; 去B点 地图3=盟重 如不同地图需分开写
DELAY 2000
MOV S5 1
INC S0 1
GOTO @CheckCount

#IF
EQUAL S5 1
#ACT
MAPMOVE 3 <$STR(S1)> <$STR(S2)> ; 去A点
DELAY 2000
MOV S5 0
INC S0 1
GOTO @CheckCount

[@CheckCount]
#IF
LARGE S0 20 ; 来回跑20次后停
#ACT
SENDMSG 6 来回跑结束
CLOSE
#ELSEACT
GOTO @DoRun


说明:MAPMOVE是瞬移,想走过去用MOVETO 地图ID X Y(部分引擎支持),WAIT单位毫秒(部分引擎用DELAYCMD)。跑动中按F12或点NPC"停止跑动"可中断——建议NPC对话加#IF CHECK [停止变量] CLOSE做停止开关。

三、假人/怪物两点来回走(服务端MonGen或假人脚本)

假人配置文件Mir200\Envir\DummyConfig\假人名.txt加移动参数实现范围随机走动(非严格两点但够用):

[Move]
MoveRange=15
MoveIntervalMin=3000
MoveIntervalMax=6000

严格两点来回需Robot脚本定时MAPMOVE假人到A再B,参考第二节写法把MAPMOVE对象换成DUMMYMOVE(GOM用MOVETO 假人名 地图 X Y或DUMMY系统自带路径点)。

四、人物随机左右走动(区域内随机坐标)

NPC触发让玩家在本地图随机走(挂机类):

[@RandomWalk]
#ACT
MOVR P7 10 ; P7=X偏移 -10~+10随机
MOVR P8 10 ; P8=Y偏移 -10~+10随机
INC P7 <$X> ; 当前X+P7=新X
INC P8 <$Y> ; 当前Y+P8=新Y
MOVETO <$MAP> <$STR(P7)> <$STR(P8)>
DELAY 1500
GOTO @RandomWalk

加计数器限制次数防死循环,如LARGE S0 50 → CLOSE 否则 INC S0 1 GOTO @RandomWalk。

死循环牢记一条——凡是GOTO回自身或形成闭环必加变量计数器+#ELSEACT跳出。来回跑脚本用两点坐标交替MAPMOVE配合次数判断即可正常运行不会卡引擎。