Jump to content

if is Already Handled


Recommended Posts

Salut, j'ai un script assez complexe qui permet d'afficher/faire disparaitre un text sur mon HUD, tout fonctionne parfaitement, seulement, le debugscript est spammé de ".. function is already handled"

Avez vous des idées pour checker si une function est déjà handled? J'ai essayé avec des variables, mais c'est assez complexe, je me perds à force et je n'y arrive pas, alors, pour me clarifier tout ça et me donner quelques pistes/soluces, j'ai besoin de vous! :D

Petites infos: ma fonction est exportée et appellée d'une autre ressource, aucun argument n'est présent, une fonction remove l'event handler, l'autre, l'ajoute.

EDIT: c'est qu'un warning qui est spammé, rien de grave mais ça peut peut-être faire laguer OU rendre illisible si une erreur au niveau script apparait.

Link to comment
  • Moderators

Oui tu as raison, mieux vaut supprimer ces warnings.

Et bah malgré mon expérience, je n'avais jamais vu/entendu parlé de cette erreur, première fois que je la vois :?

Mais j'ai bien compris que c'est lorsqu'on essaye de faire le même addEventHandler sur le même event avec la même fonction.

Si les 2 fonctions sont au même endroit, tu peux te mettre une variable que tu passes à true dans la fonction qui fait le addEventHandler et à false dans la fonction qui fait le removeEventHandler.

Sinon avec la fonction getEventHandlers il est possible de faire une fonction pour savoir s'il une fonction est déjà le handler d'un event via une source donnée. Et par chance, cette fonction à été faite dans l'exemple:

function isEventHandlerAdded( sEventName, pElementAttachedTo, func ) 
    if type( sEventName ) == 'string' and isElement( pElementAttachedTo ) and type( func ) == 'function' then 
        local aAttachedFunctions = getEventHandlers( sEventName, pElementAttachedTo ) 
        if type( aAttachedFunctions ) == 'table' and #aAttachedFunctions > 0 then 
            for i, v in ipairs( aAttachedFunctions ) do 
                if v == func then 
                    return true 
                end 
            end 
        end 
    end 
    return false 
end 

Link to comment

Oui, mais je comprends pas comment structuer le fait que la variable passe à true ou false, parce que:

voici mes deux fonctions, la première affiche, la seconde l'enlève.

function afficherVie() 
    dxDrawText( ""..health.." %", x/0.628, y/9.2, x/4, y/30, tocolor( 255,255,255, 255 ), 1, "default-bold-small", "center") 
    addEventHandler("onClientRender", root, afficherVie) 
end 
addEventHandler("onClientRender", root, afficherVie) 
  
function displayHealthNumber() 
    removeEventHandler("onClientRender", root, afficherVie) 
end 

Mais, si je fais un système de variable, il faudrait que lorsque j'export la fonction, qu'elle s'exporte avec un argument genre, si je lui demande d'afficher le texte, alors il lance l'event handler de afficherVie mais avec un argument, et si l'argument est true, alors, il affiche, sinon, il return

Je pense que c'est comme ça qu'il faut faire non? ça reste la méthode la plus simple

Link to comment
  • Moderators

Oula oui en effet, y a bien plus simple, il suffit de faire 1 fonction qui va juste se charger de faire les dxDraw et qui va être appelé en boucle via l'event "onClientRender" et 2 autres fonctions qui vont juste servir à ajouter ou retirer l'event:

function renderingVie() 
    -- j'imagine que tu get la vie du joueur au-dessus 
    dxDrawText( health.." %", x/0.628, y/9.2, x/4, y/30, tocolor( 255,255,255, 255 ), 1, "default-bold-small", "center") 
end 
  
function afficherVie() 
    addEventHandler("onClientRender", root, renderingVie) 
end 
  
function cacherVie() 
    removeEventHandler("onClientRender", root, renderingVie) 
end 

Et tu exportes afficherVie et cacherVie.

Link to comment

--Suppresion de deux posts avant pour éviter de géner avec des doubles/triples posts, parce que le soucis a était résolu une dizaine de minutes après.

J'ai finalement réussi par le biais d'une simple variable qui ajoute/retire 1

Aussi simple que ça! Pas besoin de fonction qui fait 10 lignes héhé, je révolutionne le monde..

Voici mon code:

renderviee = 0 
  
function renderVie() 
    dxDrawText( ""..health.." %", x/0.628, y/9.2, x/4, y/30, tocolor( 255,255,255, 255 ), 1, "default-bold-small", "center") 
end 
  
function afficherVie() 
    humain = tonumber(getElementData(getLocalPlayer(), "humain")) 
    if humain == 0 then 
        cancelEvent() 
        return 
    else 
        renderviee = renderviee + 1 
        if renderviee == 1 then 
            addEventHandler("onClientRender", root, renderVie) 
        end 
    end 
end 
addEventHandler("onClientRender", root, afficherVie) 
  
function displayHealthNumber() 
    removeEventHandler("onClientRender", root, renderVie) 
    renderviee = 0 
end 

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