传奇NPC输入交互实战:@@InPutString与@@InPutInteger用法及Hero/3K差异

来源: 作者: 点击:
一、命令本质与变量映射规则
@@InPutStringX 触发客户端弹文本输入框,玩家确认后内容写入当前角色 S 变量(SX),X 取值 0-99,如 @@InPutString22 → 存 S22。
@@InPutIntegerX 触发客户端弹数字输入框(仅允许 0-9 及正负号,非数字自动拒收),写入当前角色 N 变量(NX),如 @@InPutInteger8 → 存 N8。数值受 Integer 上限约束,溢出归 0。
X 超出 0-99 时(如 150),部分 Hero 引擎分支仍可用,但回写强制落 S0 / N0,不在原号变量;写脚本前先在 M2 实测目标引擎版本行为。

二、Hero / HERO M2 引擎标准写法
触发指令写在 Merchant 或市场 NPC 的 [@标签] 对话段里,玩家点链接 → 弹框 → 输入完成 → 引擎跳转 @CallInPutStringX / @CallInPutIntegerX 回调标签。过滤命中跳转 @IsInFilterList。
完整可跑模板(行会命名 + 数量兑换):

[@Main]
欢迎来到登记员处\
请输入你的行会名称:\
请输入要兑换的次数(1-10):\
<提交名称/@CallInPutString10>
<提交次数/@CallInPutInteger11>

[@CallInPutString10]
#IF
EQUAL S10
#ACT
MESSAGEBOX 名称不能为空!
GOTO @Main
#ELSEIF
ISONFILTER S10
#ACT
MESSAGEBOX 含有非法字符!
GOTO @Main
#ELSE
#ACT
SENDMSG 6 已登记行会名:<$STR(S10)>
GOTO @Main

[@CallInPutInteger11]
#IF
EQUAL N11 0
#ACT
MESSAGEBOX 次数不能为0!
GOTO @Main
#ELSEIF
LARGE N11 10
#ACT
MESSAGEBOX 超过上限10!
GOTO @Main
#ELSE
#ACT
INC G10 N11
SENDMSG 6 已记录兑换次数:<$STR(N11)>
GOTO @Main

[@IsInFilterList]
#ACT
MESSAGEBOX 输入数据中包含了非法字符,请重新编辑!
GOTO @Main


要点:
• 回调标签必须严格叫 @CallInPutStringX / @CallInPutIntegerX,少 Call 在 Hero 不触发。

• 过滤词在 M2 → 查看 → 列表信息 → 其他设置 / 过滤字符列表 配置,命中即跳 @IsInFilterList。

- 在 Q-Function0.txt 里用 @@InPutStringX 也有效,但 Merchant 市场脚本是最常用载体。

三、3K / 3KM2 引擎写法差异
3K / 3KM2 去掉 Call 前缀,输入完成直接跳 @InPutStringX / @InPutIntegerX;过滤命中跳 @MsgFilter(不是 @IsInFilterList)。同一逻辑改写:

[@Main]
请输入你的行会名称:\
请输入要兑换的次数(1-10):\
<提交名称/@InPutString10>
<提交次数/@InPutInteger11>

[@InPutString10]
#IF
EQUAL S10
#ACT
MESSAGEBOX 名称不能为空!
GOTO @Main
#ELSE
#ACT
SENDMSG 6 已登记行会名:<$STR(S10)>
GOTO @Main

[@InPutInteger11]
#IF
LARGE N11 10
#ACT
MESSAGEBOX 超过上限10!
GOTO @Main
#ELSE
#ACT
INC G10 N11
SENDMSG 6 已记录兑换次数:<$STR(N11)>
GOTO @Main

[@MsgFilter]
#SAY
输入的字符非法,请重新输入!\
GOTO @Main


差异速查表:
• Hero:触发 @@InPutStringX,回调 @CallInPutStringX,过滤 @IsInFilterList

• 3K:触发 @@InPutStringX,回调 @InPutStringX,过滤 @MsgFilter

- 变量存储两边一致:串→SX,数→NX
• 3K 转 Hero 最常见“输入无反应”就是回调标签没加 Call 前缀,M2 找不到标签直接断链

四、进阶:延时防连点与文本库校验
高频点 NPC 会触发多次弹框,加 DelayGoto 过滤连击:

[@@InPutString5]
#ACT
DelayGoto 1 ~InPutString5
[~InPutString5]
#IF
CHECKTEXTLIST ..\QuestDiary\卡号\50000.txt $STR(S5)
#ACT
DELTEXTLIST ..\QuestDiary\卡号\50000.txt $STR(S5)
GAMEGOLD + 50000
SENDMSG 7 充值成功,增加50000元宝!
GOTO @Main
#ELSEACT
SENDMSG 7 卡号错误或已使用!
GOTO @Main

数字框做范围与扣费:

[@@InPutInteger3]
#ACT
DelayGoto 1 ~InPutInteger3
[~InPutInteger3]
#IF
SMALL N3 1
#ACT
MESSAGEBOX 最少1个!
GOTO @Main
#ELSEIF
LARGE N3 50
#ACT
MESSAGEBOX 单次最多50个!
GOTO @Main
#ELSEIF
CHECKGAMEGOLD < $STR(N3)
#ACT
MESSAGEBOX 元宝不足!
GOTO @Main
#ELSE
#ACT
GAMEGOLD - $STR(N3)
GIVE 肉 $STR(N3)
SENDMSG 6 成功购买<N3>个肉!
GOTO @Main


五、常见坏象与定位
• 点链接不弹框:NPC 脚本未重读(M2→控制→重读NPC脚本)、命令拼成 @InPutStringX 少了 @@、X>99 且引擎不支持。

• 弹框后 NPC 无反应:Hero 回调写成 @InPutStringX 没加 Call;3K 回调写成 @CallInPutStringX 多加 Call。

- 取到空值:玩家取消输入,SX/NX 保持旧值,判断分支必须先 EQUAL SX 拦空。
• 特殊符号被吞:命中过滤列表,M2 列表信息里删对应字符或改 @IsInFilterList / @MsgFilter 提示。

- 大数变 0:@@InPutInteger 超出 32 位有符号上限(2147483647),超了归零,大额用 @@InPutString 接字符串再脚本解析。
• 变量串味:多 NPC 共用 S10/N10 不清理,进分支前 MOV S10 或 DelayGoto 隔离。

六、落地书写规范
任务输入用 S10-S19、交易用 S20-S29、数值兑换用 N10-N19,避免和 QF 触发变量撞车;回调标签名严格按引擎加不加 Call;过滤提示标签 Hero 用 @IsInFilterList、3K 用 @MsgFilter;Merchant 改完重读 NPC,QFunction 改完重读脚本。命令、回调标签、变量号、过滤标签四者对齐,输入交互链路就通。