任务框里显示的那一条条任务,背后都是脚本在撑着。玩家点开任务面板看到的任务名、目标、进度,靠的是任务文本配置;任务从接取到完成这段状态变化,靠的是脚本里读写任务变量。两套东西对不上,就会出任务框有显示但点不动、或者任务做完了交不掉这类毛病。下面把任务脚本落在哪个文件、骨架怎么写、变量怎么记、任务框怎么同步,逐段讲清。
一、先认路径,脚本放错地方等于没写
服务端根目录下进到 Mir200\Envir,任务相关的脚本分散在几个文件夹里,先分清各自管什么。
Market_Def 是 NPC 脚本的默认存放处,玩家跟哪个 NPC 对话触发的任务,脚本就写在对应 NPC 的文件里。这是任务脚本最常落地的位置。
QuestDiary 是功能脚本的存放处。脚本里用 #CALL 调用子段时,如果不写完整路径,引擎会自动到这个文件夹里找,找不到就报脚本不存在。任务里那些公共的判断逻辑、奖励发放,习惯拆出来放进这里,多个 NPC 共用一段。
MapQuest_Def 里的 QManage.txt 管登录触发。玩家上线时该不该自动弹任务、身上任务状态怎么初始化,写在这个文件里。任务框登录后要显示当前任务,多半要在这儿补一句。
Robot_def 里放 AutoRunRobot.txt 和 RobotManage.txt,负责定时。限时任务的时间到了要强制结束、任务每日重置,靠这两个文件配合 QManage.txt 三段联动来完成。
记住一条:脚本文件路径和 #CALL 里写的路径必须完全对应。把 QuestDiary 下的某个文件夹挪到 Market_Def,原来能跑的 #CALL 立刻失效,提示找不到脚本。
二、任务框和脚本靠任务变量对上
任务框不是自己会变的,它显示的状态来自脚本写进去的任务变量。写法上,任务状态一般用个人变量记,U 变量或 N 变量都能用,区别在保存方式。
U 变量是持久变量,人物下线上线数据还在,任务进度、是否已完成这类需要长期记的,用 U 变量。
N 变量是个人变量,人物小退大退就清空,只适合记单次登录期间的临时进度,比如本次上线在线时长、本次击杀计数。任务本身别用 N 变量,否则玩家掉线一次进度就没了。
约定一个状态值,0 表示没接,1 表示进行中,2 表示已完成待交付,3 表示已交付。脚本里所有判断都围着这个值转。变量选好后别中途改编号,改编号等于把老玩家的任务进度全洗掉。
三、任务脚本的骨架
传奇脚本的段用方括号起头,段里的内容用花括号包起来,条件判断和执行命令分行写。一个最简的任务对话骨架长这样。
[@任务使者主段]
{
#IF
EQual U100 0
#ACT
MOV U100 1
SENDMSG 6 已接取任务:清理沃玛森林。
#SAY
森林里的野怪最近太猖狂,帮我去清理二十只,回来有赏。\
<知道了/@exit>
#ELSESAY
任务已经接过了,去看任务框里的进度。\
<退出/@exit>
}
#IF 后面跟检测条件,条件成立走 #ACT 的执行命令和 #SAY 的输出。#ELSESAY 是条件不成立时说的话,#ELSEACT 是不成立时执行的动作。花括号必须成对,漏一个括号整段都读不出来。
同一文件里多个段落用不同标签名区分,标签名不能重复。标签撞名是新手最常见的坑,脚本看着哪都对,就是不执行,原因就是跟版本里已有标签重了。改一次标签名保存重载,往往就好了。
四、接任务这一步写什么
接任务段干三件事:判断玩家有没有资格接、把状态变量改成进行中、给玩家一个明确反馈。
资格判断常用几条检测命令。CheckLevel 数值 判断等级够不够;CheckJob Warr 或 Wizard 或 Taos 判职业,任务分职业时可以卡;CheckItem 物品 数量 判断背包里有没有任务道具;CHECK [n] 1 判断某个逻辑变量是否被置位,用来做前置任务是否完成的开关。
比如要求先做完前置任务才放接取,前置任务的完成标记写在 U101 里,判断就写 EQual U101 3。玩家没做过,走 #ELSESAY 提示他先去找谁。
接取动作里,MOV U100 1 把状态改掉,SENDMSG 6 招呼一声,任务框刷新后就能看到这条任务。有的版本接任务后要给任务道具,同时来一句 GIVE 任务信物 1。
五、杀怪计数和进度怎么记
打怪类任务是任务系统里最多的一类,核心是计数。计数用 U 变量存,怪物被击杀时把变量加一。
计数一般挂在触发脚本里写,不是接任务那一段。人物击杀指定怪物时引擎触发对应标签,脚本里判断当前任务是不是进行中,是就把计数加一,同时比对目标数量。
[@击杀计数]
{
#IF
EQual U100 1
#ACT
INC U102 1
SENDMSG 6 任务进度:<$STR(U102)>/20
#IF
EQual U102 20
#ACT
MOV U100 2
SENDMSG 6 目标已达成,回去交任务。
}
INC 是自加,<$STR(U102)> 用来把变量的值显示到消息里,玩家能看到 15/20 这种进度。到达目标值就把状态推到 2,任务框里这条任务会变成可交付。
这里有个单位要对齐的地方:任务文本里写的目标数量、脚本里比对的数值、怪物触发的对象,三处必须是同一个数。文本写 20 只,脚本比的是 10,玩家打到 10 只任务就提示完成,任务框文本却显示没满,玩家会以为出了 bug。
六、提交任务与奖励发放
交任务段判断状态是不是 2,是就把变量推到 3,然后发奖励。
[@提交任务]
{
#IF
EQual U100 2
#ACT
MOV U100 3
GIVE 金币 5000
GIVE 经验丹 2
SENDMSG 6 任务完成,奖励已放入背包。
#SAY
干得不错,这点东西你收着。\
<退出/@exit>
#ELSESAY
你的任务还没做完,别急着交。\
<退出/@exit>
}
GIVE 后面跟物品名和数量,物品名要和物品数据库里的名称对得上,写错了给不出去。经验用专门的经验命令给,金币也可以走 GIVE 金币。
防重复交领有两个做法。一是交完把状态改成 3,判断只在等于 2 时才发奖,天然防住重复提交。二是再加一句判断,已完成过的走另一套对话,提示已经领过。涉及贵重奖励的任务,两种判断都加上更稳。
七、任务框文本配置怎么配
脚本管状态流转,任务框里那句“清理沃玛森林 进度 15/20”的展示,靠任务文本配置。这部分通常在引擎的任务配置里维护,逐条任务对应任务编号、任务名、目标描述、可接等级、奖励预览。
配置里几个字段要跟脚本严格一致。任务编号是脚本里那组变量的锚点,脚本判断 U100 对应哪条任务,就看编号对齐没有。可接等级要和脚本里 CheckLevel 的值一致,配置写 15 级可接,脚本卡 10 级,玩家 10 级就接到了,任务框显示未解锁,两处打架。
任务目标描述里的数量要跟脚本计数目标一致,前面提过,这是最容易错又不报错的地方,错了脚本照样跑完,玩家看到的就是一份看着正常、实际对不上的任务。
任务框里显示进度,靠的是把变量值嵌进文本。有些引擎支持在任务文本里直接取变量,写法跟消息里用 <$STR(变量)> 一个道理。任务框刷新时机一般是状态变量变化后由引擎统一刷,所以脚本里改完变量不用手动刷面板。
八、限时任务和每日重置
限时任务要在接取时给一个倒计时,用 TimeRecall 数值 设一个分钟数,到点用 BreakTimeRecall 中断。配合 Robot_def 里的定时脚本,时间到没完成就强制作废,把 U 变量清回 0。
每日重置放在 RobotManage.txt 里,用 AutoRunRobot.txt 定时间,比如每天凌晨执行一次清空标签。重置的就是那条任务的 U 变量,把它 MOV 回 0,玩家第二天又能接。重置任务记得只清任务变量,别顺手把别的记录一起清了。
九、写完必做的调试动作
脚本改完保存,要在引擎里重新加载对应脚本才生效。只改 NPC 脚本就重载所有 NPC,改了 QManage.txt 或者功能脚本就重载登录脚本或全部脚本。不重载,改了跟没改一样。
每写一段就测一段。先在段里加一句 SENDMSG 6 测试输出,进游戏确认这条消息能弹出来,说明标签没重复、触发条件没问题,再往下写功能。等整段写完才第一次进游戏,出了问题分不清是标签错、变量错还是触发没到,最难查的就是这种。
进游戏后按顺序走一遍:接任务、看任务框刷新、打怪看进度有没有涨、打满看状态有没有变可交、交任务看奖励和状态。每一步对不上就回头查那一段的变量和数值。
十、几个反复出现的错误
脚本报 script error 或者 load fail,先看花括号是不是漏了、标签是不是重复、#CALL 路径是不是对。这三样占了报错的大多数。
任务接不了,查前置变量判断是不是写死了。前置任务标记是 3 才放行,玩家数据里是 1,永远进不去。
任务进度不涨,查计数触发标签有没有挂对,以及状态变量判断是不是写成别的值了。判断写 EQual U100 0,玩家已经处于进行中,条件不成立,计数当然不动。
任务交不掉,看状态变量有没有在别处被改成别的数,以及配置里的任务编号和脚本变量有没有对错位。
任务框显示正常但点不动,多半是任务文本配置和脚本没对上号,脚本里那条任务根本不存在,面板是读配置读出来的一个孤条。
把路径、骨架、变量、计数、配置这几块按顺序理顺,任务脚本写起来就是套模板。真正的功夫在数值对齐上,三个数写成同一个,脚本才跑得跟玩家看到的一致。
传奇外传任务框任务脚本编写从任务接取到提交完成的完整写法与配置实操详解
来源:
作者:
点击:

