当前位置 : 145z游戏站 | 热血传奇 | 技术教程 | 

传奇任务脚本写法:从接任务到奖励全流程

热度:
传奇任务脚本不是一套固定模板,而是由“接取标签、进度变量、完成检测、奖励发放、重置机制”五块拼出来的。不同引擎命令有差异,但结构通用。下面按HERO/LEGEND/BLUE常用命令讲,GOM/GEE类似,个别命令名不同。

一、任务脚本的存放位置
任务脚本通常放在:
•Mir200\Envir\QuestDiary\任务系统\下,按任务名建txt

•或者直接写在NPC的Market_Def文件里

•全局任务触发(比如杀怪计数)放QFunction-0.txt或QuestDiary里

接任务写在NPC上,任务进度靠变量,完成检测靠#IF判断,奖励发放用#ACT。

二、最简任务脚本骨架
NPC文件(Market_Def\任务NPC.txt):

[@main]
<任务发布人>\
\
<接取任务/@accept>\
<查看任务进度/@progress>\
<提交任务/@submit>\
<离开/@exit>\

[@accept]
IF

EQUALN$任务状态0
ACT

MOVN$任务状态1
MOVN$任务杀怪数0
SENDMSG6你接取了任务:杀死10只稻草人
GOTO@main
BREAK
ELSEACT

SENDMSG6你已经接取了任务或任务已完成
GOTO@main
BREAK

[@progress]
IF

EQUALN$任务状态1
ACT

SENDMSG6当前进度:<STR(N任务杀怪数)>/10
GOTO@main
BREAK
ELSEACT

SENDMSG6当前没有进行中的任务
GOTO@main
BREAK

[@submit]
IF

EQUALN$任务状态1
LARGEN$任务杀怪数9
ACT

GIVE金币100000
CHANGEEXP+1000000
MOVN$任务状态2
SENDMSG6任务完成,获得奖励!
GOTO@main
BREAK
ELSEACT

SENDMSG6任务未完成或已结束
GOTO@main
BREAK

三、杀怪计数怎么接进任务
任务要杀怪,得在QFunction-0.txt里加[@KillMon]触发,判断当前任务状态,再给对应变量加1。

QFunction-0.txt:

[@KillMon]
IF

EQUALN$任务状态1
ACT

IF

CHECKMCNAME稻草人
ACT

INCN$任务杀怪数1
SENDMSG6任务进度:<STR(N任务杀怪数)>/10
BREAK

CHECKMCNAME是检测怪物名字,有的引擎用$PARAM(0)取怪名再比较。如果任务要杀多种怪,就写多个#IF分支,或者用CHECKMCNAME配合OR。

四、任务状态变量说明
N$任务状态:0=未接取,1=进行中,2=已完成(等重置),3=已交付(可再接)
N$任务杀怪数:当前杀怪进度

用N$前缀是HERO/BLUE的玩家私有变量,小退不丢。如果用N0/N1这种,可能被其他脚本占用,任务会串。

五、任务重置机制
任务完成后要能再接,两种方式:
1.每日重置:登录时或定时器里检查日期,跨天就把状态改回0
2.手动重置:NPC对话里提供“放弃任务”按钮

每日重置(QFunction-0.txt[@Login]或定时器):

[@Login]
IF

EQUALN$任务状态2
ACT

IF

EQUALS任务完成日期<DATE>
ACT

MOVN$任务状态0
MOVS任务完成日期<DATE>
SENDMSG6每日任务已刷新
BREAK

[@abandon]
IF

EQUALN$任务状态1
ACT

MOVN$任务状态0
MOVN$任务杀怪数0
SENDMSG6你放弃了任务
GOTO@main
BREAK
ELSEACT

SENDMSG6没有可放弃的任务
GOTO@main
BREAK

六、多任务并行怎么写
一个NPC有多个任务,不能只用一个N$任务状态。用数组或分段变量:
•N任务1状态、N任务1杀怪数

•N任务2状态、N任务2杀怪数

NPC里:

[@accept1]
IF

EQUALN$任务1状态0
ACT

MOVN$任务1状态1
SENDMSG6接取任务1
BREAK

[@accept2]
IF

EQUALN$任务2状态0
ACT

MOVN$任务2状态1
SENDMSG6接取任务2
BREAK

QFunction杀怪时:

[@KillMon]
IF

EQUALN$任务1状态1
CHECKMCNAME稻草人
ACT

INCN$任务1杀怪数1
BREAK
IF

EQUALN$任务2状态1
CHECKMCNAME多钩猫
ACT

INCN$任务2杀怪数1
BREAK

七、任务奖励多样化
除了金币经验,还能给装备、称号、属性点:

[@submit]
IF

EQUALN$任务状态1
LARGEN$任务杀怪数9
ACT

GIVE屠龙1
GIVE金币500000
CHANGEEXP+5000000
CHANGELEVEL+1
SENDMSG0[%s]完成了任务,获得屠龙!
MOVN$任务状态2
BREAK

条件奖励(比如要求等级):

[@submit]
IF

EQUALN$任务状态1
LARGEN$任务杀怪数9
CHECKLEVELEX35
ACT

GIVE天尊道袍1
BREAK
ELSEACT

SENDMSG6等级不足35级,无法领取最终奖励
BREAK

八、任务链(连环任务)
任务1完成才能接任务2:

[@accept2]
IF

EQUALN$任务1状态2
ACT

MOVN$任务2状态1
SENDMSG6你接取了任务2
BREAK
ELSEACT

SENDMSG6请先完成任务1
BREAK

[@submit2]
IF

EQUALN$任务2状态1
LARGEN$任务2杀怪数9
ACT

GIVE特殊戒指1
MOVN$任务2状态2
MOVN$任务1状态3
SENDMSG0[%s]完成了全部任务链!
BREAK

九、任务物品收集型
杀怪掉任务物品,收集够了交任务:

[@KillMon]
IF

EQUALN$任务状态1
CHECKMCNAME半兽人
ACT

IF

RANDOM3
ACT

GIVE半兽人令牌1
SENDMSG6获得任务物品:半兽人令牌
BREAK

提交时检查物品数量:

[@submit]
IF

CHECKITEM半兽人令牌5
ACT

TAKE半兽人令牌5
GIVE金币200000
MOVN$任务状态2
SENDMSG6任务完成!
BREAK
ELSEACT

SENDMSG6半兽人令牌不足5个
BREAK

十、限时任务
任务接取后必须在时间内完成:

[@accept]
ACT

MOVN$任务状态1
MOVS任务接取时间<DATETIME>
SENDMSG6你接取了限时任务,请在30分钟内完成

[@submit]
IF

EQUALN$任务状态1
LARGEN$任务杀怪数9
ACT

IF

LARGE<DATETIME>S任务接取时间
ACT

IF

LARGE<DATETIME><STR(S$任务接取时间)>1800
ACT

SENDMSG6任务超时,失败
MOVN$任务状态0
BREAK
ELSEACT

GIVE金币100000
MOVN$任务状态2
BREAK

时间比较在HERO里用<$DATETIME>转成秒数或天数,具体看引擎命令。没有直接比较时间戳的命令,就存“接取时的天数+时间”,到期时用定时器检测。

十一、任务状态保存
HERO里N$变量默认按玩家保存,但为了保险,重要任务用SaveVarHUMAN存盘:

[@accept]
ACT

MOVN$任务状态1
SaveVarHUMANN$任务状态..\QuestDiary\任务数据\任务状态.txt
BREAK

[@KillMon]
ACT

INCN$任务杀怪数1
SaveVarHUMANN$任务杀怪数..\QuestDiary\任务数据\任务杀怪数.txt
BREAK

这样即使玩家小退、掉线、重启服务器,任务进度也不丢。

十二、任务脚本调试
常见不生效原因:
•变量名被占用:N0/N1被其他脚本用,任务进度串了,用N$任务状态这种带前缀的

•杀怪触发没接住:QFunction-0.txt里没有[@KillMon],或者地图没开杀怪触发参数

•CHECKMCNAME写错怪名:怪名要和刷怪脚本里的一模一样,包括大小写

•#IF和#ACT混用:检测命令放#IF下面,执行命令放#ACT下面,不能混

•GOTO跳错标签:NPC文件里标签名要唯一,跳转的标签必须存在

•任务状态没重置:完成任务后状态是2,不改成0就不能再接,记得写重置逻辑

十三、完整任务脚本模板
NPC文件(Market_Def\任务NPC.txt):

[@main]
<任务发布人>\
\
<接取任务/@accept>\
<查看进度/@progress>\
<提交任务/@submit>\
<放弃任务/@abandon>\
<离开/@exit>\

[@accept]
IF

EQUALN$任务状态0
ACT

MOVN$任务状态1
MOVN$任务杀怪数0
SENDMSG6任务:杀死10只稻草人
SaveVarHUMANN$任务状态..\QuestDiary\任务数据\任务状态.txt
SaveVarHUMANN$任务杀怪数..\QuestDiary\任务数据\任务杀怪数.txt
GOTO@main
BREAK
ELSEACT

SENDMSG6你已经接取了任务或任务已完成
GOTO@main
BREAK

[@progress]
IF

EQUALN$任务状态1
ACT

SENDMSG6当前进度:<STR(N任务杀怪数)>/10
GOTO@main
BREAK
ELSEACT

SENDMSG6当前没有进行中的任务
GOTO@main
BREAK

[@submit]
IF

EQUALN$任务状态1
LARGEN$任务杀怪数9
ACT

GIVE金币100000
CHANGEEXP+1000000
MOVN$任务状态2
SaveVarHUMANN$任务状态..\QuestDiary\任务数据\任务状态.txt
SENDMSG6任务完成,获得奖励!
GOTO@main
BREAK
ELSEACT

SENDMSG6任务未完成或已结束
GOTO@main
BREAK

[@abandon]
IF

EQUALN$任务状态1
ACT

MOVN$任务状态0
MOVN$任务杀怪数0
SaveVarHUMANN$任务状态..\QuestDiary\任务数据\任务状态.txt
SaveVarHUMANN$任务杀怪数..\QuestDiary\任务数据\任务杀怪数.txt
SENDMSG6你放弃了任务
GOTO@main
BREAK
ELSEACT

SENDMSG6没有可放弃的任务
GOTO@main
BREAK

QFunction-0.txt:

[@KillMon]
IF

EQUALN$任务状态1
ACT

IF

CHECKMCNAME稻草人
ACT

INCN$任务杀怪数1
SaveVarHUMANN$任务杀怪数..\QuestDiary\任务数据\任务杀怪数.txt
SENDMSG6任务进度:<STR(N任务杀怪数)>/10
BREAK

十四、任务脚本进阶思路
•任务接取次数限制:用变量记录接取次数,超过限制不让接

•任务奖励选择:提交时弹出多个选项,玩家选一个

•任务追踪:在游戏界面显示当前任务目标,用引擎的UI变量或聊天框提示

•任务与地图关联:进入指定地图才触发任务进度,用CHECKMAPNAME判断

•任务与NPC对话关联:和某个NPC对话后才算完成,用对话触发标签

任务脚本的核心就是“状态机”:未接取→进行中→可提交→已完成→重置。只要状态变量不乱,进度变量不丢,任务系统就能稳定跑。所有花哨功能都是在这个状态机上叠加判断和动作。
[顶部]