Jump to content

Destruir el evento


Platin

Recommended Posts

¿Hay alguna forma de destruir un evento así?

dibujos[player] = addEventHandler("onClientRender", root, function() 
                if speakers[player] then 
                    local px, py, pz = getElementPosition(speakers[player]["object"]) 
                    local dist = (getDistanceBetweenPoints3D(px, py, pz, getElementPosition(localPlayer))) 
                    if dist < 30 then 
                        local x, y = getScreenFromWorldPosition (px, py, pz) 
                        if x and y then 
                            texto = dxDrawText("#FFFFFFCreador: #00FFFF"..getPlayerName(player), x, y, x, y, tocolor(0,0,0,230), 0.85 + ( 15 - dist ) * 0.05, "default","center",nil, false, false, false, true, false) 
                        end 
                    end 
                else 
                    cancelEvent() 
                end 
            end 
            ) 

Ya que el removeEventHandler necesita el nombre de la funcion, ¿pero si no lo tengo? ¿O lo puedo destruir donde puse el cancelEvent()?

Link to comment

¿De qué me sirve? ¿Cómo diferencio un clientRender del otro?

Necesito ayuda porque aunque consiga una variable sería igual a:

nombreDelEvento = addEventHandler("bla", root, funcion) 
removeEventHandler(nombreDelEvento) 

Me daría un error.

Intenta con esto, agrega un cuarto argumento 'key' puede ser un numero, un string, incluso un elemento, luego en el removeEventHandler usas como tercer argumento esa key.

NOTA: No está hecho para que te equivoques, así que no lo hagas xD ._.

  
events = {} 
  
_addEventHandler = addEventHandler 
addEventHandler = function (..., key) _addEventHandler(...) events[key] = {...}[1] end 
  
_removeEventHandler = removeEventHandler 
removeEventHandler = function (...) args = {...} _removeEventHandler(args[1], args[2], events[args[3]]) events[key] = nil end  
  

Link to comment

Otra cosa que podría funcionar (no lo tengo 100% claro) es que en vez de hacer que dibujos[player] sea como lo tienes, hagas que dibujos[player] sea la función de dentro y luego manejes los eventos 'desde fuera' haciendo addEventHandler( "onClientRender", root, dibujos[player]). No sé si me entiendes pero creo que te simplificaría bastante el trabajo.

Saludos

Link to comment
Otra cosa que podría funcionar (no lo tengo 100% claro) es que en vez de hacer que dibujos[player] sea como lo tienes, hagas que dibujos[player] sea la función de dentro y luego manejes los eventos 'desde fuera' haciendo addEventHandler( "onClientRender", root, dibujos[player]). No sé si me entiendes pero creo que te simplificaría bastante el trabajo.

Saludos

Es que dibujos[player] es el propio addEventHandler, lo use para ver si me tiraba false o algo realmente ya no lo uso. Y de igual forma si agregara una funcion aparte (que ya lo intente) tengo que pasar datos, como quien es el jugador y sus coordenadas, cosa que no puedo hacer ya que es un evento.

Link to comment
table = {} 
     
_addEventHandler = addEventHandler 
function addEventHandler(arg1, arg2, arg3, arg4) 
    if type(arg1) ~= "string" or not arg2 or type(arg3) ~= "function" or type(arg4) ~= "string" then error("@addEventHandler [Error en la sintaxis]") end 
    table[tostring(arg4)] = type(arg4) == "string" 
    _addEventHandler(arg1, arg2, arg3) 
end 
  
_removeEventHandler = removeEventHandler 
function removeEventHandler(arg1, arg2, arg3) 
    if type(arg1) ~= "string" or not arg2 or type(arg3) ~= "string" then error("@removeEventHandler [Error en la sintaxis]") end 
    for i,v in ipairs(getEventHandlers(arg1, arg2)) do 
        if table[arg3] then 
            _removeEventHandler(arg1, arg2, v) 
            break 
        end 
    end 
end 

Lo que hice en el addEventHandler fue agregar un cuarto valor que me permite darle una id al evento. En el tercer parametro de removeEventHandler en lugar de pedir que una tal función sea eliminado por un nombre, la id que se le dió en la función anterior va a ser una key.

Ejemplo:

  
-- aquí hago que la función sea directamente la key. 
addEventHandler("onClientRender", root,  
function() 
    outputChatBox("Output!") 
end, "spamming") -- "spamming" es el nombre que le doy al evento. 
  
-- y aqui elimino el evento. 
addCommandHandler("stopspam",  
function() 
    removeEventHandler("onClientRender", root, "spamming") -- "spamming" es el supuesto nombre del evento. 
    outputChatBox("Spam detenido.") 
end) 

Edited by Guest
Link to comment
table = {} 
     
_addEventHandler = addEventHandler 
function addEventHandler(arg1, arg2, arg3, arg4) 
    if type(arg1) ~= "string" and not arg2 and type(arg3) ~= "func" and type(arg4) ~= "string" then error("@addEventHandler [Error en la sintaxis]") end 
    table[tostring(arg4)] = type(arg4) == "string" 
    _addEventHandler(arg1, arg2, arg3) 
end 
  
_removeEventHandler = removeEventHandler 
function removeEventHandler(arg1, arg2, arg3) 
    if type(arg1) ~= "string" and not arg2 and type(arg3) ~= "string" then error("@removeEventHandler [Error en la sintaxis]") end 
    for i,v in ipairs(getEventHandlers(arg1, arg2)) do 
        if table[arg3] then 
            _removeEventHandler(arg1, arg2, v) 
            break 
        end 
    end 
end 

Lo que hice en el addEventHandler fue agregar un cuarto valor que me permite darle una id al evento. En el tercer parametro de removeEventHandler en lugar de pedir que una tal función sea eliminado por un nombre, la id que se le dió en la función anterior va a ser una key.

Ejemplo:

  
-- aquí hago que la función sea directamente la key. 
addEventHandler("onClientRender", root,  
function() 
    outputChatBox("Output!") 
end, "spamming") -- "spamming" es el nombre que le doy al evento. 
  
-- y aqui elimino el evento. 
addCommandHandler("stopspam",  
function() 
    removeEventHandler("onClientRender", root, "spamming") -- "spamming" es el supuesto nombre del evento. 
    outputChatBox("Spam detenido.") 
end) 

En la condición utiliza ors ya que ahí sólo dará error si en todos los argumentos hay algo que no es esperado.

Link to comment
No entendi xD, como asi?

Que el error sólo aparecerá si todos los argumentos están 'mal', por ejemplo aquí:

  
arg1 = false 
arg3 = false 
  
print( (type(arg1) ~= "string" and not arg2 and type(arg3) ~= "string") and "y" or "n" ) --> y 
  
  

Hay sólo un valor correcto y de todos modos pasa la condición, la solución sería esta:

  
if ( type(arg1) ~= "string" or not arg2 or type(arg3) ~= "string" ) then ... error ... 
  

Link to comment
No entendi xD, como asi?

Que el error sólo aparecerá si todos los argumentos están 'mal', por ejemplo aquí:

  
arg1 = false 
arg3 = false 
  
print( (type(arg1) ~= "string" and not arg2 and type(arg3) ~= "string") and "y" or "n" ) --> y 
  
  

Hay sólo un valor correcto y de todos modos pasa la condición, la solución sería esta:

  
if ( type(arg1) ~= "string" or not arg2 or type(arg3) ~= "string" ) then ... error ... 
  

Lo había puesto así pero tuve un error en el source y borre todo y lo puse así. De todos modos gracias.

Editado.

Link to comment
  • Recently Browsing   0 members

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