FoxSnow Posted November 14, 2020 Share Posted November 14, 2020 (edited) Bonjour , j'ai besoin d'aide je débute dans le script sur MTA sa fait quelques jours que je me casse la tête pour essayer de save la position d'un joueur mais dans une base de donnée sans passer par les Account ou setAccountData de MTA... Donc si quelqu'un pourrait m'aider cela serait super... J'ai essayer de faire un script mais j'ai delete le script en question qui ne fonctionnait point.. Edited November 14, 2020 by FoxSnow Link to comment
Gordon_G Posted November 14, 2020 Share Posted November 14, 2020 Salut, Pour commnencer tu as besoin d'une base de donnée (SQL=base de donnée sur un serveur/SQLite=base de donnée locale, dans un fichier), pour l'instant on va partir sur du sqlite. Pour ça tu aura besoin de la fonction dbConnect Tu trouveras par ailleurs sur le wiki toute l'aide dont tu as besoin pour créer ta base de donnée Bien, je ne sais pas si tu sais comment fonctionne une base de donnée mais à vrai dire c'est relativement simple. Une base de donnée est composée de tables qui elles-mêmes contiennent des colonnes. Ensuite, on insère des enregistrements (dont des lignes dans la table). Il faut donc créer une table avec des colonnes pour commencer, il faut donc envoyer une consigne à notre base de donnée pour qu'elle créée une table, on appelle ça une "requête SQL". On placera usuellement la requête créant une table juste après la connexion à la base de donnée (donc sur la ligne suivante dans ton script), pour s'assurer que la table existe avant d'aller y chercher des données, ça semble logique. Sur MTA on utilise la fonction dbExec Je vais te donner ici une structure d'exemple pour créer une table. dbExec( connexionDatabaseRetourneeParDBCONNECT, "CREATE TABLE IF NOT EXISTS NOM_DE_LA_TABLE (colonne1 TEXT, colonne2 NUMERIC, colonne3 TEXT, blablabla TEXT) Donc, qu'est-ce que j'ai fait ici ? J'ai utilisé une fonction, dbExec et j'y ai passé deux arguments. Premièrement l'élement SQL qui correspond à ma base de donnée et qui m'a été retournée par la fonction dbConnect que nous avons vu plus haut. Deuxièmement j'ai passé une chaine de caractère à ma fonction, c'est la requête SQL en elle-même. Dans cette requête SQL je demande à ma base de donnée de CREER une table NOM_DE_LA_TABLE SI ET SEULEMENT SI une table avec ce nom n'existe pas déjà (ça permet d'éviter d'avoir 50 tables avec le même nom). Puis, je place entre parenthèse le nom des différentes colonnes et le type de donnée qu'elles pourront accueillir. Par exemple, dans ma table NOM_DE_LA_TABLE, j'aurai une colonne nommée colonne1 et qui pourra accueillir du texte (donc des données comme : bonjour, le nom d'un joueur, peu importe). Attention à bien choisir le type de donnée que peu stocker ta colonne, effectivement, tu auras des erreurs lorsque tu tenteras d'y stocker quelque chose sinon. Ensuite j'ai crée la colonne colonne2 qui peut accueillir des données numériques (donc des données comme : 5, 6, la position d'un joueur). Bien, je pense que tu as compris la suite. Commence par former un script qui va répondre à tes attentes en te basant ce que je t'ai envoyé (tu devras remplacer le nom de la table, peut-être le nom du fichier sql dans le dbConnect, le nom des colonnes en fonction de tes besoins). Je reviendrai vers toi ensuite pour t'expliquer comment tu pourras aller stocker et chercher des données dans ta base. @FoxSnow 2 Link to comment
FoxSnow Posted November 14, 2020 Author Share Posted November 14, 2020 @Gordon_GMerci déjà pour tes explications , cependant j'ai déjà créé à la main une table dans ma base de données ( pour y mettre l'username , les positions x, y et z mais je pense que je vais te montrer un bout de script , je pense que tu pourrais mieux m'aider Link to comment
Gordon_G Posted November 14, 2020 Share Posted November 14, 2020 Très bien n'hésite pas, j'essaierai de t'aiguiller ensuite Link to comment
Wumbaloo Posted November 14, 2020 Share Posted November 14, 2020 Également si tu es perdu pour les types de colonnes, il y a des tableaux qui aident pas mal en fonction de tes besoins, par exemple ici : https://sql.sh/416-limites-types-donnees-sgbd 1 Link to comment
FoxSnow Posted November 14, 2020 Author Share Posted November 14, 2020 Bon voilà j'ai fait cela , j'utilise une Base de donnée MYSQL , bon au niveau de la DB cela save bien la position et l'update bien quand je déco MAIS quand je me reconnecte à nouveau sa me mets sur les positions 0, 0, 0.. Je comprends pas pourquoi local db = exports.db:getDBConnection() addEventHandler("onPlayerJoin", getRootElement(), function() fadeCamera(source, true) setCameraTarget(source, source) local username = getPlayerName(source) local qh = dbQuery(db, "SELECT * FROM users WHERE username=?", username) local result = dbPoll (qh, -1) local row = result[1] if not row then spawnPlayer(source, 1743.63281, -1861.50757, 13.57743) local x, y, z = getElementPosition(source) dbExec(db, 'INSERT INTO users (username, posX, posY, posZ) VALUES (?,?,?,?)', username, x, y, z) else local x, y, z = getElementPosition(source) setElementPosition(source, x, y, z) end end) addEventHandler("onPlayerQuit", getRootElement(), function() local x, y, z = getElementPosition(source) local username = getPlayerName(source) outputDebugString("x: "..x..", y: "..y..", z: "..z) dbExec(db, 'UPDATE users SET posX = ?, posY = ?, posZ = ?', x, y, z) end) Link to comment
Moderators Citizen Posted November 14, 2020 Moderators Share Posted November 14, 2020 Mes commentaires/explications dans le code: local qh = dbQuery(db, "SELECT * FROM users WHERE username=?", username) local result = dbPoll (qh, -1) local row = result[1] -- ici tu récupères la row de ta DB if not row then spawnPlayer(source, 1743.63281, -1861.50757, 13.57743) local x, y, z = getElementPosition(source) dbExec(db, 'INSERT INTO users (username, posX, posY, posZ) VALUES (?,?,?,?)', username, x, y, z) else -- ici t'as confirmation que "row" existe mais tu ne fais rien avec, il faut récupérer les valeurs x, y, z depuis la row ! local x, y, z = getElementPosition(source) -- et non pas getElementPosition qui va récupérer la position actuelle du joueur, cad 0, 0, 0 par défaut quand on se connecte setElementPosition(source, x, y, z) -- et il faut utiliser spawnPlayer plutôt que setElementPosition si t'as pas déjà spawn end 2 Link to comment
FoxSnow Posted November 14, 2020 Author Share Posted November 14, 2020 5 minutes ago, Citizen said: Mes commentaires/explications dans le code: local qh = dbQuery(db, "SELECT * FROM users WHERE username=?", username) local result = dbPoll (qh, -1) local row = result[1] -- ici tu récupère la row de ta DB if not row then spawnPlayer(source, 1743.63281, -1861.50757, 13.57743) local x, y, z = getElementPosition(source) dbExec(db, 'INSERT INTO users (username, posX, posY, posZ) VALUES (?,?,?,?)', username, x, y, z) else -- ici t'as confirmation que "row" existe mais tu ne fais rien avec, il faut récupérer les valeurs x, y, z depuis la row ! local x, y, z = getElementPosition(source) -- et non pas getElementPosition qui va récupérer la position actuelle du joueur, cad 0, 0, 0 par défaut quand on se connecte setElementPosition(source, x, y, z) -- et il faut utiliser spawnPlayer plutôt que setElementPosition si t'as pas déjà spawn end Ok je pense comprendre mais concrètement je vois pas comment régler le problème .. Enfaite je vois pas ce que je peux utiliser pour solutionner le problème. Link to comment
Moderators Citizen Posted November 14, 2020 Moderators Share Posted November 14, 2020 Okay alors maintenant, si je te dis de modifier ton code pour essayer ça: else outputChatBox( row["x"] ) -- même résultat avec outputChatBox( row.x ) -- local x, y, z = getElementPosition(source) -- setElementPosition(source, x, y, z) end qu'est-ce qui s'affiche dans la chatbox ? Link to comment
FoxSnow Posted November 14, 2020 Author Share Posted November 14, 2020 Oh oui je vois ! Merci beaucoup le soucis est réglé du coup , je vous remercie pour votre aide 2 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