你的问题出在 MOV G30 N0 和 MOV G31 N0 这两行。BLUE引擎里,@@InPutInteger 输入的值不是自动存进 N0 或 M0,而是存进一个系统临时变量,具体是哪个要看引擎版本。你写 MOV G30 N0,意思是把变量 N0 的值赋给 G30,但输入框弹出来后,你敲进去的数字根本没进 N0,N0 是引擎内部临时变量,可能被其他脚本占用、可能是 0、可能根本没被赋值,所以 G30 永远拿到 0 或空。
BLUE引擎正确的写法是:@@InPutInteger 输入的值会自动存入变量 M0(部分版本是 N0,但 BLUE 常见是 M0)。你在 [@InputInteger_城市传送] 里应该写:
[@InputInteger_城市传送]
ACT
MOV G30 M0
SENDMSG 6 设置城市传送需要金币:<$STR(G30)>
GOTO @管理
不是 MOV G30 N0,是 MOV G30 M0。M0 是 BLUE 引擎专门用来承接 @@InPutInteger 输入值的临时变量,N0 是另一套数值变量,两者不通用。你后面试验时写 <$STR(M1)> 能实现第一个变量,就是因为 M1 承接了输入值,但你在第二个变量那里又用了 M1,M1 已经被第一个输入覆盖了,所以第二个输入拿不到值。
字符串输入同理。@@InPutString 输入的值在 BLUE 引擎里存进 S0(部分版本是 S0,部分版本是 M0 但按字符串处理)。你写 MOV A30 S0 是对的,但要注意 A30 是字符串变量,S0 是系统临时字符串变量,赋值时不能写 MOV A30 S0 这种简写,BLUE 引擎里字符串赋值要用 MOV A30 <$STR(S0)> 或者直接 MOV A30 S0 看版本。你写 MOV A30 S0 如果没生效,改成:
[@InPutString_传送提示]
ACT
MOV A30 <$STR(S0)>
SENDMSG 6 设置金币不足时的提示是:<$STR(A30)>
GOTO @管理
如果还是不行,说明你的 BLUE 版本里 @@InPutString 的承接变量不是 S0,而是 S1 或 M0,去 M2 帮助文档里搜“输入字符串 变量”或“InputString 临时变量”,查清楚再改。
你试验成功的那段 <$STR(M1)> 说明你的引擎版本里,@@InPutInteger 的输入值确实存在 M 系列变量里。但 M1 和 M0 的区别是:M0 是第一个输入框的值,M1 是第二个输入框的值。如果你只有一个输入框,值存 M0;如果你连续弹两个输入框,第一个存 M0,第二个存 M1。你写 MOV G30 <$STR(M1)> 能成功,是因为你的脚本里第一个输入框的值恰好被引擎放进了 M1(可能因为你前面有别的输入框占用了 M0),但这不是通用写法,换一个 NPC 或换一段脚本就可能变。
最稳妥的写法是用 DelayGoto 配合 MOV,像你试验那样:
<设置城市传送需要金币/@@InPutInteger1>
[@@InputInteger1]
ACT
DelayGoto 1 @InPutInteger1
[@InPutInteger1]
ACT
MOV G30 <$STR(M0)>
SENDMSG 6 设置城市传送需要金币:<$STR(G30)>
GOTO @管理
这里的关键是:@@InPutInteger1 是输入框的标签名,[@@InputInteger1] 是输入完成后的回调,DelayGoto 1 @InPutInteger1 是为了等引擎把输入值写入 M0 再执行后续,不加 DelayGoto 有时会读到旧值。然后 MOV G30 <$STR(M0)> 把 M0 的值转成字符串再赋给 G30,这样 G30 就是你要的金币数。
第二个变量险恶传送,同样处理,但要用不同的标签名,避免和第一个冲突:
<设置险恶传送需要金币/@@InPutInteger2>
[@@InputInteger2]
ACT
DelayGoto 1 @InPutInteger2
[@InPutInteger2]
ACT
MOV G31 <$STR(M0)>
SENDMSG 6 设置险恶传送需要金币:<$STR(G31)>
GOTO @管理
注意:这里两个输入框都用了 M0,因为每次输入完成时,M0 会被重新赋值为当前输入框的值。你不需要用 M1、M2 区分,只要保证两个输入框的标签名不同(@@InPutInteger1 和 @@InPutInteger2),回调标签不同([@@InputInteger1] 和 [@@InputInteger2]),跳转标签不同([@InPutInteger1] 和 [@InPutInteger2]),M0 的值就是各自输入框的值。
字符串输入同理:
<设置金币不足时的提示/@@InPutString_传送提示>
[@@InPutString_传送提示]
ACT
DelayGoto 1 @InPutString_传送提示
[@InPutString_传送提示]
ACT
MOV A30 <$STR(S0)>
SENDMSG 6 设置金币不足时的提示是:<$STR(A30)>
GOTO @管理
S0 是 BLUE 引擎字符串输入承接变量,如果你试了 S0 不行,试 S1 或 M0。有些 BLUE 版本里,字符串输入也用 M0,只是按字符串处理,那就写 MOV A30 <$STR(M0)>。
还有一个坑:ISADMIN 判断。你写的是 #IF ISADMIN,但 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. MOV G30 N0 改成 MOV G30 <$STR(M0)>,N0 换成 M0。
2. MOV G31 N0 同样改成 MOV G31 <$STR(M0)>。
3. MOV A30 S0 改成 MOV A30 <$STR(S0)> 或 MOV A30 <$STR(M0)>,看版本。
加上 DelayGoto 1 等待输入值写入,加上 GOTO @main 跳转到正确标签,你的脚本就能用了。BLUE 引擎的 @@InPutInteger 和 @@InPutString 就是靠 M0/S0 承接输入值,别用 N0,N0 是别的用途。
传奇BLUE引擎变量输入正确写法:N0和M0别混用
来源:
作者:
点击:

