传奇服务端经验卷双击兑换经验脚本编写与物品触发配置完整实操教程

来源: 作者: 点击:
经验卷这东西有两条完全不同的用场,先把它们分清楚,脚本才不会写混。一条是拿它当消耗品,双击一下就换成人物经验,用完就没了;另一条是拿它当兑换凭据,几张低级的攒在手上,到NPC那里换成一张高级的,卷子本身不涨经验。前一条走物品触发,后一条走NPC菜单,用到的是两套命令,代码长得也不像。

先说物品触发那条,也是双击给经验的核心。

要让一张经验卷双击有反应,得先在物品数据库里定死它的类型。打开物品数据库,找到经验卷那一条,把 StdMode 填31。31这个类别在引擎里是触发类物品,它自己不带效果,双击之后引擎会去脚本里找一段对应的标签来跑,跑什么完全由你写。同一张表里,31既是触发类,也跟捆药、打包那类共用一个值,判断的时候看的是 AniCount 那一栏。

AniCount 就是触发编号,引擎按这个数去拼标签名。填100,就去 QFunction-0.txt 里找 [@StdModeFunc100] 这一段;填120,就找 [@StdModeFunc120]。编号各家占用情况不一样,动手前先翻一遍现有的 QFunction-0.txt,看100到130这一段哪些号已经有人用了,挑一个空的。撞号是最麻烦的一种错,脚本写得再对,触发到的是别人那一段,症状是双击经验卷结果跳出来一个完全不相关的功能。

QFunction-0.txt 的路径在 Mir200\Envir\Market_Def 目录下,这是双击触发的主文件,里面除了一堆固定名字的系统标签,就是这些 [@StdModeFunc数字] 的段落。一段最基本的长这样。

[@StdModeFunc100]
#IF
CHECKLEVELEX > 0
#ACT
CHANGEEXP + 5000000
SENDMSG 6 你双击了一张经验卷,获得五百万经验。
BREAK

CHECKLEVELEX > 0 这一句是防呆,零级号理论上不该有经验卷,加一道不亏。CHANGEEXP 后面跟加号再加数字,就是给当前人物加这么多经验,五百万写成 5000000,不要用逗号或者空格断开数字,引擎认不出来。SENDMSG 6 是往聊天框丢一行绿字,告诉玩家卷子生效了,不带这一句也能加经验,但玩家不知道分了没分到,容易被当成bug。

写到这里有个绕不过去的判断:这张卷子双击之后要不要扣掉。

按引擎的惯例,StdMode=31 的物品在触发脚本跑完之后自己会减一个,也就是说你在脚本里不用再写 TAKE,写多了反而会一次扣两张。但这条规矩各家不统一,有的版本要脚本自己收。最稳的验证办法是拿一张卷子进游戏双击,看背包里那张还在不在,在就得自己补 TAKE,不在就别补。别凭记忆下结论,版本之间这一点差得最厉害。

接着是数字本身的边界,这一步错了很难查。

CHANGEEXP 一次能塞进去的经验有上限,给一个特别大的数,比如二十亿往上的量级,有的引擎会溢出翻成负数,玩家经验当场掉底。做高级经验卷尤其要小心,一张十亿的卷子,先拿小号试一次,确认经验条是涨了不是往回走。CHANGEExp 这条命令除了加号减号,还能用等号把经验直接设成某个数,[@ChangeExp] 这种用法适合测试,正式玩法里基本不用,谁点到谁经验被清空。第三个参数是给英雄分经验的开关,写1人物和英雄一起加,不写只加人物,带英雄的版本记得把它补上。

经验卷要真做成能用的东西,光会加经验不够,还得防着被刷。

刷的方式有三种,脚本要各堵一道。一种是拿改过的包伪造双击,绕过客户端的消耗。防这个靠服务端,StdMode=31 的物品在服务端这一层会验一次,脚本里再加一句 CHECKITEM 经验卷 1,确认背包里确实有这张卷子,再给经验,两条一叠,伪造的包进不来。另一种是短时间内连点,一张卷子当十张用。防这个用时间戳,脚本开头把当前秒数存进一个变量,跟上次记录比,差不到一秒的直接踢出去。第三种更少见,用自动化工具反复走触发,这种只能靠频率上限拦,比如每分钟只认五次。

再往下说兑换那条路,经验卷在这里不是消耗品,是货币。

低级经验卷换高级经验卷的脚本,骨架跟卖东西的NPC一模一样,菜单上铺一行按钮,每个按钮背后一段检测。判断凭据用的是 CHECKITEM,后跟物品全称和需要的张数;收走用 TAKE,名字和张数要和前面那句完全对上;给新的用 GIVE,数量一般是一。一段完整的样子是这样。

[@main]
#SAY
你要换哪种?
<1000万换5000万/@换1> <5000万换1亿/@换2>
<1亿换2亿/@换3> <退出/@exit>

[@换1]
#IF
CHECKITEM 1000万经验卷 5
#ACT
TAKE 1000万经验卷 5
GIVE 5000万经验卷 1
SENDMSG 6 兑换成功,五张低级卷换到一张高级卷。
GOTO @main
#ELSEACT
MESSAGEBOX 你的1000万经验卷不够五张,凑齐再来。
BREAK

这段里有三个地方必须一模一样,错一处兑换就废。物品名一次都不能差,CheckItem 写的是1000万经验卷,TAKE 也必须是1000万经验卷,少一个字、多一个空格,引擎会判成两样东西,检测能过、收走收不到,结果玩家白拿一张高级卷。张数要对上,检测五张、收五张,写成四张就是漏收。GIVE 后面的数量是给几张,多数情况给一张,写成五张就是发错。三个数字整齐划一,是这类脚本的基本功。

GOTO @main 这一句看着不起眼,用途是兑换完刷新一下菜单,玩家能连着换,不用退出重进。不写它,换完一次菜单停在原地,想再换得重新点NPC,体验差一截。

兑换有时候还要加上次数或者身份的限制。限一次就用名单文件,CHECKNAMELIST 那一组命令,路径写成 ..\QuestDiary\经验卷\已兑换.txt 这种相对路径,文件提前建好,空着也行,编码存ANSI或者GBK。写成UTF-8,中文物品名和角色名读出来是乱码,CHECK永远返回假,防重复也就失效了。限身份就用等级,CHECKLEVELEX 判一下够不够。

还有一类经验卷是打包的,双击一次给好几张小的,或者随机给不同级别的。做这个的思路跟单张的一样,只是 GIVE 那一段换成了循环。GIVE 写五行,每行给一张,就是一次给五张。想要随机,用引擎的随机数命令取一个一到五之间的数,再用 IF 分段跳到不同标签,这个各家命令写法差别大,按引擎自带说明来。给的时候留意背包空格,背包满了东西会掉在地上,别的玩家能捡,这是长期做经验卷最容易吃的亏,脚本里最好在给之前先 CHECKBAGSIZE,空格不够就提示玩家先清包。

经验卷做成限时的,比如只在活动期间能吃,靠 HOUR 和 MIN 两条命令把时间卡住。

#IF
HOUR 20 22
MIN 0 59
#ACT
CHANGEEXP + 5000000
BREAK
#ELSESAY
现在不是使用时间,经验卷只在晚上20点到22点生效。

HOUR 后面是起止两个数,MIN 是这一小时的第几分钟,两条都写才卡得准,只写 HOUR 就是整两小时都能用,跟你要的窗口差得远。

聚灵珠跟经验卷常被混在一起讲,其实机制不一样,顺便说清。聚灵珠在数据库里 StdMode 填49,DuraMax 表示它最多能攒多少经验,1点代表一万经验,填20就是二十万。AniCount 那一栏决定提取时扣什么,写0扣元宝,写1扣金币,具体扣多少看 Need 那一栏。玩家戴着它杀怪自动往里攒,攒满了双击取出来。它不需要你写加经验的脚本,引擎自己会算,这跟经验卷每张都要脚本接住完全不同。想把经验卷做成聚灵珠那种能攒着用的,实现方式是把攒的经验写进人物变量,攒够一个门槛再转成经验,这套要用到 MOV、INC 和名单文件,比单张触发复杂一档,建议先把手动触发的版本做顺了再上。

最后把调试时最常撞的几种情形拎出来。

双击经验卷没反应,头一个要查的是 StdMode 和 AniCount。StdMode 不是31,引擎不会去找触发标签;AniCount 填的号,在 QFunction-0.txt 里没有对应的 [@StdModeFunc数字],触发就落空,脚本里写什么都没人跑。这两栏都对了还不动,看 QFunction-0.txt 存的是不是GBK,存成UTF-8带BOM,文件开头几个隐藏字符会让第一个标签读不出来,表现是只有第一段触发失效,后面的都正常。再不行就把NPC全部重载一次,改完不重载,跑的还是内存里那份旧的。

双击触发到了,但经验没涨。先确认 CHANGEEXP 后面那个符号是加号不是等号,等号是覆盖,会把经验冲掉。再看数字是不是超出了这一版能装的上限。还要确认触发标签末尾有没有 BREAK,漏了它,引擎会顺着往下把文件里后面的段落也执行一遍,轻则弹一堆无关提示,重则连别人的奖励一起发。

兑换脚本里东西收了没给新的,八成是物品名对不上,或者 TAKE 的张数跟 CHECKITEM 的没对上。把这三行的名字复制粘贴,别手打,手打最容易多一个空格。给出去的东西也要核一遍,GIVE 后面的名字跟数据库里那张卷子的名字必须完全一致,差一个字给不出来,玩家会觉得你私吞了。

有连点器或者自动化工具在刷,就把频率限制补上。用变量记住上一次触发的时间,两次间隔不到一秒的直接 BREAK 拒绝,这一句能挡住绝大多数脚本刷法。经验卷是个产值很高的道具,防刷这一步省不得。

经验卷这套东西落在配置上是三块:数据库里的 StdMode 和 AniCount,QFunction-0.txt 里的触发标签,还有NPC菜单里的兑换逻辑。三块对齐了,双击加经验、攒卷换高级两条路就都能走通。改之前把物品数据库和 QFunction-0.txt 各备份一份放在旁边,这两个文件一动,出错面积都很大,有备份能立刻回退。改完进游戏实打实走一遍:双击一张看涨不涨经验、看卷子扣没扣、连点两次看会不会重复给、去NPC那里换一次看收没收到,这四步过了,脚本才算真的能用。