传奇任务脚本不是一套固定模板,而是由“接取标签、进度变量、完成检测、奖励发放、重置机制”五块拼出来的。不同引擎命令有差异,但结构通用。下面按 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
EQUAL N$任务状态 0
ACT
MOV N$任务状态 1
MOV N$任务杀怪数 0
SENDMSG 6 你接取了任务:杀死10只稻草人
GOTO @main
BREAK
ELSEACT
SENDMSG 6 你已经接取了任务或任务已完成
GOTO @main
BREAK
[@progress]
IF
EQUAL N$任务状态 1
ACT
SENDMSG 6 当前进度:<STR(N任务杀怪数)>/10
GOTO @main
BREAK
ELSEACT
SENDMSG 6 当前没有进行中的任务
GOTO @main
BREAK
[@submit]
IF
EQUAL N$任务状态 1
LARGE N$任务杀怪数 9
ACT
GIVE 金币 100000
CHANGEEXP + 1000000
MOV N$任务状态 2
SENDMSG 6 任务完成,获得奖励!
GOTO @main
BREAK
ELSEACT
SENDMSG 6 任务未完成或已结束
GOTO @main
BREAK
三、杀怪计数怎么接进任务
任务要杀怪,得在 QFunction-0.txt 里加 [@KillMon] 触发,判断当前任务状态,再给对应变量加 1。
QFunction-0.txt:
[@KillMon]
IF
EQUAL N$任务状态 1
ACT
IF
CHECKMCNAME 稻草人
ACT
INC N$任务杀怪数 1
SENDMSG 6 任务进度:<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
EQUAL N$任务状态 2
ACT
IF
EQUAL S任务完成日期 <DATE>
ACT
MOV N$任务状态 0
MOV S任务完成日期 <DATE>
SENDMSG 6 每日任务已刷新
BREAK
[@abandon]
IF
EQUAL N$任务状态 1
ACT
MOV N$任务状态 0
MOV N$任务杀怪数 0
SENDMSG 6 你放弃了任务
GOTO @main
BREAK
ELSEACT
SENDMSG 6 没有可放弃的任务
GOTO @main
BREAK
六、多任务并行怎么写
一个 NPC 有多个任务,不能只用一个 N$任务状态。用数组或分段变量:
• N任务1状态、N任务1杀怪数
• N任务2状态、N任务2杀怪数
NPC 里:
[@accept1]
IF
EQUAL N$任务1状态 0
ACT
MOV N$任务1状态 1
SENDMSG 6 接取任务1
BREAK
[@accept2]
IF
EQUAL N$任务2状态 0
ACT
MOV N$任务2状态 1
SENDMSG 6 接取任务2
BREAK
QFunction 杀怪时:
[@KillMon]
IF
EQUAL N$任务1状态 1
CHECKMCNAME 稻草人
ACT
INC N$任务1杀怪数 1
BREAK
IF
EQUAL N$任务2状态 1
CHECKMCNAME 多钩猫
ACT
INC N$任务2杀怪数 1
BREAK
七、任务奖励多样化
除了金币经验,还能给装备、称号、属性点:
[@submit]
IF
EQUAL N$任务状态 1
LARGE N$任务杀怪数 9
ACT
GIVE 屠龙 1
GIVE 金币 500000
CHANGEEXP + 5000000
CHANGELEVEL + 1
SENDMSG 0 [%s]完成了任务,获得屠龙!
MOV N$任务状态 2
BREAK
条件奖励(比如要求等级):
[@submit]
IF
EQUAL N$任务状态 1
LARGE N$任务杀怪数 9
CHECKLEVELEX 35
ACT
GIVE 天尊道袍 1
BREAK
ELSEACT
SENDMSG 6 等级不足35级,无法领取最终奖励
BREAK
八、任务链(连环任务)
任务1完成才能接任务2:
[@accept2]
IF
EQUAL N$任务1状态 2
ACT
MOV N$任务2状态 1
SENDMSG 6 你接取了任务2
BREAK
ELSEACT
SENDMSG 6 请先完成任务1
BREAK
[@submit2]
IF
EQUAL N$任务2状态 1
LARGE N$任务2杀怪数 9
ACT
GIVE 特殊戒指 1
MOV N$任务2状态 2
MOV N$任务1状态 3
SENDMSG 0 [%s]完成了全部任务链!
BREAK
九、任务物品收集型
杀怪掉任务物品,收集够了交任务:
[@KillMon]
IF
EQUAL N$任务状态 1
CHECKMCNAME 半兽人
ACT
IF
RANDOM 3
ACT
GIVE 半兽人令牌 1
SENDMSG 6 获得任务物品:半兽人令牌
BREAK
提交时检查物品数量:
[@submit]
IF
CHECKITEM 半兽人令牌 5
ACT
TAKE 半兽人令牌 5
GIVE 金币 200000
MOV N$任务状态 2
SENDMSG 6 任务完成!
BREAK
ELSEACT
SENDMSG 6 半兽人令牌不足5个
BREAK
十、限时任务
任务接取后必须在时间内完成:
[@accept]
ACT
MOV N$任务状态 1
MOV S任务接取时间 <DATETIME>
SENDMSG 6 你接取了限时任务,请在30分钟内完成
[@submit]
IF
EQUAL N$任务状态 1
LARGE N$任务杀怪数 9
ACT
IF
LARGE <DATETIME> S任务接取时间
ACT
IF
LARGE <DATETIME> <STR(S$任务接取时间)> 1800
ACT
SENDMSG 6 任务超时,失败
MOV N$任务状态 0
BREAK
ELSEACT
GIVE 金币 100000
MOV N$任务状态 2
BREAK
时间比较在 HERO 里用 <$DATETIME> 转成秒数或天数,具体看引擎命令。没有直接比较时间戳的命令,就存“接取时的天数+时间”,到期时用定时器检测。
十一、任务状态保存
HERO 里 N$ 变量默认按玩家保存,但为了保险,重要任务用 SaveVarHUMAN 存盘:
[@accept]
ACT
MOV N$任务状态 1
SaveVarHUMAN N$任务状态 ..\QuestDiary\任务数据\任务状态.txt
BREAK
[@KillMon]
ACT
INC N$任务杀怪数 1
SaveVarHUMAN N$任务杀怪数 ..\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
EQUAL N$任务状态 0
ACT
MOV N$任务状态 1
MOV N$任务杀怪数 0
SENDMSG 6 任务:杀死10只稻草人
SaveVarHUMAN N$任务状态 ..\QuestDiary\任务数据\任务状态.txt
SaveVarHUMAN N$任务杀怪数 ..\QuestDiary\任务数据\任务杀怪数.txt
GOTO @main
BREAK
ELSEACT
SENDMSG 6 你已经接取了任务或任务已完成
GOTO @main
BREAK
[@progress]
IF
EQUAL N$任务状态 1
ACT
SENDMSG 6 当前进度:<STR(N任务杀怪数)>/10
GOTO @main
BREAK
ELSEACT
SENDMSG 6 当前没有进行中的任务
GOTO @main
BREAK
[@submit]
IF
EQUAL N$任务状态 1
LARGE N$任务杀怪数 9
ACT
GIVE 金币 100000
CHANGEEXP + 1000000
MOV N$任务状态 2
SaveVarHUMAN N$任务状态 ..\QuestDiary\任务数据\任务状态.txt
SENDMSG 6 任务完成,获得奖励!
GOTO @main
BREAK
ELSEACT
SENDMSG 6 任务未完成或已结束
GOTO @main
BREAK
[@abandon]
IF
EQUAL N$任务状态 1
ACT
MOV N$任务状态 0
MOV N$任务杀怪数 0
SaveVarHUMAN N$任务状态 ..\QuestDiary\任务数据\任务状态.txt
SaveVarHUMAN N$任务杀怪数 ..\QuestDiary\任务数据\任务杀怪数.txt
SENDMSG 6 你放弃了任务
GOTO @main
BREAK
ELSEACT
SENDMSG 6 没有可放弃的任务
GOTO @main
BREAK
QFunction-0.txt:
[@KillMon]
IF
EQUAL N$任务状态 1
ACT
IF
CHECKMCNAME 稻草人
ACT
INC N$任务杀怪数 1
SaveVarHUMAN N$任务杀怪数 ..\QuestDiary\任务数据\任务杀怪数.txt
SENDMSG 6 任务进度:<STR(N任务杀怪数)>/10
BREAK
十四、任务脚本进阶思路
• 任务接取次数限制:用变量记录接取次数,超过限制不让接
• 任务奖励选择:提交时弹出多个选项,玩家选一个
• 任务追踪:在游戏界面显示当前任务目标,用引擎的 UI 变量或聊天框提示
• 任务与地图关联:进入指定地图才触发任务进度,用 CHECKMAPNAME 判断
• 任务与 NPC 对话关联:和某个 NPC 对话后才算完成,用对话触发标签
任务脚本的核心就是“状态机”:未接取 → 进行中 → 可提交 → 已完成 → 重置。只要状态变量不乱,进度变量不丢,任务系统就能稳定跑。所有花哨功能都是在这个状态机上叠加判断和动作。
传奇任务脚本写法:从接任务到奖励全流程
来源:
作者:
点击:

