传奇排行榜不显示人物名与当前地图名称和坐标变量的排查与写入全流程详解

来源: 作者: 点击:
排行榜上名字是空的、地图那一栏是乱的、坐标直接不显示,这一类问题几乎都不是引擎坏了,而是取数用错了变量,或者取数的地方根本没有那个变量。把变量分清楚、把数据来源找对,榜单就能正常显示。

一、先分清排行榜取数据的两种来源

一种是引擎自带的榜,等级榜、财富榜、行会榜都属于这一类。它直接读人物数据库,只认固定字段,名字、等级、职业这些能取到,地图和坐标它不提供,配置里也没有这两个字段。很多人反复改脚本,想让自带榜多显示一列地图,方向就是错的,自带榜的列是写死的。

另一种是脚本自己做的榜,靠 NPC 对话输出,想显示什么就显示什么。只有这种榜能带人物名、当前地图名和坐标。下面讲的所有变量和写法,都是针对脚本榜。

二、人物名用哪个变量

显示人物名字段是 <
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
,取的是人物名称。带封号、转生标识的完整名称用
<
USERNAME>,取的是人物名称。带封号、转生标识的完整名称用<USERALLNAME>,行会名用 <
𝐺
𝑈
𝐼
𝐿
𝐷
𝑁
𝐴
𝑀
𝐸
>
,等级用
<
GUILDNAME>,等级用<LEVEL>。

榜单里名字显示空白,常见的三种原因。第一种是变量名拼错,比如少写一个字母、把 USERNAME 写成 USERANME,引擎不认识就原样不输出。第二种是变量本身支持但当前环境下为空,比如取了 <$GUILDNAME> 却没进任何行会,那一栏就是空的。第三种是数据来源不是人物上下文,而是从文本文件里读出来的名字,读文件那一行没读到,显示自然空白。

三、地图名和坐标各自对应哪个变量

地图相关有两个容易混的变量,一定要分开。

<
𝑀
𝐴
𝑃
>
取的是当前地图代码,是数字编号,不是文字名。想显示成蜈蚣洞、猪洞七层这样的文字,用
<
MAP>取的是当前地图代码,是数字编号,不是文字名。想显示成蜈蚣洞、猪洞七层这样的文字,用<MAPNAME>,部分引擎写法是 <$MapTitle>,两者都是取地图名称,具体哪个生效看引擎版本。

坐标是 <
𝑋
>
和
<
X>和<Y>,分别取人物的当前坐标 X 和 Y。

也就是说,要在榜单上显示“人物站在哪张图的哪个点”,完整的一组写法是 <
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
<
USERNAME><MAPNAME> <
𝑋
>
<
X><Y>。如果只写了 <$MAP>,那一栏出来的是地图编号,看着像乱码,实际是变量选错了。

四、排行榜不显示地图坐标的根本原因

<
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
、
<
USERNAME>、<MAP>、<
𝑋
>
、
<
X>、<Y> 这四个变量有个共同点,它们取的都是当前上下文那个人物的信息。你在自己的 NPC 对话里写这些变量,显示的是正在跟你对话的这个人的名字、地图和坐标。

而排行榜要显示的是别人。这里是关键:脚本没有直接读取其他在线人物这些变量的通用写法。你在榜单 NPC 里写 <$MAP>,取到的只会是打开榜单的这个玩家自己的地图,而不是榜上第一名的。

所以在榜单上想显示每个人的地图和坐标,必须先有人把每个人的这些数据写下来存好,榜单再去读这份数据。绕过这一步,榜单上永远取不到别人的位置信息。这是绝大多数排行榜地图坐标显示不出来的真正原因,也是很多人反复怀疑引擎有 bug 的地方。

五、把每个人的名字地图坐标落到文件

正确路径是写读分离。

写的那一头,在人物登录时、人物切换地图时、以及定时脚本里,把当前人物的名字、地图名、坐标写进服务端 Envir 目录下的一个文本文件,一个人一行,字段用固定分隔符隔开,比如竖线或者逗号。登录触发写在 QManage.txt 里,切图触发一般也在这套触发逻辑中,定时那一头放在 Robot_def 下的定时文件里,几分钟走一次,把在线人物的最新位置刷一遍。

读的那一头,榜单 NPC 逐行读这个文件,按分隔符切开,铺到对话框里。读文件用引擎的按行读取命令,一行读完往下走,写进临时变量再显示。

六、显示变量值用 <$STR>

读进变量之后要显示,写法是 <$STR(变量名)>。排行榜里显示进度、数量、坐标,全靠这个把变量值嵌到文本里。

如果榜单那一行写了变量但没套 <$STR>,出来的是变量名本身或者空白,不会出来值。这一条在坐标和等级这类数字字段上错得最多。

七、几种做榜时能直接借用的现成变量

引擎里已经有一批记录地图名加坐标的组合变量,做榜时可以照着它们的格式抄。

记忆石那套,记录点用的就是地图名加两个坐标的组合,<
𝑇
𝐴
𝐺
𝑀
𝐴
𝑃
𝑁
𝐴
𝑀
𝐸
1
>
是记录点的地图名,
<
TAGMAPNAME1>是记录点的地图名,<TAGX1> 和 <$TAGY1> 是对应的坐标,编号 1 到 6 对应六个记录点。做坐标类展示时,这种“地图名变量配 X 变量配 Y 变量”的三件套格式最直观,照着套不会错。

还有一套传回点变量,地图和坐标分开存,显示坐标用 <$RecallPointX> 这一组。这类变量的意义在于,它们已经由引擎的传送点命令写好,你在榜单里直接引用就行,不用自己再拼地图名和坐标,也就少了拼错的概率。

八、完整的一段榜单读取写法

带定时写文件的思路,脚本结构大致是这样。

写的位置,在人物登录和定时的标签里。

[@写位置]
{
#ACT
MOV S90 <
𝑀
𝐴
𝑃
𝑁
𝐴
𝑀
𝐸
>
𝑀
𝑂
𝑉
𝑆
91
<
MAPNAME>MOVS91<X>
MOV S92 <
𝑌
>
𝑀
𝑂
𝑉
𝑆
93
<
Y>MOVS93<USERNAME>
写文件的命令 S93 S90 S91 S92
}

显示的位置,在榜单 NPC 里。

[@排行榜]
{
#ACT
读取文件的命令 1 变量组
#SAY
第一名 <$STR(变量组)>\
<退出/@exit>
}

写文件命令和读取命令的名字各引擎不同,GOM、HERO、GEE 的叫法都不一样,先在自己版本的脚本变量表里查准命令名再用,别照搬别的版本。

九、逐条排查不显示的原因

榜单名字空白,先核对变量名拼写,再看是不是取了行会这类可能为空的字段,最后看文件里那一行有没有写进去。

榜单地图那一栏显示数字,是用了 <
𝑀
𝐴
𝑃
>
而不是
<
MAP>而不是<MAPNAME>,换成地图名称变量即可。

榜单地图那一栏空白,可能是地图名变量取到的值为空,也可能是写文件时地图名那一段没写进去,逐行看文件确认。

坐标不显示,先确认写文件时 X、Y 有没有分开两段写,再确认显示时有没有用 <$STR> 包起来,最后确认榜单读的那一行有没有超过文件实际行数。

整个榜单不刷新,是刷新时机问题。榜单只在上线读了一次文件,后面再没人写新位置,显示的就是上线那一刻的旧数据,把定时写文件那段补上就会动。

十、几个容易忽略的细节

变量名区分大小写,<
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
和
<
USERNAME>和<username> 在不同引擎里不一定等价,照引擎文档原样写最稳。

地图名长度不固定,猪洞七层和蜈蚣洞字数差得多,对话框排版按字数预留位置,别按固定宽度对齐。

写文件的编码要跟引擎一致,编辑器存成别的编码,读出来就是乱码,地图名和名字都会花。

文本文件会越写越长,定时写文件时按人物名覆盖同一行,不要每次追加,不然榜单越读越厚,读出来的还是旧数据在前。

名字里带特殊符号或者超长,写进文件时会被截断或者切乱分隔符,榜单上看起来就是名字少半截、坐标串到上一行,写之前把分隔符设成名字里不会出现的字符能避掉这个坑。

十一、区分清楚自带榜和脚本榜再动手

最后把开头那句再说清一次,因为它决定排查方向。想让引擎自带的等级榜多显示地图坐标,改脚本改到天亮也没用,那个榜的字段是固定的,不提供位置信息。要做带地图和坐标的榜,只能用脚本 NPC 自建,数据靠定时写文件维护,显示靠 <$STR> 输出变量。把这条分清,一半的排查时间就省下来了。