个人定时器是引擎为每个在线角色独立创建的计时器,每个角色的定时器互不干扰,独立运行。与全局定时器不同,个人定时器随角色上线而开启、下线而自动销毁,不会给服务端带来额外的持久化负担。它的核心用途是周期性执行脚本操作,典型场景包括每秒检测背包物品、持续给泡点地图中的玩家增加经验、实时倒计时技能冷却等。
## 命令格式与参数详解
个人定时器的开启命令为SETONTIMER,完整格式如下:
SETONTIMER 定时器索引 定时间隔 循环次数
定时器索引的取值范围因引擎版本不同而存在差异。传统引擎通常为0到19,HGE引擎支持0到30,部分后期引擎和GOM、GEE引擎扩展到了0到255。索引编号在同一个角色的脚本体系中必须唯一,不能有两个功能同时占用同一个索引号。如果两个不同的脚本使用了同一个定时器索引,后开启的会覆盖先开启的,导致前一个定时器逻辑失效。
定时间隔以秒为单位,表示引擎每隔多少秒执行一次定时器对应的脚本段。设置为1时每秒执行一次,设置为60时每分钟执行一次。这个参数直接影响脚本的执行频率,设置过小会增加服务端运算压力,设置过大则响应迟钝。
循环次数参数是部分引擎新增的扩展功能。留空时定时器无限制循环执行,直到被手动关闭或角色下线。填入具体数值时,定时器执行指定次数后自动停止。例如SETONTIMER 0 20 3表示索引为0的定时器每隔20秒执行一次,共执行3次后自动关闭,总运行时长60秒。这个参数特别适合实现技能冷却倒计时、限时活动倒计时等有明确次数限制的场景。
关闭定时器使用SETOFFTIMER命令,格式为SETOFFTIMER 定时器索引。该命令会立即停止指定索引的定时器,之后不会再触发对应的脚本段。部分引擎的关闭命令名称为KILLSCTIMER,格式和用法相同,具体以所用引擎的文档为准。
## 脚本存放位置与触发标签
个人定时器的实际执行脚本统一存放在QManage.txt文件中,路径为服务端根目录下的Mir200\Envir\MapQuest_def\QManage.txt。这个文件是登录脚本的主文件,角色上线时引擎会读取其中的[@Login]标签段进行初始化。
每个定时器索引对应一个独立的触发标签,命名规则为@OnTimer加上索引编号。索引0对应[@OnTimer0],索引7对应[@OnTimer7],以此类推。定时器开启后,引擎每隔指定秒数自动跳转到对应的标签段执行其中脚本。标签名必须与定时器索引严格一致,写错标签名会导致定时器虽然开启但脚本不执行。
QManage.txt中的标签必须具有唯一性。同一个文件中不能出现两个同名的[@OnTimerX]标签,否则引擎只会执行其中一个,另一个定时器的逻辑将完全失效。排查定时器不执行的问题时,首先应检查标签是否存在重复。
## 变量配合与典型应用
定时器本身只负责触发,具体的功能逻辑需要配合变量和条件判断来实现。最常见的用法是用一个变量记录时间累计值,定时器每秒或每分钟对该变量进行增减操作。
以一个在线奖励系统为例:在[@Login]段中定义N10为在线秒数变量并归零,同时用SETONTIMER 1 1开启一个每秒执行的定时器。在[@OnTimer1]段中让N10自增1,然后判断N10是否大于300。当N10超过300时发放5分钟在线奖励,同时将N10减去300继续累计下一阶段。为了防止玩家重复领取,还需要引入状态变量N11来标记该档奖励是否已领取。所有涉及奖励发放的变量必须在发放后调用数据保存命令写入角色存档,否则玩家小退或大退后变量归零,可以反复上下线刷取同一档奖励。
泡点功能的实现方式与此类似。在泡点地图的NPC脚本中,玩家进入地图时开启定时器,设置间隔为1秒,在对应的[@OnTimerX]标签中给玩家增加经验值。玩家离开泡点地图时需要关闭定时器,否则定时器会继续运行并持续给不在泡点区域的玩家加经验。常见的回城石重复触发问题就是因为玩家自行使用回城石离开泡点地图时没有执行关闭定时器的命令,定时器仍在后台运行并不断传送玩家回泡点地图。解决方法是在回城石的使用脚本中加入SETOFFTIMER命令关闭对应的定时器索引。
## 多定时器并发与索引管理
一个角色可以同时运行多个个人定时器。例如一个定时器每1秒检测背包是否有指定物品,另一个定时器每60秒刷新一次属性面板,第三个定时器每10秒检测玩家所在位置是否在活动范围内。三个定时器使用不同的索引号,各自触发不同的[@OnTimerX]标签,互不干扰。
管理多个定时器时,需要注意每个定时器对应的变量是否被其他定时器误操作。如果两个定时器都读写同一个变量,就可能出现逻辑冲突。建议为每个定时器分配独立的变量区间,并在脚本注释中明确标注每个变量的用途和归属。
索引号的选择应避免使用已被其他功能占用的编号。可以通过脚本变量查询工具搜索已有的定时器使用情况,输入定时器编号即可查看哪些索引已被占用。部分引擎还支持通过O前缀批量搜索定时器占用情况,例如输入O1表示搜索1号定时器,输入O1-5表示搜索1号到5号定时器。
## 常见问题排查
定时器开启后脚本不执行,首先检查标签名是否与索引号一致,再确认QManage.txt中是否存在重复的[@OnTimerX]标签。如果标签无误,检查定时器是否被其他脚本以相同的索引号覆盖。
定时器持续执行但功能异常,通常是变量逻辑的问题。检查变量是否在角色上线时正确初始化,以及变量的增减操作是否在正确的条件分支内执行。涉及跨定时器的变量共享时,确认变量类型是否支持跨标签读写。
角色下线后定时器仍占用资源,一般不会发生,因为个人定时器随角色下线自动销毁。但如果定时器逻辑中使用了全局变量记录状态,下线后全局变量不会归零,下次上线重新开启定时器时可能出现状态错乱。正确做法是将所有定时器相关的状态变量使用角色私有变量类型,确保随角色下线自动清理。
定时器间隔设置为0或负数会导致引擎行为不可预期,可能造成死循环或服务端卡顿。定时间隔的最小值建议不低于1秒,高频率检测需求应通过其他机制实现。

