pRemi Posted May 5, 2014 Share Posted May 5, 2014 Bonjour, Excusez moi pour le nom du sujet peu original .. Mais je n'est pas d'autres idées pour décrire le soucis. Depuis toutes à l'heures, je réalise une function qui me permettra d'afficher au dessus de la tête de mon personnage un petit "Admin en service". Jusqu'à là pas de soucis, je réalise ma function.. Je bloque sur certaine chose que je finis par corriger moi-même avec l'aide du wiki. Maintenant, j'en suis rendu à là.. Ma commande fonctionne, le texte s'affiche bien au dessus de ma petite tête.. Mais malheureusement dès que je fais un seul mouvement celui-ci disparaît aussitôt. Voici le code (côté serveur) : function adminService(source, commandName) if isObjectInACLGroup ( "user." .. getAccountName(getPlayerAccount(source)), aclGetGroup ( "Admin" ) ) then local x, y, z = getElementPosition(source) -- Récupération de la position du joueurs local text = exports.easy3dtext:create3DText(x, y, z + 1, "Admin en service", 255, 0, 0) -- Création du text au dessus de la tête de l'administrateur attachElements(text, source) else outputChatBox("Vous n'êtes pas administrateur !", source, 255, 0, 0) end end addCommandHandler("aservice", adminService) J'imagine qu'il faudrait créer un timer pour mettre à jour toutes les X millisecondes la position du joueurs afin que le texte suit le joueurs. Hors, je pense que ce n'est pas tellement une solution surtout en terme d'optimisation des performances du serveur (et je ne sais pas si cela est faisable). Avez-vous une idée du problème et de sa solution ? Merci de votre aide, Rémi Link to comment
Moderators Citizen Posted May 5, 2014 Moderators Share Posted May 5, 2014 Oui c'est normal, parce que la ressource que tu utilises pour afficher les textes en 3D ne prend pas en compte le fait qu'il soit attaché à un élément lors du calcul de la position. J'ai téléchargé la ressource et merci à l'auteur qui n'a pas compilé ses sources (c'est plutôt rare malheureusement) et j'ai pu donc lire rapidement et comprendre le code. Il n'y a, en effet, aucune gestion pour les textes attachés (ils ne bougent pas et restent donc à l'endroit x, y, z où il a été créé. J'ai donc rapidement modifié le code et je pense que ça devrait fonctionner (je n'ai pas testé). Il te faut rajouter ce bout de code au début de la boucle for qui permet d'afficher tous les textes créés (ligne 134 du fichier c.lua de la ressource easy3dtext): local attachedTo = getElementAttachedTo( t ) --on récupére l'élément auquel il est peut être attaché if attachedTo ~= nil and isElement( attachedTo ) then --si on en a un et que c'est bien un élément alors: local atX, atY, atZ = getElementPosition( attachedTo ) --on récupère la position de cet élément local ofX, ofY, ofZ = getElementAttachedOffsets( t ) --on récupère l'ajustement du texte (par rapport à l'élément) setElementPosition( t, atX + ofX, atY + ofY, atZ + ofZ ) --on déplace le texte à la position de l'élément avec l'ajustement. end Tu devrais donc te retrouver avec quelque chose comme ceci: ... local px, py, pz = getElementPosition ( getLocalPlayer ( ) ) for i, t in ipairs ( getElementsByType ( "text" ) ) do local attachedTo = getElementAttachedTo( t ) if attachedTo ~= nil and isElement( attachedTo ) then local atX, atY, atZ = getElementPosition( attachedTo ) local ofX, ofY, ofZ = getElementAttachedOffsets( t ) setElementPosition( t, atX + ofX, atY + ofY, atZ + ofZ ) end local cx, cy, cz = getElementPosition ( t ) local dist = getDistanceBetweenPoints3D ( px, py, pz, cx, cy, cz ) ... Pense bien à te /login et te mettre en /debugscript 3 (marchera que si t'es admin dans l'acl) pour voir les éventuelles erreurs de scripts si je me suis planté quelque part. Link to comment
pRemi Posted May 5, 2014 Author Share Posted May 5, 2014 Salut, J'ai testé ton script et donc lorsque je fais ma commande le texte s'affiche mais disparaît toujours lors d'un mouvement. J'ai fais la commande /debugscript 3 et il me renvoie l'erreur suivante : easy3dtext\c.lua:147: attempt to compare number with nil Après, je ne sais pas si l'erreur était déjà présente avant l'ajout du code. Voici le code que j'ai mis au cas où, si l'erreur vient de moi : (de la ligne 133 à 144) local px, py, pz = getElementPosition ( getLocalPlayer ( ) ) for i, t in ipairs ( getElementsByType ( "text" ) ) do local attachedTo = getElementAttachedTo( t ) if attachedTo ~= nil and isElement( attachedTo ) then local atX, atY, atZ = getElementPosition( attachedTo ) local ofX, ofY, ofZ = getElementAttachedOffsets( t ) setElementPosition( t, atX + ofX, atY + ofY, atZ + ofZ ) end local cx, cy, cz = getElementPosition ( t ) local dist = getDistanceBetweenPoints3D ( px, py, pz, cx, cy, cz ) Merci de l'aide Citizen comme d'habitude Rémi Link to comment
Moderators Citizen Posted May 6, 2014 Moderators Share Posted May 6, 2014 Je ne sais pas à quoi correspond la ligne 147 chez toi. mais en supposant que c'est la ligne de mon if, tente de remplacer par ça: if attachedTo and isElement( attachedTo ) then Mais je ne comprends pas comment l'erreur soit liée avec ce if vu que ça ne retourne jamais un nombre oO Link to comment
pRemi Posted May 6, 2014 Author Share Posted May 6, 2014 La ligne 147 chez moi correspond au if suivant (Un peu plus bas que ton script) : if dist <= defdd then Pour la modification du if au final, ça ne change rien du coups. J'imagine qu'il faudrait changer un truc dans le if plus bas. Link to comment
Moderators Citizen Posted May 6, 2014 Moderators Share Posted May 6, 2014 La ligne 147 chez moi correspond au if suivant (Un peu plus bas que ton script) : if dist <= defdd then Pour la modification du if au final, ça ne change rien du coups. J'imagine qu'il faudrait changer un truc dans le if plus bas. Ok alors le mec publie sa ressource mais ne test pas juste avant ... Donc en remontant les définitions des variables: On a l'utilisation de defdd dans le if ok, on remonte et on voit qu'elle est censé être définie ligne 14 en utilisant un tableau envoyé via l'event onClientLoadSettings, qui est "triggered" du côté serveur ligne 82. Ce trigger ligne 82 est dans une fonction qui est appelé via l'event onLoadSettings qui n'est "triggered" nulle part. (Il devait sûrement le "triggered" via une autre de ses ressources et il n'a donc pas vu/eu ce problème). Donc 2 solutions: - tu "trigger" l'event toi-même (dans s.lua): triggerEvent("onLoadSettings", resourceRoot) que tu peux mettre ligne 85 (rajoutes des lignes s'il faut): - tu remplaces l'event "onLoadSettings" par l'event "onResourceStart" (remplace la ligne 69 par ceci): addEventHandler ( "onResourceStart", resourceRoot, Dans les 2 cas, l'erreur devrait disparaître et ça devrait fonctionner (à condition qu'il n'y ai pas d'autre bugs). Link to comment
pRemi Posted May 6, 2014 Author Share Posted May 6, 2014 Le script promet une belle série de cheveux perdu apparemment.. J'ai essayé les deux méthodes et aucune méthode ne fonctionne pas (à cause probablement d'une erreur supplémentaire). J'ai remplacé la ligne 69 par ce code ci : addEventHandler ( "onResourceStart", resourceRoot, Il doit donc y avoir encore un problème.. Et malheureusement, je n'est pas trouvé d'autres ressources simple d'utilisation pour afficher un texte 3d. Par contre, l'erreur a disparu en faisant la commande /debugscript 3 .. C'est déjà ça. Et de ton côté, si tu utilise ma commande fonctionne t-elle ? Merci de l'aide en tout cas, Rémi 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