传奇任务脚本不是一套固定模板,而是由“接取标签、进度变量、完成检测、奖励发放、重置机制”五块拼出来的。不同引擎命令有差异,但结构通用。下面按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对话后才算完成,用对话触发标签
任务脚本的核心就是“状态机”:未接取→进行中→可提交→已完成→重置。只要状态变量不乱,进度变量不丢,任务系统就能稳定跑。所有花哨功能都是在这个状态机上叠加判断和动作。
一、任务脚本的存放位置
任务脚本通常放在:
•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对话后才算完成,用对话触发标签
任务脚本的核心就是“状态机”:未接取→进行中→可提交→已完成→重置。只要状态变量不乱,进度变量不丢,任务系统就能稳定跑。所有花哨功能都是在这个状态机上叠加判断和动作。

