Olá, eu fiz esta biblioteca para melhor gerenciar os eventos.
A função mais útil e nova é a createCycleEvent.
local EVENT_TYPE = {
SINGLE = 1,
CYCLE = 2,
}
-- private functions
local function parseSingleEvent(event)
event.f(unpack(event.args))
event.id = nil
end
local function parseCycleEvent(event)
event.f(unpack(event.args))
event.id = addEvent(parseCycleEvent, event.time, event)
end
-- member functions
Event = {}
function Event:start()
if not self.id then
if self.type == EVENT_TYPE.SINGLE then
self.id = addEvent(parseSingleEvent, self.time, self)
self.finishTime = os.mtime() + self.time
elseif self.type == EVENT_TYPE.CYCLE then
parseCycleEvent(self)
self.finishTime = -1
end
end
end
function Event:restart(time)
if self.id then
self:stop()
end
self.time = time or self.time
self:start()
end
function Event:stop()
if self.id then
stopEvent(self.id)
self.id = nil
end
end
function Event:trigger()
if self.type == EVENT_TYPE.SINGLE then
if self.id then
self:stop()
self.f(unpack(self.args))
end
elseif self.type == EVENT_TYPE.CYCLE then
print(debug.traceback('Can\'t trigger a cycle event.'))
end
end
function Event:isFinished()
return not self.id
end
-- public functions
function createSingleEvent(f, time, ...)
local event = {}
event.f = f
event.args = {...}
event.time = time
event.type = EVENT_TYPE.SINGLE
setmetatable(event, { __index = Event })
event:start()
return event
end
function createCycleEvent(f, time, ...)
local event = {}
event.f = f
event.args = {...}
event.time = time
event.type = EVENT_TYPE.CYCLE
setmetatable(event, { __index = Event })
event:start()
return event
end
Como um simples exemplo, createCycleEvent pode ser usada para enviar um efeito em certa posição do mapa a cada 500 ms.
g_testEvent = createCycleEvent(doSendMagicEffect, 500, {x=100,y=100,z=7}, CONST_ME_FIREAREA)
-- pode ser parado quando usa um item
function onUse()
g_testEvent:stop()
end
-- pode alterar a velocidade ao usar outro item
function onUse()
g_testEvent:restart(100)
end
info
Grupo: Campones
Registrado: 02/11/08
Posts: 17
Reputação: +7
Olá, eu fiz esta biblioteca para melhor gerenciar os eventos.
A função mais útil e nova é a createCycleEvent.
local EVENT_TYPE = { SINGLE = 1, CYCLE = 2, } -- private functions local function parseSingleEvent(event) event.f(unpack(event.args)) event.id = nil end local function parseCycleEvent(event) event.f(unpack(event.args)) event.id = addEvent(parseCycleEvent, event.time, event) end -- member functions Event = {} function Event:start() if not self.id then if self.type == EVENT_TYPE.SINGLE then self.id = addEvent(parseSingleEvent, self.time, self) self.finishTime = os.mtime() + self.time elseif self.type == EVENT_TYPE.CYCLE then parseCycleEvent(self) self.finishTime = -1 end end end function Event:restart(time) if self.id then self:stop() end self.time = time or self.time self:start() end function Event:stop() if self.id then stopEvent(self.id) self.id = nil end end function Event:trigger() if self.type == EVENT_TYPE.SINGLE then if self.id then self:stop() self.f(unpack(self.args)) end elseif self.type == EVENT_TYPE.CYCLE then print(debug.traceback('Can\'t trigger a cycle event.')) end end function Event:isFinished() return not self.id end -- public functions function createSingleEvent(f, time, ...) local event = {} event.f = f event.args = {...} event.time = time event.type = EVENT_TYPE.SINGLE setmetatable(event, { __index = Event }) event:start() return event end function createCycleEvent(f, time, ...) local event = {} event.f = f event.args = {...} event.time = time event.type = EVENT_TYPE.CYCLE setmetatable(event, { __index = Event }) event:start() return event endComo um simples exemplo, createCycleEvent pode ser usada para enviar um efeito em certa posição do mapa a cada 500 ms.
g_testEvent = createCycleEvent(doSendMagicEffect, 500, {x=100,y=100,z=7}, CONST_ME_FIREAREA) -- pode ser parado quando usa um item function onUse() g_testEvent:stop() end -- pode alterar a velocidade ao usar outro item function onUse() g_testEvent:restart(100) end