传奇 NPC 输入交互脚本实战 @@InPutString 与 @@InPutInteger Hero 与 3K 引擎差异详

来源: 作者: 点击:
一、命令本质与变量映射
@@InPutStringX:客户端弹文本输入框,玩家确认后内容写入当前角色 S 变量(SX),X=0~99,如 @@InPutString10 → 存 S10。
@@InPutIntegerX:客户端弹数字输入框(仅收 0-9、正负号,非数字拒收),写入当前角色 N 变量(NX),如 @@InPutInteger8 → 存 N8。数值受 32 位有符号整数上限约束(2147483647),溢出归 0。
X>99 时(如 150),部分 Hero 分支仍可用,但回写强制落 S0 / N0,不在原号变量;写脚本前先在本机 M2 实测目标引擎版本行为 。
命令仅在 Merchant 市场脚本与 QFunction-0.txt(QF)内有效,触发后引擎中断当前对话流,弹框,输入完成跳转对应回调标签 。

二、Hero / HeroM2 引擎标准写法
触发指令写在 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 → 查看 → 列表信息 → 其他设置 / 过滤字符列表(或 GuildRankNameFilter.txt)配置,命中即跳 @IsInPutList 。

- 高频点击加 DelayGoto 过滤连击:@@InPutInteger5 → #ACT DelayGoto 1 ~InPutInteger5 → [~InPutInteger5] 写逻辑 。

三、3K / 3KM2 引擎写法差异
3K 去掉 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 找不到标签直接断链

四、进阶:文本库校验与扣费逻辑
数字框做范围与货币扣费:

[@@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

文本输入落盘(写行会申请记录):

[@CallInPutString5]
#IF
EQUAL S5
#ACT
MESSAGEBOX 不能为空!
GOTO @Main
#ELSE
#ACT
AddTextList .\Envir\QuestDiary\行会申请.txt <$USERNAME>:<$STR(S5)>
SENDMSG 6 申请已提交:<$STR(S5)>
GOTO @Main

大数金额(超 21 亿)别用 @@InPutInteger,改用 @@InPutString 接字符串后脚本解析,避免溢出归 0 。

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

- 弹框后 NPC 无反应:Hero 回调写成 @InPutStringX 没加 Call;3K 回调写成 @CallInPutStringX 多加 Call 。
• 取到空值:玩家取消输入,SX/NX 保持旧值,判断分支必须先 EQUAL SX 拦空。

- 特殊符号被吞:命中过滤列表,M2 列表信息里删对应字符或改 @IsInFilterList / @MsgFilter 提示。
• 大数变 0:@@InPutInteger 超出 32 位有符号上限,换 @@InPutString 接字符串。

- 变量串味:多 NPC 共用 S10/N10 不清理,进分支前 MOV S10 或 DelayGoto 隔离。

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