庆典仙子在十周年这类活动版本里是个常驻的活动NPC,功能是全套的:老玩家上线领庆典礼包,攒庆典积分,拿积分换周年勋章、换时装、换称号,运气好的还能在她那儿抽一次奖。她跟普通商店NPC的区别只有一个,商店只做买卖,她要把时间、次数、身份全部卡住,所以脚本里检测条件比执行命令还多。下面按文件放哪、命令怎么写、功能怎么搭、坑在哪,一块一块说。
先解决她站哪、由谁触发。
脚本文件放在服务端 Mir200\Envir\Market_Def 目录下,一个NPC一个txt,名字随你起,比如 庆典仙子.txt。文件建好只是有了她的台词,还得让她出现在地图上,这一步在 Mir200\Envir\MerChant.txt 里登记。这个文件一行一个NPC,字段依次是脚本名、地图名、X坐标、Y坐标、NPC显示名字、标志、形象编号、是否属于沙巴克、是否移动、移动间隔、是否允许变色、变色速度。最省事的一行长这样:
庆典仙子 3 336 336 庆典仙子 0 8 0 0 0 0 0
脚本名那一栏写的是文件名去掉后缀的部分,要跟 Market_Def 下那个txt同名,写错了NPC不出现。地图名3是土城,坐标自己按版本调,形象编号8是常见的仙子外观,想在客户端里换成更好看的造型,就把8改成对应的外观号。后面几栏填0,NPC站着不动。
脚本本身的结构是固定套路,[@main]是入口,下面#IF放检测、#ACT放执行、#SAY放就地显示的文字、#ELSEACT和#ELSESAY放不满足条件时的分支,每段最后用BREAK收尾,想直接关掉对话框就写CLOSE,跳到别的段落用GOTO。对话框里换行用反斜杠,按钮写成尖括号包显示文字、斜杠、@跳转标签,点一下跳到对应的[@标签]继续跑。
因为用的是3K引擎,有三处跟别的引擎不一样,先记住,后面写脚本全靠它。
第一处是输入框的回调标签。3K里写 @@InPutString10,玩家填完内容存进 S10,回调标签直接就是 [@InPutString10],前面不加任何前缀。别家引擎要求补一个Call,写成 [@CallInPutString10],3K上照抄那一套,玩家填完就卡住,一点反应没有。数字输入框 @@InPutInteger11 对应 N11,回调就是 [@InPutInteger11]。
第二处是非法字符的处理。玩家输入的内容里带过滤字符,3K引擎跳转到 [@MsgFilter] 这一段,别家跳 [@IsInFilterList]。想给玩家一个"别输入敏感词"的提示,就得把 [@MsgFilter] 这一节补上,不补的话引擎按内置提示走,有的版本干脆不提示。
第三处是变量。P、D、M、N、S这几组是私人变量,关掉对话框或者重登就重置,存不住东西;G、A是全局变量,能存下来但全服共用一个号,拿它记某个玩家的庆典积分,等于所有人的分加在同一个数上。真正给单个玩家存积分的,是自定义人物变量,也就是脚本里HUMAN那一档,登记文件在 Mir200\Envir 目录下,用M2自带的变量编辑器打开,加一行:变量名填 庆典积分,类型填 HUMAN,保存那栏选是,初值写0。登记完重载一次变量,脚本里才认这个号。
自定义人物变量的读写用MOV,两个方向别搞反:
MOV S0 HUMAN 庆典积分
这一句是把玩家的庆典积分读进临时变量S0。反过来要往人物变量里写:
MOV HUMAN 庆典积分 <$STR(S0)>
记住一条:HUMAN加变量名在后面是读出来,HUMAN加变量名在前面是写进去。加减用INC和DEC,3K这里有个跟别家不一样的地方,变量参与运算的时候要带尖括号,写成 INC S0 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
100
。比大小用
𝑙
𝑎
𝑟
𝑔
𝑒
、
𝑠
𝑚
𝑎
𝑙
𝑙
、
𝑒
𝑞
𝑢
𝑎
𝑙
,同样带尖括号,
𝑙
𝑎
𝑟
𝑔
𝑒
𝑆
0
<
STR(S0)>100。比大小用large、small、equal,同样带尖括号,largeS0<STR(S0)> 999 就是判积分够不够一千。
现在搭她的主菜单。
[@main]
#SAY
十年风雨,谢谢你还在这里。
我这里有几样东西给你:
<领取庆典礼包/@领礼包> <兑换周年勋章/@兑换勋章>
<用积分抽奖/@抽奖> <查询我的庆典积分/@查积分>
<离开/@exit>
主页把功能铺成按钮,五个入口,每个按钮跳到各自标签。@exit 是引擎自带的关闭标签,写它就关掉对话框,不用自己写关闭命令。
第一件是领庆典礼包,这属于一年只能领一次的东西,用名单文件卡死。
[@领礼包]
#IF
CHECKNAMELIST ..\QuestDiary\十周年\庆典礼包.txt
#ELSESAY
这份礼包你已经领过了,一年就这一回,留着明年再来。
BREAK
#ACT
ADDNAMELIST ..\QuestDiary\十周年\庆典礼包.txt
GIVE 庆典宝箱 1
GIVE 元宝 5000000
SENDMSG 6 庆典礼包已经放进你的背包,记得先清出空格。
BREAK
CHECKNAMELIST 查的是当前人物名在不在那份txt里,不在才往下走,进去第一件事是 ADDNAMELIST 把人名写进去,再发东西。这样哪怕玩家连点十次,第二次就被拦在门口。名单文件的路径写相对路径,反斜杠开头,目录和文件都要提前建好,文件空着没关系但必须存在,路径缺一级,CHECK永远返回假,防重复等于没做,玩家能反复领。文件编码存ANSI或者GBK,存成UTF-8带BOM,中文名字读出来是乱码,同样对不上。
发东西之前最好加一句 CHECKBAGSIZE 判空格,背包满了奖励会掉在地上被别人捡走,这是活动NPC最容易吃的亏。
第二件是兑换周年勋章,用积分换,读积分、判够不够、扣掉、发货,一步不能少。
[@兑换勋章]
#IF
MOV S0 HUMAN 庆典积分
large S0 <STR(S0)> 9999 #ACT MOV S0 HUMAN 庆典积分 DEC S0 <STR(S0)> 10000
MOV HUMAN 庆典积分 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
𝐺
𝐼
𝑉
𝐸
十周年纪念勋章
1
𝑆
𝐸
𝑁
𝐷
𝑀
𝑆
𝐺
6
兑换成功,扣一万积分,你还剩
<
STR(S0)>GIVE十周年纪念勋章1SENDMSG6兑换成功,扣一万积分,你还剩<STR(S0)> 分。
GOTO @main
#ELSESAY
勋章要一万积分,你现在还不够,去多打打活动怪。
BREAK
这里读了两遍积分是有意的。第一遍读出来只为了判够不够,判完不许直接进执行;执行里重新读一遍再扣,是因为中间几条检测命令有可能把S0用掉,重读一次最稳。扣分只减不加,别想着用 INC 写负数,各家引擎对负数的处理不一致,正数减最保险。GOTO @main 是用来刷新菜单的,不写它换完一次菜单停在原地,想再换得重新点NPC。
第三件是抽奖。抽奖的关键在概率和次数上限,两样都要卡。
[@抽奖]
#IF
MOV S0 HUMAN 庆典积分
large S0 <STR(S0)> 999 #ACT MOV S0 HUMAN 庆典积分 DEC S0 <STR(S0)> 1000
MOV HUMAN 庆典积分 <STR(S0)> MOVR N1 100 #IF large N1 <STR(N1)> 89
#ACT
GIVE 极品时装 1
SENDMSG 0 有个幸运的人从庆典仙子手里抽到了极品时装。
BREAK
#IF
large N1 <$STR(N1)> 59
#ACT
GIVE 高级称号卷 1
SENDMSG 6 你抽到了一张高级称号卷。
BREAK
#ACT
GIVE 经验丹 5
SENDMSG 6 你抽到了五颗经验丹,下次手气会好的。
BREAK
#ELSESAY
抽一次要一千积分,你的分不够。
BREAK
MOVR N1 100 是给N1赋一个0到99之间的随机数,落在哪个区间拿哪一档奖,区间从上往下判,第一个成立的执行完就BREAK,不会往下串。概率别把极品那档开太大,开大了活动几天就被抽空。想给抽奖加个每天限次的限制,就在最前面加一段 CHECKNAMELIST 查当天的记录文件,一天一份,文件名叫 抽奖20261010.txt 这种带日期的,比用一个公共变量记次数直观。
第四件是庆典积分查询,纯展示。做这个之前先把积分读进临时变量,再用尖括号显示。
[@查积分]
#ACT
MOV S0 HUMAN 庆典积分
#SAY
你现在有 <$STR(S0)> 点庆典积分。
积分可以换勋章、时装、称号,也能在我这儿抽一次奖。
<返回/@main>
尖括号不能漏,写成 S0 引擎不会替换,玩家看到的是一串字母。STR(S0) 这个写法,只在 #SAY 里显示用,不能在 #ACT 里当命令参数用,那个位置要写成 <STR(S0)>。
接下来讲活动NPC绕不开的两件事,时间和积分从哪来。
时间是靠 HOUR 和 MIN 两条命令卡,缺一不可。
#IF
HOUR 20 22
MIN 0 30
#SAY
现在是庆典时段,礼包和经验加成都在开着。
#ELSESAY
庆典只在每晚20点到22点半之间开,别的时候我不发东西。
BREAK
HOUR 20 22 是20点到22点这一整段,MIN 0 30 是这一时段的第0分钟到第30分钟,两条叠在一起,窗口才锁得准。只写HOUR,整两小时都能领,跟你要的十几分钟差得远。周年庆这种只在一天里开的,用不到时间判断,靠日期控制,可以在开服前手动把脚本换上,活动结束再换回来,比写一堆日期变量省事。
积分从哪来,得给玩家铺几条路。打活动怪给分,挂在杀怪触发里,触发标签一般叫 [@KillMon] 或者 [@KillMonster],各家不一样,翻 QFunction-0.txt 开头的注释对一遍。段里先读、再加减、再写回,三段不能少:
[@KillMon]
#IF
CHECKMAPNAME 庆典地图
#ACT
MOV S0 HUMAN 庆典积分
INC S0 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
5
𝑀
𝑂
𝑉
𝐻
𝑈
𝑀
𝐴
𝑁
庆典积分
<
STR(S0)>5MOVHUMAN庆典积分<STR(S0)>
进庆典地图打一只怪加五分,别的图不加。读了不写回等于没加,这个错误最隐蔽,脚本跑完没有任何报错,玩家就是分不涨。
在线时长给分、充值给分、回收给分,做法各不相同。在线时长一般靠机器人脚本按点触发,或者玩家自己点签到,签到配名单文件防一天多次。充值给分嫁接在充值那套校验命令后面,把发积分那三行接在发元宝后面就成。回收给分要多一道检测,先看背包里有没有那件东西、有几件,CHECKITEM 判数量,TAKE 收走,再折算成分。
玩家的庆典积分要能花出去,菜单里铺几档兑换就够了,档位多了建议一档一个标签,排查方便,哪一档算错只看那一段。除兑换之外,还可以给她加一档任务类的功能,让玩家填内容提交,比如庆典祝福语,提交完存一份记录,运营隔天看一遍,挑好的发积分。做提交要用输入框,3K 的写法是 @@InPutString 加编号,回调标签不加前缀:
[@main]
#SAY
想给十年留句话?写下来,我帮你记着。
<写祝福/@@InPutString10>
<关闭/@exit>
[@InPutString10]
#SAY
你写的是 <$STR(S10)>,确认吗?
<确认提交/@提交祝福> <重写/@main>
[@提交祝福]
#IF
CHECKNAMELIST ..\QuestDiary\十周年\祝福名单.txt
#ACT
MESSAGEBOX 你已经写过一条了,留一条就够。
BREAK
#ACT
ADDNAMELIST ..\QuestDiary\十周年\祝福名单.txt
MOV S0 HUMAN 庆典积分
INC S0 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
200
𝑀
𝑂
𝑉
𝐻
𝑈
𝑀
𝐴
𝑁
庆典积分
<
STR(S0)>200MOVHUMAN庆典积分<STR(S0)>
SENDMSG 6 祝福收到了,给你加两百积分。
BREAK
输入框这一段,回调标签写 [@InPutString10],3K上就是这个样子,别照着别家的补 Call 前缀。玩家填了带过滤字符的内容,引擎会跳到 [@MsgFilter],把这一节补上就有一句人话的提示:
[@MsgFilter]
#SAY
这句话里有些字我不能记,换一句再来。
<重写/@main>
编号从0到99,一场活动里输入框多了记得把编号错开,任务相关的用10到19,交易相关的用20到29,省得两个输入框共用一个变量互相覆盖。
调试的时候,几个点盯着走,基本能定位。
NPC点不开,先看 MerChant.txt 里坐标填没填对、脚本名跟 Market_Def 下那个txt名字对不对得上。点开了按钮没反应,看按钮后那个@标签,脚本里有没有对应段,多级菜单里上一段的 BREAK 有没有漏,漏了会顺着往下把后面几段也执行一遍,轻则乱弹提示,重则奖励发重、人连着被传送两次。
领奖能领但重复领,看名单文件在不在、路径对不对、编码是不是GBK。目录缺一级、文件没建、编码存错,三种都会让 CHECKNAMELIST 永远返回假,症状就是防重复整个失效。
积分加了不涨、兑换时读到空,去查自定义变量登记了没有、类型是不是 HUMAN、保存那栏选了没有,以及改完变量定义有没有重载。只重载NPC不重载变量,脚本里读不到新变量,表现是加了分不涨。
发的东西收不到,看 GIVE 后面的物品名跟数据库里那张对不对,一个空格都不能差。发出去之前加一句 CHECKBAGSIZE 判空格,背包满了东西掉地上,这个坑在活动期间天天有人踩。
变量运算结果不对,先检查那个尖括号。3K上写变量运算要带 <$STR(变量)>,直接写变量名,有的版本认有的不认,认不认还看具体命令,症状是数值变零或者干脆不变,很难看出是格式问题。
最后把记忆点收一下。庆典仙子这套东西落在四块:MerChant.txt 里那一行登记、Market_Def 下那个脚本文件、变量定义文件里登记的自定义人物积分、QuestDiary 下那几个名单文件。四块对齐了,领礼包、查积分、换勋章、抽奖四条路才走得通。3K上额外记三条:输入框回调不加 Call 前缀、非法字符跳 [@MsgFilter]、变量运算要带尖括号。改之前把 MerChant.txt 和 QFunction-0.txt 各备份一份放旁边,这两个文件一动出错面积都很大。改完拿小号进去实打实走一遍:领一次礼包看扣没扣、连点两次看会不会重复、打几只活动怪看分涨不涨、换一次勋章看看分和物品对不对、抽一次奖看抽到的东西进没进背包,这一圈过了,脚本才算真的能用。
完美仿盛大传奇十周年庆典仙子脚本3K引擎可用功能编写与参数配置完整详解
来源:
作者:
点击:

