Jump to content

[Problème] Le texte veut pas rester..


Recommended Posts

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

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

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

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

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

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

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