Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 03/01/16 em %
-
Sistema Torneio 4x ao dia PRA SITE + NPC
robsonsiilva e 3 outros reagiu a L3K0T por um tópico no fórum
CONTEÚDO REMOVIDO: AGORA VOCÊ VAI TER QUE TER CRIATIVIDADE OU SE PENDURAR-SE NAS COSTA DE ALGUÉM, MENOS NA MINHA - BOA SORTE! error 404 - I do not serve the forum I retired.4 pontos -
Antes do if not target:isPlayer() then return true end coloque isso: local creature, target = Creature(creature), Creature(target)2 pontos
-
Nova seção: Escola de Scripting LUA
Sirarcken e um outro reagiu a Caronte por um tópico no fórum
Pô nem fala, eu to ansioso para caralho também, eu já disse que eu tenho a primeira aula já pronta kkkkk mas o lançamento da escolinha tinha que ser sincronizado junto com outro evento... e esse evento independe de mim... haha, se eu der muitos detalhes como quem é/são o/os responsáveis eu vou dar spoiler. Na verdade já to meio que dando...2 pontos -
Editor de Sprites? Object builder!
liel157 e um outro reagiu a Sirarcken por um tópico no fórum
2 pontos -
[OrochiElf] New OTRestarter v1.0
Arnz190 reagiu a Tony Araujo por um tópico no fórum
New OTRestarter version: 1.0 developer: Tony Araújo (OrochiElf) pt. Gabriel Nogueira (Idéias) Funções: - Auto Restarter (Ele inicia o servidor assim que ele não detectar mais que o processo está ativo, ou seja, toda vez que o seu servidor fechar sozinho, o programa automaticamente irá reconhecer e irá reinicia-lo.) - Auto Crash Timer (Uma nova função inédita foi adicionada, esta função é responsável por detectar quando o processo do servidor para de funcionar, algo que acontece frequentemente, então ele irá reconhecer e reiniciar o processo.) - Auto Restarter Timer (Outra função nova adicionada nesta versão, esta função é responsável por programar os horários que você deseja reiniciar o seu servidor. ela é bastante usada para evitar o desperdício de memória usada no consumo do processo do servidor, ou seja, quando um servidor está ativo por muito tempo o gasto de memória aumenta, então esta função irá reiniciar o processo do seu servido de acordo com os horários que você marcar. Para próxima versão: - OTRestarter hosting (Esta função será uma inovação bastante bacana, ela dará o direito de você acessar o Restarter *que estará provavelmente instalado no VPS/Dedicado do servidor* sem que a pessoa precise acionar a conexão remota, ou seja, funcionará parecido com um FTP Control, você poderá controlar o Restarter e ter acesso as informações gravadas no LOG do programa através de um simples client, deixando possível ser acessado em computadores diferentes, e em breve uma versão para mobile/celular.) Imagem do funcionamento do programa: Download: Link Aqui1 ponto -
OtPokémonDBR Online
luizmachado1 reagiu a L3K0T por um tópico no fórum
CONTEÚDO REMOVIDO: AGORA VOCÊ VAI TER QUE TER CRIATIVIDADE OU SE PENDURAR-SE NAS COSTA DE ALGUÉM, MENOS NA MINHA - BOA SORTE! error 404 - I do not serve the forum I retired.1 ponto -
Mudar de uid para item id
surfnament reagiu a Night Wolf por uma questão
t[item.uid] muda pra t[item.itemid], é quase oque o danih falou mas é itemid e não somente id.1 ponto -
Mudar Função deste evento para TFS 1.0
surfnament reagiu a Lucas CP por uma questão
tente assim: function onSay(cid, words, param) if(param == "") then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Use: \"!hunted kks,nick\".") return TRUE end local t = string.split(param, ",") if(not t[2]) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Use: \"!hunted kks,nick\".") return TRUE end local sp_id = getPlayerGUIDByName(t[2]) if sp_id == nil then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Esse player nao existe.") return TRUE end local result_plr = db.storeQuery("SELECT * FROM `bounty_hunters` WHERE `sp_id` = "..sp_id.." AND `killed` = 0;") if(result_plr ~= false) then is = tonumber(result.getDataInt(result_plr, "sp_id")) result.free(result_plr) else is = 0 end prize = tonumber(t[1]) if(prize == nil or prize < 1) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Use: \"!hunted kks,nick\".") return TRUE end if(prize >= 100000000000000000000) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Desculpe,numero muito grande!") return TRUE end if is ~= 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Este player ja esta hunted, confira em nosso site a lista.") return TRUE end if doPlayerRemoveMoney(cid, prize*1000000) == TRUE then db.query("INSERT INTO `bounty_hunters` VALUES (NULL,"..getPlayerGUID(cid)..","..sp_id..",0," .. os.time() .. ","..prize..",0,0);") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Hunted adicionado com sucesso!") for _, pid in pairs(Game.getPlayers()) do local player = Player(pid) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Hunted Update:\n %s deu hunted em %s e esta pagando por sua cabeça: %d kks!", Player(cid):getName(), t[2], prize)) end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Hunted [BOUNTY HUNTERS] Você não tem dinheiro!") end return 1 end1 ponto -
Sistema Torneio 4x ao dia PRA SITE + NPC
robsonsiilva reagiu a L3K0T por um tópico no fórum
NPC <?xml version="1.0" encoding="UTF-8"?> <npc name="Nick" script="tournament1.lua" walkinterval="999000" floorchange="0"> <health now="150" max="150"/> <look type="150" head="20" body="100" legs="50" feet="99" corpse="2212"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|. Sou o NIKE, Encarregado pelo Torneio diario caso queira entrar diga: {torneio}."/> </parameters> </npc> lib torneio torneio = { awardTournament = 2160, awardAmount = 1000, playerTemple = {x = 1044, y = 883, z = 7}, tournamentFight = {x = 894, y = 538, z = 15}, area = {fromx = 1240, fromy = 1782, fromz = 7, tox = 922, toy = 572, toz= 15}, waitPlace = {x = 1219, y = 1805, z = 7}, waitArea = {fromx = 957, fromy = 536, fromz = 15, tox = 983, toy = 552, toz= 15}, startHour1 = "07:50:00", endHour1 = "08:00:00", startHour2 = "11:50:00", endHour2 = "12:00:00", startHour3 = "17:50:00", endHour3 = "18:00:00", startHour4 = "22:50:00", endHour4 = "23:00:00", price = 500, revivePoke = 12344, } function getPlayersInArea(area) local players = {} for x = area.fromx,area.tox do for y = area.fromy,area.toy do for z = area.fromz,area.toz do local m = getTopCreature({x=x, y=y, z=z}).uid if m ~= 1 and isPlayer(m) then table.insert(players, m) end end end end return players end1 ponto -
algum erro na distro ? poderia me mandar caso houver. tente essa lib de NPC/liblib.rar antes de baixar tente assim <?xml version="1.0" encoding="UTF-8"?> <npc name="Nick" script="tournament1.lua" walkinterval="999000" floorchange="0"> <health now="150" max="150"/> <look type="150" head="20" body="100" legs="50" feet="99" corpse="2212"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|. Sou o NIKE, Encarregado pelo Torneio diario caso queira entrar diga: {torneio}."/> </parameters> </npc>1 ponto
-
CONTEÚDO REMOVIDO: AGORA VOCÊ VAI TER QUE TER CRIATIVIDADE OU SE PENDURAR-SE NAS COSTA DE ALGUÉM, MENOS NA MINHA - BOA SORTE! error 404 - I do not serve the forum I retired.1 ponto
-
Função doPlayerOpenChannel para tfs 0.4
Gabriel Netto reagiu a L3K0T por um tópico no fórum
CONTEÚDO REMOVIDO: AGORA VOCÊ VAI TER QUE TER CRIATIVIDADE OU SE PENDURAR-SE NAS COSTA DE ALGUÉM, MENOS NA MINHA - BOA SORTE! error 404 - I do not serve the forum I retired.1 ponto -
troca function onTime() por function onTimer() no script torneio.lua do globalevents1 ponto
-
Ganhar Gold ao Matar Player Level 700+
surfnament reagiu a Lucas CP por uma questão
Tente assim: local config = { level = 700, -- level que ganha o dinheiro coin = 10000 -- coin é em gold coin, ou seja, 1 é 1 gold coin, 100 é 1 platinum coin, 10000 é 1 crystal coin } function onKill(cid, target) if isPlayer(cid) and isPlayer(target) then if getPlayerLevel(target) >= config.level then broadcastMessage(getCreatureName(target).."["..getPlayerLevel(target).."] acabou de ser morto pelo jogador "..getCreatureName(cid).."["..getPlayerLevel(cid).."].", MESSAGE_EVENT_ADVANCE) Player(cid):addMoney(config.coin) Player(cid):sendTextMessage(MESSAGE_STATUS_DEFAULT, string.format('Você ganhou %d golds por matar o jogador %s.',config.coin, getCreatureName(target))) end end return true end1 ponto -
CONTEÚDO REMOVIDO: AGORA VOCÊ VAI TER QUE TER CRIATIVIDADE OU SE PENDURAR-SE NAS COSTA DE ALGUÉM, MENOS NA MINHA - BOA SORTE! error 404 - I do not serve the forum I retired. resource Hacker.rar1 ponto
-
[ANTI-CLONE] 100% NOVO
MasterDino reagiu a kaleudd por um tópico no fórum
Créditos: Absolute Thales Valentim Como funciona? Toda vez que um ItemVIP ou qualquer Item comprado no SHOP do seu site, quando ele for entregar ao player, irá ficar; COMPRADOR POR:, ou seja; irá adicionar uma "KEY" algo que realmente saiu direto do seu SHOP, pois quando o item é disparado para o player ele vai entregar normal com a função "doCreateItemEx" e então adicionar a descrição no mesmo com a função "doItemSetAttribute". E como evitará os clones? Você terá uma QUERY para executar no seu banco de dados, fazendo uma checagem dos items VIPS que não possuem esse SERIAL KEY (o script também já faz a checagem), ou seja; os que não tiverem a KEY foram clonados (não saíram do SHOP), e então vocês poderão deleta-los manualmente caso necessário. É muito simples, apenas um script e a QUERY de checagem. Vamos a instalação! Em data/globalevents/scripts substitua o seu arquivo shop.lua por este: -- ### CONFIG ### -- message send to player by script "type" (types you can check in "global.lua") SHOP_MSG_TYPE = 19 -- time (in seconds) between connections to SQL database by shop script SQL_interval = 30 -- ### END OF CONFIG ### function onThink(interval, lastExecution) local result_plr = db.getResult("SELECT * FROM z_ots_comunication WHERE `type` = 'login';") if(result_plr:getID() ~= -1) then while(true) do id = tonumber(result_plr:getDataInt("id")) action = tostring(result_plr:getDataString("action")) delete = tonumber(result_plr:getDataInt("delete_it")) cid = getCreatureByName(tostring(result_plr:getDataString("name"))) if isPlayer(cid) == TRUE then local itemtogive_id = tonumber(result_plr:getDataInt("param1")) local itemtogive_count = tonumber(result_plr:getDataInt("param2")) local container_id = tonumber(result_plr:getDataInt("param3")) local container_count = tonumber(result_plr:getDataInt("param4")) local add_item_type = tostring(result_plr:getDataString("param5")) local add_item_name = tostring(result_plr:getDataString("param6")) local received_item = 0 local full_weight = 0 if add_item_type == 'container' then container_weight = getItemWeightById(container_id, 1) if isItemRune(itemtogive_id) == TRUE then items_weight = container_count * getItemWeightById(itemtogive_id, 1) else items_weight = container_count * getItemWeightById(itemtogive_id, itemtogive_count) end full_weight = items_weight + container_weight else full_weight = getItemWeightById(itemtogive_id, itemtogive_count) if isItemRune(itemtogive_id) == TRUE then full_weight = getItemWeightById(itemtogive_id, 1) else full_weight = getItemWeightById(itemtogive_id, itemtogive_count) end end local free_cap = getPlayerFreeCap(cid) if full_weight <= free_cap then if add_item_type == 'container' then local new_container = doCreateItemEx(container_id, 1) doItemSetAttribute(new_container, "description", 'Bought by ' .. getCreatureName(cid) .. ' [ID:' .. id .. '].') local iter = 0 while iter ~= container_count do local new_item = doCreateItemEx(itemtogive_id, itemtogive_count) doItemSetAttribute(new_item, "description", 'Bought by ' .. getCreatureName(cid) .. ' [ID:' .. id .. '].') doAddContainerItemEx(new_container, new_item) iter = iter + 1 end received_item = doPlayerAddItemEx(cid, new_container) else local new_item = doCreateItemEx(itemtogive_id, itemtogive_count) doItemSetAttribute(new_item, "description", 'Bought by ' .. getCreatureName(cid) .. ' [ID:' .. id .. '].') received_item = doPlayerAddItemEx(cid, new_item) end if received_item == RETURNVALUE_NOERROR then doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, 'You received >> '.. add_item_name ..' << from OTS shop.') doPlayerSave(cid) db.executeQuery("DELETE FROM `z_ots_comunication` WHERE `id` = " .. id .. ";") db.executeQuery("UPDATE `z_shop_history_item` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";") else doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS shop is waiting for you. Please make place for this item in your backpack/hands and wait about '.. SQL_interval ..' seconds to get it.') end else doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS shop is waiting for you. It weight is '.. full_weight ..' oz., you have only '.. free_cap ..' oz. free capacity. Put some items in depot and wait about '.. SQL_interval ..' seconds to get it.') end end if not(result_plr:next()) then break end end result_plr:free() end return TRUE end Confira se no seu globalevents.xml já possui a tag: <globalevent name="shop" interval="30000" script="shop.lua"/> PRONTO!! Para fazer a checagem se há items clonados, abra o seu phpmyadmin e execute a seguinte query: ------------------- COMANDO SQL BY ABSOLUTE PARA VERIFICAR A TABELA PLAYER_DEPOTITEMS---------------------- SELECT `player_id`,`pid`,`sid`,CONVERT( `attributes` USING latin1 ) FROM `player_depotitems` WHERE CONVERT( `attributes` USING latin1 ) LIKE '%description%' ------------------- COMANDO SQL BY ABSOLUTE PARA VERIFICAR A TABELA PLAYER_ITEMS---------------------- SELECT `player_id`,`pid`,`sid`,CONVERT( `attributes` USING latin1 ) FROM `player_items` WHERE CONVERT( `attributes` USING latin1 ) LIKE '%description%' OBSERVAÇÃO IMPORTANTE: Caso seu servidor já esteja online e já possua vendas no seu SHOP, você terá que adicionar a "KEY" em todos os items ou reseta-los. OUTRA OBSERVAÇÃO: Nunca crie items VIP com o ADMIN e de aos jogadores, pois eles ficaram sem a "KEY" e poderão ser deletados. ESTE SCRIPT FUNCIONA PERFEITAMENTE NAS REVS 0.3.6 e 0_4, caso necessário passo para a 1.x.1 ponto -
Sala de Trainers contando X e Y
Yan Liima reagiu a Night Wolf por uma questão
(espero q entendam o link ser de outro fórum) vc pode encontrar esse sistema aqui1 ponto -
Pessoal, as aulas continuam firme e forte, só tenham paciência, pois não tem data fixa ainda... Mas eu prometo, que essas aulas vão conter uma coisa que nenhuma aula em fórum de Tibia (ou qualquer outro fórum, eu acho) tem, e vai ser muito legal poder interagir com isso, vai ser mais fácil de aprender e testar conhecimentos. Repito: a aula-1 já está pronta. Acrescento que já tenho o assunto e início da aula-2. Enquanto eu não libero a escolinha, vou estudar outras coisas, para ajudar na didática das aulas. Obrigado pelo feedback pessoal, significa bastante para mim (quero um dia poder ensinar matemática, depois de fazer BCC, e Licenciatura em mat) É muito bom ver o interesse de muita gente! Aqui vão frases para inspirar: -Insanity: doing the same thing over and over again and expecting different results. -Learn from yesterday, live for today, hope for tomorrow. The important thing is not to stop questioning. -Imagination is more important than knowledge. For knowledge is limited to all we now know and understand, while imagination embraces the entire world, and all there ever will be to know and understand. Essas frases são de um carinha chamado de A. Einstein, aposto que vocês conhecem, ele foi um cara muito a frente da geração dele. Ele foi mais a frente do que minha geração , e provavelmente da do futuro filho... Essas frases são muuuuito importantes para programar, e para a vida. Duvidar de tudo é uma qualidade que eu tenho, e me orgulho muuuito disso, pois quem duvida não veste a venda do pseudo-conhecimento. A primeira frase tem muito haver com programar, a segunda também e a terceira também... se você não sabe inglês, tente chegar até elas, elas são muito importantes... Dica: Aprender inglês, se você não quer, aprenda pelo menos o que significa os termos, durante a aula. Se você já sabe: Que bom! Vai ser útil para sua vida, e muito mais fácil de entender funções e sintaxes LUA. FRASES ACIMA EM PT-br: Sabe aquele momento que o professor pergunta: - Alguma dúvida? , e ninguém da sua classe tem dúvida? A verdade é que são um bando de babacas, por não terem dúvidas, ou ter vergonha de perguntar. A ciência só progride se existir dúvidas. Certezas são burrices. Curiosidade: Linguagem LUA é brasileira, foi feita por integrantes da PUC. Mas é praticamente toda em inglês ... Estou pelo celular, qualquer erro de gramática, ponho culpa no corretor...1 ponto
-
Vamos Programar? - Introdução
Hisokafailll reagiu a Oneshot por um tópico no fórum
Vamos Programar? Introdução Olá, pessoal. Acredito que ninguém aqui me conheça, mas sou Oneshot, ou Bruno Lopes, um programador por passatempo. Desenvolvi muitos trabalhos para fóruns em geral, principalmente o XTibia, até que levei uma flecha no joelho... ... Brincadeiras a parte, eu gostaria muito de voltar a escrever tutoriais e quem sabe desenvolver novos recursos para a comunidade, depende muito do meu tempo disponível. Para essa primeira parte do tutorial, eu gostaria de tratar de um assunto que é subestimado por muitos... Não, eu não vou falar de lógica da programação, de Lua, ou de C++... eu vou falar sobre o editor de texto, a principal ferramenta de um programador. Muitos aqui, provavelmente começam sua vida de scripter utilizando o Notepad++ no Windows, ou talvez um gedit em alguns flavors do Linux, talvez até o vim, se você for muito hardcore Eu já usei vários editores de texto, e ultimamente tenho recomendado um editor de texto excelente, desenvolvido pela equipe do Github, chamado Atom. Eu poderia muito bem fazer deste tópico, um comparativo entre os editores de texto e até alguns IDEs (ou Integrated Development Environment), mas vou fazer deste, um tutorial para configuração do Atom e espero que vocês gostem. Atom Atom, conforme o criador, é um editor de texto totalmente personalizável, você pode editar todos os tipos de configurações dentro dele, mas também se não quiser, não é necessário. E acho que esse é o diferencial do Atom, existem muitos plugins de excelente qualidade, e você não vai precisar usar ele só para programar Lua, pode usar ele em um monte de sintaxes diferentes e se ele não tiver uma sintaxe, basta baixar um plugin que certamente existirá com a sintaxe, snippets (trechos de código pré-configurados), entre outros. Você vai baixar o Atom no site deles, http://atom.io/, no momento que escrevo esse artigo/tutorial, estou no Windows 10 (Ao invés do Fedora), então veja abaixo: Depois de baixar o instalador para sua plataforma (Ele está disponível para Windows, Linux e Mac), basta instalar o aplicativo, conforme os padrões do seu sistema (Next, Next, Next no Windows e por aí vai) Depois disso o Atom é apresentado da seguinte forma: Não tão dessa forma... estou com o tema da interface Seti-UI. Se você for curioso, pode então ler a documentação do Atom, e eu recomendo, pois você vai aprender muito lá, e se tiver noções de programação, já poderá aprender a personalizar seu Atom. Vamos baixar alguns plugins, para isso você pode ir no menu Packages > Settings View > Install Packages/Themes ou pressionar Ctrl+Shift+P (No caso do Windows), digitar Install e escolher a opção, e eu uso muito essa segunda forma: No menu que irá abrir, você pode procurar diversos plugins e temas, na página inicial ele mostra os plugins em destaque: Daqui não tem segredo, pesquise o nome do plugin, ele vai aparecer e então clique em Install, abaixo deixo alguns plugins que eu uso, e nem todos são voltados para Open Tibia. PluginsOpen Recent - Abre arquivos recentes Minimap - Mostra um minimapa com todo o código do arquivo Highlight Selected - Quando você seleciona uma palavra, ele seleciona todas as ocorrências Pigments - Voltado para Front-End, mostra a cor de um código hexadecimal de um arquivo CSS Linter* - Uma função muito presente em IDEs, que mostra algum erro no código, como um ';' faltando Auto-Detect-Indentation - Detecta a indentação de um arquivo e configura a indentação do seu TAB automaticamente) Atom-Beautify - Um "embelezador" de código Emmet - Para front-ends preguiçosos. language-lua - Para adicionar a sintaxe Lua no atom TemasSeti-UI - Um excelente tema com ícones para cada tipo de arquivo. Atom-Monokai - Um tema de sintaxe bem parecido com o Sublime. E tem muitos outros plugins excelentes... No caso do Linter, você precisa baixar o plugin principal, e então o plugin secundário para a linguagem que você pretende utilizar (Não sei se existe um Linter para Lua) Depois disso, você pode ir na opção Themes e mudar o tema de interface e de sintaxe: E por último, mudar algumas configurações a seu gosto: Cada configuração tem sua explicação em inglês. Esse é o Atom, configurado com os plugins do tutorial, com sintaxe Lua, a linha branca cruzando o arquivo é um separador que delimita 80 caracteres e quebra o código que passar disso, dando mais legibilidade. E o mais legal é que o Atom tem um modo de identificar funções diferente do Notepad++, então ele identifica até as funções Open Tibia no seu código. Legal, né? Conclusão Bom, é isso aí, esssa foi a primeira parte de uma sequência de tutoriais que pretendo fazer quando tiver tempo livre, afinal não consigo largar o Open Tibia. Espero que gostem. Abraços.1 ponto -
Biblioteca de Eventos (003-events.lua)
MasterDino reagiu a Baxnie por um tópico no fórum
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) end1 ponto