先说清楚这里讲的"无变量"是什么意思。做拿沙奖励最常见的一种写法,是在脚本里找一个没人用的全局变量,比如G31,发奖之前用EQUAL G31 1判一下发过没有,发完MOV G31 1记一笔,第二天开区前再改回0。这种写法用着顺手,但有两个隐患:一是变量号容易被别的脚本占用,版本越堆越厚,G31被谁先占了都不知道;二是变量重启或者重载之后不一定还在,遇到维护就得手动补。所谓无变量,不是说不碰任何数据,而是不自己定义、不占用脚本变量号,改成用引擎自带的沙城系统数据加上名单文件来判定,谁来领、领没领、什么时候领,全部靠引擎已经算好的那几样东西。
引擎自己就带着一批沙城数据,直接就能读,不用你建。
沙巴克当前归属行会的名字,一般写作 <
𝐶
𝐴
𝑆
𝑇
𝐿
𝐸
𝑁
𝐴
𝑀
𝐸
>
,部分引擎里跟
<
CASTLENAME>,部分引擎里跟<OWNERGUILD> 是一回事,取的是同一个值。当前沙城城主,也就是掌门人的角色名,写 <
𝐿
𝑂
𝑅
𝐷
>
。正在跟
𝑁
𝑃
𝐶
对话的人,写
<
LORD>。正在跟NPC对话的人,写<USERNAME>。把 <
𝐿
𝑂
𝑅
𝐷
>
和
<
LORD>和<USERNAME> 放在一起比,就能知道站在NPC面前的人是不是城主,这一步不需要任何自定义变量。
身份判定用这几条:ISCASTLEMASTER 判是不是沙城老大,ISCASTLEGUILD 判是不是沙城成员,ISGUILDMASTER 判是不是行会老大,HAVEGUILD 判有没有加行会。攻城相关的有 CHECKCASTLEWAR 行会名,判这个行会在不在本次攻城名单里;CASTLEWARAY 跟一个比较符和天数,判距上次攻城过了几天;CASTLECHANGEDAY 判沙巴克被占领了几天;CHECKCASTLEDOOR 判城门是开着还是坏了。这些东西引擎在攻城开始时就已经写好了,脚本只负责读。
时间靠 HOUR 和 MIN 两条命令卡。写法是命令名后面跟起止两个数,HOUR 22 22 就是22点这一小时之内,MIN 01 20 是这一小时的第1分钟到第20分钟。两条叠在一起,奖励窗口就锁死在每天晚上22点01分到22点20分,过了这个点,条件不成立,脚本自然不给发,不需要写任何"今天发过了吗"的判断。
防重复领奖是无变量的核心,靠的是名单文件,不靠变量。
引擎有一组专门读写名单文件的命令。CHECKGUILDLIST 文件名,判当前人物所在行会是否已经在名单里;ADDGUILDLIST 文件名,把当前人物所在行会写进名单;DELGUILDLIST 文件名,从名单里删掉。把行会换成角色名,就是 CHECKNAMELIST、ADDNAMELIST、DELNAMELIST 这一组。这两组命令都支持相对路径,一般写成 ..\QuestDiary\下面某个目录\某个.txt。名单文件是一行一条,写法跟引擎自带的IP列表、帐号列表一样。
用名单文件的好处很直接:发奖之前先CHECK,名单里没有才发,发完立刻ADD。哪怕城主换人、哪怕同一分钟点十次,名单里已经有这条行会记录,CHECK就会拦住。而这份记录存在硬盘文件上,重启、重载、维护全都不影响,这正是变量法最怕的地方。
下面给一段能直接用的NPC脚本,引擎按GOM或者GEE这一类通用写法,奖励设成三亿元宝,领取窗口晚上22点01分到22点20分。
[@main]
#IF
ISCASTLEMASTER
#SAY
沙城现在是【<$CASTLENAME>】的。\
【<$USERNAME>】,你是本届城主。\
沙奖励三亿元宝,领取时间是每晚22:01到22:20。\
过时不领,当作放弃。\
\
<领取沙奖励/@领奖> <离开/@exit>
#ELSEACT
MESSAGEBOX 你不是沙城城主,这个NPC只认城主。
BREAK
[@领奖]
#IF
CHECKGUILDLIST ..\QuestDiary\沙城领奖\行会名单.txt
#ACT
MESSAGEBOX 你们行会已经领过这一届的沙奖励了,换一届再来。
BREAK
#IF
HOUR 22 22
MIN 01 20
#ELSESAY
现在不是领取时间。沙奖励只在每晚22:01到22:20发放,其他时段NPC不办事。
BREAK
#IF
ISCASTLEMASTER
#ACT
GAMEGOLD + 300000000
ADDGUILDLIST ..\QuestDiary\沙城领奖\行会名单.txt
ADDGUILDLIST ..\QuestDiary\沙城领奖\城主名单.txt
SENDMSG 0 沙巴克城主【<
𝑈
𝑆
𝐸
𝑅
𝑁
𝐴
𝑀
𝐸
>
】领取了本届沙奖励三亿元宝,行会【
<
USERNAME>】领取了本届沙奖励三亿元宝,行会【<CASTLENAME>】已经拿到手。
BREAK
#ELSESAY
条件没对上,领不了。
这段里三个检测是有顺序的,先查名单,再查时间,最后再确认一次身份。顺序不能反,反了会出现时间没到就把行会写进名单、结果时间到了反而领不到的情况。
名单文件要提前建好,路径里的目录也要先建。文件空着没关系,但文件本身必须存在,路径里任何一级目录缺失,CHECKGUILDLIST 会判成不存在,ADDGUILDLIST 会静默失败,表现出来就是每天都能重复领一次。这个坑踩的人最多。文件编码用ANSI或者GBK,用UTF-8存这类列表,引擎读到的行会名会跟实际对不上,CHECK永远返回没有。
第二种用法是全服自动发放,玩家不用点NPC,掌门在线就自动到手。这套走的是机器人脚本,要动三个文件。
先在工作目录的Robot相关目录里,找到 AutoRunRobot.txt,加一行定时触发:
#AutoRun NPC RUNONDAY 22:01 @沙奖励发起
这句的意思是每天22点01分,由机器人执行一次名叫沙奖励发起的标签。然后在 RobotManage.txt 里写这个标签,作用是全服弹窗:
[@沙奖励发起]
#IF
#ACT
Gmexecute 开始提问 @沙奖励领取
BREAK
Gmexecute 是让机器人以GM身份执行命令,开始提问是版本里的全服触发命令,它会给所有在线玩家弹出一个有没有话要说>的输入框,点确定就跳到后面那个标签。这里要注意,开始提问这个命令名必须跟你的版本里配置的完全一致,有的版本叫其他名字,照抄别人的脚本就会点了没反应。
最后在 QManage.txt 里写真正发奖的标签:
[@沙奖励领取]
#IF
EQUAL <
𝐿
𝑂
𝑅
𝐷
>
<
LORD><USERNAME>
#ACT
GAMEGOLD + 88888
ADDGUILDLIST ..\QuestDiary\沙城领奖\行会名单.txt
SENDMSG 0 万人之上的城主【<$USERNAME>】已经领取攻城奖励,元宝八万八千八百八十八。
BREAK
#ELSESAY
你不是沙城城主,别点。
这段没有用任何自定义变量,判据就是 <
𝐿
𝑂
𝑅
𝐷
>
跟
<
LORD>跟<USERNAME> 相等,再加一句名单文件兜底。想同时限制"每届只发一次",就在GAMEGOLD前面再加一句 CHECKGUILDLIST,思路跟前面第一段完全一样。
这套自动发放有一个天然限制,城主必须在线。<
𝐿
𝑂
𝑅
𝐷
>
取的是当前城主名字,如果攻城结束那一刻城主没上线,机器人弹窗发到全服,也没有任何人的名字能跟
<
LORD>取的是当前城主名字,如果攻城结束那一刻城主没上线,机器人弹窗发到全服,也没有任何人的名字能跟<LORD> 对上,这一届就发不出去。想避开,可以改成ISCASTLEGUILD给全行会成员发,或者把领取窗口拉长到半小时以上,给城主上线留时间。
再往细做一步,给整个行会的会员发同一份奖励。做法是加一个标签,把身份判定从城主换成成员:
[@行会成员领奖]
#IF
ISCASTLEGUILD
CHECKNAMELIST ..\QuestDiary\沙城领奖\成员名单.txt
#ACT
GAMEGOLD + 8888
ADDNAMELIST ..\QuestDiary\沙城领奖\成员名单.txt
SENDMSG 7 你作为【<$CASTLENAME>】的成员,领到了沙奖励八千八百八十八元宝。
BREAK
#ELSESAY
你不是沙城行会的人,或者已经领过了。
成员这一档用的是角色名列表,一人一条,不按行会算。因为成员比城主人多,用角色名逐个记,比用行会名一把记更准,退会再入会不会误判成没领过。
名单怎么重置,是运营时绕不开的事。
每一届攻沙结束后要发奖,就得让名单回到空。没有变量,就没有"改回0"这一步,得靠文件操作。最稳妥的办法是开区或者每届攻城前,进目录手动把名单文件清空,也可以按日期分文件,这个月用行会名单202610.txt,下个月换一个,文件全在,出了纠纷翻记录也方便。脚本里要动态删,就用 DELGUILDLIST 或者 DELNAMELIST 把指定行会、指定角色删掉,配合 CHECKNAMELIST 用。
几个高频出问题的地方单独拎出来。
<
𝐿
𝑂
𝑅
𝐷
>
的刷新时机要留意。攻城刚结束的那几十秒,引擎可能还没把新归属写进沙城数据,这时候读到的
<
LORD>的刷新时机要留意。攻城刚结束的那几十秒,引擎可能还没把新归属写进沙城数据,这时候读到的<LORD> 还是上一届的城主。所以奖励窗口别卡在攻城结束的那一分钟,往后留出至少一两分钟。机器人触发时间设在22:01这种成规的写法,就是为了避开这个刷新空档。
HOUR 跟 MIN 是两条命令,不能只写一条。只写 HOUR 22 22,整点一小时都能领,跟你要的十几分钟窗口差很远。两条都写齐,才卡得准。
文件路径里的斜杠方向。脚本里写的是相对路径,反斜杠开头,..\QuestDiary...,正斜杠在部分引擎里认不出,路径拼错,CHECK一律返回假,等于防重复整个失效。
无变量不等于一点数据都不留。名单文件本身就是记录,只是这份记录由引擎的文件读写命令管,不由脚本变量管。想查谁领了,直接打开那个txt看,比翻变量直观得多,这是无变量法在做客服时的一个附带好处。
换了引擎,命令名要对一遍。GOM和GEE这一系,ISCASTLEMASTER、CHECKGUILDLIST、ADDGUILDLIST这些名字一致;HERO那边有些命令的写法会变,判断之前先翻引擎自带的命令说明,别拿一套脚本硬套三个引擎。Gmexecute 在有些版本里写 GMEXECUTE,大小写和拼写都要按版本里那份说明来。
最后一条是身份检测覆盖不到的边角。ISCASTLEMASTER 认的是"现役城主",如果攻城过程中城主被踢出帮派、帮派被解散,这个判定可能长时间为假。做长期服,可以在发奖标签前面再补一条 CHECKGUILDLIST 判行会是否在攻城获胜名单里,两条并起来,比单靠一条身份判定稳。
传奇沙巴克拿沙奖励无变量脚本系统写法全解与攻城元宝自动发放配置实操教程
来源:
作者:
点击:

