check [43] 1 是传奇NPC脚本里最常用的条件判断语句之一,意思是检查当前角色身上编号为43的变量值是否等于1。如果等于1,条件成立,执行后面#ACT段里的动作;如果不等于1,条件不成立,执行#ELSESAY或#ELSEACT段里的内容。
你贴的代码结构:
IF
check [43] 1
act
GOTO @怎么怎么的
ELSESAY
这段脚本的完整逻辑是:先判断变量[43]是否为1。如果为1,跳转到标签“@怎么怎么的”继续执行后面的脚本;如果不是1,则什么都不做,或者说显示#ELSESAY后的提示文字。因为你这里#ELSESAY后面没有写内容,所以条件不成立时NPC只是没有响应而已。
注意写法,GOTO和标签之间不要加空格,应该写成 GOTO @怎么怎么的,中间有空格可能导致跳转失败。另外#ACT和#ELSESAY都不是必须同时存在。只有#IF+check时,条件成立也可以什么都不做,条件不成立也可以只显示文字,全看你自己怎么设计。
一、方括号里的数字是什么
传奇脚本里[43]这种写法表示一个数字型变量,中括号内是变量编号。变量编号一般有范围限制,不同引擎范围不一样,常见的是0到499。这个变量用来保存数字,可以当作任务进度、开关标志、领取状态、触发次数等任何整数用途。
比如[43]等于0可能表示“没有完成任务”,等于1表示“任务已经完成”或“这个开关已经打开”。具体含义由你自己的脚本决定,引擎本身不限制变量编号的业务含义。
二、变量怎么才会变成1
光有check [43] 1判断没用,必须先有地方把[43]的值赋成1,否则第一次执行永远走不进去。赋值语句一般写在#ACT段里,比如:
IF
ACT
MOV [43] 1
这段脚本的意思是:无条件把变量[43]设置为1。MOV是赋值命令,后面第一个参数是变量编号,第二个是要赋予的值。
还有两种常用写法是INC和DEC。INC [43] 1表示在原来数值基础上加1,DEC [43] 1表示减1。比如杀怪任务里每杀一只怪就在怪物死亡脚本里写INC [43] 1,最后用check [43] 5判断是否已经杀了5只。
三、完整例子:任务领奖开关
下面用一个实际脚本说明check [43] 1的完整工作方式:
[@main]
IF
check [43] 1
SAY
你已经领过新手奖励了,不能再领。\ \
<离开/@exit>
ELSESAY
完成新手任务后可以领取一把木剑。\ \
<领取奖励/@get>
[@get]
IF
ACT
give 木剑 1
MOV [43] 1
SAY
领取成功,下次再来就不会再给你了。\ \
<离开/@exit>
第一次点NPC时,[43]是0,check [43] 1不成立,走#ELSESAY显示“可以领取”。点<领取奖励>后执行give给一把木剑,然后MOV [43] 1把变量设成1。第二次再来,check [43] 1成立,直接显示“你已经领过”,不会再给剑。
这就是check [43] 1最常见的应用场景:防止重复领取奖励。
四、你贴的分支跳转结构
你贴的片段本质上是一个入口判断:
IF
check [43] 1
act
GOTO @某标签
ELSESAY
条件不满足时的文字
这里#ACT只做了一件事就是跳转,所以实际效果是:如果变量[43]等于1,就去执行某标签内的逻辑;如果不等于1,显示提示文字。这种写法常用于多分支任务,例如:
[@main]
IF
check [43] 1
ACT
GOTO @任务完成
ELSESAY
任务还没完成,先去杀10只鸡。\ \
<离开/@exit>
[@任务完成]
IF
ACT
give 奖励 1
MOV [43] 2
SAY
给你奖励。\ \
<离开/@exit>
注意#ELSESAY和#ELSEACT的区别。#ELSESAY只负责显示文字,不执行任何动作支撑;#ELSEACT则可以在条件不成立时执行动作,比如跳转到另一个标签:
IF
check [43] 1
ACT
GOTO @完成状态
ELSEACT
GOTO @未完成状态
两种写法可以混用,但同一个#IF判断下,#ELSESAY和#ELSEACT同时出现时,引擎一般默认#ELSESAY只处理显示,#ELSEACT只处理动作,具体以你使用的引擎版本为准。
五、变量检查常见的坑
第一是变量号冲突。传奇版本自带功能也可能占用变量号,尤其是一些M2插件、自动功能、会员系统会用掉部分变量号。如果你写的[43]正好被系统其他地方使用,就会出现改一个NPC任务却影响别的功能的奇怪问题。稳妥做法是先查看版本自带的变量占用表,或者从100以后开始用。
第二是变量持久性。个人变量通常保存在角色数据库里,服务器重启也不会丢;但部分老端或特殊变量类型会在重启后清空。如果你发现前一天设置[43]=1,重启后check [43] 1又不成立了,先确认这个变量是否被引擎定义为临时变量。
第三是脚本编码问题。服务端脚本文件如果编码不对,#IF和check之间可能出现隐藏字符,导致判断失效。常见解决办法是用记事本把脚本另存为ANSI编码,或者用引擎自带的脚本编辑器打开再保存一次。
第四是变量值类型。check [43] 1比较的是数字1,但有些脚本在赋值的时误写成带引号的"1"或者汉字,这时比较会失败。赋值时保持数字格式,不要加引号。
六、其他类似判断命令
理解了check [43] 1,其他check类命令基本都能看懂:checkgold 8800表示检查金币是否大于等于8800,checkitem 金条 1表示检查背包里是否有1根金条,checklevel 40表示检查等级是否达到40级。
这些命令都是同一套语法:check 参数 值。区别只是检查对象不同。如果你想检查变量[43]是否大于5,部分引擎支持直接写check [43] > 5,但很多老引擎不支持这种写法。比较可靠的替代做法是先MOVR临时变量或者直接用CHECKVAR配合LARGE命令。在你熟悉的引擎里,这类高阶写法需要翻M2帮助文档确认。
七、调试建议
写完后如果判断不生效,先做两件事。第一件,在#SAY里加一行临时提示确认变量当前值,但这个操作依赖引擎是否支持在#SAY中显示变量。第二件,用M2引擎的在线角色查看工具打开人物列表,找到当前角色,直接查变量[43]的实时数值。看它是不是真的被设置成了1。很多时候不是check命令写错,而是MOV那段脚本根本没被执行到,比如标签名拼错、跳转失败、给了物品但物品名称对不上导致脚本中断。
最后再看一眼脚本中是否有全角空格、多余分号、标签重名。老传奇脚本对这些细节很敏感,一个隐藏字符就能让整个#IF段失效。按上面顺序排查,大部分check [43] 1不生效的问题都能定位。
传奇脚本check[43]1变量判断含义与IF跳转逻辑详解完整版
来源:
作者:
点击:

