当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇BLUE引擎变量输入正确写法:N0和M0别混用

热度:
你的问题出在MOVG30N0和MOVG31N0这两行。BLUE引擎里,@@InPutInteger输入的值不是自动存进N0或M0,而是存进一个系统临时变量,具体是哪个要看引擎版本。你写MOVG30N0,意思是把变量N0的值赋给G30,但输入框弹出来后,你敲进去的数字根本没进N0,N0是引擎内部临时变量,可能被其他脚本占用、可能是0、可能根本没被赋值,所以G30永远拿到0或空。

BLUE引擎正确的写法是:@@InPutInteger输入的值会自动存入变量M0(部分版本是N0,但BLUE常见是M0)。你在[@InputInteger_城市传送]里应该写:

[@InputInteger_城市传送]
ACT

MOVG30M0
SENDMSG6设置城市传送需要金币:<$STR(G30)>
GOTO@管理

不是MOVG30N0,是MOVG30M0。M0是BLUE引擎专门用来承接@@InPutInteger输入值的临时变量,N0是另一套数值变量,两者不通用。你后面试验时写<$STR(M1)>能实现第一个变量,就是因为M1承接了输入值,但你在第二个变量那里又用了M1,M1已经被第一个输入覆盖了,所以第二个输入拿不到值。

字符串输入同理。@@InPutString输入的值在BLUE引擎里存进S0(部分版本是S0,部分版本是M0但按字符串处理)。你写MOVA30S0是对的,但要注意A30是字符串变量,S0是系统临时字符串变量,赋值时不能写MOVA30S0这种简写,BLUE引擎里字符串赋值要用MOVA30<$STR(S0)>或者直接MOVA30S0看版本。你写MOVA30S0如果没生效,改成:

[@InPutString_传送提示]
ACT

MOVA30<$STR(S0)>
SENDMSG6设置金币不足时的提示是:<$STR(A30)>
GOTO@管理

如果还是不行,说明你的BLUE版本里@@InPutString的承接变量不是S0,而是S1或M0,去M2帮助文档里搜“输入字符串变量”或“InputString临时变量”,查清楚再改。

你试验成功的那段<$STR(M1)>说明你的引擎版本里,@@InPutInteger的输入值确实存在M系列变量里。但M1和M0的区别是:M0是第一个输入框的值,M1是第二个输入框的值。如果你只有一个输入框,值存M0;如果你连续弹两个输入框,第一个存M0,第二个存M1。你写MOVG30<$STR(M1)>能成功,是因为你的脚本里第一个输入框的值恰好被引擎放进了M1(可能因为你前面有别的输入框占用了M0),但这不是通用写法,换一个NPC或换一段脚本就可能变。

最稳妥的写法是用DelayGoto配合MOV,像你试验那样:

<设置城市传送需要金币/@@InPutInteger1>

[@@InputInteger1]
ACT

DelayGoto1@InPutInteger1

[@InPutInteger1]
ACT

MOVG30<$STR(M0)>
SENDMSG6设置城市传送需要金币:<$STR(G30)>
GOTO@管理

这里的关键是:@@InPutInteger1是输入框的标签名,[@@InputInteger1]是输入完成后的回调,DelayGoto1@InPutInteger1是为了等引擎把输入值写入M0再执行后续,不加DelayGoto有时会读到旧值。然后MOVG30<$STR(M0)>把M0的值转成字符串再赋给G30,这样G30就是你要的金币数。

第二个变量险恶传送,同样处理,但要用不同的标签名,避免和第一个冲突:

<设置险恶传送需要金币/@@InPutInteger2>

[@@InputInteger2]
ACT

DelayGoto1@InPutInteger2

[@InPutInteger2]
ACT

MOVG31<$STR(M0)>
SENDMSG6设置险恶传送需要金币:<$STR(G31)>
GOTO@管理

注意:这里两个输入框都用了M0,因为每次输入完成时,M0会被重新赋值为当前输入框的值。你不需要用M1、M2区分,只要保证两个输入框的标签名不同(@@InPutInteger1和@@InPutInteger2),回调标签不同([@@InputInteger1]和[@@InputInteger2]),跳转标签不同([@InPutInteger1]和[@InPutInteger2]),M0的值就是各自输入框的值。

字符串输入同理:

<设置金币不足时的提示/@@InPutString_传送提示>

[@@InPutString_传送提示]
ACT

DelayGoto1@InPutString_传送提示

[@InPutString_传送提示]
ACT

MOVA30<$STR(S0)>
SENDMSG6设置金币不足时的提示是:<$STR(A30)>
GOTO@管理

S0是BLUE引擎字符串输入承接变量,如果你试了S0不行,试S1或M0。有些BLUE版本里,字符串输入也用M0,只是按字符串处理,那就写MOVA30<$STR(M0)>。

还有一个坑:ISADMIN判断。你写的是#IFISADMIN,但BLUE引擎里管理员判断命令是ISADMIN还是CHECKGAMEGOLD还是ISADMIN要看版本。如果ISADMIN不生效,玩家不是管理员也能看到面板,或者管理员也看不到面板。BLUE引擎常见写法是:

IF

ISADMIN
SAY

...

或者:

IF

CHECKADMIN
SAY

...

查你的M2里“管理员判断”命令是什么,别用错。你脚本里#say和#elseact大小写混用,BLUE引擎不区分大小写,但建议统一大写,避免某些版本解析出错。

GOTO@管理这个跳转也有问题。你脚本里没有[@管理]这个标签,只有[@main]或你省略的部分。GOTO@管理会跳到一个不存在的标签,引擎会报错或卡住。改成GOTO@main,或者把你省略的部分里那个管理面板标签名改成“管理”。

最后,<$USERCOUNT>和<$DATETIME>这两个变量在BLUE引擎里不一定叫这个名字。BLUE引擎在线人数变量可能是<$USERCOUNT>也可能是<$ONLINECOUNT>,时间变量可能是<$DATETIME>也可能是<$TIME>。查M2的变量列表,用引擎认的变量名,否则显示空白。

总结你的错误就三处:
1.MOVG30N0改成MOVG30<$STR(M0)>,N0换成M0。
2.MOVG31N0同样改成MOVG31<$STR(M0)>。
3.MOVA30S0改成MOVA30<$STR(S0)>或MOVA30<$STR(M0)>,看版本。

加上DelayGoto1等待输入值写入,加上GOTO@main跳转到正确标签,你的脚本就能用了。BLUE引擎的@@InPutInteger和@@InPutString就是靠M0/S0承接输入值,别用N0,N0是别的用途。
[顶部]