Jump to content

"drawyourlevel" problème mineur


Recommended Posts

Bonjour!

Bon, pour les problèmes précédents c'est pas grave je laisse tomber...

Mon serveur avance tout de même bien. Mais là je me retrouve avec, à mon humble avis, un petit problème.

Pourtant je n'arrive pas à trouver comment on le gère.. :D 

 

En fait, j'ai ce script (qui fonctionne avec un autre script qui s'appel "exp_system")

https://community.multitheftauto.com/index.php?p=resources&s=details&id=6143

Il sert à afficher le level du joueur sur l'écran + l'XP nécessaire pour le prochain level (exemple: Level 2 | Exp: 52/60)

Le problème, c'est qu'en fait lorsque le joueur passe au level suivant, le "text" précédant qui affiche l’expérience requis reste en dessous du nouveau.

Ce qui fait qu'au bout d'un moment, il y a plein de "text" superposé... 

 

Le script est composé du fichier méta (non sans blague? :D ), et de deux fichiers type client, soient:

addEventHandler ( "onClientResourceStart", resourceRoot,
    function ( )
        GUIEditor_Label = { }
   

      GUIEditor_Label[1] = guiCreateLabel(624,135,66,14,"Level:",false)
         
guiSetFont(GUIEditor_Label[1],"default-bold-small")


         GUIEditor_Label[3] = guiCreateLabel(691,138,83,15,"Exp:",false)

         guiSetFont(GUIEditor_Label[3],"default-bold-small")
 
        GUIEditor_Label[2] = guiCreateLabel(625,153,53,43, tostring ( getElementData ( localPlayer, "level" ) ),false)
        guiSetFont ( GUIEditor_Label[2], "sa-header" )
        GUIEditor_Label[4] = guiCreateLabel(679,159,49,14, tostring ( getElementData ( localPlayer, "exp" ) ),false)
        guiSetFont ( GUIEditor_Label[4], "default-bold-small" )
    end
)
 
addEventHandler ( "onClientElementDataChange", localPlayer,
    function ( dataName )
        if ( dataName == "level" ) then
            guiSetText ( GUIEditor_Label[2], tostring ( getElementData ( localPlayer, "level" ) ) )
        elseif ( dataName == "exp" ) then
            guiSetText ( GUIEditor_Label[4], tostring ( getElementData ( localPlayer, "exp" ) ) )
        end
    end
)


-- Direct X Drawing
addEventHandler("onClientRender",root,
    function()
        dxDrawText("",623.0,211.0,799.0,226.0,tocolor(255,255,255,255),1.0,"default","left","top",false,false,false)
        dxDrawRectangle(623.0,211.0,175.0,16.0,tocolor(0,0,0,0),false)
    end
)
gMe = getLocalPlayer()

 

puis:

function dxsetText ( )
    local text = ""
    local UP = tonumber ( getElementData ( localPlayer, "level" ) ) or 0
    if ( UP == 1 ) then
        text = "  /20"
    elseif ( UP == 2 ) then -- el 2 significa el level 
        text = "  /100" -- el 110 es el texto que va a aparecer  osea la experiencia que le va a faltar eso editenlo a su gusto ponganlo de acuerdo a lo que pusieron en el level.xml del resource exp_system
    elseif ( UP == 3 ) then
        text = "  /200"
    elseif ( UP == 4 ) then
        text = "  /500"
    elseif ( UP == 5 ) then
        text = "  /1000"
    elseif ( UP == 6 ) then
        text = "  /2000"
    elseif ( UP == 7 ) then
        text = "  /3000"
    elseif ( UP == 8 ) then
        text = "  /4000"
    elseif ( UP == 9 ) then
        text = "  /5000"
    elseif ( UP == 10 ) then
        text = "  /6000"
    elseif ( UP == 11 ) then
        text = "  /7000"
    elseif ( UP == 12 ) then
        text = "  /8000"
    elseif ( UP == 13 ) then
        text = "  /9000"
    elseif ( UP == 14 ) then
        text = "  /10000"
    elseif ( UP == 15 ) then
        text = "  /20000"
    elseif ( UP == 16 ) then
        text = "  /30000"
    elseif ( UP == 17 ) then
        text = "  /40000"
    elseif ( UP == 18 ) then
        text = "  /50000"
    elseif ( UP == 19 ) then
        text = "  /60000"
    elseif ( UP == 20 ) then
        text = "  /lvl max!"
    end
    GUIEditor_Label[5] = guiCreateLabel(706,159,63,13,text,false)
    guiSetFont ( GUIEditor_Label[5], "default-bold-small" )
end
addEventHandler ( "onClientResourceStart", resourceRoot, dxsetText )
 
addEventHandler ( "onClientElementDataChange", localPlayer,
    function ( dataName )
        if ( dataName == "level" ) then
            dxsetText ( )
        end
    end
)

 

J'ai pensé qu'il fallait, supprimé le "text" lorsque le level d'après est atteint, pour qu'ensuite juste après le nouveau "text" s'affiche.

Si c'est ce qu'il faut faire, ça parait bête mais je ne sais pas comment faire.. :( 

Link to comment
  • Moderators

Non, le problème c'est qu'à chaque changement de level (ligne 50 à 56) tu crées un nouveau label à l'écran (ligne 45), sans vérifier qu'il peut déjà y en avoir un d'affiché/créé.

Pour corriger il suffit de remplacer la ligne 45 en appliquant la logique suivante:

  • Si GUIEditor_Label[5] ~= nil alors je crée le label et je le stocke dans GUIEditor_Label[5] (ligne 45 à récupérer) puis je lui set sa police (ligne 46 à récupérer)
  • Sinon je lui change son texte via guiSetText 

Je pensais te le corriger directement, mais je pense qu'avec le code en français (mes 2 petits points du dessus), tu verrais la logique et comment le retranscrire dans ton code (ça doit se passer ligne 45 du coup).

Link to comment

C'est bon, il est corrigé comme ceci:

function dxsetText ( )
    local text = ""
    local UP = tonumber ( getElementData ( localPlayer, "level" ) ) or 0
    if ( UP == 1 ) then
        text = "  /20"
    elseif ( UP == 2 ) then -- el 2 significa el level 
        text = "  /100" -- el 110 es el texto que va a aparecer  osea la experiencia que le va a faltar eso editenlo a su gusto ponganlo de acuerdo a lo que pusieron en el level.xml del resource exp_system
    elseif ( UP == 3 ) then
        text = "  /200"
    elseif ( UP == 4 ) then
        text = "  /500"
    elseif ( UP == 5 ) then
        text = "  /1000"
    elseif ( UP == 6 ) then
        text = "  /2000"
    elseif ( UP == 7 ) then
        text = "  /3000"
    elseif ( UP == 8 ) then
        text = "  /4000"
    elseif ( UP == 9 ) then
        text = "  /5000"
    elseif ( UP == 10 ) then
        text = "  /6000"
    elseif ( UP == 11 ) then
        text = "  /7000"
    elseif ( UP == 12 ) then
        text = "  /8000"
    elseif ( UP == 13 ) then
        text = "  /9000"
    elseif ( UP == 14 ) then
        text = "  /10000"
    elseif ( UP == 15 ) then
        text = "  /20000"
    elseif ( UP == 16 ) then
        text = "  /30000"
    elseif ( UP == 17 ) then
        text = "  /40000"
    elseif ( UP == 18 ) then
        text = "  /50000"
    elseif ( UP == 19 ) then
        text = "  /60000"
    elseif ( UP == 20 ) then
        text = "  /lvl max!"
    end
    if isElement(GUIEditor_Label[5]) then 
        destroyElement(GUIEditor_Label[5]) 
    end 
    GUIEditor_Label[5] = guiCreateLabel(706,159,63,13,text,false) 
    guiSetFont ( GUIEditor_Label[5], "default-bold-small" ) 
end 
addEventHandler ( "onClientResourceStart", resourceRoot, dxsetText ) 
  
addEventHandler ( "onClientElementDataChange", localPlayer, 
    function ( dataName ) 
        if ( dataName == "level" ) then 
            dxsetText ( ) 
        end 
    end 
) 

merci :D

 

Et est-ce rapide pour faire en sorte que le script s'affiche en fonction de la résolution de l'écran du joueur? parce qu'il ne s'agit pas d'un tableau.. 

Link to comment
  • Moderators
    if isElement(GUIEditor_Label[5]) then
        destroyElement(GUIEditor_Label[5])
    end
    GUIEditor_Label[5] = guiCreateLabel(706,159,63,13,text,false)
    guiSetFont ( GUIEditor_Label[5], "default-bold-small" )

Hmmm alors oui ça fonctionne mais non c'est pas la logique que j'avais indiqué. Le soucis (non visible) avec ce code c'est que tu supprimes le label s'il existe déjà pour reconstruire le même label avec la même font et tout mais juste avec le texte qui change. Et pour changer juste le texte, il y a guiSetText ...

Je m'attendais plus à un truc comme ça:

    if not isElement(GUIEditor_Label[5]) then
        GUIEditor_Label[5] = guiCreateLabel(706,159,63,13,text,false)
        guiSetFont ( GUIEditor_Label[5], "default-bold-small" )
    else
        guiSetText( GUIEditor_Label[5], text )
    end

 

10 hours ago, LawrenceKnight said:

Et est-ce rapide pour faire en sorte que le script s'affiche en fonction de la résolution de l'écran du joueur?

Oui, il suffit de remplacer les nombres exprimés pixels par leur correspondance en pourcentage d'écran. Pour ça il suffit d'appliquer un calcul basique.

Admettons que tu l'as bien positionné (706, 159 => position absolue car en pixels) sur ton écran et que tu as une résolution de 1920x1080, pour le mettre en position relative (pourcentage) il faut faire comme suit:

guiCreateLabel(706,159,63,13,text,false)

On veut répondre à la question: 706 pixels, c'est combien de pourcent de 1920 ?
=> Réponse: 706/1920 = 0.36770833333333333333333333333333 qu'on peut arrondir => 0.368
(3 chiffres après la virgule est suffisamment précis même si un joueur à un écran 4K (1.12 pixels de différence donc LARGE niveau précision))

guiCreateLabel(0.368,159,63,13,text,false)

Ensuite on veut répondre à la question: 159 pixels, c'est combien de pourcent de 1080 ?
=> Pareil: 159/1080 = 0.14722222222222222222222222222222 qu'on peut arrondir => 0.147

guiCreateLabel(0.368,0.147,63,13,text,false)

On fait pareil pour 63, 13 => 0.033, 0.012 on remplace et on change l'argument relative à true

guiCreateLabel(0.368,0.147,0.033,0.012,text,true)

Et voilà ton label devrait s'afficher en fonction de la résolution de l'écran du joueur.

Edited by Citizen
Oubli parenthèse fermante
Link to comment

Parfait! merci beaucoup! 

J'ai même pu modifier le "font" et ajouter un peu de couleurs au passage:

        GUIEditor_Label[1] = guiCreateLabel(0.895,0.270,0.033,0.012,"Level:",true)
        guiSetFont(GUIEditor_Label[1],"default-bold-small")
		guiLabelSetColor( GUIEditor_Label[1], 0, 180, 210, 255 )

        GUIEditor_Label[3] = guiCreateLabel(0.895,0.300,0.033,0.012,"Exp:",true)
        guiSetFont(GUIEditor_Label[3],"default-bold-small")
		guiLabelSetColor( GUIEditor_Label[3], 0, 180, 210, 255 )
 
        GUIEditor_Label[2] = guiCreateLabel(0.920,0.270,0.033,0.012, tostring ( getElementData ( localPlayer, "level" ) ),true)
        guiSetFont ( GUIEditor_Label[2], "default-normal" )
		
        GUIEditor_Label[4] = guiCreateLabel(0.915,0.300,0.033,0.012, tostring ( getElementData ( localPlayer, "exp" ) ),true)
        guiSetFont ( GUIEditor_Label[4], "default-normal" )

C'est tout pour moi, et encore merci!

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