NPC脚本里做输入框功能,Hero和3K两套引擎的写法区别卡住过不少人。看起来差不多的代码放进去要么弹不出输入窗,要么点完没反应,根本原因在于回调标签的命名规则和非法字符处理机制不一样。
输入框指令本身不难理解。@@InPutIntegerX用来弹出仅限数字的输入框,输入内容存进N变量,比如@@InPutInteger10就把数字存进N10。@@InPutStringX弹出文本输入框,内容存进S变量,@@InPutString15对应S15。变量编号范围0到99,建议从10开始用,避开系统占用的低编号变量。
Hero引擎的写法必须加Call前缀。NPC对话里调用@@InPutInteger10后,玩家提交数字,引擎自动跳转到[@CallInPutInteger10]段执行后续处理。文本输入同理,@@InPutString15对应[@CallInPutString15]。非法字符检测是引擎自动触发的,输入内容命中过滤列表后跳转到[@IsInFilterList],不需要额外写判断。
Hero引擎金币捐赠功能的完整脚本结构是这样的:
[@Main]
欢迎使用捐赠功能\
当前资金:<$GUILDBANKMONEY>金币\
<捐赠金币/@@InPutInteger10>\
[@CallInPutInteger10]
#IF
CHECKGAMEGOLD<$STR(N10)
#ACT
GAMEGOLD-$STR(N10)
GUILDBANKMONEY+$STR(N10)
MESSAGEBOX成功捐赠<$STR(N10)>金币!
#ELSEACT
MESSAGEBOX金币不足!
数字输入用$STR(N10)调用变量值,条件判断里直接比较,不需要额外转换。文本输入要处理空值和长度问题,角色改名场景里常用CHECKTEXTLENGTH限制字符数。
3K引擎的差异在于去掉Call前缀。玩家输入数字后直接跳转[@InPutIntegerX],文本输入跳转[@InPutStringX],没有中间的Call环节。非法字符过滤跳转到[@MsgFilter]而不是[@IsInFilterList]。
3K引擎的写法直接一些:
[@Main]
请输入数字<输入/@@InPutInteger1>\
[@InPutInteger1]
#SAY
输入的数字是<$STR(N1)>\
[@MsgFilter]
#SAY
输入的字符非法,请重新输入
变量调用方式两个引擎一致,都用$STR(SX)和$STR(NX)获取值。3K引擎在变量作用域上更敏感,跨段调用时建议先用MOV转到中间变量再操作,避免直接引用输入变量造成数据错乱。
非法字符过滤的配置位置也有区别。Hero引擎在M2Server的查看→列表信息→其他设置里添加过滤词,触发后自动跳转@IsInFilterList。3K引擎通过插件管理里的消息过滤配置,触发后跳转@MsgFilter。
变量编号不够用的时候,可以把X设成大于100的数字,输入内容会存进S0或N0变量。比如@@InPutString150输入的内容存进S0,回调标签还是[@CallInPutString150]。
输入内容必须做空值检测,不然玩家直接点确定导致变量为空,后续逻辑报错。用CHECKSTR命令检查S变量是否为空,配合MESSAGEBOX弹提示让玩家重新输入。数字输入的超长值会被引擎自动截断,不会报错,但最好在回调段里用范围判断限制上下限。
Hero引擎的回调标签前缀是区分两套引擎最直观的地方。复制别人的脚本时先看是@CallInPut还是@InPut,前缀不对代码跑不通。非法字符跳转标签也不一样,改漏了玩家输入敏感词时不会触发拦截直接执行后续操作。
输入框指令本身不难理解。@@InPutIntegerX用来弹出仅限数字的输入框,输入内容存进N变量,比如@@InPutInteger10就把数字存进N10。@@InPutStringX弹出文本输入框,内容存进S变量,@@InPutString15对应S15。变量编号范围0到99,建议从10开始用,避开系统占用的低编号变量。
Hero引擎的写法必须加Call前缀。NPC对话里调用@@InPutInteger10后,玩家提交数字,引擎自动跳转到[@CallInPutInteger10]段执行后续处理。文本输入同理,@@InPutString15对应[@CallInPutString15]。非法字符检测是引擎自动触发的,输入内容命中过滤列表后跳转到[@IsInFilterList],不需要额外写判断。
Hero引擎金币捐赠功能的完整脚本结构是这样的:
[@Main]
欢迎使用捐赠功能\
当前资金:<$GUILDBANKMONEY>金币\
<捐赠金币/@@InPutInteger10>\
[@CallInPutInteger10]
#IF
CHECKGAMEGOLD<$STR(N10)
#ACT
GAMEGOLD-$STR(N10)
GUILDBANKMONEY+$STR(N10)
MESSAGEBOX成功捐赠<$STR(N10)>金币!
#ELSEACT
MESSAGEBOX金币不足!
数字输入用$STR(N10)调用变量值,条件判断里直接比较,不需要额外转换。文本输入要处理空值和长度问题,角色改名场景里常用CHECKTEXTLENGTH限制字符数。
3K引擎的差异在于去掉Call前缀。玩家输入数字后直接跳转[@InPutIntegerX],文本输入跳转[@InPutStringX],没有中间的Call环节。非法字符过滤跳转到[@MsgFilter]而不是[@IsInFilterList]。
3K引擎的写法直接一些:
[@Main]
请输入数字<输入/@@InPutInteger1>\
[@InPutInteger1]
#SAY
输入的数字是<$STR(N1)>\
[@MsgFilter]
#SAY
输入的字符非法,请重新输入
变量调用方式两个引擎一致,都用$STR(SX)和$STR(NX)获取值。3K引擎在变量作用域上更敏感,跨段调用时建议先用MOV转到中间变量再操作,避免直接引用输入变量造成数据错乱。
非法字符过滤的配置位置也有区别。Hero引擎在M2Server的查看→列表信息→其他设置里添加过滤词,触发后自动跳转@IsInFilterList。3K引擎通过插件管理里的消息过滤配置,触发后跳转@MsgFilter。
变量编号不够用的时候,可以把X设成大于100的数字,输入内容会存进S0或N0变量。比如@@InPutString150输入的内容存进S0,回调标签还是[@CallInPutString150]。
输入内容必须做空值检测,不然玩家直接点确定导致变量为空,后续逻辑报错。用CHECKSTR命令检查S变量是否为空,配合MESSAGEBOX弹提示让玩家重新输入。数字输入的超长值会被引擎自动截断,不会报错,但最好在回调段里用范围判断限制上下限。
Hero引擎的回调标签前缀是区分两套引擎最直观的地方。复制别人的脚本时先看是@CallInPut还是@InPut,前缀不对代码跑不通。非法字符跳转标签也不一样,改漏了玩家输入敏感词时不会触发拦截直接执行后续操作。

