LawrenceKnight Posted December 12, 2017 Share Posted December 12, 2017 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.. 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? ), 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 Citizen Posted December 12, 2017 Moderators Share Posted December 12, 2017 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
LawrenceKnight Posted December 12, 2017 Author Share Posted December 12, 2017 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 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 Citizen Posted December 12, 2017 Moderators Share Posted December 12, 2017 (edited) 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 December 13, 2017 by Citizen Oubli parenthèse fermante Link to comment
LawrenceKnight Posted December 12, 2017 Author Share Posted December 12, 2017 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now