Stanley Sathler Posted December 6, 2015 Share Posted December 6, 2015 Oiiiie miguxos! Galera, tem tanto tempo que não desenvolvo nada em Lua para o MTA que esqueci uma coisa que podia jurar que era possível (e ainda posso), mas que, nas minhas tentativas, retornou erro: Eu tenho um addEventHandler que, como vocês já sabem, recebe um callback no 3o argumento (callback: função chamada). Dependendo do evento usado, o callback recebe uma lista de parâmetros (por exemplo, quando usamos o evento onClientGUIClick, o callback recebe button, state, absoluteX e absoluteY). Isso tudo por padrão. A questão é: eu consigo passar um argumento meu para o callback? Isto é, além dos argumentos padrões que a função recebe (conforme dito, button, state, absoluteX e absoluteY), eu gostaria de passar mais um ou dois argumentos. O que eu tentei, foi: addEventHandler("onClientGUIClick", myButton, myCallbackFunction, true, "normal", myCustomArg) Só que não rolou muito... Link to comment
n3wage Posted December 7, 2015 Share Posted December 7, 2015 Não dá pra passar argumentos na função addEventHandler (Você deve estar confundindo com triggerEvent/triggerClientEvent etc) Mesmo assim você sempre pode reescrever a função addEventHandler, e, aí sim, passar argumentos Link to comment
Stanley Sathler Posted December 7, 2015 Author Share Posted December 7, 2015 n3wage, nunca reescrevi uma função assim, nativa do Multi Theft Auto. Como eu poderia começar? Eu não sei como o adicionador de eventos do MTA funciona por debaixo dos panos. Você já fez algo parecido? Btw, valeu pela ajuda, realmente estava me confundindo. Link to comment
RenanPG Posted December 8, 2015 Share Posted December 8, 2015 (edited) @StanleySathler Eh só fazer um override da função original, tipo assim: local _addEventHandler = addEventHandler -- variavel com a função nativa function addEventHandler(...) -- função editada -- aqui faz a lógica que vc quiser return _addEventHandler(...) end Edited December 8, 2015 by Guest Link to comment
n3wage Posted December 8, 2015 Share Posted December 8, 2015 Bem, Oque vamos fazer não é exatamente reescrever a função (Até porque não tem como, não temos acesso as funções da source do MTA), Vamos fazer um truque que quando usarmos addEventHandler o nosso addEventHandler vai adicionar um handler para outra função, que vai chamar a função que desejamos com os argumentos do evento + os argumentos que passamos no addEventHandler: _addEventHandler = addEventHandler; -- se nao fizermos isso e chamarmos addEventHandler na função abaixo ela vai entrar em um loop infinito (stack overflow) function addEventHandler ( name, element, func, propagated, priority, ... ) local propagated, priority = ( propagated or true ), ( priority or "normal" ); local cArgs = arg or {}; -- argumentos personalizados return _addEventHandler ( name, element, function( ... ) return func ( unpack ( mergeTables ( arg , cArgs ) ) ); end , propagated, priority ); end function mergeTables ( a, b ) for _, value in ipairs ( b ) do a[ #a + 1 ] = value; end return a; end Pra testar você pode fazer isso: addEventHandler ( "onPlayerChat", root, function ( ... ) for k, v in ipairs ( arg ) do print ( k, v ); end end , true, "normal", "teste", 159 ) Vai aparecer no console: A mensagem que o player enviou (padrão do mta) O tipo da mensagem (padrão do mta) "teste" (argumento personalizado) 159 (argumento personalizado) Esse método de reescrever a função pode ser muito útil em outros casos também para evitar repetição de código. Link to comment
Stanley Sathler Posted December 8, 2015 Author Share Posted December 8, 2015 Que orgulho essa comunidade brasileira, meu Deus. Muitíssimo obrigado, n3wage e Hornet. Nunca havia pensado nisso e, se fosse parar pra pensar, talvez demorasse para conseguir algo, sinceramente. Vou aplicar no meu conceito e volto com qualquer resultado. Enquanto aguardava a resposta, usei variáveis globais, então vou ter que fazer umas mudanças, hehe. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now