跳到主要内容

定时器

定时计划任务

计划任务表达式是由6个字段组成的字符串,字段分别由表示时间数字以空格分隔。* 表示字段的值是任意值,如下:

<seconds> <minutes> <hours> <days of month> <months> <days of week>
<第几秒> <第几分钟> <第几小时> <第几天> <第几月> <每周第几天>

表达式字段

字段允许的数字允许的符号说明
seconds0-59*
minutes0-59*
hours0-23*24进制
days of month1-31*自然时间:* * * 31 2 * -> 每个2月的第31天,是无效
months1-12*
days of week0-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, "副本定时器测试")