传奇脚本开发实战:Hero与3K引擎@@InPutString/@@InPutInteger全流程对比

来源: 作者: 点击:
一、两条指令到底干什么
@@InPutStringX:客户端弹出文本输入框,只能输字符/汉字/符号,X取值0–99,输入结果写入人物 S 变量(SX)。
@@InPutIntegerX:客户端弹出数字输入框,只能输纯整数,X取值0–99,输入结果写入人物 N 变量(NX)。
X 就是变量槽位编号,@@InPutString5 → S5,@@InPutInteger12 → N12;超出0–99时部分引擎回落到 S0/N0,数值型受整数上限约束溢出归0。

脚本位置不变:MerChant.txt 挂 NPC,Market_Def\脚本名-地图号.txt 写逻辑,QuestDiary 下也可放复杂任务段,Q-Function0.txt 里同样能触发输入指令。

二、Hero引擎标准写法(带 Call 前缀回调)
玩家点菜单 → 弹框 → 输入确认 → 引擎跳到 [@CallInPutStringX] 或 [@CallInPutIntegerX] 段继续执行。
过滤命中(敏感词/特殊符)跳 [@IsInFilterList]。

完整示例(盟重加“自定义传送密码”NPC):
[@main]
SAY

输入你想设置的传送密码(文字):\
输入传送冷却秒数(数字):\
<提交/@ok> <关闭/@exit>

[@ok]
@@InPutString20
@@InPutInteger21

[@CallInPutString20]
SAY

你设置的密码是:\
<继续设数字/@next> <返回/@main>

[@next]
@@InPutInteger21

[@CallInPutInteger21]
if

EQUAL N21 0
act

MESSAGEBOX 冷却秒数不能为0
GOTO @main
elsesay

密码: S20 \
冷却: N21 秒\
已记录到人物变量,关NPC生效。

[@IsInFilterList]
act

MESSAGEBOX 输入含非法字符,重新输入
GOTO @main

[@exit]
say

慢走。

要点:
• 菜单里写 @@InPutString20 是直接触发弹框,不是标签

- 回调段必须叫 [@CallInPutString20] / [@CallInPutInteger21],少 Call 不跳
• S20 用 <文本 S20> 或 S20 直接输出,N21 用 N21

- 过滤词在 M2 → 查看 → 列表信息 → 其他设置 → 过滤字符里维护

三、3K引擎标准写法(无 Call 前缀)
回调段名直接对应指令:[@InPutStringX]、[@InPutIntegerX];过滤命中跳 [@MsgFilter],不是 [@IsInFilterList]。

同上功能3K版:
[@main]
SAY

输入传送密码:\
输入冷却秒数:\
<提交/@ok> <关闭/@exit>

[@ok]
@@InPutString20
@@InPutInteger21

[@InPutString20]
SAY

你输入的密码:\
<继续/@next>

[@next]
@@InPutInteger21

[@InPutInteger21]
if

EQUAL N21 0
act

MESSAGEBOX 冷却不能为零
GOTO @main
elsesay

密码 S20 已记,冷却 N21 秒。

[@MsgFilter]
SAY

字符非法,含屏蔽词或特殊符号,回去重输。

[@exit]
say

再见。

四、Hero / 3K 关键差异对照
维度 Hero引擎 3K引擎
字符串回调段 [@CallInPutStringX] [@InPutStringX]
数字回调段 [@CallInPutIntegerX] [@InPutIntegerX]
过滤非法字符跳转 [@IsInFilterList] [@MsgFilter]
存储变量 SX / NX SX / NX
X范围 0–99(超界落S0/N0) 0–99(超界落S0/N0)
典型用途 任务密码、行会名、充值卡号 同上,语法更短


踩坑:把3K脚本直接丢Hero端,弹框后能输入但不执行后续 → 因为 [@InPutString20] 在Hero里不会自动回调,必须改 [@CallInPutString20];反向同理。

五、实用业务片段
1. 充值卡号校验(InPutString + 文本列表)
[@main]
SAY

请输入充值卡号:\
<确定/@do>

[@do]
@@InPutString22

;Hero端
[@CallInPutString22]
if

CHECKTEXTLIST ..\QuestDiary\元宝充值\card.txt $STR(S22)
act

DELTEXTLIST ..\QuestDiary\元宝充值\card.txt $STR(S22)
GAMEGOLD + 50000
SENDMSG 7 充值成功,增加50000元宝
GOTO @main
elsesay

卡号无效或已使用。

;3K端把 [@CallInPutString22] 改成 [@InPutString22] 即可

2. 数字范围投票 / 次数限制
[@main]
SAY

投票(1-3):\

[@callvote]
@@InPutInteger30

[@CallInPutInteger30]
if

SMALL N30 1
act

MESSAGEBOX 太小
elsesay

if

LARGE N30 3
act

MESSAGEBOX 超出范围
else

act

INC G$票N30 1
SENDMSG 6 投票成功:N30

3. 行会命名过滤
@@InPutString1 → S1 存名 → EQUAL / CHECKTEXTLIST 校验 → 命中 [@IsInFilterList] 拒回

六、调试与常见起不来原因
• 弹框不出:菜单行没写 @@InPutStringX,只在 #SAY 写了文字;或 NPC 没重载(@ReloadNpc / M2重载所有NPC)

• 输入后没反应:回调段名拼错(Hero少 Call、3K多 Call),或脚本文件不在 Market_Def / QuestDiary 对应路径

• 变量读空:输出写成 S20 但用的是 @@InPutInteger20(应读 N20);或 X 超出99落到 S0/N0 没对应上

• 中文乱码:脚本文件存成 UTF-8,改 ANSI

• 过滤总触发:M2过滤列表里带了常用字,清掉误加项

• 数字变0:输入超过整数上限,或 N 变量被别处覆盖

两套引擎输入交互本质一样:弹框 → S/N 变量落地 → 回调段处理;差别只在回调标签前缀和过滤段名,按端型抄对应模板就不会偏。