传奇单机QFunction-0触发脚本编写与实战教程

来源: 作者: 点击:
一、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快。