传奇996三端引擎任务模块实战:cfg_newtask与QuestDiary挂脚本全流程拆解

来源: 作者: 点击:
996传奇三端引擎(996m2 / GOM系三端)的任务模块分两层:一层是左上角任务列表展示层,由 cfg_newtask.xls + 引擎内置接口控制;另一层是业务逻辑层,靠 QF(QFunction-0.txt)、QuestDiary、LUA 后端共同实现接取、进度、提交、奖励、重置。只改列表不写业务,任务栏能显示但点下去没反应;只写业务不接 cfg_newtask.xls,左上角不亮任务条。两套必须打通。

一、任务系统核心文件与路径
• Mir200\Envir\cfg_newtask.xls:任务列表配置表(ID、标题、接取前/进行中/完成展示、特效、排序)

• Mir200\Envir\QFunction-0.txt(QF):挂 picktask / changetask / clicknewtask / completetask / deletetask 等钩子

- Mir200\Envir\QuestDiary\任务系统\*.txt:具体业务脚本(接取、杀怪计数、提交、奖励)
• Mir200\Envir\LuaScripts\*.lua 或引擎 LUAScripts 目录:复杂逻辑用 callscript(actor, "文件路径", "@标签") 调 TXT 段

- Mir200\Envir\MonItems.txt:绑定怪物击杀触发 @段 做进度自增

二、cfg_newtask.xls 表结构写法
列顺序:任务ID / TaskTitle / Pickinfo(接取前展示) / Haveinfo(进行中,支持 %s 占位) / Completeinfo(完成展示) / EffectId(特效,格式 0#5056 | 1#5055,5056问号、5055感叹号) / order(排序,越小越靠上)
示例行:

1 | <font color='#22ff22'>新手试炼 %1</font> | 找新手村向导接取任务 | <font color='#ff2222'>击杀稻草人【%s】/10 采集矿石【%s】/5</font> | <font color='#2222ff'>新手试炼完成</font> | 0#5056 | 1

%s 对应 NEWCHANGETASK 任务ID 状态1 状态2 ... 里的状态标识,按顺序填充,最多支持多个 %s。

三、QF 钩子挂载(标准写法)
-- QFunction-0.txt 内 Lua 段或 TXT 段注册
function picktask(actor)
callscript(actor, "../QuestDiary/任务系统/触发_接受", "@接受任务处理")
end

function changetask(actor)
Renwu_Refresh(actor) -- 自定义刷新函数或直达脚本段
end

function clicknewtask(actor)
callscript(actor, "../QuestDiary/任务系统/点击处理", "@点击任务继续")
end

function completetask(actor)
callscript(actor, "../QuestDiary/任务系统/完成处理", "@完成任务处理")
end

function deletetask(actor)
callscript(actor, "../QuestDiary/任务系统/删除处理", "@删除任务处理")
end

引擎在玩家点任务栏、接任务、刷新进度时回调这些函数;不挂钩子,左上角任务条点了没反应。

四、NPC 接取+业务脚本(QuestDiary 实战)
文件:Envir\QuestDiary\任务系统\新手试炼.txt
[@Main]
新手试炼向导\ \
<接受新手试炼/@AcceptTask> <取消/@Exit>\

[@AcceptTask]
#IF
EQUAL U200 1
#ACT
SENDMSG 6 你已接过新手试炼,别重复接!
CLOSE
#IF
CHECKVAR HUMAN 新手试炼 1
#ACT
SENDMSG 6 任务进行中,去杀10只稻草人、采5块铜矿!
CLOSE
#ELSE
#ACT
SET [HUMAN 新手试炼] 1
MOV U200 1
MOV S$任务奖励 新手试炼
NEWPICKTASK 1
NEWCHANGETASK 1 0 0
SENDMSG 6 已接取【新手试炼】:击杀稻草人10/10,采集铜矿5/5
ADDBUTTON 110 1 Navigation 110
CLOSE

[@KillScarecrow] ; MonItems.txt 绑稻草人 KillScript=@KillScarecrow
#IF
CHECKVAR HUMAN 新手试炼 1
#ACT
INC N$稻草人计数 1
#IF
LARGE N$稻草人计数 10
#ACT
MOV N$稻草人计数 10
NEWCHANGETASK 1 <$STR(N$稻草人计数)> <$STR(N$矿石计数)>
SENDMSG 7 稻草人进度已满,去采铜矿!
#ELSE
#ACT
NEWCHANGETASK 1 <$STR(N$稻草人计数)> <$STR(N$矿石计数)>
SENDMSG 7 稻草人进度:<$STR(N$稻草人计数)>/10
CLOSE

[@PickOre] ; 采矿触发或地图事件触发
#IF
CHECKVAR HUMAN 新手试炼 1
CHECKITEM 铜矿 1
#ACT
TAKE 铜矿 1
INC N$矿石计数 1
#IF
LARGE N$矿石计数 5
#ACT
MOV N$矿石计数 5
NEWCHANGETASK 1 <$STR(N$稻草人计数)> <$STR(N$矿石计数)>
SENDMSG 7 矿石已够,回向导交任务!
#ELSE
#ACT
NEWCHANGETASK 1 <$STR(N$稻草人计数)> <$STR(N$矿石计数)>
SENDMSG 7 铜矿进度:<$STR(N$矿石计数)>/5
CLOSE

[@SubmitTask]
#IF
CHECKVAR HUMAN 新手试炼 1
LARGE N$稻草人计数 9
LARGE N$矿石计数 4
#ACT
SET [HUMAN 新手试炼] 2
NEWCOMPLETETASK 1
GIVE 金币 5000
GIVE 初级经验丹 1
ADDEXP 5000
SENDMSG 6 新手试炼完成!奖励:5000金币、初级经验丹x1、5000经验
MOV N$稻草人计数 0
MOV N$矿石计数 0
CLOSE
#ELSE
#ACT
SENDMSG 6 进度未满,稻草人10 铜矿5 才能提交!
CLOSE

变量说明:U200 为个人标识(接取状态),HUMAN 新手试炼 持久化任务状态,N$稻草人计数 / N$矿石计数 记录进度,NEWPICKTASK / NEWCHANGETASK / NEWCOMPLETETASK 驱动左上角列表。

五、MonItems.txt 绑杀怪触发

稻草人 1 2 @KillScarecrow

玩家每杀一只稻草人,引擎回调 QuestDiary 里 @KillScarecrow,自增进度并刷列表。改完 M2 执行 @reloadnpc all 或重载脚本。

六、LUA 后端复杂任务示例(每日任务重置)
-- LuaScripts/daily_task.lua
function daily_reset(actor)
local day = os.date("%Y-%m-%d")
if GetVar(actor, "HUMAN 每日任务日期") ~= day then
SetVar(actor, "HUMAN 每日任务日期", day)
SetVar(actor, "HUMAN 每日击杀", 0)
SetVar(actor, "HUMAN 每日采集", 0)
NEWDELETETASK(actor, 100)
callscript(actor, "../QuestDiary/任务系统/每日任务", "@InitDaily")
end
end

登录触发(QFunction-0.txt 的 [@Login] 或 OnLogin Lua 钩子)调用 daily_reset(actor),实现跨天重置。

七、常用引擎任务命令速查
- NEWPICKTASK 任务ID:接取并写入左上角列表
• NEWCHANGETASK 任务ID 状态1 状态2 ...:刷新进行中进度,填 %s

• NEWCOMPLETETASK 任务ID:标记完成、列表变完成态

- NEWDELETETASK 任务ID:移除任务条
• TASKTOPSHOW 任务ID:置顶指定任务

• OPENHYPERLINK 面板ID 1:打开任务专用面板

- KILLMOBAPPOINT 地图 X Y 范围 怪物名|怪物名:任务指定打怪
• STOPAUTOATTACK:停止自动攻击

• SETNPCEFFECT NPCID 特效ID X Y / DELNPCEFFECT NPCID:NPC 头顶问号/感叹号

• ADDBUTTON 110 1 Navigation 110:任务导航按钮

八、调试与排错硬点
• cfg_newtask.xls 改完必须重启 M2 或重载任务表,热更不生效

• %s 数量必须与 NEWCHANGETASK 状态标识数量一致,少填显示空白、多填截断

- callscript 路径相对 Envir\QuestDiary,不写 .txt 后缀,标签必须存在否则报错
• 996 引擎 TXT 脚本不支持嵌套 #IF,复杂分支写 LUA 返回结果再用 #ACT CALL 调

- 变量冲突:任务状态统一用 HUMAN 前缀 + 明确命名,别和活跃度、签到系统共用 N$1 S$1
• 三端(PC/安卓/iOS)表现一致,但客户端补丁缺 Navigation 110 按钮资源时 PC 正常、手机端不显示导航箭头,需补 Data/UI 资源

任务模块本质就是 cfg_newtask.xls 管显示 + QF 钩子管事件 + QuestDiary/LUA 管逻辑 + MonItems 管进度 四条线并起来,任意一条断链任务条就会变死条。