触发系统
触发系统是 Blue 引擎脚本开发的核心机制。当特定游戏事件发生时,引擎会自动执行对应的脚本标签,无需玩家手动触发。
触发系统架构
Blue 引擎的触发系统由以下几个核心文件组成:
| 脚本文件 | 作用 |
|---|---|
| QFunction-0.txt | 功能脚本,处理玩家行为、装备操作、技能、交易等触发事件 |
| QManage.txt | 登录脚本,人物每次登录时执行,也承载服务器启停和数据存取触发 |
| QMapEvent-0.txt | 地图事件脚本,处理地图坐标范围触发 |
| QChatMission-0.txt | 聊天栏和任务导航专用功能脚本 |
| RobotManage.txt | 机器人专用脚本,配合 Robot_def 目录使用 |
| MapQuest.txt | 杀怪/拾取触发配置文件 |
QFunction 触发标签
人物行为触发
| 触发标签 | 触发时机 |
|---|---|
| @PlayLevelUp | 人物升级时 |
| @PlayDie | 人物死亡时 |
| @ONLOGOUT_SOFTCLOSING | 小退触发(安全区内有效) |
| @ONLOGOUT_OFFLINEPLAYING | 大退触发(安全区内有效) |
| @QueryUserState | 查看别人装备时,$PARAM(1) 为被查看的角色名 |
| @KickDoubleConnect | 被顶号时 |
大退、小退触发默认只在安全区内有效;在 !Setup.txt 中写入 QUITGAMEWIDETRIGGER=1 后,非安全区下线同样会触发 [@ONLOGOUT_OFFLINEPLAYING] 与 [@ONLOGOUT_SOFTCLOSING],该开关默认为 0。
复活触发
| 触发标签 | 触发时机 | 关键参数 |
|---|---|---|
| @OnRevive | 复活成功时 | $PARAM(3) 角色名、$PARAM(4) 地图、$PARAM(5) X、$PARAM(6) Y、$PARAM(8) 1 人物 / 60 英雄 |
| @OnItemDamageRevive | 复活且消耗装备持久时 | $PARAM(0) 装备位置、$PARAM(1) 装备名、$PARAM(7) 装备ID、$PARAM(9) 剩余持久 |
装备触发
| 触发标签 | 触发时机 | 说明 |
|---|---|---|
| @TakeOnX | 穿戴装备时 | X 为装备位置 |
| @TakeOffX | 脱下装备时 | X 为装备位置 |
| @HeroTakeOnX | 英雄穿戴装备时 | X 为装备位置(0~16),写在 QFunction-0.txt 中 |
| @HeroTakeOffX | 英雄取下装备时 | X 为装备位置(0~16),在 [@HeroTakeOff3] 中可以检测到脱下的旧装备 |
| @DropItem | 人物死亡掉落物品时 | $PARAM(1) 物品名、$PARAM(2) Looks、$PARAM(3) 角色名、$PARAM(4) 地图名、$PARAM(5) X、$PARAM(6) Y |
| @DroppingItem | 丢弃/掉落物品之前 | $PARAM(0) 1000 死亡 / 2000 手动 / 0~16 装备位 |
| @ProduceItem | 物品出产时 | 需物品 RareItem 含 128 |
| @EvalEquipSucceed | 鉴定装备成功时 | 可临时使用 GetEquipProps、UpgradeDlgItem(位置 10000)等命令,注意用法,防止死循环 |
| @SECRETPROPERTY_SKILL | 鉴定出特殊技能时 | 解读出特殊技能时同时赋予 S98 技能名、S99 装备名;目前支持五岳独尊、召唤巨魔、神龙附体、倚天辟地 |
| @RefineItem_Succeed | 淬炼成功时 | 可临时使用 GetEquipProps |
| @SwitchFashion | 切换时装时 | $PARAM(0) 0 隐藏 / 1 外显 |
| @OnCursingWeapon | 武器诅咒时 | $PARAM(0) 武器名、$PARAM(1) 幸运、$PARAM(2) 诅咒 |
技能触发
| 触发标签 | 触发时机 | 关键参数 |
|---|---|---|
| @MagSelfFuncX | 释放技能时(X 为技能ID) | $PARAM(0) 0 玩家 / 1 英雄 |
| @MagTagFuncX | 技能命中目标时(X 为技能ID) | $PARAM(3) 攻击者角色名 |
物品使用触发
| 触发标签 | 触发时机 | 关键参数 |
|---|---|---|
| @StdModeFuncX | 双击物品触发(X 为 AniCount) | $PARAM(0) 0 玩家 / 1 英雄 |
| @PickUpItem | 拾取物品时 | $PARAM(0) 0 非背包 / 1 背包 / 2 挖取 |
| @MonDropItemDown | 怪物掉落极品时 | $PARAM(3) 掉落者名 |
商店与交易触发
| 触发标签 | 触发时机 | 关键参数 |
|---|---|---|
| @DealingGoods | 商店买卖之前 | $PARAM(0) 0 购买 / 1 出售(需 RareItem 含 32) |
| @StorageItem | 仓库存取之前 | $PARAM(0) 0 存 / 1 取(需 RareItem 含 64) |
| @Shopping | 商店购物时 | $PARAM(4) 数量、$PARAM(5) 最大持久 |
寄售行触发
| 触发标签 | 触发时机 | 关键参数 |
|---|---|---|
| @SaleOnConsignment | 寄售上架时 | $DLGITEMID 物品ID、$PARAM(0) 物品名称 |
英雄相关触发
| 触发标签 | 触发时机 |
|---|---|
| @HeroLevelUp | 英雄升级 |
| @HeroDie | 英雄死亡(含主号击杀) |
| @CreateHeroOK | 创建英雄成功触发、召唤英雄 |
| @HeroLogin | 召唤英雄触发(假人也可触发) |
| @HeroIPLevelUp | 英雄内功升级 |
称号触发
| 触发标签 | 触发时机 |
|---|---|
| @TitleChanged_XX | 人物改变使用称号或上线时用到称号(XX 为称号物品的 Shape) |
| @HeroTitleChanged_XX | 英雄改变使用称号或上线时用到称号(XX 为称号物品的 Shape) |
XX 取称号物品 DB 中的 Shape,配置方法见 称号称谓设置。
内功触发
| 触发标签 | 触发时机 |
|---|---|
| @IPLEVELUP | 人物内功升级 |
| @HEROIPLEVELUP | 英雄内功升级 |
怪物触发
| 触发标签 | 触发时机 |
|---|---|
| @KillMon | 杀怪触发(配合 MapQuest.txt) |
| @MonDrop | 怪物掉落触发 |
| @OpenTreasureChest | 打开宝箱时 |
| @GetButchItem怪物名字 | 挖卧龙怪时 |
地图事件触发
| 触发标签 | 触发时机 | 关键参数 |
|---|---|---|
| @EnterMap | 进入地图时(替代 @OnMapChanged) | $PARAM(0) 是否英雄(0 人物 / 1 英雄)、$PARAM(1) 原地图、$PARAM(2) 进入地图 |
| @LeaveMap | 离开地图时(替代 @OnMapChanging) | $PARAM(1) 原地图、$PARAM(2) 目标地图 |
SetAbility 相关触发
| 触发标签 | 触发时机 |
|---|---|
| @SetAbility_XX | SetAbility 设置时(XX 为 ID) |
| @ResetAbility_XX | SetAbility 重置时(XX 为 ID) |
| @SuspendAbility_XX | SetAbility 暂停时(XX 为 ID) |
| @ResumeAbility_XX | SetAbility 恢复时(XX 为 ID) |
其他触发
| 触发标签 | 触发时机 |
|---|---|
| @TimerX | 定时器触发 |
| @WALLWARSTOPFUNC | 每日 22 点准时触发 |
| @InPutStringX | 输入框输入内容时 |
| @OnGetEquipProps | GetEquipProps 获取属性后 |
| @EnableCharacterResult | EnableCharacter 操作结果 |
| @chgname_fail_name_used_0 | 改名时在线角色名占用 |
QManage 触发标签
登录脚本
人物每次登录时,引擎自动执行 QManage.txt 中的 @Login 标签:
[@Login]
#IF
CheckLevelEx = 1
#ACT
GIVE 布衣 1
SENDMSG 6 欢迎来到本服!
服务器启停触发
| 触发标签 | 触发时机 |
|---|---|
| @OnStart | 服务器启动时 |
| @OnStop | 服务器关闭时 |
数据存取触发
| 触发标签 | 触发时机 |
|---|---|
| @LoadData | QM 加载人物数据时(不支持英雄) |
| @SaveData | QM 保存人物数据时(不支持英雄) |
聊天监控触发
当 !Setup.txt 中 ViewWhisper=2 时,Server 节下的聊天监控会触发 @OnMonitorChatMessage。
$CHATMSG 是聊天监控专用变量,禁止在此触发中使用任何文本操作命令。QMapEvent 地图事件触发
QMapEvent-0.txt 用于配置地图坐标范围触发,格式如下:
地图号 坐标X 坐标Y 触发标签
当玩家进入指定地图的坐标范围时,自动执行对应的触发标签。
该文件还承接 MapInfo.txt 中 KILLFUNC(数字) 对应的击杀联动:地图参数写 KILLFUNC(1) 时,引擎会执行 QMapEvent-0.txt 中的 [@KillPlay1](击杀玩家)与 [@KillPlayMon1](击杀怪物)。因此 [@KillPlay数字] 属于 QMapEvent 触发,不写在 QFunction 中,详见 QMapEvent-0.txt。
MapQuest 杀怪/拾取触发
MapQuest.txt 用于配置杀怪和拾取触发:
地图号 变量 判断 角色名 物品名 执行文件名
拾取触发示例:
3 [123] 0 蛤蟆 乌木剑 QPickup1
3 [123] 0 * 屠龙 QPickup2
怪物刷新预告触发(MonGen.txt 第 12 参数):
3 333 333 蜈蚣 6 1 2 0 0 0 0 @RespawnAlert,60|@RespawnAlert,10
触发时 $PARAM(0) 为秒数、$PARAM(1) 为分钟数、$PARAM(2) 为怪物名、$PARAM(3) 为地图名、$PARAM(4) 为中心坐标 X、$PARAM(5) 为中心坐标 Y。
Robot 机器人定时触发
机器人在 Robot_def\AutoRunRobot.txt 中配置定时规则:
#AutoRun NPC SEC 10 @Robot1
#AutoRun NPC MIN 1 @Robot2
#AutoRun NPC HOUR 1 @Robot3
#AutoRun NPC DAY 1 @Robot4
支持精确到秒的时间格式:
#AutoRun NPC RUNONDAY 12:00:00 @正午触发
#AutoRun NPC RUNONWEEK 5:18:00:00 @周五18点触发
定时触发到达后,引擎会执行 RobotManage.txt 中对应的标签。
触发参数变量
通用参数
| 变量 | 说明 |
|---|---|
$PARAM(0) ~ $PARAM(9) | 触发参数,含义随触发器不同而变化 |
$PARAMSTR(0) ~ | 字符串型触发参数 |
$DLGITEMID | 对话框物品ID(64 位字符串型) |
攻击触发专用变量
| 变量 | 说明 |
|---|---|
$ATTINFO_NAME | 攻击者名称 |
$ATTINFO_RACE | 攻击者种族 |
$ATTINFO_ISHUMAN | 攻击者是否人物 |
$ATTINFO_ISHERO | 攻击者是否英雄 |
$ATTINFO_HITTYPE | 攻击类型(0 普通 / 1 暴击) |
$ATTINFO_DAMAGE | 攻击伤害值 |
$ATTINFO_SKILLID | 攻击技能ID |
$ATTINFO_MNAME | 攻击者主人名称 |
目标触发专用变量
| 变量 | 说明 |
|---|---|
$TARINFO_NAME | 目标名称 |
$TARINFO_ISHUMAN | 目标是否人物 |
$TARINFO_STATID | 目标 StatID |
$TARINFO_CX / $TARINFO_CY | 目标坐标 |
完整的攻击触发开关、$ATTINFO_* / $TARINFO_* / $T.* 变量表与脚本示例见 攻击触发 @Attack / @UnderAttack。
触发优先级和链式触发
当多个触发条件同时满足时,引擎按以下优先级处理:
- QFunction 中的触发标签优先级最高
- QMapEvent 地图事件次之
- QManage 登录触发在玩家进入游戏时执行
- Robot 定时触发按配置的时间规则独立运行
在同一个触发标签中,可以通过 GOTO 或 CALL 实现链式触发,将多个功能串联执行。
注意事项
- QFunction 触发标签区分大小写
- 触发标签不能重复定义
- 触发脚本中避免死循环逻辑,尤其是使用
GetEquipProps等可能递归触发的命令 - @LoadData 和 @SaveData 不支持英雄,不要在其中编写繁重脚本
- @OnMonitorChatMessage 禁止使用任何文本操作命令
- QManage 登录脚本中不宜放置耗时操作
- 大量触发事件建议使用机器人定时器代替实时触发
