一、QFunction-0到底是什么
QFunction-0.txt是引擎里的事件触发脚本,不是NPC对话脚本。NPC脚本要玩家点窗口按钮才跑,QF脚本是“玩家做了某个动作,引擎自动调用”。
常见能捕获的动作:
•登录、小退、大退
•走路、跑步
•升级、拿经验
•物理攻击、放魔法
•打死怪物、杀人、被杀死
•穿装备、脱装备
•双击使用物品(回城卷、金条、特殊道具)
•骑马、合击、外挂检测
文件位置:
D:\MirServer\Mir200\Envir\Market_Def\QFunction-0.txt
GOM/GEE默认认这个名字。HERO老端有些版本读的是:
D:\MirServer\Mir200\Envir\QFunction.txt
改之前先去Market_Def目录看一眼实际存在哪个文件,别自己新建一个名字不对的,引擎根本不读。
二、文件头部声明
QFunction-0.txt顶部要声明可用功能属性,不声明的话部分命令用不了。打开文件最上面写:
@@sendmsg
@@storage
@@PlayOffline
@@getback
@@buy
@@sell
@@repair
@@s_repair
@@offlinemsg
@@ShopStall
不同引擎支持的内置声明不一样,不用全抄,按你要用的功能加。新手先留空也行,等报“命令未定义”再补。
三、基础语法结构
[@Login]
#IF
CheckGameGold>0
#ACT
SendMsg5欢迎回来,当前元宝:<$GAMEGOLD>
#ELSEACT
SendMsg5你当前没有元宝,先去领新手礼包
规则:
•[@标签]必须顶格,前面不能有空格
•标签名区分大小写,@Login和@login不是同一个
•#IF#ACT#ELSEACT都要顶格
•#IF和#ACT之间不能空行
•注释用;英文分号
•文件编码必须ANSI,别用UTF-8
•一行一个命令,别把两条命令挤一行
四、常用触发标签(直接能抄)
1.登录触发
[@Login]
#ACT
SendMsg6欢迎进入单机测试区
Give强效金创药5
2.升级触发
[@Upgrade]
#IF
CheckLevelEx=7
#ACT
SendMsg6恭喜升到7级,赠送基本剑术
Give基本剑术1
CheckLevelEx是“刚好升到这个数”的判断,别写成CheckLevel。
3.攻击触发(做切割、吸血、暴击)
[@Attack]
#IF
Random5
#ACT
SendMsg6触发暴击切割!
Damage500
Random5是1/5概率触发,做刀刀切割把Random去掉就行。
4.打死怪物触发
[@OnKillMob]
#ACT
SendMsg5击杀怪物,获得额外经验
GiveExp100
部分引擎要求地图参数里加ONKILLMON才生效,具体看引擎说明。
5.杀人触发
[@KillPlay]
#ACT
MessageBox你击杀了其他玩家
SendMsg6PK值+1
6.死亡触发
[@PlayDie]
#ACT
SendMsg6你阵亡了,10秒后回城复活
7.获得经验触发
[@GetExp]
#ACT
SendMsg5本次获得经验:$GetExp
$GetExp是引擎内置变量,直接读本次经验值,可以用来做经验倍数、经验池。
8.穿装备触发(发光特效、属性加成)
[@WearEquip]
#IF
CheckItemWear传奇神剑0
#ACT
SetItemEffect023
SendMsg7穿戴传奇神剑,特效已开启
0是武器栏位,23是特效编号,对应补丁素材。
9.脱装备触发
[@TakeOff0]
#IF
NOTCheckItemWear传奇神剑0
#ACT
SetItemEffect00
SendMsg7脱下武器,特效取消
10.双击物品触发(回城卷、礼包、金条)
回城卷例子:
[@Item703]
#IF
#ACT
DelItem回城卷1
MapMove3333333
703是回城卷在物品库里的Idx,MapMove后面跟地图号+坐标。
五、物品触发的前提条件(最容易踩坑)
光写脚本不够,物品本身要“允许触发脚本”。
1.打开DBC2000,进StdItems.DB
2.找到回城卷那行,看StdMode字段
3.回城卷类设2(可使用),金条类设18(可兑换)
4.部分引擎还要在!Item.txt里把第6列功能位设1
不设这个,表现是:双击物品消失了,但人不传送、不加金币、不执行脚本。
六、变量使用
玩家变量(HUMAN)示例:
[@Login]
#ACT
MOVHUMANRWSR0
SAVEVARHUMANRWSR..\QuestDiary\数据文件\RWSRSave.txt
读取和累加:
[@完成日常]
#ACT
LOADVARHUMANRWSR..\QuestDiary\数据文件\RWSRSave.txt
CALCVARHUMANRWSR+1
SAVEVARHUMANRWSR..\QuestDiary\数据文件\RWSRSave.txt
SendMsg5今日已完成任务次数:<$HUMAN(RWSR)>
要点:
•变量要先MOV初始化再CALCVAR
•不SAVEVAR重启M2就丢
•路径里的文件夹要真实存在,..\QuestDiary\数据文件\目录没有就先建
•斜杠用反斜杠\,别用/
七、调用外部脚本段
QF里可以CALL别的脚本文件:
[@Login]
#ACT
#CALL[..\QuestDiary\登陆\登陆脚本.txt]@领取
注意:
•路径相对QuestDiary
•目标文件里必须有[@领取]段
•中文目录“登陆”和“登录”不是一回事,复制粘贴最容易错
•双反斜杠\\在某些引擎写法里要写\\\\,具体看引擎命令手册
八、改完怎么生效
两种方式:
1.热重载(部分引擎支持)
M2菜单→控制→重新加载脚本→重新加载QFunction
2.硬重启
直接重启M2Server.exe,最稳。
测试阶段建议每次改完都重启M2,热重载有时候不重新读变量初始化段。
九、不触发的排查顺序
1.看M2开关
M2→选项→功能设置→脚本设置→勾“启用QFunction脚本触发”
没勾,脚本全失效,物品照常消耗但不执行逻辑。
2.看文件有没有被主脚本加载
HERO端检查Main.txt里有没有:
INCLUDEQFunction-0.txt
没有就手动加一行,文件名大小写要对。
3.看文件名对不对
GOM/GEE用QFunction-0.txt
HERO有些用QFunction.txt
别自己起名QF.txt、QF0.txt,引擎不认。
4.看物品StdMode和功能位
回城卷StdMode=2,金条StdMode=18,功能列置1。
5.看编码
Notepad++打开→编码→转为ANSI→保存
UTF-8带BOM会让中文段乱码,引擎读到乱码直接跳过。
6.看脚本加密验证
M2→选项→安全设置→关掉“强制验证脚本加密”
没加密的脚本在加密模式下会被拒绝执行。
7.看M2日志
Mir200\Log目录下找当天日志,搜:
ScriptError
QFunction-0.txtLine
CommandSyntaxError
日志会告诉你第几行出错,比如:
ScriptError:Market_Def\QFunction-0.txtLine23:CommandSyntaxError
回去把第23行前后重打一遍,重点清掉隐藏空格、全角符号、制表符。
十、调试技巧
在怀疑没触发的标签里先塞一句:
[@Login]
#ACT
SendMsg0登录触发已执行
进游戏看聊天栏有没有这句话。
•有→脚本加载了,问题在条件判断
•没有→文件没加载,回头查开关、文件名、Include
条件分支调试:
[@OnKillMob]
#IF
CheckMonName祖玛卫士
#ACT
SendMsg5打到祖玛卫士
#ELSEACT
SendMsg5打到的不是祖玛卫士
用SendMsg把判断结果打出来,比瞎改快十倍。
十一、实战:做一个双击开新手礼包
1.物品库加一个“新手礼包”,Idx假设8888,StdMode设2
2.QF里写:
[@Item8888]
#IF
#ACT
DelItem新手礼包1
Give裁决之杖1
Give天魔神甲1
Give强效金创药50
Give元宝1000
SendMsg6已领取新手礼包!
3.进游戏把新手礼包放进背包,双击,背包少一个,装备和元宝进包。
十二、实战:做刀刀切割
[@Attack]
#ACT
Damage300
想加概率:
[@Attack]
#IF
Random3
#ACT
Damage300
SendMsg6切割触发!
Random3是三分之一概率,想更频繁改Random2或去掉判断。
十三、实战:升级自动学技能
[@Upgrade]
#IF
CheckLevelEx=19
#ACT
Give攻杀剑术1
SendMsg6自动领悟攻杀剑术
[@Upgrade]
#IF
CheckLevelEx=26
#ACT
Give半月弯刀1
SendMsg6自动领悟半月弯刀
注意:同一个[@Upgrade]标签可以出现多次,只要每段条件不冲突。
十四、实战:穿戴套装加属性
[@WearEquip]
#IF
CheckItemWear圣战头盔2
CheckItemWear圣战项链3
CheckItemWear圣战手镯4
CheckItemWear圣战戒指5
#ACT
SetStatus圣战威压1
SendMsg7圣战套装激活:攻击+50
脱下时记得在[@TakeOffX]里清状态,不然脱一件还留着加成。
十五、实战:合击触发(合击版专用)
[@ComboSkill1]
#IF
CheckHeroExist
CheckRage500
#ACT
CastComboSkill1
SendMsg6破魂斩释放!
#ELSEACT
SendMsg6怒气不足或英雄未出战
十六、常见命令速查
判断类:
•CheckLevelEx=等级
•CheckGameGold>数值
•CheckItem物品名数量
•CheckItemWear物品名栏位
•Random概率
•CheckMonName怪物名
执行类:
•SendMsg频道内容
•Give物品名数量
•DelItem物品名数量
•GiveExp经验值
•MapMove地图坐标X坐标Y
•Damage数值
•MOVHUMAN变量值
•CALCVARHUMAN变量+数值
•SAVEVARHUMAN变量路径
•LOADVARHUMAN变量路径
•SetItemEffect栏位特效号
十七、写脚本的坏习惯
•从网页直接复制粘贴,带隐藏零宽字符,表现为“看着对但报错”→Notepad++开“显示所有字符”清掉
•标签前后加空格,引擎当普通文本跳过
•用中文分号、中文括号、中文竖线
•一个#IF下面挂八层判断不写#ELSEACT,逻辑绕晕自己
•改完不备份,崩了回不去
•把QF当NPC脚本写#SAY对话,QF里#SAY基本没意义,用#ACT直接执行
十八、备份与分段管理
QF脚本越写越长,建议按功能分段,用注释隔开:
;=====登录相关=====
[@Login]
;=====战斗相关=====
[@Attack]
;=====物品触发=====
[@Item703]
[@Item8888]
;=====装备特效=====
[@WearEquip]
[@TakeOff0]
改之前把QFunction-0.txt另存一份QFunction-0.bak,改崩了拖回来。
十九、最小可跑模板
新建一个干净的QFunction-0.txt,先只放这段:
[@Login]
#ACT
SendMsg6触发成功
Give强效金创药3
重启M2,进游戏,能看到提示、背包多3瓶药,说明QF链路通了。然后再往里加攻击、物品、升级逻辑。
二十、几个高频疑问
1.写了@Login没反应
先查M2里“启用QFunction触发”勾没勾,再查文件是不是叫QFunction-0.txt。
2.双击物品消失但没效果
StdMode不对,或者!Item.txt功能位没开,或者标签名不是@Item+Idx。
3.攻击脚本不触发
确认标签是[@Attack],不是[@attack](部分引擎大小写敏感),也没被别的[@Attack]段覆盖。
4.变量报错“未定义”
登录段没做MOV初始化,第一次用变量前先给初值。
5.热重载后旧逻辑还在
变量初始化段没重跑,重启M2最稳。
6.脚本红字报行号
直接跳日志里那一行,清隐藏字符、查命令拼写、查物品名和数据库一致。
7.HERO端怎么弄
把文件放Envir\QFunction.txt,或者去M2高级设置里把“用户脚本文件名”指到QFunction-0.txt。
8.GOM/GEE怎么看全部触发标签
引擎脚本编辑器里搜“QF触发”或“特殊触发”,能列出当前引擎支持的所有事件名,不用死记。
QFunction-0的核心就一句话:玩家动作→引擎找对应标签→执行#ACT里的命令。先把登录触发跑通,再逐步加攻击、物品、装备、升级逻辑,每加一段重启一次M2验证。卡住优先查四件事:开关没开、文件名不对、物品没设触发位、编码不是ANSI,这四处占了九成问题。改任何段之前备一份bak,出事回滚比debug快。
QFunction-0.txt是引擎里的事件触发脚本,不是NPC对话脚本。NPC脚本要玩家点窗口按钮才跑,QF脚本是“玩家做了某个动作,引擎自动调用”。
常见能捕获的动作:
•登录、小退、大退
•走路、跑步
•升级、拿经验
•物理攻击、放魔法
•打死怪物、杀人、被杀死
•穿装备、脱装备
•双击使用物品(回城卷、金条、特殊道具)
•骑马、合击、外挂检测
文件位置:
D:\MirServer\Mir200\Envir\Market_Def\QFunction-0.txt
GOM/GEE默认认这个名字。HERO老端有些版本读的是:
D:\MirServer\Mir200\Envir\QFunction.txt
改之前先去Market_Def目录看一眼实际存在哪个文件,别自己新建一个名字不对的,引擎根本不读。
二、文件头部声明
QFunction-0.txt顶部要声明可用功能属性,不声明的话部分命令用不了。打开文件最上面写:
@@sendmsg
@@storage
@@PlayOffline
@@getback
@@buy
@@sell
@@repair
@@s_repair
@@offlinemsg
@@ShopStall
不同引擎支持的内置声明不一样,不用全抄,按你要用的功能加。新手先留空也行,等报“命令未定义”再补。
三、基础语法结构
[@Login]
#IF
CheckGameGold>0
#ACT
SendMsg5欢迎回来,当前元宝:<$GAMEGOLD>
#ELSEACT
SendMsg5你当前没有元宝,先去领新手礼包
规则:
•[@标签]必须顶格,前面不能有空格
•标签名区分大小写,@Login和@login不是同一个
•#IF#ACT#ELSEACT都要顶格
•#IF和#ACT之间不能空行
•注释用;英文分号
•文件编码必须ANSI,别用UTF-8
•一行一个命令,别把两条命令挤一行
四、常用触发标签(直接能抄)
1.登录触发
[@Login]
#ACT
SendMsg6欢迎进入单机测试区
Give强效金创药5
2.升级触发
[@Upgrade]
#IF
CheckLevelEx=7
#ACT
SendMsg6恭喜升到7级,赠送基本剑术
Give基本剑术1
CheckLevelEx是“刚好升到这个数”的判断,别写成CheckLevel。
3.攻击触发(做切割、吸血、暴击)
[@Attack]
#IF
Random5
#ACT
SendMsg6触发暴击切割!
Damage500
Random5是1/5概率触发,做刀刀切割把Random去掉就行。
4.打死怪物触发
[@OnKillMob]
#ACT
SendMsg5击杀怪物,获得额外经验
GiveExp100
部分引擎要求地图参数里加ONKILLMON才生效,具体看引擎说明。
5.杀人触发
[@KillPlay]
#ACT
MessageBox你击杀了其他玩家
SendMsg6PK值+1
6.死亡触发
[@PlayDie]
#ACT
SendMsg6你阵亡了,10秒后回城复活
7.获得经验触发
[@GetExp]
#ACT
SendMsg5本次获得经验:$GetExp
$GetExp是引擎内置变量,直接读本次经验值,可以用来做经验倍数、经验池。
8.穿装备触发(发光特效、属性加成)
[@WearEquip]
#IF
CheckItemWear传奇神剑0
#ACT
SetItemEffect023
SendMsg7穿戴传奇神剑,特效已开启
0是武器栏位,23是特效编号,对应补丁素材。
9.脱装备触发
[@TakeOff0]
#IF
NOTCheckItemWear传奇神剑0
#ACT
SetItemEffect00
SendMsg7脱下武器,特效取消
10.双击物品触发(回城卷、礼包、金条)
回城卷例子:
[@Item703]
#IF
#ACT
DelItem回城卷1
MapMove3333333
703是回城卷在物品库里的Idx,MapMove后面跟地图号+坐标。
五、物品触发的前提条件(最容易踩坑)
光写脚本不够,物品本身要“允许触发脚本”。
1.打开DBC2000,进StdItems.DB
2.找到回城卷那行,看StdMode字段
3.回城卷类设2(可使用),金条类设18(可兑换)
4.部分引擎还要在!Item.txt里把第6列功能位设1
不设这个,表现是:双击物品消失了,但人不传送、不加金币、不执行脚本。
六、变量使用
玩家变量(HUMAN)示例:
[@Login]
#ACT
MOVHUMANRWSR0
SAVEVARHUMANRWSR..\QuestDiary\数据文件\RWSRSave.txt
读取和累加:
[@完成日常]
#ACT
LOADVARHUMANRWSR..\QuestDiary\数据文件\RWSRSave.txt
CALCVARHUMANRWSR+1
SAVEVARHUMANRWSR..\QuestDiary\数据文件\RWSRSave.txt
SendMsg5今日已完成任务次数:<$HUMAN(RWSR)>
要点:
•变量要先MOV初始化再CALCVAR
•不SAVEVAR重启M2就丢
•路径里的文件夹要真实存在,..\QuestDiary\数据文件\目录没有就先建
•斜杠用反斜杠\,别用/
七、调用外部脚本段
QF里可以CALL别的脚本文件:
[@Login]
#ACT
#CALL[..\QuestDiary\登陆\登陆脚本.txt]@领取
注意:
•路径相对QuestDiary
•目标文件里必须有[@领取]段
•中文目录“登陆”和“登录”不是一回事,复制粘贴最容易错
•双反斜杠\\在某些引擎写法里要写\\\\,具体看引擎命令手册
八、改完怎么生效
两种方式:
1.热重载(部分引擎支持)
M2菜单→控制→重新加载脚本→重新加载QFunction
2.硬重启
直接重启M2Server.exe,最稳。
测试阶段建议每次改完都重启M2,热重载有时候不重新读变量初始化段。
九、不触发的排查顺序
1.看M2开关
M2→选项→功能设置→脚本设置→勾“启用QFunction脚本触发”
没勾,脚本全失效,物品照常消耗但不执行逻辑。
2.看文件有没有被主脚本加载
HERO端检查Main.txt里有没有:
INCLUDEQFunction-0.txt
没有就手动加一行,文件名大小写要对。
3.看文件名对不对
GOM/GEE用QFunction-0.txt
HERO有些用QFunction.txt
别自己起名QF.txt、QF0.txt,引擎不认。
4.看物品StdMode和功能位
回城卷StdMode=2,金条StdMode=18,功能列置1。
5.看编码
Notepad++打开→编码→转为ANSI→保存
UTF-8带BOM会让中文段乱码,引擎读到乱码直接跳过。
6.看脚本加密验证
M2→选项→安全设置→关掉“强制验证脚本加密”
没加密的脚本在加密模式下会被拒绝执行。
7.看M2日志
Mir200\Log目录下找当天日志,搜:
ScriptError
QFunction-0.txtLine
CommandSyntaxError
日志会告诉你第几行出错,比如:
ScriptError:Market_Def\QFunction-0.txtLine23:CommandSyntaxError
回去把第23行前后重打一遍,重点清掉隐藏空格、全角符号、制表符。
十、调试技巧
在怀疑没触发的标签里先塞一句:
[@Login]
#ACT
SendMsg0登录触发已执行
进游戏看聊天栏有没有这句话。
•有→脚本加载了,问题在条件判断
•没有→文件没加载,回头查开关、文件名、Include
条件分支调试:
[@OnKillMob]
#IF
CheckMonName祖玛卫士
#ACT
SendMsg5打到祖玛卫士
#ELSEACT
SendMsg5打到的不是祖玛卫士
用SendMsg把判断结果打出来,比瞎改快十倍。
十一、实战:做一个双击开新手礼包
1.物品库加一个“新手礼包”,Idx假设8888,StdMode设2
2.QF里写:
[@Item8888]
#IF
#ACT
DelItem新手礼包1
Give裁决之杖1
Give天魔神甲1
Give强效金创药50
Give元宝1000
SendMsg6已领取新手礼包!
3.进游戏把新手礼包放进背包,双击,背包少一个,装备和元宝进包。
十二、实战:做刀刀切割
[@Attack]
#ACT
Damage300
想加概率:
[@Attack]
#IF
Random3
#ACT
Damage300
SendMsg6切割触发!
Random3是三分之一概率,想更频繁改Random2或去掉判断。
十三、实战:升级自动学技能
[@Upgrade]
#IF
CheckLevelEx=19
#ACT
Give攻杀剑术1
SendMsg6自动领悟攻杀剑术
[@Upgrade]
#IF
CheckLevelEx=26
#ACT
Give半月弯刀1
SendMsg6自动领悟半月弯刀
注意:同一个[@Upgrade]标签可以出现多次,只要每段条件不冲突。
十四、实战:穿戴套装加属性
[@WearEquip]
#IF
CheckItemWear圣战头盔2
CheckItemWear圣战项链3
CheckItemWear圣战手镯4
CheckItemWear圣战戒指5
#ACT
SetStatus圣战威压1
SendMsg7圣战套装激活:攻击+50
脱下时记得在[@TakeOffX]里清状态,不然脱一件还留着加成。
十五、实战:合击触发(合击版专用)
[@ComboSkill1]
#IF
CheckHeroExist
CheckRage500
#ACT
CastComboSkill1
SendMsg6破魂斩释放!
#ELSEACT
SendMsg6怒气不足或英雄未出战
十六、常见命令速查
判断类:
•CheckLevelEx=等级
•CheckGameGold>数值
•CheckItem物品名数量
•CheckItemWear物品名栏位
•Random概率
•CheckMonName怪物名
执行类:
•SendMsg频道内容
•Give物品名数量
•DelItem物品名数量
•GiveExp经验值
•MapMove地图坐标X坐标Y
•Damage数值
•MOVHUMAN变量值
•CALCVARHUMAN变量+数值
•SAVEVARHUMAN变量路径
•LOADVARHUMAN变量路径
•SetItemEffect栏位特效号
十七、写脚本的坏习惯
•从网页直接复制粘贴,带隐藏零宽字符,表现为“看着对但报错”→Notepad++开“显示所有字符”清掉
•标签前后加空格,引擎当普通文本跳过
•用中文分号、中文括号、中文竖线
•一个#IF下面挂八层判断不写#ELSEACT,逻辑绕晕自己
•改完不备份,崩了回不去
•把QF当NPC脚本写#SAY对话,QF里#SAY基本没意义,用#ACT直接执行
十八、备份与分段管理
QF脚本越写越长,建议按功能分段,用注释隔开:
;=====登录相关=====
[@Login]
;=====战斗相关=====
[@Attack]
;=====物品触发=====
[@Item703]
[@Item8888]
;=====装备特效=====
[@WearEquip]
[@TakeOff0]
改之前把QFunction-0.txt另存一份QFunction-0.bak,改崩了拖回来。
十九、最小可跑模板
新建一个干净的QFunction-0.txt,先只放这段:
[@Login]
#ACT
SendMsg6触发成功
Give强效金创药3
重启M2,进游戏,能看到提示、背包多3瓶药,说明QF链路通了。然后再往里加攻击、物品、升级逻辑。
二十、几个高频疑问
1.写了@Login没反应
先查M2里“启用QFunction触发”勾没勾,再查文件是不是叫QFunction-0.txt。
2.双击物品消失但没效果
StdMode不对,或者!Item.txt功能位没开,或者标签名不是@Item+Idx。
3.攻击脚本不触发
确认标签是[@Attack],不是[@attack](部分引擎大小写敏感),也没被别的[@Attack]段覆盖。
4.变量报错“未定义”
登录段没做MOV初始化,第一次用变量前先给初值。
5.热重载后旧逻辑还在
变量初始化段没重跑,重启M2最稳。
6.脚本红字报行号
直接跳日志里那一行,清隐藏字符、查命令拼写、查物品名和数据库一致。
7.HERO端怎么弄
把文件放Envir\QFunction.txt,或者去M2高级设置里把“用户脚本文件名”指到QFunction-0.txt。
8.GOM/GEE怎么看全部触发标签
引擎脚本编辑器里搜“QF触发”或“特殊触发”,能列出当前引擎支持的所有事件名,不用死记。
QFunction-0的核心就一句话:玩家动作→引擎找对应标签→执行#ACT里的命令。先把登录触发跑通,再逐步加攻击、物品、装备、升级逻辑,每加一段重启一次M2验证。卡住优先查四件事:开关没开、文件名不对、物品没设触发位、编码不是ANSI,这四处占了九成问题。改任何段之前备一份bak,出事回滚比debug快。

