一、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
SendMsg 5 欢迎回来,当前元宝:<$GAMEGOLD>
#ELSEACT
SendMsg 5 你当前没有元宝,先去领新手礼包
规则:
• [@标签] 必须顶格,前面不能有空格
• 标签名区分大小写,@Login 和 @login 不是同一个
• #IF #ACT #ELSEACT 都要顶格
• #IF 和 #ACT 之间不能空行
• 注释用 ; 英文分号
• 文件编码必须 ANSI,别用 UTF-8
• 一行一个命令,别把两条命令挤一行
四、常用触发标签(直接能抄)
1. 登录触发
[@Login]
#ACT
SendMsg 6 欢迎进入单机测试区
Give 强效金创药 5
2. 升级触发
[@Upgrade]
#IF
CheckLevelEx = 7
#ACT
SendMsg 6 恭喜升到7级,赠送基本剑术
Give 基本剑术 1
CheckLevelEx 是“刚好升到这个数”的判断,别写成 CheckLevel。
3. 攻击触发(做切割、吸血、暴击)
[@Attack]
#IF
Random 5
#ACT
SendMsg 6 触发暴击切割!
Damage 500
Random 5 是 1/5 概率触发,做刀刀切割把 Random 去掉就行。
4. 打死怪物触发
[@OnKillMob]
#ACT
SendMsg 5 击杀怪物,获得额外经验
GiveExp 100
部分引擎要求地图参数里加 ONKILLMON 才生效,具体看引擎说明。
5. 杀人触发
[@KillPlay]
#ACT
MessageBox 你击杀了其他玩家
SendMsg 6 PK值+1
6. 死亡触发
[@PlayDie]
#ACT
SendMsg 6 你阵亡了,10秒后回城复活
7. 获得经验触发
[@GetExp]
#ACT
SendMsg 5 本次获得经验:$GetExp
$GetExp 是引擎内置变量,直接读本次经验值,可以用来做经验倍数、经验池。
8. 穿装备触发(发光特效、属性加成)
[@WearEquip]
#IF
CheckItemWear 传奇神剑 0
#ACT
SetItemEffect 0 23
SendMsg 7 穿戴传奇神剑,特效已开启
0 是武器栏位,23 是特效编号,对应补丁素材。
9. 脱装备触发
[@TakeOff0]
#IF
NOT CheckItemWear 传奇神剑 0
#ACT
SetItemEffect 0 0
SendMsg 7 脱下武器,特效取消
10. 双击物品触发(回城卷、礼包、金条)
回城卷例子:
[@Item703]
#IF
#ACT
DelItem 回城卷 1
MapMove 3 333 333
703 是回城卷在物品库里的 Idx,MapMove 后面跟地图号+坐标。
五、物品触发的前提条件(最容易踩坑)
光写脚本不够,物品本身要“允许触发脚本”。
1. 打开 DBC2000,进 StdItems.DB
2. 找到回城卷那行,看 StdMode 字段
3. 回城卷类设 2(可使用),金条类设 18(可兑换)
4. 部分引擎还要在 !Item.txt 里把第6列功能位设 1
不设这个,表现是:双击物品消失了,但人不传送、不加金币、不执行脚本。
六、变量使用
玩家变量(HUMAN)示例:
[@Login]
#ACT
MOV HUMAN RWSR 0
SAVEVAR HUMAN RWSR ..\QuestDiary\数据文件\RWSRSave.txt
读取和累加:
[@完成日常]
#ACT
LOADVAR HUMAN RWSR ..\QuestDiary\数据文件\RWSRSave.txt
CALCVAR HUMAN RWSR + 1
SAVEVAR HUMAN RWSR ..\QuestDiary\数据文件\RWSRSave.txt
SendMsg 5 今日已完成任务次数:<$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 里有没有:
INCLUDE QFunction-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.txt Line
CommandSyntaxError
日志会告诉你第几行出错,比如:
ScriptError: Market_Def\QFunction-0.txt Line 23: CommandSyntaxError
回去把第23行前后重打一遍,重点清掉隐藏空格、全角符号、制表符。
十、调试技巧
在怀疑没触发的标签里先塞一句:
[@Login]
#ACT
SendMsg 0 登录触发已执行
进游戏看聊天栏有没有这句话。
• 有 → 脚本加载了,问题在条件判断
• 没有 → 文件没加载,回头查开关、文件名、Include
条件分支调试:
[@OnKillMob]
#IF
CheckMonName 祖玛卫士
#ACT
SendMsg 5 打到祖玛卫士
#ELSEACT
SendMsg 5 打到的不是祖玛卫士
用 SendMsg 把判断结果打出来,比瞎改快十倍。
十一、实战:做一个双击开新手礼包
1. 物品库加一个“新手礼包”,Idx 假设 8888,StdMode 设 2
2. QF 里写:
[@Item8888]
#IF
#ACT
DelItem 新手礼包 1
Give 裁决之杖 1
Give 天魔神甲 1
Give 强效金创药 50
Give 元宝 1000
SendMsg 6 已领取新手礼包!
3. 进游戏把新手礼包放进背包,双击,背包少一个,装备和元宝进包。
十二、实战:做刀刀切割
[@Attack]
#ACT
Damage 300
想加概率:
[@Attack]
#IF
Random 3
#ACT
Damage 300
SendMsg 6 切割触发!
Random 3 是三分之一概率,想更频繁改 Random 2 或去掉判断。
十三、实战:升级自动学技能
[@Upgrade]
#IF
CheckLevelEx = 19
#ACT
Give 攻杀剑术 1
SendMsg 6 自动领悟攻杀剑术
[@Upgrade]
#IF
CheckLevelEx = 26
#ACT
Give 半月弯刀 1
SendMsg 6 自动领悟半月弯刀
注意:同一个 [@Upgrade] 标签可以出现多次,只要每段条件不冲突。
十四、实战:穿戴套装加属性
[@WearEquip]
#IF
CheckItemWear 圣战头盔 2
CheckItemWear 圣战项链 3
CheckItemWear 圣战手镯 4
CheckItemWear 圣战戒指 5
#ACT
SetStatus 圣战威压 1
SendMsg 7 圣战套装激活:攻击+50
脱下时记得在 [@TakeOffX] 里清状态,不然脱一件还留着加成。
十五、实战:合击触发(合击版专用)
[@ComboSkill1]
#IF
CheckHeroExist
CheckRage 500
#ACT
CastComboSkill 1
SendMsg 6 破魂斩释放!
#ELSEACT
SendMsg 6 怒气不足或英雄未出战
十六、常见命令速查
判断类:
• CheckLevelEx = 等级
• CheckGameGold > 数值
• CheckItem 物品名 数量
• CheckItemWear 物品名 栏位
• Random 概率
• CheckMonName 怪物名
执行类:
• SendMsg 频道 内容
• Give 物品名 数量
• DelItem 物品名 数量
• GiveExp 经验值
• MapMove 地图 坐标X 坐标Y
• Damage 数值
• MOV HUMAN 变量 值
• CALCVAR HUMAN 变量 + 数值
• SAVEVAR HUMAN 变量 路径
• LOADVAR HUMAN 变量 路径
• 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
SendMsg 6 触发成功
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触发脚本编写与实战教程
来源:
作者:
点击:

