BlackHamm3rJack Posted August 27, 2013 Share Posted August 27, 2013 Allora, ho fatto uno script do login/registrazione con database SQLite, ma quando mi da la conferma del login/registrazione mi invia due volte lo stesso messaggio! Per esempio quando mi loggo mi dice: -Ti sei loggato con successo -Ti sei loggato con successo Ma dovrebbe inviarmelo solo una volta. Comunque, ecco la descrizione della resource: -Database: Tabella "info": "nome", "password", "seriale", "ip" (lo so la password non è criptata, devo ancora farlo) -Gestore.lua (lato server): -- Controlla che l'account con un determinato nome esista function controllaEsistenzaAccount(nome) -- Codice SQL local db = dbConnect("sqlite", ":mod_libera/utenti.db"); local gQuery = dbQuery(db, "SELECT nome FROM 'info' WHERE nome = '" .. nome .. "';"); local rs, nRighe, msgErr = dbPoll(gQuery, -1); if (nRighe == 0) then triggerClientEvent("rispostaControlloAccount", getRootElement(), 0); else triggerClientEvent("rispostaControlloAccount", getRootElement(), 1); end; end; -- Fa uscire il client function clientEsce(giocatore) kickPlayer(giocatore, "Non puoi giocare senza loggarti/registrarti"); end; -- Logga il client function loggaClient(nome, pass, giocatore) -- Codice SQL local db = dbConnect("sqlite", ":mod_libera/utenti.db"); local gQuery = dbQuery(db, "SELECT password FROM 'info' WHERE nome = '" .. nome .. "';"); local rs, nRighe, msgErr = dbPoll(gQuery, -1); if nRighe > 0 then for rs, riga in pairs (rs) do for colonna, valore in pairs (riga) do if (valore == pass) then -- Login avvenuto con successo spawnPlayer(giocatore, 1965, -1720, 16); fadeCamera(giocatore, true); setCameraTarget(giocatore, giocatore); outputChatBox("Ti sei loggato con successo", giocatore); else -- Password errata outputChatBox("Password errata", giocatore); triggerClientEvent("rispostaControlloAccount", getRootElement(), 1); end; end; end; end; end; -- Registra il client function registraClient(nome, pass, giocatore) -- Codice SQL local db = dbConnect("sqlite", ":mod_libera/utenti.db"); local gQuery = dbQuery(db, "INSERT INTO 'info' VALUES ('" .. nome .. "', '" .. pass .. "', '" .. getPlayerSerial(giocatore) .. "', '" .. getPlayerIP(giocatore) .. "');"); local rs, nRighe, msgErr = dbPoll(gQuery, -1); -- Registrazione avvenuta con successo sempre spawnPlayer(giocatore, 1965, -1720, 16); fadeCamera(giocatore, true); setCameraTarget(giocatore, giocatore); outputChatBox("Ti sei registrato con successo", giocatore); end; -- Nuovi eventi addEvent("controllaAccount", true); addEvent("clientVuoleUscire", true); addEvent("loginClient", true); addEvent("registrazioneClient", true); -- Gestori eventi addEventHandler("controllaAccount", getRootElement(), controllaEsistenzaAccount); addEventHandler("clientVuoleUscire", getRootElement(), clientEsce); addEventHandler("loginClient", getRootElement(), loggaClient); addEventHandler("registrazioneClient", getRootElement(), registraClient); - GUI.lua (lato client): -- Il client ha inviato i dati per il login function clientInviaLogin(bottone, stato) if ((bottone == "left") and (stato == "up")) then local nome = getPlayerName(getLocalPlayer()); local pass = guiGetText(tLPassword); if (pass ~= "") then triggerServerEvent("loginClient", getRootElement(), nome, pass, getLocalPlayer()); guiSetInputEnabled(false); guiSetVisible(fLogin, false); showCursor(false); else outputChatBox("Perfavore, inserisci una password"); end; end; end; -- Il client ha inviato i dati per la registrazione function clientInviaRegistrazione(bottone, stato) if ((bottone == "left") and (stato == "up")) then local nome = getPlayerName(getLocalPlayer()); local pass = guiGetText(tRPassword); if (pass ~= "") then triggerServerEvent("registrazioneClient", getRootElement(), nome, pass, getLocalPlayer()); guiSetInputEnabled(false); guiSetVisible(fRegistrazione, false); showCursor(false); else outputChatBox("Perfavore, inserisci una password"); end; end; end; -- Il client esce dal server function clientInviaUscita() triggerServerEvent("clientVuoleUscire", getRootElement(), getLocalPlayer()); end; -- Crea la finestra per permettere al giocatore di loggarsi e giocare function creaFinestraLogin() -- Centra la finestra a seconda della risoluzione dello schermo del giocatore local alt, lun = 200, 120; local xAlt, yLun = guiGetScreenSize(); local centroX, centroY = (xAlt / 2) - (alt / 2), (yLun / 2) - (lun / 2); -- Crea la finestra fLogin = guiCreateWindow(centroX, centroY, alt, lun, "Perfavore, loggati", false); guiWindowSetMovable(fLogin, false); guiWindowSetSizable(fLogin, false); -- Crea delle labels guiCreateLabel(10, 20, 180, 18, "Inserisci i dati per continuare:", false, fLogin); guiCreateLabel(10, 40, 180, 18, "Password:", false, fLogin); -- Crea il campo di testo e setta alcune impostazioni tLPassword = guiCreateEdit(10, 60, 180, 18, "", false, fLogin); guiEditSetMasked(tLPassword, true); guiEditSetMaxLength(tLPassword, 16); -- Crea il bottone di login e uscita bLogin = guiCreateButton(10, 90, 85, 28, "Login", false, fLogin); bLEsci = guiCreateButton(105, 90, 85, 28, "Esci", false, fLogin); -- Rende la finestra invisibile guiSetVisible(fLogin, false); -- Gestore onClick del bottone esci e login addEventHandler("onClientGUIClick", bLogin, clientInviaLogin, false); addEventHandler("onClientGUIClick", bLEsci, clientInviaUscita, false); end; -- Crea la finestra per registrare il giocatore nuovo function creaFinestraRegistrazione() -- Centra la finestra a seconda della risoluzione dello schermo del giocatore local alt, lun = 200, 120; local xAlt, yLun = guiGetScreenSize(); local centroX, centroY = (xAlt / 2) - (alt / 2), (yLun / 2) - (lun / 2); -- Crea la finestra fRegistrazione = guiCreateWindow(centroX, centroY, alt, lun, "Perfavore, registrati", false); guiWindowSetMovable(fRegistrazione, false); guiWindowSetSizable(fRegistrazione, false); -- Crea delle labels guiCreateLabel(10, 20, 180, 18, "Inserisci i dati per continuare:", false, fRegistrazione); guiCreateLabel(10, 40, 180, 18, "Password:", false, fRegistrazione); -- Crea il campo di testo e setta alcune impostazioni tRPassword = guiCreateEdit(10, 60, 180, 18, "", false, fRegistrazione); guiEditSetMasked(tRPassword, true); guiEditSetMaxLength(fRegistrazione, 16); -- Crea il bottone di registrazione e uscita bRegistrati = guiCreateButton(10, 90, 85, 28, "Registrati", false, fRegistrazione); bREsci = guiCreateButton(105, 90, 85, 28, "Esci", false, fRegistrazione); -- Rende la finestra invisibile guiSetVisible(fRegistrazione, false); -- Gestore onClick del bottone esci e registrati addEventHandler("onClientGUIClick", bRegistrati, clientInviaRegistrazione, false); addEventHandler("onClientGUIClick", bREsci, clientInviaUscita, false); end; function rispostaControllo(esistenza) if (esistenza == 1) then -- Crea una finestra di login creaFinestraLogin(); guiSetVisible(fLogin, true); else -- Crea una finestra di registrazione creaFinestraRegistrazione(); guiSetVisible(fRegistrazione, true); end; -- Abilita l'input dall'utente showCursor(true); guiSetInputEnabled(true); end; -- Nuovi eventi addEvent("rispostaControlloAccount", true); -- Gestore eventi addEventHandler("onClientResourceStart", getRootElement(), function () triggerServerEvent("controllaAccount", getRootElement(), getPlayerName(getLocalPlayer())); end ); addEventHandler("rispostaControlloAccount", getRootElement(), rispostaControllo); Ci sono molti passaggi tra client e server, comunque nel server locale funziona bene, ma quando carico la resource nel mio server hostato, fa quel bug descritto sopra. Grazie per l'aiuto! Link to comment
HunT Posted August 27, 2013 Share Posted August 27, 2013 Forse (sicuro) il problema sta nel triggerServerEvent. invece di usare : triggerServerEvent("loginClient", getRootElement(), nome, pass, getLocalPlayer()) usa : triggerServerEvent("loginClient",getLocalPlayer() , nome, pass) Siccome è un login panel,quindi solo un player sta facendo questa azione,non cè bisogno di usare il getRootElement() su triggerServerEvent Aggiungo che è inutile mettere quelle minchiate punto e virgola alla fine di ogni stringa tipo ; Link to comment
BlackHamm3rJack Posted August 27, 2013 Author Share Posted August 27, 2013 Hhahhaha mettere le ; lo faccio per abitudine con C, o Pawn, comunque grazie della risposta, ora vedo di provare se va Link to comment
BlackHamm3rJack Posted August 27, 2013 Author Share Posted August 27, 2013 Comunque, ho modificato come hai detto tu ma bugga di brutto, tipo ci rimane il pannello di login con quello di registrazione sovrapposto, ecc. Ah il messaggio lo stampa 2 volte ancora. Link to comment
HunT Posted August 27, 2013 Share Posted August 27, 2013 Evidentemente hai faillato qualcosa,anche io ho fatto un login panel simile tempo fa. Controlla bene e posta il debug se hai problemi. Link to comment
BlackHamm3rJack Posted August 28, 2013 Author Share Posted August 28, 2013 Secondo me non ho capito bene quando, nell'addEventHandler e nel triggerServerEvent devo usare getLocalPlayer() o getRootElement() Link to comment
HunT Posted August 28, 2013 Share Posted August 28, 2013 Ad ogni trigger server usa il metodo che ti ho scritto. Dopo ti faccio un esempio ora rispondo con l iphone. Link to comment
HunT Posted August 28, 2013 Share Posted August 28, 2013 Anyway. . . Perche non hai usato il database default di mtasa? È la stessa cosa,solo che e molto più pratico Ad ogni script che farai dovrai sempre aggiornare il database mentre con il default ti basta: AddAccount GetAccountData SetAccountData Vabe ogniuno ha le sue idee. 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