当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇NPC输入交互脚本实战@@InPutString与@@InPutIntegerHero与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
EQUALS10
#ACT
MESSAGEBOX名称不能为空!
GOTO@Main
#ELSEIF
ISONFILTERS10
#ACT
MESSAGEBOX含有非法字符!
GOTO@Main
#ELSE
#ACT
SENDMSG6已登记行会名:<$STR(S10)>
GOTO@Main

[@CallInPutInteger11]
#IF
EQUALN110
#ACT
MESSAGEBOX次数不能为0!
GOTO@Main
#ELSEIF
LARGEN1110
#ACT
MESSAGEBOX超过上限10!
GOTO@Main
#ELSE
#ACT
INCG10N11
SENDMSG6已记录兑换次数:<$STR(N11)>
GOTO@Main

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


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

•过滤词在M2→查看→列表信息→其他设置/过滤字符列表(或GuildRankNameFilter.txt)配置,命中即跳@IsInPutList。

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

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

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

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

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

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


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

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

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

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

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

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

[@CallInPutString5]
#IF
EQUALS5
#ACT
MESSAGEBOX不能为空!
GOTO@Main
#ELSE
#ACT
AddTextList.\Envir\QuestDiary\行会申请.txt<$USERNAME>:<$STR(S5)>
SENDMSG6申请已提交:<$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保持旧值,判断分支必须先EQUALSX拦空。

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

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

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