开脚本的兄弟都遇到过这种需求:让玩家在NPC对话框里输点东西。要么是输个数字比如要买多少药、捐多少金币,要么是输一段文字比如行会名字、结义对象ID。GEE和V8这些新引擎有自己的写法,但Hero和3K这两个老牌引擎还在大量服役,而且写法有细微差别,不注意就踩坑。
先搞清楚这两个指令是干嘛的。@@InPutIntegerX是弹出只能输数字的输入框,玩家敲了字母或者符号根本输不进去,输完的内容存到N变量里。@@InPutStringX是文本输入框,中英文数字都能敲,内容存到S变量里。后面的X是0到99之间的数字,相当于给这个输入框编个号,系统自动生成对应的N或者S变量。
**Hero引擎怎么写的**
Hero引擎的调用方式要带Call前缀。NPC对话里点触发链接,比如写这么一段:
```
[@Main]
#SAY
欢迎光临,请操作:\
<输入数字/@@InPutInteger10>\
<输入文字/@@InPutString11>\
```
点了"输入数字"之后弹出输入框,玩家填完点确定,M2就去找`[@CallInPutInteger10]`这个标签。同理,文字输入完去找`[@CallInPutString11]`。变量编号建议从10开始往后用,0和1这种低编号容易跟系统变量打架。
接收的脚本段长这样:
```
[@CallInPutInteger10]
#ACT
MOVN$强化等级<$STR(N10)>
#SAY
你输入的数字是:<$STR(N$强化等级)>\
<确认/@下一步><重新输入/@Main>\
```
```
[@CallInPutString11]
#ACT
MOVS$玩家名字<$STR(S11)>
#SAY
你输入的文字是:<$STR(S$玩家名字)>\
<确认/@下一步><重新输入/@Main>\
```
Hero引擎对非法字符有过滤机制,玩家输入的内容触发了过滤列表,系统自动跳转到`[@IsInFilterList]`,在这里写提示就行。
**3K引擎的写法差异**
3K引擎不用Call前缀,直接写`[@InPutIntegerX]`和`[@InPutStringX]`。NPC触发代码是一样的:
```
[@Main]
#SAY
<输入数字/@@InPutInteger1>\
<输入文字/@@InPutString2>\
```
但接收标签名字不一样:
```
[@InPutInteger1]
#SAY
你输入的数字是:<$STR(N1)>\
```
```
[@InPutString2]
#SAY
你输入的文字是:<$STR(S2)>\
```
非法字符过滤在3K里跳转的是`[@MsgFilter]`。
**双引擎兼容写法**
如果想让脚本在两种引擎上都能跑,用条件判断把两个标签都写上。Hero引擎认`[@CallInPutIntegerX]`,3K引擎认`[@InPutIntegerX]`,两个都写进去,哪个引擎跑起来就执行哪个。
变量取值那一步放在公共处理段里,两种引擎都跳转到同一个地方处理业务逻辑,后面的代码就不用写两遍了。
**几个容易栽跟头的地方**
变量覆盖问题。比如用N10存了玩家输入的数字,但后面某个脚本又把N10拿来干别的,数据就乱了。要么用完之后把变量清掉,要么用自定义变量比如N$XXX把值转移过去,原始N变量留给下次输入用。
输入内容校验。玩家输了个空字符串或者超长内容,脚本没做判断直接往下走就会出bug。数字输入要校验范围,文字输入要校验长度,Hero用CHECKLEN,3K用CHECKTEXTLENGTH,写法上略有区别。做行会创建功能的时候,这些校验一个都不能少,名字长度、是否为空、是否包含禁用词都要查一遍。
数字输入和文字输入搞混。@@InPutInteger存到N变量,@@InPutString存到S变量,变量类型和指令要配对。用N变量去接文字输入的结果,或者用S变量去接数字输入,取值的时候就是空或者乱码。
**实际应用场景**
金币交易、行会创建、结义系统、装备强化等级输入,都靠这两个指令撑着。结义系统里输入对方角色名,用@@InPutString拿过来之后校验对方是否在线,在线才能往下走。行会创建输入行会名,长度限制2到8个字符,非法字符直接拦截。
Hero和3K的核心差异就三点:回调标签加不加Call、过滤跳转标签名字不同、个别校验命令写法不一样。把这两套逻辑记清楚了,来回切引擎写脚本就不用翻说明书了。
先搞清楚这两个指令是干嘛的。@@InPutIntegerX是弹出只能输数字的输入框,玩家敲了字母或者符号根本输不进去,输完的内容存到N变量里。@@InPutStringX是文本输入框,中英文数字都能敲,内容存到S变量里。后面的X是0到99之间的数字,相当于给这个输入框编个号,系统自动生成对应的N或者S变量。
**Hero引擎怎么写的**
Hero引擎的调用方式要带Call前缀。NPC对话里点触发链接,比如写这么一段:
```
[@Main]
#SAY
欢迎光临,请操作:\
<输入数字/@@InPutInteger10>\
<输入文字/@@InPutString11>\
```
点了"输入数字"之后弹出输入框,玩家填完点确定,M2就去找`[@CallInPutInteger10]`这个标签。同理,文字输入完去找`[@CallInPutString11]`。变量编号建议从10开始往后用,0和1这种低编号容易跟系统变量打架。
接收的脚本段长这样:
```
[@CallInPutInteger10]
#ACT
MOVN$强化等级<$STR(N10)>
#SAY
你输入的数字是:<$STR(N$强化等级)>\
<确认/@下一步><重新输入/@Main>\
```
```
[@CallInPutString11]
#ACT
MOVS$玩家名字<$STR(S11)>
#SAY
你输入的文字是:<$STR(S$玩家名字)>\
<确认/@下一步><重新输入/@Main>\
```
Hero引擎对非法字符有过滤机制,玩家输入的内容触发了过滤列表,系统自动跳转到`[@IsInFilterList]`,在这里写提示就行。
**3K引擎的写法差异**
3K引擎不用Call前缀,直接写`[@InPutIntegerX]`和`[@InPutStringX]`。NPC触发代码是一样的:
```
[@Main]
#SAY
<输入数字/@@InPutInteger1>\
<输入文字/@@InPutString2>\
```
但接收标签名字不一样:
```
[@InPutInteger1]
#SAY
你输入的数字是:<$STR(N1)>\
```
```
[@InPutString2]
#SAY
你输入的文字是:<$STR(S2)>\
```
非法字符过滤在3K里跳转的是`[@MsgFilter]`。
**双引擎兼容写法**
如果想让脚本在两种引擎上都能跑,用条件判断把两个标签都写上。Hero引擎认`[@CallInPutIntegerX]`,3K引擎认`[@InPutIntegerX]`,两个都写进去,哪个引擎跑起来就执行哪个。
变量取值那一步放在公共处理段里,两种引擎都跳转到同一个地方处理业务逻辑,后面的代码就不用写两遍了。
**几个容易栽跟头的地方**
变量覆盖问题。比如用N10存了玩家输入的数字,但后面某个脚本又把N10拿来干别的,数据就乱了。要么用完之后把变量清掉,要么用自定义变量比如N$XXX把值转移过去,原始N变量留给下次输入用。
输入内容校验。玩家输了个空字符串或者超长内容,脚本没做判断直接往下走就会出bug。数字输入要校验范围,文字输入要校验长度,Hero用CHECKLEN,3K用CHECKTEXTLENGTH,写法上略有区别。做行会创建功能的时候,这些校验一个都不能少,名字长度、是否为空、是否包含禁用词都要查一遍。
数字输入和文字输入搞混。@@InPutInteger存到N变量,@@InPutString存到S变量,变量类型和指令要配对。用N变量去接文字输入的结果,或者用S变量去接数字输入,取值的时候就是空或者乱码。
**实际应用场景**
金币交易、行会创建、结义系统、装备强化等级输入,都靠这两个指令撑着。结义系统里输入对方角色名,用@@InPutString拿过来之后校验对方是否在线,在线才能往下走。行会创建输入行会名,长度限制2到8个字符,非法字符直接拦截。
Hero和3K的核心差异就三点:回调标签加不加Call、过滤跳转标签名字不同、个别校验命令写法不一样。把这两套逻辑记清楚了,来回切引擎写脚本就不用翻说明书了。

