Sign in to follow this  
Stanley Sathler

Como passar argumentos para o callback do eventHandler?

Recommended Posts

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...

Share this post


Link to post

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.

Share this post


Link to post

@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 by Guest

Share this post


Link to post

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.

Share this post


Link to post

8) 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.

Share this post


Link to post

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.