Ir para conteúdo

Biblioteca de Eventos (003-events.lua)


Baxnie

Posts Recomendados

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

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...