定时器
定时计划任务
计划任务表达式是由6个字段组成的字符串,字段分别由表示时间数字以空格分隔。*
表示字段的值是任意值,如下:
<seconds> <minutes> <hours> <days of month> <months> <days of week>
<第几秒> <第几分钟> <第几小时> <第几天> <第几月> <每周第几天>
表达式字段
字段 | 允许的数字 | 允许的符号 | 说明 |
---|---|---|---|
seconds | 0-59 | * | |
minutes | 0-59 | * | |
hours | 0-23 | * | 24进制 |
days of month | 1-31 | * | 自然时间:* * * 31 2 * -> 每个2月的第31天,是无效 的 |
months | 1-12 | * | |
days of week | 0-6 | * | 周日=0 |
表达式例子
表达式 | 说明 |
---|---|
* * * * * * | 每一秒 |
5 * * * * * | 每分钟的 05秒 (1分钟触发1次) |
0 5 * * * * | 每小时的 05分00秒 (1小时触发1次) |
0 5 2 * * * | 每天的 02点05分00秒 (1天触发1次) |
0 2 2 1 * * | 每月01号的 02点02分00秒 (1月触发1次) |
0 2 2 1 1 * | 每年01月01号的 02点02分00秒 |
0 2 2 * * 1 | 每周1的 02点02分00秒 |
* 2 2 * * 1 | 每周1的 02点02分的每秒 触发60次 |
* * 2 * * 1 | 每周1的 02点的每秒 触发3600次 |
0 * 2 * * 1 | 每周1的 02点的每个00秒 触发60次 |
接口
添加计划任务
edi.general:add_crontab(唯一标记, 计划任务表达式, 回调函数, 回调数据)
- 示例:
local const_def = include('define.const_def')
--- 添加计划任务
function add_days_crontab()
local _callback = function(strdata)
edi.general:send_broadcast_notice(const_def.NOTICE_TYPE.ChatBox, strdata)
end
-- 每周6上午 08:00:00 触发
local crontab = "0 0 8 * * 6"
edi.general:add_crontab("test_crontab_key", crontab, _callback, "玩家们!周末快乐")
end
-- 调用执行添加计划任务
add_days_crontab()
删除计划任务
edi.general:del_crontab(唯一标记)
- 示例:
edi.general:del_crontab("test_crontab_key")
判断是否有指定的计划任务
local has_crontab = edi.general:has_crontab(唯一标记)
返回为 true 或者 false
- 示例:
edi.general:send_broadcast_notice(const_def.NOTICE_TYPE.ChatBox, "找到了test_crontab_key ?" .. tostring(edi.general:has_crontab("test_crontab_key")))
全局定时器
添加定时器
edi.general:add_timer(唯一标记, 间隔时间(毫秒), 执行次数, 回调函数, 回调数据)
删除定时器
edi.general:del_timer(唯一标记)
判断是否有指定的定时器
local has_timer = edi.general:has_timer(唯一标记)
返回为 true 或者 false
示例
-- 定时器的key不能相同
local global_timer_key = "global_timer"
local del_global_timer_key = "del_global_timer"
function add_global_timer()
-- 定时器回调
local _callback = function(strdata)
edi.general:send_broadcast_notice(const_def.NOTICE_TYPE.ChatBox, strdata)
end
-- 添加定时器
edi.general:add_timer(global_timer_key, 5000, -1, _callback, "我是5秒全局定时器")
end
-- 调用执行添加定时器
add_global_timer()
edi.general:send_broadcast_notice(const_def.NOTICE_TYPE.ChatBox, "global_timer ?" .. tostring(edi.general:has_timer(global_timer_key)))
function del_global_timer()
-- 定时器回调
local _callback = function(strdata)
edi.general:del_timer(global_timer_key)
edi.general:send_broadcast_notice(const_def.NOTICE_TYPE.ChatBox, strdata)
edi.general:send_broadcast_notice(const_def.NOTICE_TYPE.ChatBox, "global_timer ?" .. tostring(edi.general:has_timer(global_timer_key)))
end
-- 添加定时器
edi.general:add_timer(del_global_timer_key, 20000, 1, _callback, "5秒全局定时器删除了")
end
del_global_timer()
个人定时器
仿照全局定时器的个人定时器,跟随个人的离线停止
edi.player:add_timer(玩家对象, 唯一标记, 间隔时间(毫秒), 执行次数, 回调函数, 回调数据)
edi.player:del_timer(玩家对象, 唯一标记)
edi.player:has_timer(玩家对象, 唯一标记)
- 示例
给玩家添加一个每5秒加100血的定时器,玩家登录添加,玩家下线停止
local AttrDef = include("engine.define.attr_def")
-- 定时器函数
local function _add_player_timer(player)
local _callback = function(uuid, timer_key, callback_params)
local player = edi.player:get_by_uuid(uuid)
edi.general:send_broadcast_notice(const_def.NOTICE_TYPE.ChatBox, callback_params)
edi.player:change_attr(player, AttrDef.EN_ATTR_1, 100)
end
local index_key = "player_timer"
local tick = 10000
local count = -1
local params = ""
edi.player:add_timer(player, index_key, tick, count, _callback, "我10秒加血定时器")
end
-- 登录事件
local function _on_login(player)
_add_player_timer(player)
end
--@Main--
edi.event:reg(edi.event.login, _on_login, "定时器测试")
场景定时器
仿照全局定时器的场景定时器,跟随场景关闭停止
edi.scene:add_timer(场景对象, 唯一标记, 间隔时间(毫秒), 执行次数, 回调函数, 回调数据)
edi.scene:del_timer(场景对象, 唯一标记)
edi.scene:has_timer(场景对象, 唯一标记)
- 示例
给比奇添加一个每分钟广播消息的定时器
-- 定时器函数
local function _add_biqi_hours_timer(scene)
local _callback = function(uuid, timer_key, callback_params)
local scene = edi.scene:get_by_uuid(uuid)
edi.general:broadcast_notice_map(scene, core_def.NOTICE_TYPE.ChatBox, "比奇大陆欢迎你们")
end
local index_key = "scene_timer"
local tick = 60000
local count = -1
local params = ""
edi.scene:add_timer(scene, index_key, tick, count, _callback, params)
end
-- 创建场景事件
local function _on_create_scene(scene)
if edi.scene:get_name(scene) == '比奇' then
_add_biqi_hours_timer(scene)
end
end
edi.event:reg(edi.event.create_scene, _on_create_scene, "场景定时器测试")
副本定时器
仿照全局定时器的副本定时器,跟随副本关闭停止
edi.dg:add_timer(副本对象, 唯一标记, 间隔时间(毫秒), 执行次数, 回调函数, 回调数据)
edi.dg:del_timer(副本对象, 唯一标记)
edi.dg:has_timer(副本对象, 唯一标记)
- 示例
给todo XX副本添加一个每分钟广播消息的定时器
-- 定时器函数
local function _add_dg_timer(dg)
local _callback = function(uuid, timer_key, callback_params)
local dg = edi.dg:get_by_uuid(uuid)
local scene = edi.dg:get_layer_scene(dg, 1)
edi.general:broadcast_notice_map(scene, core_def.NOTICE_TYPE.ChatBox, "XX大陆欢迎你们")
end
local index_key = "dg_scene_timer"
local tick = 10000
local count = -1
local params = ""
edi.dg:add_timer(dg, index_key, tick, count, _callback, params)
end
-- 创建场景事件
local function _on_create_dg(dg)
_add_dg_timer(dg)
end
edi.event:reg(edi.event.create_dg, _on_create_dg, "副本定时器测试")