传奇人物名与行会名批量写入列表文件脚本命令完整用法与配置实操详解教程

来源: 作者: 点击:
列表文件这东西,引擎自带了好几组,IP列表、帐号列表、人物名列表、行会名列表,写法一模一样,就是一行一个名字的纯文本。做活动奖励、白名单、黑名单、限购、防重复领取,全都靠它。脚本里要干的活其实就三件事:查在不在、写进去、删出来。查用CHECK开头那组,写用ADD开头那组,删用DEL开头那组。

先认命令。

人物名这一组是 CHECKNAMELIST、ADDNAMELIST、DELNAMELIST。行会名这一组是把NAME换成GUILD,CHECKGUILDLIST、ADDGUILDLIST、DELGUILDLIST。命令后面跟一个路径参数,路径用相对路径,反斜杠开头,一般落在 QuestDiary 目录下,比如 ..\QuestDiary\活动\白名单.txt。这两组命令的行为完全对称,判身份用哪个,写列表就用哪个,别一个用行会、一个用人物,对不上。

再说往列表里写什么。

写进去的是当前正在跟NPC对话的那个人的名字,用变量 <
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
取。行会名用
<
USERNAME>取。行会名用<GUILDNAME> 取,取的是当前人物所在行会的名字;沙巴克归属行会用 <$CASTLENAME>,两回事,别混。角色名和行会名中间可以有空格,也可以有中文,写进文件都是一行一条,引擎按整行做匹配,所以文件里那句必须跟变量取出来的值分毫不差,多个空格、多个回车,CHECK就判成没有。

最常用的写法是这样,把当前人物的行会名加进列表:

[@加入行会列表]

#IF

HAVEGUILD

CHECKGUILDLIST ..\QuestDiary\活动\行会名单.txt

#ACT

MESSAGEBOX 你们行会已经在名单里了,不用再加。

BREAK

#IF

HAVEGUILD

#ACT

ADDGUILDLIST ..\QuestDiary\活动\行会名单.txt

SENDMSG 7 行会【<$GUILDNAME>】已经加入活动名单。

BREAK

#ELSESAY

你还没有加入任何行会,加不了。

这里两段IF是有意分开的。第一段先查有没有,有就弹框拦住;第二段才真写。如果不查直接ADD,同一个人连点十次,文件里就会留下十行一样的行会名,虽然不影响CHECK的结果,但文件会越来越臃肿,早晚要出事。

同理由,加人物名进列表,把GUILD那组换成NAME那组,变量从 <
𝐺
𝑈
𝐼
𝐿
𝐷
𝑁
𝐴
𝑀
𝐸
>
换成
<
GUILDNAME>换成<USERNAME>:

[@加入人物列表]

#IF

CHECKNAMELIST ..\QuestDiary\活动\报名名单.txt

#ACT

MESSAGEBOX 你已经报过名了。

BREAK

#IF

#ACT

ADDNAMELIST ..\QuestDiary\活动\报名名单.txt

SENDMSG 7 【<$USERNAME>】报名成功。

BREAK

人物名这组不需要判有没有行会,条件栏可以空着,也可以加其他条件,比如等级、元宝、地图。

沙巴克场景里还有一种写法,把城主名和行会名分开存两份,一份用于发奖防重复,一份留档查询:

[@沙城登记]

#IF

ISCASTLEMASTER

#ACT

ADDGUILDLIST ..\QuestDiary\沙城\行会名单.txt

ADDNAMELIST ..\QuestDiary\沙城\城主名单.txt

SENDMSG 0 城主【<
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
】带着行会【
<
USERNAME>】带着行会【<GUILDNAME>】完成登记。

BREAK

两条写入挨着放,行会那份用GUILD那组,城主那份用NAME那组,一份按行会判,一份按人查,各管各的。

想把某个行会从名单里踢掉,用DEL那组,逻辑上跟写入反过来,先确认在名单里,再删:

[@移出名单]

#IF

CHECKGUILDLIST ..\QuestDiary\活动\行会名单.txt

#ACT

DELGUILDLIST ..\QuestDiary\活动\行会名单.txt

SENDMSG 5 行会【<$GUILDNAME>】已经从名单里移除。

BREAK

#ELSESAY

你们行会本来就不在名单里,删不了。

写别人名字进列表,也是同样的命令,只是变量换成要写的那个名字。引擎支持用一个变量存住名字再写,比如先把名字放进 <$STR(S0)> 这类字符串变量,然后:

MOV S0 <$USERNAME>

ADDNAMELIST ..\QuestDiary\活动\指定名单.txt

有版本支持带参数的写法,把要写的人名直接跟在命令后面,ADDNAMELIST 路径 名字,写谁的名字就填谁。这一步各家引擎有差异,落笔前翻一下自带说明,别照搬。

路径这块要单独讲。

路径是相对的,基准目录在服务端的 Mir200 下面,所以写 ..\QuestDiary... 能落到 M2 的 QuestDiary 目录里。目录必须真实存在,要写进 活动 这个子目录,就得先在 QuestDiary 底下建好 活动 这个文件夹。文件本身也得先建,空的没关系,但必须有一个。文件不存在,ADD会静默失败,CHECK一律返回假,表面上看不出来,等你发现玩家重复领了奖才回过味来。

文件编码用ANSI或者GBK,跟引擎读列表的默认编码一致。用UTF-8存,中文行会名读出来会乱码,CHECK拿乱码跟变量比,永远对不上,症状是防重复整个失效,加多少行都没用。

文件里一行一条,末尾有没有空行无所谓,但中间别塞空行、别塞注释符号。想给文件加行说明,写在别的文件里,别往列表文件里掺。

换行符用回车加换行,也就是常见的Windows格式。拿代码编辑器存成只有换行、没有回车的文件,有些老引擎会把它读成一大行,CHECK虽然还能撞对,但DEL删的时候会连别人的名字一起删掉,很隐蔽。

跟条件组合起来用,才能做出实际功能。

做限购,就把名单当已购记录:参加活动前 CHECKNAMELIST,不在名单里才放行,放行完立刻 ADDNAMELIST,一个账号只能拿一次。

做白名单,名单里是提前录入的名字,脚本只查不写,CHECKNAMELIST 反着用,把 没有在名单里 的人拦下。这种文件是运营手动往txt里贴名字,贴的时候注意别多打空格。

做行会对抗,名单里存参赛行会,CHECKGUILDLIST 判资格,ADDGUILDLIST 登记,DELGUILDLIST 淘汰。注意行会名会改名,改了名的行会,原来的名字还留在文件里,CHECK对不上新名字,会被当成没登记过,做长期活动要么锁死改名,要么在改名逻辑里同步更新列表,这一步很多版本漏掉。

做倒计时、按届发放,就把文件按届或者按日期拆开,这一届用 行会名单202611.txt,下一届换一个文件,旧文件留着查账。比用一个文件反复清空更稳,出纠纷能翻到每一届的原始记录。

几个高频出错点。

变量取错。行会名用 <
𝐺
𝑈
𝐼
𝐿
𝐷
𝑁
𝐴
𝑀
𝐸
>
,沙城归属行会用
<
GUILDNAME>,沙城归属行会用<CASTLENAME>,城主名用 <
𝐿
𝑂
𝑅
𝐷
>
,当前人物名用
<
LORD>,当前人物名用<USERNAME>。拿 <$LORD> 去写行会名单,写进去的是人名,CHECK永远对不上。这几个变量长得像,写的时候一个个核。

没加 HAVEGUILD 就查行会。人物没加行会时,<$GUILDNAME> 是空值,ADDGUILDLIST 会在文件里写一个空行,之后 CHECKGUILDLIST 遇到空行可能整个判乱。加行会名单之前先 HAVEGUILD 判一道,能避掉这类脏数据。

只写不查。前面反复说过,ADD之前一定要CHECK,不然重复写入会把文件撑大。这不光影响性能,做防重复领奖时,文件里那条记录还在,反而不会漏发,但一旦运营手工清文件,重复的重灾区就暴露了。

路径斜杠方向。脚本里统一用反斜杠,正斜杠在部分引擎里认不出,路径拼错,命令看起来跑了,其实什么都没写。

相对路径的基准搞混。有的引擎基准在 Mir200,有的在 M2 的 QuestDiary 之下,多试一次 ../ 或少一次,路径就偏了。判断方法很简单,执行一次写入后去硬盘上找那个txt,找得到就说明路径对了。

引擎差异。GOM和GEE这一系,CHECKNAMELIST/ADDNAMELIST/CHECKGUILDLIST/ADDGUILDLIST 这一整套名字一致。HERO那边个别命令写法会变,迁移版本时挨条对照引擎自带的命令说明,别整套拷过去就用。

最后是查列表的用法。

判是不是已经登记过,直接 CHECKNAMELIST 路径,条件成立走#ACT,不成立走#ELSEACT。

#IF

CHECKNAMELIST ..\QuestDiary\活动\名单.txt

#SAY

你在名单里,后面的功能给你开。

#ELSESAY

名单里没你,先去报名。

判行会在不在,用 CHECKGUILDLIST 路径,同一个套路。

列表文件是可读的纯文本,出问题时不用进命令行,直接打开文件看就行。名字有没有写进去、写成了什么、是不是多了空格,一眼就清楚。这是列表这一套比脚本变量顺手的地方,查起来直观,改起来也不难,需要批量加人就直接编辑文件,比写一串MOV省事。