传奇NPC脚本实现输入框功能与变量存储详解

来源: 作者: 点击:
在传奇服务端脚本编写中,实现类似“申请行会”或“自定义称号”的输入功能,核心在于调用引擎内置的输入指令。这些指令能够暂停脚本执行,弹出一个系统级对话框供玩家录入数据,并将录入的内容存储到特定的变量中,以便后续脚本进行读取和判定。由于传奇引擎版本众多(如HERO、GOM、3K、GEE等),具体的指令前缀和变量调用方式存在显著差异,必须根据当前使用的引擎内核选择正确的语法。

核心指令:InputString与InputInteger

实现文本输入主要依赖InputString系列指令,而数字输入则依赖InputInteger。这两类指令会在客户端弹出一个对话框,玩家输入内容并点击确定后,脚本才会继续向下执行。

InputString(文本输入)
这是实现行会申请、角色改名等功能的关键指令。当脚本执行到该命令时,游戏界面会弹出一个输入框。
基本语法:InputString 变量编号 或 @@InputString 变量编号。
功能:允许玩家输入字符串(汉字、字母、符号)。
数据存储:输入的内容会自动保存到人物的字符串变量(S变量)中。例如,编号为0的输入框,其内容通常存储在S0或S[0]中。

InputInteger(数字输入)
主要用于输入密码、数量或特定的数字ID。
基本语法:InputInteger 变量编号 或 @@InputInteger 变量编号。
功能:仅允许玩家输入数字字符。
数据存储:输入的数字会自动保存到人物的数字变量(N变量)中。

变量编号与数据存储机制

输入框指令后的数字编号(0-99)至关重要,它直接决定了数据存储在哪个变量槽位中。不同的引擎版本对变量的命名规则略有不同,理解这一点是脚本编写的关键。

变量对应关系
S变量(字符串):对应InputString。如果脚本中使用InputString 5,玩家输入的内容将被赋值给S5(或S[5])。在后续的脚本逻辑中,你需要通过检测S5的内容来判断玩家输入了什么。
N变量(整数):对应InputInteger。如果脚本中使用InputInteger 8,玩家输入的数字将被赋值给N8(或N[8])。

数据读取示例
假设玩家输入了行会名称“传奇霸主”,脚本执行了InputString 1。此时,系统变量S1的值即为“传奇霸主”。后续的脚本可以通过MOV S10 S1将这个名字转移到其他变量,或者直接通过CHECK命令检测S1是否符合命名规范。

不同引擎版本的语法差异

传奇引擎的内核迭代导致了语法的不统一,主要分为“带Call前缀”和“不带Call前缀”两大流派,以及标签跳转逻辑的区别。

HERO引擎与GOM引擎(常用)
这类引擎通常使用@@作为指令前缀,且在获取输入结果时,往往需要跳转到特定的标签(Label)。
触发指令:[@Main] #SAY 请输入行会名称:
结果处理:引擎会自动跳转到[@CallInputString0]标签(部分版本可能直接继续执行下一行,但显式跳转更稳妥)。
代码示例:
[@Main]
#SAY
请输入你想要的行会名称:\
\


[@CallInputString0]
#IF
#SAY
你输入的内容是:\
确认使用此名称吗?\
\


在此示例中,S0存储了玩家的输入。

3K引擎与部分老版本
这类引擎的语法相对直接,通常不需要Call前缀,或者指令格式更为简化。
触发指令:
结果处理:输入后直接执行后续脚本或跳转到指定标签。
代码示例:
[@Main]
#SAY
请输入数字密码:\


[@InputInteger1]
#SAY
你输入的数字是:\


注意这里标签名直接对应了指令名[@InputInteger1],这是3K引擎的典型特征。

数据过滤与非法字符处理

在开放输入功能时,必须防止玩家输入非法字符(如敏感词、特殊符号等)。引擎通常内置了过滤机制,或者允许脚本进行二次判断。

系统级过滤
大部分引擎在M2Server的控制台或配置文件中提供了“过滤字符列表”设置。管理员可以将敏感词、乱码符号填入列表。当玩家在InputString对话框中输入这些字符时,引擎会自动拦截,并可能跳转到特定的错误处理标签(如[@IsInFilterList]),提示玩家重新输入。

脚本级检测
除了系统过滤,脚本中也可以编写逻辑进行检测。例如,检测变量长度是否为0(防止空名),或者使用CHECK命令配合正则表达式(如果引擎支持)来验证格式。
[@CheckInput]
IF
EQUAL S0 0
ACT
SENDMSG 6 名称不能为空!
GOTO @Main
ELSEACT
GOTO @Success

综合应用:行会申请脚本逻辑

结合上述指令,一个完整的行会申请脚本逻辑应当包含:触发输入 -> 存储变量 -> 检测变量(判空、判重、判非法) -> 执行创建。

触发阶段:NPC对话提供“申请行会”选项,链接到@@InputString0。
输入阶段:玩家弹出对话框,输入“我的行会”。
接收阶段:脚本跳转至[@CallInputString0]。
验证阶段:
检测S0是否为空。
检测S0是否包含非法字符(系统自动或脚本判断)。
检测S0是否已存在(查询数据库或变量列表)。
执行阶段:若验证通过,调用CREATEGUILD命令创建行会;若失败,提示错误并GOTO @Main。

通过灵活运用InputString和变量系统,你可以实现自定义装备命名、留言板书写的复杂功能,极大地丰富游戏的交互体验。