Jump to content

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

Link to comment

@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
Link to comment

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

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.

Link to comment

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...