3K传奇引擎积分反馈奖励系统完整搭建教程自定义变量定义与积分发放兑换脚本配置详解

来源: 作者: 点击:
积分这东西在3K引擎里不能随便找个变量塞。先搞明白变量分几类,类别选错,玩家今天攒的积分一重登就归零,前面发出去的奖励全打水漂。

3K引擎的变量按作用范围和能不能保存分成这些组。P0到P99是私人數字变量,关掉对话框就重置为0,只能用来存一次对话里临时算的数。D0到D99、M0到M99、N0到N99都是私人数字变量,不能保存。S0到S99是私人字符变量,也不能保存。I0到I99是全局数字变量,服务器重启就归零。G0到G99是全局数字变量,能保存。A0到A99是全局字符变量,能保存。

问题出在这几个能保存的上面。G和A虽然能存,但它们是全局的,全服共用一个号,用来记某个玩家的积分,等于所有人的分加在同一个数上,完全没法用。真正给单个玩家存积分的,是自定义人物变量,也就是脚本里HUMAN那一档。

自定义人物变量要在服务端的变量定义文件里先登记,文件在 Mir200\Envir 目录下,名字按版本可能叫 Variable.txt 或者 变量.txt,各家略有出入,找不着就打开M2自带的那个变量编辑器,在里面加。每一行定义一个变量,要填的字段一般有变量名、变量类型、是否保存、初始值。类型这一栏填 HUMAN 就是人物变量,GUILD 是行会变量,GLOBAL 是全局变量。给积分开一个叫积分的数字型人物变量,类型写 HUMAN,保存那一栏选是,初值写0。登记完保存,重载一次变量,人物变量才认。

登记好之后,脚本里读写都用MOV,跨着自定义变量和临时变量倒。

把当前玩家身上的积分读出来放进临时变量,写法是:

MOV S0 HUMAN 积分

这句的意思是,把自定义人物变量积分的值,传给临时字符变量S0。反过来要往人物变量里写,写法是:

MOV HUMAN 积分 <$STR(S0)>

两句记牢一个方向就行:HUMAN加变量名在前是往人物变量写,HUMAN加变量名在后是往外读。同一个自定义变量还能和N、D这类数字变量直接对接,比如 MOV N1 HUMAN 积分 是把积分读进N1,MOV HUMAN 积分 <$STR(N1)> 是把N1写回积分。

读写的方向搞清楚了,加减乘除按3K的格式写。3K有一条别家不一样的地方,变量和数值一起算的时候,变量那一栏要带尖括号包起来,写成 <
𝑆
𝑇
𝑅
(
变量
)
>
。给
𝑆
0
里的积分加一千,写
𝐼
𝑁
𝐶
𝑆
0
<
STR(变量)>。给S0里的积分加一千,写INCS0<STR(S0)> 1000;减一千写 DEC S0 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
1000
。把积分按八折折算,写
𝑀
𝑈
𝐿
𝑆
0
<
STR(S0)>1000。把积分按八折折算,写MULS0<STR(S0)> 8,再 DIV S0 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
10
,两步一起就是乘以零点八。想直接算百分比,用
𝑃
𝐸
𝑅
𝐶
𝐸
𝑁
𝑇
𝑆
0
<
STR(S0)>10,两步一起就是乘以零点八。想直接算百分比,用PERCENTS0<STR(S0)> 80,出来的就是原来积分的八成。有些版本的简写 INC S0 1000 也认,但带尖括号那种在任何一份3K上都跑,拿不准就用长的那一种。

攒出来的分要判够不够,用 small、large、equal 这三条比大小。判积分够不够一千,写 large S0 <$STR(S0)> 999,成立就走下面的执行,不成立走反面。等于用 equal,小于用 small,参数格式跟上面一致,也都带尖括号。

积分从哪来,是这个系统的第一半。来源通道做全了玩家才有得攒。

打怪给分,挂在杀怪触发里。3K的杀怪触发标签一般写在 QFunction-0.txt 里,名叫 [@KillMon] 这一类,翻文件开头的注释能对上。里面先读积分,加一点,再写回去:

[@KillMon]
#IF
CHECKMAPNAME 积分地图
#ACT
MOV S0 HUMAN 积分
INC S0 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
1
𝑀
𝑂
𝑉
𝐻
𝑈
𝑀
𝐴
𝑁
积分
<
STR(S0)>1MOVHUMAN积分<STR(S0)>

进积分地图打一只怪加一分,别的图不加,条件一拦就干净。这里读写各一行不能少,读了不加白读,加了不写回等于没加。

在线时长给分,一般靠机器人脚本按时间触发,或者玩家每点一次NPC签到领一次。签到这种最稳,配一份名单文件防重复,一天一次。名单命令是 CHECKNAMELIST、ADDNAMELIST,路径写 ..\QuestDiary\积分\签到.txt 这种相对路径,文件先建好,空着也行,编码存ANSI或者GBK。

[@签到]
#IF
CHECKNAMELIST ..\QuestDiary\积分\签到.txt
#ELSESAY
你今天已经签过了,明天再来。
BREAK
#ACT
ADDNAMELIST ..\QuestDiary\积分\签到.txt
MOV S0 HUMAN 积分
INC S0 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
100
𝑀
𝑂
𝑉
𝐻
𝑈
𝑀
𝐴
𝑁
积分
<
STR(S0)>100MOVHUMAN积分<STR(S0)>
SENDMSG 6 签到成功,积分加一百,你现在有 <$STR(S0)> 分。
BREAK

充值给分,用3K的卡号那一套。玩家输卡号,脚本用 CHECKCODELIST 去指定的txt里核对,对上就 CLEARCODELIST 把这条划掉,再发元宝和积分。这一路跟积分嫁接的时候,把发积分那三行接在发元宝后面就行,等于充一次值,元宝和积分一起到账。

回收给分,把不要的装备、材料换成积分。这类要多一道检测,先看背包里有没有那件东西、有几件,再按件数算分。装备检测用 CHECKITEM,佩戴用 CHECKITEMW,名字写全称,跟数据库里的一模一样。包里有一件屠龙,回收给五百分,脚本里就是把积分读出来、加五百、写回去,再收走那件装备。

反馈奖励是这套系统的第二半,也是名字里那个反馈的出处。玩法是玩家提建议、报故障、纠错,运营确认有价值之后发积分。

让玩家提交内容,用输入框。3K的字符输入框是 @@InPutString 加编号,编号存进S变量,写 <提交建议/@@InPutString10> 就弹框,填完内容进S10。数字输入框是 @@InPutInteger 加编号,内容进N变量。名字回调标签在3K里直接是 [@InPutString10] 这一种,不必加前缀,这跟HERO那系要在前面补Call不一样,换成3K就别照搬别人的写法。

玩家填完进回调,这时候不能立刻给分,得先让运营看到。做法是把这条反馈落一份记录,再等人工发分。记录用文件名加时间戳的方式落,或者干脆把内容追加进一个文本,运营隔天看一遍,把该给的名单列出来。

人工发分用小号脚本实现最省事。开一个只有管理员能敲的命令,命令表在 Mir200\Envir 的 Command.txt 里加一行,权限那一栏填1或者更高,别填0。管理员在游戏里敲命令,弹输入框要填玩家名和分数,脚本把分数加到那个玩家头上。3K里读写别人的人物变量,一般用带玩家名的写法或者先切目标,这一步各家引擎差异大,落笔前翻引擎自带的命令说明,别想当然。发完给那个被奖励的玩家发一条SENDMSG,让他自己知道分到账了。

积分拿到手要能花,兑换是这套系统的第三半。兑换窗口做成NPC菜单,一屏铺几个档位,每一档先判分数够不够,够就扣分发东西,扣分那一步就是 DEC 加写回:

[@兑换]
#SAY
你的积分:<$STR(S0)>。想换点什么?
<兑换屠龙/@换屠龙> <兑换祝福油/@换祝福油>
<兑换经验/@换经验> <关闭/@exit>

[@换屠龙]
#IF
MOV S0 HUMAN 积分
large S0 <STR(S0)> 4999 #ACT MOV S0 HUMAN 积分 DEC S0 <STR(S0)> 5000
MOV HUMAN 积分 <
𝑆
𝑇
𝑅
(
𝑆
0
)
>
𝐺
𝐼
𝑉
𝐸
屠龙
1
𝑆
𝐸
𝑁
𝐷
𝑀
𝑆
𝐺
6
兑换成功,扣五千分,还剩
<
STR(S0)>GIVE屠龙1SENDMSG6兑换成功,扣五千分,还剩<STR(S0)> 分。
BREAK
#ELSESAY
积分不够,屠龙要五千分。
BREAK

这里两组读取是刻意的。第一组读出来只为判够不够,判完不进执行;第二组在执行里再读一次,是因为前面那些条件命令可能把S0用掉了,重读一遍最稳。扣多少分就 DEC 多少,别用 INC 写负数,各家引擎对负数的处理不一致,正数减最保险。

几个档位的判断可以并成一段,也可以在菜单里各挂各的标签,看功能多少。档位多了建议一个标签一个档,排查方便,哪一档算错只看那一段。

想让积分不光能换东西,还能当身份用,就再做一档排行榜。把每个玩家的积分写进一份txt,一条一个名,或者用引擎自带的人物变量排行功能。做排行这一块各家差异最大,有的引擎有现成的排序命令,有的得自己拼,材料不够就先做前十名的展示,别硬上全服排行。

积分系统搭完,几处最容易踩的坑单独拎出来。

第一是变量类别选错。用N、M、D存积分,下线就没了;用G、A存,全服混在一起。积分必须落在自定义人物变量上,类型 HUMAN,保存那栏选是。这一条错了,后面脚本写得再对也是白写。

第二是读写没配对。MOV S0 HUMAN 积分 读了不写回,等于没加;写了没读,等于覆盖。加分的标准三段是:先读进临时变量,中间加减,最后写回人物变量,三步一步都不能省。同一个NPC里连续给两次分,第一次写回之后记得重新读一次再算,不然第二次拿的还是旧值,两次只加了一次。

第三是尖括号漏了。3K做变量运算,参数里那个变量要写成 <$STR(变量)>,直接写变量名,有的版本认有的不认,认不认还看具体命令。省事省出一个括号,症状是数值变零或者不变化,很难看出是格式问题。写的时候就带上,比事后查快。

第四是编码。脚本文件存GBK,名单文件、记录文件也存GBK或者ANSI。存成UTF-8带BOM,玩家名和分数之间的中文读出来是乱码,对不上,防重复那一套整个失效。

第五是名单文件的目录。..\QuestDiary\积分\ 这个目录要一级一级先建好,文件也要先建出来,空着没关系。目录缺一级,CHECK一律返回假,ADDNAMELIST静默失败,表现出来就是每天都能重复签到,看脚本完全看不出问题。

第六是数值溢出。3K这一段变量能装的数有上限,积分攒到特别大之后再加可能翻负。做长期服,给积分设一个封顶,条件里加一条判积分小于某个数才允许再攒,或者隔一段时间把积分按比例折一次,别让它无限往上顶。

第七是权限。管理员发分的那条命令,权限栏必须填1以上。填成0等于把发分权限开给全服,玩家敲几下就给自己加满。

第八是重载。变量定义文件改完,要重载变量,脚本文件改完要重载NPC,两样不是一回事。只重载NPC不重载变量,新建的积分变量在脚本里读不到,症状是加了分不涨、兑换时读到的是空。改一次、重载一次、拿小号进去验一次,比改一堆再回头找错省事。

积分这套东西看着是四个动作,攒、存、读、花,真跑起来最容易乱在存上面。变量定对了,读写配齐了,扣分只减不加,剩下的就是按版本把命令核对一遍。全都对完了,进游戏实打实走一遍:打怪看涨不涨,下线再上看还在不在,兑换看到底扣没扣、东西有没有到手,这四步过了,系统就立住了。