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

传奇单机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
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快。
[顶部]