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

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

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

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

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

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

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

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

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

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

[@AcceptTask]
#IF
EQUALU2001
#ACT
SENDMSG6你已接过新手试炼,别重复接!
CLOSE
#IF
CHECKVARHUMAN新手试炼1
#ACT
SENDMSG6任务进行中,去杀10只稻草人、采5块铜矿!
CLOSE
#ELSE
#ACT
SET[HUMAN新手试炼]1
MOVU2001
MOVS$任务奖励新手试炼
NEWPICKTASK1
NEWCHANGETASK100
SENDMSG6已接取【新手试炼】:击杀稻草人10/10,采集铜矿5/5
ADDBUTTON1101Navigation110
CLOSE

[@KillScarecrow];MonItems.txt绑稻草人KillScript=@KillScarecrow
#IF
CHECKVARHUMAN新手试炼1
#ACT
INCN$稻草人计数1
#IF
LARGEN$稻草人计数10
#ACT
MOVN$稻草人计数10
NEWCHANGETASK1<$STR(N$稻草人计数)><$STR(N$矿石计数)>
SENDMSG7稻草人进度已满,去采铜矿!
#ELSE
#ACT
NEWCHANGETASK1<$STR(N$稻草人计数)><$STR(N$矿石计数)>
SENDMSG7稻草人进度:<$STR(N$稻草人计数)>/10
CLOSE

[@PickOre];采矿触发或地图事件触发
#IF
CHECKVARHUMAN新手试炼1
CHECKITEM铜矿1
#ACT
TAKE铜矿1
INCN$矿石计数1
#IF
LARGEN$矿石计数5
#ACT
MOVN$矿石计数5
NEWCHANGETASK1<$STR(N$稻草人计数)><$STR(N$矿石计数)>
SENDMSG7矿石已够,回向导交任务!
#ELSE
#ACT
NEWCHANGETASK1<$STR(N$稻草人计数)><$STR(N$矿石计数)>
SENDMSG7铜矿进度:<$STR(N$矿石计数)>/5
CLOSE

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

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

五、MonItems.txt绑杀怪触发

稻草人12@KillScarecrow

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

六、LUA后端复杂任务示例(每日任务重置)
--LuaScripts/daily_task.lua
functiondaily_reset(actor)
localday=os.date("%Y-%m-%d")
ifGetVar(actor"HUMAN每日任务日期")~=daythen
SetVar(actor"HUMAN每日任务日期"day)
SetVar(actor"HUMAN每日击杀"0)
SetVar(actor"HUMAN每日采集"0)
NEWDELETETASK(actor100)
callscript(actor"../QuestDiary/任务系统/每日任务""@InitDaily")
end
end

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

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

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

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

•OPENHYPERLINK面板ID1:打开任务专用面板

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

•SETNPCEFFECTNPCID特效IDXY/DELNPCEFFECTNPCID:NPC头顶问号/感叹号

•ADDBUTTON1101Navigation110:任务导航按钮

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

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

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

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

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