GTA-Expert Forum: [TUT]Creare un sistema di registrazione con YSI\y_ini - GTA-Expert Forum

Salta al contenuto

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

[TUT]Creare un sistema di registrazione con YSI\y_ini

#1 L'utente č offline   Galletziz 

  • Cittadino Onesto
  • Gruppo: Utenti
  • Messaggi: 12
  • Iscritto il: 19/03/13
  • GTA Preferito:GTA: San Andreas

Inviato il 05 dicembre 2013 - 00:26

Registration System con YSI\Y_INI e Dialogs

Che cosa è ?

Si tratta di un semplice sistema di registrazione e login utilizzando Y_INI e i dialogs

Che cosa è Y_INI?


Y_INI è un include che ti permette di gestire la lettura e la scrittura di un file all'interno di un server sa-mp, è noto anche come "File Manage System" ed il creatore dell'include è Y_Lees. E' un include della YSI Library che contiene altre utili include come y_commands (YCMD) e y_groups


La differeza da questo tipo di FMS e gli altri ?

Si dice sia stato riconosciuto come il piu veloce di tutti gli altri File Manage Systems, come DINI etc.
troverete molte piu informazioni a questo link.

OK. Ma come faccio ad installare Y_INI ?

Semplice, per prima cosa è necessario scaricare Y_INI a questo . Dopo di che estraete il tutto all'interno della cartella del vostro server sa-mp.

I Step

Come primo passo è necessario dichiarare l'include Y_INI sotto l'include <a_samp> come di seguito, dovrete dichiarare anche l'include dubd che servirà per richiamare la funzione con la quale cripteremo la password di ogni utente che si registra, suddetto include lo trovate a questo link:

Quote

#include <a_samp>
#include <YSI\y_ini>
#include <dudb>

II Step

l'include dubd ha una funzione che non viene usata quindi, per evitare eventuali warn dal compiler sotto le nostre dichiarazioni di include mettiamo quanto segue:

Quote

#pragma unused ret_memcpy


III Step

Definiamo i Dialogs con cui l'utente si troverà faccia a faccia e nei quali dovrà digitare le informazioni da questi richiesti.

Quote

#define D_NOME 1
#define D_COGNOME 2
#define D_ETA 3
#define D_PROVENIENZA 4
#define D_ALLINEAMENTO 5
#define D_REGISTRAZIONE 6
#define D_LOGIN 7
#define D_SUC_REG 8
#define D_SUC_LOG 9
#define D_FINE_REG 10


IV Step

Definiamo la directory nella quale verra creato il file.ini dell'utente che si registrerà, ricordo che questa dovrà essere creata nella directory filescripts del vostro server sa-mp, quindi entrate in questa e create una cartella chiamata User o chiamata a seconda di come vorrete che si chiami ma mi raccomando, definitela con la seguente sintassi (la mia cartella in questo caso è Users).

Quote

#define PATH "/Users/%s.ini"


V Step

Definiamo dei colori per i messaggi che imposteremo nelle nostre dialogs.

Quote

#define COL_BIANCO "{FFFFFF}"
#define COL_ROSSO "{FF0000}"
#define COL_VERDE "{00FF22}"
#define COL_LBLUE "{00CED1}"


VI Step

Definiamo un contenitore enum che conterrà tutte le variabili che a sua volta conterranno le informazioni dell'utente ed infine settiamo una variabile globale che le incanalerà con la seguente sintassi:

Quote

enum pStats {
sPassword,
sNome[MAX_PLAYER_NAME],
sCognome[MAX_PLAYER_NAME],
sEta,
sProvenienza[MAX_PLAYER_NAME],
sAllineamento[MAX_PLAYER_NAME],
sAdmin,
sScore,
sSoldi,
sMorti,
sUccisioni,
sCampi[MAX_PLAYER_NAME]
}

new statistiche[MAX_PLAYERS][pStats];


VII Step
Ho dichiarato anche una variabile che svolgerà un metodo per sapere se il player ha immesso determinate informazioni, tramite dialogs, o meno.

Quote

new InfoDate[MAX_PLAYERS];


IIX Step
Andremo adesso a creare una funzione che svolgerà il compito di caricare dal file.ini i dati salvati all'interno di esso con delle funzioni che ci offre Y_INI

Quote

forward CaricaUtente_data(playerid,name[],value[]);
public CaricaUtente_data(playerid,name[],value[]){
INI_Int("Password",statistiche[playerid][sPassword]);
INI_String("Nome",statistiche[playerid][sNome],24);
INI_String("Cognome",statistiche[playerid][sCognome],24);
INI_Int("Eta",statistiche[playerid][sEta]);
INI_String("Provenienza",statistiche[playerid][sProvenienza],24);
INI_String("Allineamento",statistiche[playerid][sAllineamento],24);
INI_Int("Admin",statistiche[playerid][sAdmin]);
INI_Int("Score",statistiche[playerid][sScore]);
INI_Int("Soldi",statistiche[playerid][sSoldi]);
INI_Int("Morti",statistiche[playerid][sMorti]);
INI_Int("Uccisioni",statistiche[playerid][sUccisioni]);
INI_String("Campi",statistiche[playerid][sCampi],24);
return 1;
}


IX Step

Andiamo a creare una funzione di immagazzinamento Stock che formatterà una stringa la quale destinazione sarà il PATH che abbiamo dichiarato con il nome del utente registrato grazie alla funzione GetPlayerName.

Quote

stock FileUtente(playerid){
new string[128], nomeplayer[MAX_PLAYER_NAME];
GetPlayerName(playerid,nomeplayer,sizeof(nomeplayer));
format(string,sizeof(string),PATH,nomeplayer);
return string;
}



X Step

Adesso andiamo a creare all'interno della funzione di callback OnPlayerConnect() delle istruzioni if, che grazie alla funzione fexist() capiranno se il file dell'utente esiste o meno e asseconda di questo "vincolo" eseguiranno delle azioni/funzioni:

Quote

public OnPlayerConnect(playerid)
{
if(fexist(FileUtente(playerid))){
INI_ParseFile(FileUtente(playerid),"CaricaUtente_%s", .bExtra = true, .extra = playerid);
ShowPlayerDialog(playerid,D_LOGIN,DIALOG_STYLE_PASSWORD,""COL_BIANCO"Log In!",""COL_BIANCO"Bentornato!\nInserisci la password del tuo account per effettuare il Log in!","Log In","Esci");
}else{
ShowPlayerDialog(playerid,D_REGISTRAZIONE,DIALOG_STYLE_PASSWORD,""COL_BIANCO"Registrazione",""COL_BIANCO"Benvenuto!\nInserisci la password per creare il tuo nuovo account!","Registrati","Esci");
}
return 1;
}



abbiamo visto la funzione INI_ParseFile() e facciamo attenzione ai suoi parametri: FileUtente è il file che abbiamo dichiarato nella funzione stock e "CaricaUtente_%s" non è una stringa.. o quasi, è la funzione CaricaUtente_data() che abbiamo creato poc'anzi e che serve a caricare i parametri del file.ini e viene richiamata all'interno della funzione INI_ParseFile dove _data corrisponde a una stringa ed in questo caso al nome dell'utente, e per questo il parametro s'imposta in tale maniera: INI_ParseFile(FileUtente(playerid),"CaricaUtente_%s" ...) . i parametri .bExtra ed extra servono a far capire che tipo di dati inviare e a chi inviarli.

Messaggio modificato da Galletziz il 05 dicembre 2013 - 16:50

0

#2 L'utente č offline   Arcash 

  • Boss
  • Gruppo: Utenti
  • Messaggi: 10034
  • Iscritto il: 12/04/13
  • ID PSN:lobanbre
  • ID Social Club:_BigArcash_
  • Provenienza:Sardegna
  • GTA Preferito:GTA: San Andreas

Inviato il 05 dicembre 2013 - 00:30

Reply.
Is the Karma, amigo.

Immagine Postata
- Only Skrillex & Machete -
0

#3 L'utente č offline   Galletziz 

  • Cittadino Onesto
  • Gruppo: Utenti
  • Messaggi: 12
  • Iscritto il: 19/03/13
  • GTA Preferito:GTA: San Andreas

Inviato il 05 dicembre 2013 - 00:32

XI step

Quando il player si sconnetterà dovremo salvare i suoi dati, perché nel corso del gioco questi saranno sicuramente aumentati o diminuiti. E quindi andiamo alla funzione di Callback OnPlayerDisconnect() e riscriviamo i dati del file che potrebbero essere in incremento o in diminuzione, con le funzioni che ci offre Y_INI:

Quote

public OnPlayerDisconnect(playerid, reason)
{
new INI:File = INI_Open(FileUtente(playerid));
INI_WriteInt(File,"Livello_Admin",statistiche[playerid][sAdmin]);
INI_WriteInt(File,"Score",statistiche[playerid][sScore]);
INI_WriteInt(File,"Soldi",GetPlayerMoney(playerid));
INI_WriteInt(File,"Morti",statistiche[playerid][sMorti]);
INI_WriteInt(File,"Uccisioni",statistiche[playerid][sUccisioni]);
INI_WriteString(File,"Campi_Conquistati",statistiche[playerid][sCampi]);
INI_Close(File);
return 1;
}



XII Step

Ricordate che nella funzione di Callback OnPlayerConnect() abbiamo impostato delle istruzioni if che a seconda dei "vincoli" ci mostravano due differenti Dialogs (uno per la registrazione e uno per il login)? Bene scorriamo la nostra GM fino ad incrociarci con la funzione di Callback OnDialogResponse() e scriviamo:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == D_REGISTRAZIONE){
        if(!response){
            Kick(playerid);
        }
        if(response){
         	if(!strlen(inputtext) || strlen(inputtext) < 3 || strlen(inputtext) > 12){
                ShowPlayerDialog(playerid,D_REGISTRAZIONE,DIALOG_STYLE_PASSWORD,""COL_BIANCO"Registrazione",""COL_ROSSO"La tua password deve essere compresa tra i 3 ed i 12 caratteri\n"COL_BIANCO"Inserisci la tua password per creare il tuo nuovo account!","Registrati","Esci");
            }
            if(InfoDate[playerid] == 0){
                SendClientMessage(playerid,-1,"[SERVER]: Dovrai riconfermare la tua password dopo, ma prima vorremmo sapere qualche informazione sul tuo giocatore.");
                ShowPlayerDialog(playerid,D_NOME,DIALOG_STYLE_INPUT,""COL_BIANCO"Nome",""COL_BIANCO"Inserisci il nome del tuo personaggio:","Procedi","");                }else{
            }
            if(InfoDate[playerid] == 1){
                new INI:File = 	INI_Open(FileUtente(playerid));
                INI_WriteInt(File,"Password",udb_hash(inputtext));
                INI_WriteInt(File,"Livello_Admin",0);
                INI_WriteInt(File,"Score",0);
                INI_WriteInt(File,"Soldi",500);
                INI_WriteInt(File,"Morti",0);
                INI_WriteInt(File,"Uccisioni",0);
                INI_WriteString(File,"Campi_Conquistati","0");
                INI_Close(File);
                ShowPlayerDialog(playerid,D_SUC_REG,DIALOG_STYLE_MSGBOX,""COL_BIANCO"Registrato!",""COL_VERDE"Complimenti, hai registrato il tuo account con successo.\nLo staff ti raccomanda di visitare il forum e la sezione regole,\nper tutto il resto buona fortuna e buon game!","Procedi","");
                SpawnPlayer(playerid)
            }
        }
    }
    
    if(dialogid == D_NOME){
        if(response){
            new INI:File = 	INI_Open(FileUtente(playerid));
              format(statistiche[playerid][sNome],24,inputtext);
            INI_WriteString(File,"Nome",statistiche[playerid][sNome]);
            INI_SetTag(File,"Informazioni Account");
            INI_Close(File);
        }
        return ShowPlayerDialog(playerid,D_COGNOME,DIALOG_STYLE_INPUT,""COL_BIANCO"Cognome",""COL_BIANCO"Inserisci il cognome del tuo personaggio:","Procedi","");
    }
      
    if(dialogid == D_COGNOME){
        if(response){
            new INI:File = 	INI_Open(FileUtente(playerid));
         	format(statistiche[playerid][sCognome],24,inputtext);
         	INI_WriteString(File,"Cognome",statistiche[playerid][sCognome]);
         	INI_Close(File);

        }
        return ShowPlayerDialog(playerid,D_ETA,DIALOG_STYLE_INPUT,""COL_BIANCO"Eta",""COL_BIANCO"Inserisci l'eta del tuo personaggio:","Procedi","");
    }
    
    if(dialogid == D_ETA){
        if(response){
            new INI:File = 	INI_Open(FileUtente(playerid));
            statistiche[playerid][sEta] = strval(inputtext);
            INI_WriteInt(File,"Eta",statistiche[playerid][sEta]);
            INI_Close(File);
        }
        return ShowPlayerDialog(playerid,D_PROVENIENZA,DIALOG_STYLE_INPUT,""COL_BIANCO"Provenienza",""COL_BIANCO"Inserisci la provenienza del tuo personaggio:","Procedi","");
    }
    
    if(dialogid == D_PROVENIENZA){
        if(response){
            new INI:File = 	INI_Open(FileUtente(playerid));
            format(statistiche[playerid][sProvenienza],30,inputtext);
            INI_WriteString(File,"Provenienza",statistiche[playerid][sProvenienza]);
            INI_Close(File);
       	}
        return ShowPlayerDialog(playerid,D_ALLINEAMENTO,DIALOG_STYLE_INPUT,""COL_BIANCO"Allineamento",""COL_BIANCO"Inserisci l'allineamento del tuo personaggio scegliendo tra:\nPOSITIVO\nNEUTRALE\nNEGATIVO\nSe non sai cosa riguarda questo tipo di impostazione del personaggio visita il forum prima di registrarti","Procedi","Annulla");
    }
    
    if(dialogid == D_ALLINEAMENTO){
        if(response){
            new INI:File = 	INI_Open(FileUtente(playerid));
            format(statistiche[playerid][sAllineamento],30,inputtext);
            INI_WriteString(File,"Allineamento",statistiche[playerid][sAllineamento]);
            INI_Close(File);
            InfoDate[playerid] = 1;
       	}
       	return ShowPlayerDialog(playerid,D_REGISTRAZIONE,DIALOG_STYLE_PASSWORD,""COL_BIANCO"Registrazione",""COL_BIANCO"Compi l'ultimo passo, re inserisci la tua password:","Registrati","Esci");
    }

    if(dialogid == D_LOGIN){
        if(!response){
            Kick(playerid);
        }
        if(response){
            if(udb_hash(inputtext) == statistiche[playerid][sPassword]){
                INI_ParseFile(FileUtente(playerid),"CaricaUtente_%s", .bExtra = true, .extra = playerid);
                GivePlayerMoney(playerid,statistiche[playerid][sSoldi]);
                ShowPlayerDialog(playerid,D_SUC_LOG,DIALOG_STYLE_MSGBOX,""COL_BIANCO"Loggato",""COL_VERDE"Ti sei loggato con successo!","Procedi","");
                SpawnPlayer(playerid);
            }else{
                ShowPlayerDialog(playerid,D_LOGIN,DIALOG_STYLE_PASSWORD,""COL_BIANCO"Log In!",""COL_ROSSO"La password che hai inserito è errata!\nInserisci la password del tuo account per effettuare il Log in!","Log In","Esci");
                return 0;
            }

        }
    }
    return 1;
}


Come ben potete vedere nel dialog di registrazione, viene vengono fatte delle istruzioni IF una delle piu interessanti è quella che ci dice se il player ci ha dato delle determinate informazioni. Tutto ciò avviene grazie alla variabile globale InfoDate[MAX_PLAYERS] che avevamo dichiarato. E quindi se questa risulta 0 vuol dire che il player non ha dato delle informazioni che ci servono per completare la sua registrazione e per questo motivo viene indirizzato ad un Dialog al quale ne seguirà un altro e un altro ancora (Dialogo di nome, di cognome, di eta.. etc) una volta arrivati all'ultimo dialog, cioè una volta che l'utente ha messo tutte le informazioni che soddisfano i requisiti per la registrazione, la variabile globale InfoDate[MAX_PLAYERS] viene settata a 1 e l'utente viene rimandatato al Dialogo di registrazione che compierà nuovamente le istruzioni ma questa volta ne conseguirà che InfoDate[MAX_PLAYERS] è uguale a 1 e quindi vuol dire che le informazioni per i requisiti di registrazione da noi scaturiti sono state date dall'utente e si puo continuare con le funzioni che ci offre Y_INI che altro non servono per la scrittura dei dati nel file.ini del nostro utente.


E con questo è tutto, spero di esservi stato d'aiuto e che vi piaccia. So che non sono stato troppo dettagliato, poiché se lo avessi fatto avrei finito verso le 3 di scrivere questo post. Perciò se non capite qualcosa potete scrivere e se il compiler vi da qualche errore o warning postate qui.

Enjoooy!

ps: grazie Arcash :D

Messaggio modificato da Galletziz il 05 dicembre 2013 - 12:20

0

Pagina 1 di 1
  • Non puoi iniziare una nuova discussione
  • Non puoi rispondere a questa discussione

1 utenti stanno leggendo questa discussione
0 utenti, 1 ospiti, 0 utenti anonimi