传奇玩家在线输入指定命令弹出菜单脚本功能完整配置与引擎命令注册实操详解教程

来源: 作者: 点击:
玩家在聊天框里敲一句以@开头的话,服务端就把这个人带到某个脚本标签前面,像点了NPC一样弹出菜单,这套东西不靠NPC、不靠按钮,走的是命令触发那一条线。整条链路只有三截:命令先在命令表里登记,登记时指明它对应哪个脚本标签,玩家一敲,引擎就去 QFunction-0.txt 或者 QManage.txt 里找那个标签执行。三截里任何一截名字对不上,玩家敲出来不是提示未知命令,就是敲了没反应,排查也从这三截挨着往下找。

先说命令表在哪。

引擎不同,文件位置和名字都不一样,这是头一个坑。GOM引擎在服务端 Mir200\Envir 目录下的 Command.txt。GEE引擎挪了地方,在 Mir200\Envir\Data 目录下,后缀还是 ini,写 Command.ini。HERO引擎放在 Mir200\Envir\Market_Def 目录下,写 Command.txt。传奇3那一系在 Mud3\Envir 里,写 Command.def。找不着就在服务端根目录搜 Command 这个关键词,一般都能翻出来。翻出来先照抄一份放旁边做备份,这份表是引擎启动时要读的核心文件,格式填错能让引擎起不来,有备份就能马上还原。

再说表里那一行怎么写。

以GOM那份为例,一行一条,字段依次是命令名、权限等级、要执行的脚本文件、脚本里对应的标签。命令名习惯带上@,比如 @回城、@菜单、@会员。权限等级是个数字,0代表所有玩家都能用,1只有GM能用,2是超级GM,数字越大越严,给玩家的命令填0。脚本文件那一栏一般填 QFunction-0.txt。最后一栏是标签名,必须带@开头,标签名里不许有空格。

想让玩家打@菜单弹一个功能菜单,命令表里就加这一行:

@菜单 0 QFunction-0.txt @打开菜单

这行的意思是,谁打@菜单,引擎就去 QFunction-0.txt 里找 [@打开菜单] 这段来跑。表里这一行写完只是登记,真正弹什么、点了干什么,全在脚本标签里,所以下面必须在 QFunction-0.txt 里把 [@打开菜单] 补上,表里指了标签、脚本里没有这个标签,命令会被引擎当成无效命令吞掉,一点提示都不给。

脚本标签这一段,写法跟NPC里完全一样,入口标签下用 #SAY 铺文本和按钮,按钮写成尖括号包显示文字、斜杠、@跳转标签的形式。给一个能直接跑的多级菜单:

[@打开菜单]
#SAY
你想做什么?
<传送服务/@传送菜单> <领取奖励/@领奖菜单>
<会员功能/@会员菜单> <关闭/@exit>

[@传送菜单]
#SAY
去哪?
<盟重土城/@去盟重> <比奇城/@去比奇>
<返回/@打开菜单>

[@去盟重]
#ACT
MAPMOVE 3 330 330
SENDMSG 6 已经把你送到盟重。
BREAK

[@去比奇]
#ACT
MAPMOVE 0 330 330
SENDMSG 6 已经把你送到比奇。
BREAK

[@领奖菜单]
#IF
CHECKLEVELEX > 9
#ACT
GAMEGOLD + 10000
SENDMSG 7 你领到了一万元宝。
BREAK
#ELSESAY
等级不到十级,领不了。
BREAK

[@会员菜单]
#SAY
会员专属,往后加功能就加在这。
<返回/@打开菜单>

这里主页用 #SAY 把三个按钮铺成一行,点传送进第二级菜单,点返回回主页。@exit 是引擎自带的关闭标签,写它就能关掉对话框,不用自己写。每一段最后都用 BREAK 收尾,防止引擎一路往下把后面几段也执行掉,多级菜单里漏写 BREAK,点一个按钮会连着触发好几段,症状是奖励发重、玩家被连着传送两次。

@菜单这个命令名,两个地方必须一致:命令表里写的是@菜单,玩家就得打@菜单,写成@功能那两个就都认不了。命令名也别跟引擎已有的命令撞名,撞了谁生效看加载顺序,不好排查。名字里少用#、%、&这类符号,中文名反而稳,玩家也好记。

权限那一栏要单独想清楚。

给玩家用的功能,权限填0;纯管理的功能另开一条命令,权限填1或者更高。别图省事把@管理也写成0,那样谁都能敲,等于把后台开给了全服。同一套菜单,完全可以让玩家和GM各有一条命令入口,脚本里各自指向不同标签,GM那条多几个按钮。命令表和脚本是分开的两半,改权限只动命令表那一栏,不用碰脚本。

有的引擎支持命令带参数,玩家打 @传送 3 330 330 这种,后面几个数会被引擎塞进参数变量,脚本里用 <
𝑃
𝐴
𝑅
𝐴
𝑀
1
>
、
<
PARAM1>、<PARAM2> 这类取出来。这套写法各引擎差异很大,参数变量名、能不能带、带几个都不同,落笔前翻引擎自带那份命令说明,别照搬别人的格式。做带参数的命令尤其要防刷,参数值要拿 CHECKSCRIPTPARAM 一类命令逐组校验,不然玩家能自己拼参数跳到别的地图或者换别的物品。

光有文本菜单还不够,很多功能要玩家填东西,比如改名字、填数量、领口令,这就得用输入框。

文本输入用 @@InPutString 加编号调用,写成 <输入名称/@@InPutString10>,玩家点了弹输入框,填完回车,内容存进对应的字符串变量 S10,脚本里用 <$STR(S10)> 取出来。数字输入用 @@InPutInteger 加编号,内容存进 N 变量,比如 @@InPutInteger11 对应 N11,适合填数量、等级。编号范围一般是0到99,超出会报错,做多个输入框时把编号错开,一个功能一段连续的号,省得互相覆盖。

回调标签的写法各引擎有差别:HERO引擎要在原编号前加 Call,编号10对应 [@CallInPutString10];3K这一类直接就是 [@InPutString10],不加前缀。写反了回调进不去,玩家填完输入框没任何动静。非法字符的处理也不同,HERO会跳到 [@IsInFilterList],3K跳到 [@MsgFilter],想让玩家填了脏字符有个提示,就把这两个标签也补上。

一段带输入框的完整写法:

[@打开菜单]
#SAY
你要改名字?先告诉我新名字。
<填写新名/@@InPutString10>
<关闭/@exit>

[@CallInPutString10]
#SAY
你填的是 <$STR(S10)>,确认吗?
<确认/@名字确认> <重填/@打开菜单>

[@名字确认]
#IF
CHECKNAMELIST ..\QuestDiary\改名\名单.txt
#ACT
MESSAGEBOX 你已经改过名了,这一辈子就一次。
BREAK
#ACT
ADDNAMELIST ..\QuestDiary\改名\名单.txt
SENDMSG 6 改名成功。
BREAK

输入框回调那一段,HERO加Call、3K不加,这条要按自己引擎改,别的都能照抄。改名这类功能最好配一份名单文件记一下,一人一次,不然玩家能反复改。

命令表改完不生效,多半是没重载。

引擎在读命令表的时候是有缓存的,改了文件不重载,跑的还是内存里那份旧的,玩家敲出来仍然是老样子。重载的办法看引擎:有的支持在游戏里用GM命令 @ReloadCommand 或者 @ReloadNpc 重载,GOM里对应"重新加载所有NPC"的那个入口,点一下就行;有的必须把服务端关干净再起,只关窗口不算,后台进程还在就还是旧配置。改完命令表后拿GM号先自己敲一遍,能弹菜单了再放给玩家。

格式上有几处细节,容易忽略。

命令表用记事本改容易把编码弄乱,尤其在存成UTF-8带BOM的时候,引擎读到的第一行会多出几个看不见的字符,导致第一条命令永远失效。用支持查看编码的编辑器改,存成ANSI或者不带BOM的UTF-8。中文字段中间的空格用半角,全角空格引擎认不出来,会把整行当成一条命令名去读,命令就废了。命令表里前面加注释,有的引擎用分号开头,有的不认注释,加之前先确认,加错了会把注释当命令解析。

排查顺序捋一遍。

玩家敲了提示未知命令,先看命令表里有没有这一行、命令名跟玩家敲的是不是一模一样、权限等级够不够。敲了没反应也不报错,看命令表里指的那个脚本文件、那个标签名在文件里存不存在,标点有没有用全角。能弹菜单但点按钮没反应,看按钮后那个@标签在脚本里有没有对应段,多级菜单里上一段的 BREAK 有没有漏。填了输入框没反应,看回调标签加没加 Call 前缀对不对引擎。全都对,还是不动,先去把服务端彻底重启一次,再试。

最后一点,命令触发的脚本和NPC脚本共用同一个 QFunction-0.txt,或者同一个 QManage.txt,两边的标签名不能重。菜单里已经有一个 [@领奖菜单],别处再写一个同名标签,引擎只会认其中一个,另一个形同虚设。标签名取细一点、取专属一点的,比如 [@菜单传送]、[@菜单领奖],比通用名字稳。命令表里的标签名、脚本里的标签名、按钮跳转的标签名,这三处是全套里最容易写错的地方,改一次就对一遍。