Jump to content

[HELP] Save position d'un joueur dans une base de donnée


FoxSnow

Recommended Posts

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 by FoxSnow
Link to comment
  • FoxSnow changed the title to [HELP] Save position d'un joueur dans une base de donnée

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

 unknown.png

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

 

 

  • Like 2
Link to comment
 
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

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 
  • Like 2
Link to comment
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

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

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