[Tutorial] Base d'un systиme d'enregistrement avec Mysql R39-3 & Whirlpool
#1

[CENTER][SIZE="6"][COLOR="RoyalBlue"]Base d'un systиme d'enregistrement avec Mysql R39-3 & Whirlpool[/COLOR][/SIZE]
[COLOR="Red"]Ce tutoriel n'explique pas directement comment fonctionne le plugin mysql de BlueG & Maddinat0r[/COLOR], mais quelque chose d'un peu plus simple sur un systиme d'enregistrement.[/CENTER]

[SIZE="3"]Niveau de difficultй : Moyen[/SIZE]
[INDENT][SIZE="3"]Requis :[/SIZE][/INDENT]
  • Une connaissance des bases du Pawn
  • Une connaissance des bases du SQL
  • De la logique
  • [URL="https://github.com/pBlueG/SA-MP-MySQL/releases/tag/R39-3"]Plugin Mysql R39-3[/URL]
  • [URL="https://sampforum.blast.hk/showthread.php?tid=65290"]Plugin Whirlpool[/URL]
[INDENT][SIZE="3"]Fonctionnement :[/SIZE]
Un systиme trиs simple, oщ le joueur se connecte pour la premiиre fois, s'enregistre et se connecte.
Nous utiliserons le cache dans ce tutoriel et nous hacherons le mot de passe des joueurs.
Je mettrai quelque bonus а la fin pour que vous constatiez que ce genre de base fonctionne.

[SIZE="3"]Thйorie et Pratique :[/SIZE]
Avant d'commencer, voici le code SQL de la table pour ce tutoriel :
Code:
CREATE TABLE IF NOT EXISTS `Joueurs` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Pseudo` varchar(24) NOT NULL,
  `MotDePasse` varchar(128) NOT NULL,
  `AdminLevel` int(11) NOT NULL,
  `Skin` int(11) NOT NULL,
  `Tuer` int(11) NOT NULL,
  `Mort` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Nous partirons d'une page blanche pour ce tutoriel, tout d'abord, nous allons placer toutes les callbacks que nous utiliserons :
PHP Code:
#include <a_samp> // La base pour que les callbacks et fonctions soient reconnues par le compilateur
#include <a_mysql> // Les natives pour utiliser les fonctions de cache mysql

native WP_Hash(buffer[], len, const str[]); // La native Whirlpool

public OnGameModeInit() // Nous l'utiliserons pour йtablir la connexion а la base de donnйe
{

    return 
1;
}

public 
OnGameModeExit() // Nous l'utiliserons pour йtablir la dйconnexion de la base de donnйe
{
    return 
1;
}

public 
OnPlayerConnect(playerid// Nous l'utiliserons pour rйcupйrer seulement le pseudo du joueur
{

    return 
1;
}
public 
OnPlayerDisconnect(playeridreason// Nous l'utiliserons pour sauvegarder les informations et les rй-initialisйes
{

    return 
1;
}

public 
OnPlayerRequestClass(playeridclassid// Nous l'utiliserons pour йtablir l'appel de la requкte threadйe
{

    return 
1;
}

public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[]) // Nous l'utiliserons pour gйrer les dialogues lors que l'inscription et la connexion du joueur
{

    return 
1;
}

//-----------------------------------------------------------------------------------------------------------------------------

public OnPlayerDeath(playeridkilleridreason// Bonus
{

    return 
1;
}

//--------------------------------------------------------------------

public OnPlayerText(playeridtext[]) // Bonus
{

    return 
1;
}

//--------------------------------------------------------------------

public OnPlayerCommandText(playeridcmdtext[]) // Bonus
{

    return 
0;


Nous allons commencer en crйer toutes nos variables et йnumйration :
PHP Code:
#include <a_samp>
#include <a_mysql>

new
    
mysql// La variable qui stockera le pointeur de la connexion avec la base de donnйe

native WP_Hash(buffer[], len, const str[]);


enum Joueur_Informations
{
    
IDSql// ID Mysql
    
bool:Logguer// Si le joueur est logguй ou pas
    
Pseudo[MAX_PLAYER_NAME+1], // Le pseudo du joueur
    
Mdp[129], // Le mot de passe
    
Adminlevel// Son niveau admin
    
Skin// Son skin
    
Tuer// Son nombre de kills
    
Mort // Son nombre de morts
}

new 
    
JoueurInfo[MAX_PLAYERS][Joueur_Informations]; 

Now, j'vais vous passer quelque macro dont on aura besoin pour ce systиme :
PHP Code:
#include <a_samp>
#include <a_mysql>

new
    
mysql;

#define MYSQL_HOST ""
#define MYSQL_USER ""
#define MYSQL_DB ""
#define MYSQL_PASSWORD ""
// Les informations de votre base de donnйe

#define GetName(%0) JoueurInfo[%0][Pseudo]
// Macro permettant de rйcupйrer le pseudo du joueur

#define IsPlayerLogguer(%0) (JoueurInfo[%0][Logguer])
// Macro permettant de savoir si le joueur s'est logguй

#define DIALOG_REGISTER 0
#define DIALOG_CONNECTION 1
// Les IDs des dialogs 

native WP_Hash(buffer[], len, const str[]);

enum Joueur_Informations
{
    
IDSql,
    
bool:Logguer,
    
Pseudo[MAX_PLAYER_NAME+1],
    
Mdp[129],
    
Adminlevel,
    
Skin,
    
Tuer,
    
Mort    
}

new 
    
JoueurInfo[MAX_PLAYERS][Joueur_Informations]; 

Trиs bien, la base de la base est faite, on va attaquer la connexion et la dйconnexion а la base de donnйe.
PHP Code:
public OnGameModeInit()
{
    
mysql mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_DBMYSQL_PASSWORD);
    
// Connexion а la base de donnйe

    
return 1;
}

public 
OnGameModeExit()
    return 
mysql_close(mysql);
    
// Dйconnexion de la base de donnйe 

Rйcupйrons maintenant le pseudo du joueur :
PHP Code:
public OnPlayerConnect(playerid)
    return 
GetPlayerName(playeridJoueurInfo[playerid][Pseudo], MAX_PLAYER_NAME+1); 

So', il va maintenant falloir se concentrer, car si vous ne savez absolument pas comment vous pourriez faire pour la suite, vous risquez d'кtre perdu!
PHP Code:
public OnPlayerRequestClass(playeridclassid)
{
    if(
IsPlayerLogguer(playerid)) return SpawnPlayer(playerid); // Au cas oщ le joueur aurait forcй son retour а la sйlection des classes et qu'il serait dйjа logguй

    
SetSpawnInfo(playerid000000000000); // Obligatoire, sinon le joueur ne spawnera jamais
    
TogglePlayerSpectating(playeridtrue); // Pour cacher les boutons en bas

    
new
        
req[128]; // Tableau dans lequel nous formaterons notre requкte SQL

    
mysql_format(mysqlreqsizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s' LIMIT 1"GetName(playerid));
    
// On sйlectionne tous les informations par rapport au pseudo du joueur dans notre table "Joueurs"
    
mysql_tquery(mysqlreq"Verification""i"playerid);
    
// On exйcute notre requкte et on ira chercher nos informations dans notre thread "Verification"
    
return 1;


Vйrifions maintenant si le joueur possиde ou non un compte sur votre serveur :
PHP Code:
forward Verification(playerid);
public 
Verification(playerid)
{
    if(
cache_get_row_count()) // Si le compte a йtй trouvй
    
{
        new
            
str[MAX_PLAYER_NAME+9] = "Bonjour ";

        
strcat(strGetName(playerid)); // "Bonjour {Pseudo}"
        // On lui affiche le dialogue de connexion
        
return ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Entre ton mot de passe :""Connexion""Quitter");
    }

    
// Sinon on lui affiche le dialogue d'enregistrement
    
return ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Enregistrement""Pour t'inscrire entre un mot de passe de plus de 4 caractиres.""Enregistrer""Quitter");


On va
PHP Code:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    switch(
dialogid// On scanne la valeur de dialogid
    
{
        case 
DIALOG_REGISTER// Si dialogid contient la valeur de notre macro DIALOG_REGISTER
        
{
            if(!
response) return Kick(playerid); // Si le joueur a cliquй sur "Quitter" on le kick
            
if(strlen(inputtext) &lt5) return ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Enregistrement""Pour t'inscrire entre un mot de passe de plus de 4 caractиres.""Enregistrer""Quitter"); 
            
// Si le mot de passe entrй est infйrieur а 5 caractиres

            
new 
                
mdphash[129], // Tableau qui stockera le mot de passe hashй 
                
req[256]; // Tableau qui stockera la requкte SQL

            
WP_Hash(mdphashsizeof(mdphash), inputtext); // On hashe le mot de passe et on le stocke dans "mdphash"

            
mysql_format(mysqlreqsizeof(req), "INSERT INTO `Joueurs` (Pseudo, MotDePasse) VALUES ('%s', '%s')"GetName(playerid), mdphash);
            
// On formate la requкte SQL en y insйrant le pseudo et le mot de passe

            
mysql_tquery(mysqlreq);
            
// On exйcute la requкte sans appeler de fonctions publiques 

            
new
                
str[MAX_PLAYER_NAME+9] = "Bonjour ";

            
strcat(strGetName(playerid)); // "Bonjour {Pseudo}"

            // Il s'est inscrit correctement, il doit maintenant se connecter
            
return ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Ton compte a bien йtй enregistrй, entre de nouveau ton mot de passe :""Connexion""Quitter");
        }
    }

    return 
1;


Passons а la connexion :
PHP Code:
public OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    switch(
dialogid// On scanne la valeur de dialogid
    
{
        case 
DIALOG_CONNECTION// Si dialogid contient la valeur de notre macro DIALOG_CONNECTION
        
{
            if(!
response) return Kick(playerid); // Si le joueur a cliquй sur "Quitter" on le kick
            
if(strlen(inputtext) &lt5// Si le mot de passe entrй est infйrieur а 5 caractиres
            
{
                new
                    
str[MAX_PLAYER_NAME+9] = "Bonjour ";

                
strcat(strGetName(playerid));

                return 
ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Entre ton mot de passe :""Connexion""Quitter");
            }

            
WP_Hash(JoueurInfo[playerid][Mdp], 129inputtext); // On hashe le mot de passe entrй et on le place dans notre table "Mdp"

            
new
                
req[128]; // Tableau dans lequel on formate notre requкte SQL

            
mysql_format(mysqlreqsizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s'"GetName(playerid));
            
// On sйlectionne toutes les informations par rapport au pseudo du joueur
            
return mysql_tquery(mysqlreq"Connection""i"playerid);
            
// On Exйcute la requкte et on appelle la fonction publique "Connection" avec comme paramиtre l'id du joueur
        
}
    }

    return 
1;


On va vйrifier maintenant si le joueur a tapй le bon mot de passe et lui attribuer ses informations.
PHP Code:
forward Connection(playerid);
public 
Connection(playerid)
{
    new 
        
mdp[129]; // Tableau dans lequel on va stocker le mot de passe dans la base de donnйe

    
cache_get_field_content(0"MotDePasse"mdp); // On rйcupиre me mot de passe et on le stocke dans la variable "mdp"

    
if(strcmp(mdpJoueurInfo[playerid][Mdp], true) == 0// On vйrifie que les mots de passe sont identiques
    
{
        
JoueurInfo[playerid][IDSql] = cache_get_field_content_int(0"ID");
        
JoueurInfo[playerid][Adminlevel] = cache_get_field_content_int(0"AdminLevel");
        
JoueurInfo[playerid][Skin] = cache_get_field_content_int(0"Skin");
        
JoueurInfo[playerid][Tuer] = cache_get_field_content_int(0"Tuer");
        
JoueurInfo[playerid][Mort] = cache_get_field_content_int(0"Mort");
        
JoueurInfo[playerid][Logguer] = true;
        
// On rйcupиre toutes les informations

        // On retourne la fonction en dйsactivant le mode spectateur, зa fera spawn le joueur
        
return TogglePlayerSpectating(playeridfalse);
    }

    
// Si le mot de passe n'йtait pas bon, la suite sera exйcutйe    

    
new
        
str[MAX_PLAYER_NAME+9] = "Bonjour ";

    
strcat(strGetName(playerid)); // "Bonjour {Pseudo}" 

    // On averti le joueur dans le dialogue que le mot de passe n'est pas bon et on lui propose de retaper son mot de passe
    
return ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Mot de passe fail\n\nEntre ton mot de passe :""Connexion""Quitter");


On finit par la sauvegarde des informations lorsque le joueur se dйconnecte :
PHP Code:
public OnPlayerDisconnect(playeridreason)
{
    new
        
req[128]; // Le tableau dans lequel nous aurons notre requкte SQL

    // On update les informations du joueur par rapport а son ID dans la base de donnйe
    
mysql_format(mysqlreqsizeof(req), "\
                                            UPDATE `Joueurs` SET \
                                            AdminLevel = %d, \
                                            Skin = %d, \
                                            Tuer = %d, \
                                            Mort = %d \
                                            WHERE ID = %d"
,

                                            
JoueurInfo[playerid][Adminlevel],
                                            
JoueurInfo[playerid][Skin],
                                            
JoueurInfo[playerid][Tuer],
                                            
JoueurInfo[playerid][Mort],
                                            
JoueurInfo[playerid][IDSql]);

    
mysql_tquery(mysqlreq);
    
// On exйcute la requкte

    
static 
        array[
Joueur_Informations];

    
JoueurInfo[playerid] = array; // On rй-initialise les informations du joueurs

    
return 1;


Aller en bonus j'vous ai fait зa car c'est trиs important pour 2 trus :
PHP Code:
public OnPlayerDeath(playeridkilleridreason)
{
    if(
killerid != INVALID_PLAYER_IDJoueurInfo[killerid][Tuer]++; // On incrйmente le nombre de tuer, si le killerid est une id valide
    
JoueurInfo[playerid][Mort]++; // On incrйmente le nombre de morts de playerid

    
return 1;
}

//--------------------------------------------------------------------

public OnPlayerText(playeridtext[])
{
    if(!
IsPlayerLogguer(playerid)) return 0// Si le joueur presse F6 lors de l'inscription/connexion, зa l'empкchera d'envoyer un message (merci Vuki)

    
return 1;
}

//--------------------------------------------------------------------

public OnPlayerCommandText(playeridcmdtext[])
{
    if(!
IsPlayerLogguer(playerid)) return 1// Pareil que OnPlayerText

    
if(strcmp(cmdtext"/skinrandom"true) == 0// Bref vous savez faire une commande avec strcmp....
    
{    
        do 
JoueurInfo[playerid][Skin] = random(300); // On appelle random pour qu'il sorte un nombre entre 0 et 299 qu'on stocke dans la variable "Skin"
        
while(JoueurInfo[playerid][Skin] == 74); // Si celui-ci est йgal а 74, on rappelle le contenu de "do"

        
return SetPlayerSkin(playeridJoueurInfo[playerid][Skin]); // On retourne la commande en appelant SetPlayerSkin
    
}

    return 
0;


[COLOR="Red"]Le code entier, mкme si j'aime pas faire зa, le voici : [/COLOR]
PHP Code:
#include <a_samp>
#include <a_mysql>

new
    
mysql;

#define MYSQL_HOST ""
#define MYSQL_USER ""
#define MYSQL_DB ""
#define MYSQL_PASSWORD ""

#define GetName(%0) JoueurInfo[%0][Pseudo]
#define IsPlayerLogguer(%0) (JoueurInfo[%0][Logguer])

#define DIALOG_REGISTER 0
#define DIALOG_CONNECTION 1

#if !defined isnull
    #define isnull(%1) \
                
((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif

native WP_Hash(buffer[], len, const str[]);

enum Joueur_Informations
{
    
IDSql,
    
bool:Logguer,
    
Pseudo[MAX_PLAYER_NAME+1],
    
Mdp[129],
    
Adminlevel,
    
Skin,
    
Tuer,
    
Mort    
}

new 
    
JoueurInfo[MAX_PLAYERS][Joueur_Informations];

public 
OnGameModeInit()
{
    
mysql mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_DBMYSQL_PASSWORD);
    return 
1;
}

public 
OnGameModeExit()
    return 
mysql_close(mysql);

public 
OnPlayerConnect(playerid)
    return 
GetPlayerName(playeridJoueurInfo[playerid][Pseudo], MAX_PLAYER_NAME+1);

public 
OnPlayerDisconnect(playeridreason)
{
    new
        
req[128];

    
mysql_format(mysqlreqsizeof(req), "\
                                            UPDATE `Joueurs` SET \
                                            AdminLevel = %d, \
                                            Skin = %d, \
                                            Tuer = %d, \
                                            Mort = %d \
                                            WHERE ID = %d"
,

                                            
JoueurInfo[playerid][Adminlevel],
                                            
JoueurInfo[playerid][Skin],
                                            
JoueurInfo[playerid][Tuer],
                                            
JoueurInfo[playerid][Mort],
                                            
JoueurInfo[playerid][IDSql]);

    
mysql_tquery(mysqlreq);

    static 
        array[
Joueur_Informations];

    
JoueurInfo[playerid] = array;

    return 
1;
}

public 
OnPlayerRequestClass(playeridclassid)
{
    if(
IsPlayerLogguer(playerid)) return SpawnPlayer(playerid);

    
SetSpawnInfo(playerid000000000000);
    
TogglePlayerSpectating(playeridtrue);

    new
        
req[128];

    
mysql_format(mysqlreqsizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s' LIMIT 1"GetName(playerid));
    
mysql_tquery(mysqlreq"Verification""i"playerid);

    return 
1;
}

forward Verification(playerid);
public 
Verification(playerid)
{
    if(
cache_get_row_count())
    {
        new
            
str[MAX_PLAYER_NAME+9] = "Bonjour ";

        
strcat(strGetName(playerid));

        return 
ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Entre ton mot de passe :""Connexion""Quitter");
    }

    return 
ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Enregistrement""Pour t'inscrire entre un mot de passe de plus de 4 caractиres.""Enregistrer""Quitter");
}

public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    switch(
dialogid)
    {
        case 
DIALOG_REGISTER:
        {
            if(!
response) return Kick(playerid);
            if(
isnull(inputtext) || strlen(inputtext) &lt5) return ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Enregistrement""Pour t'inscrire entre un mot de passe de plus de 4 caractиres.""Enregistrer""Quitter"); 

            new 
                
mdphash[129],
                
req[256];

            
WP_Hash(mdphashsizeof(mdphash), inputtext);

            
mysql_format(mysqlreqsizeof(req), "INSERT INTO `Joueurs` (Pseudo, MotDePasse) VALUES ('%s', '%s')"GetName(playerid), mdphash);
            
mysql_tquery(mysqlreq);

            new
                
str[MAX_PLAYER_NAME+9] = "Bonjour ";

            
strcat(strGetName(playerid));

            return 
ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Entre ton mot de passe :""Connexion""Quitter");
        }

        case 
DIALOG_CONNECTION:
        {
            if(!
response) return Kick(playerid);
            if(
isnull(inputtext) || strlen(inputtext) &lt5)
            {
                new
                    
str[MAX_PLAYER_NAME+9] = "Bonjour ";

                
strcat(strGetName(playerid));

                return 
ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Entre ton mot de passe :""Connexion""Quitter");
            }

            
WP_Hash(JoueurInfo[playerid][Mdp], 129inputtext);

            new
                
req[128];

            
mysql_format(mysqlreqsizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s'"GetName(playerid));
            return 
mysql_tquery(mysqlreq"Connection""i"playerid);
        }
    }

    return 
1;
}

forward Connection(playerid);
public 
Connection(playerid)
{
    new 
        
mdp[129];

    
cache_get_field_content(0"MotDePasse"mdp);

    if(
strcmp(mdpJoueurInfo[playerid][Mdp], true) == 0)
    {
        
JoueurInfo[playerid][IDSql] = cache_get_field_content_int(0"ID");
        
JoueurInfo[playerid][Adminlevel] = cache_get_field_content_int(0"AdminLevel");
        
JoueurInfo[playerid][Skin] = cache_get_field_content_int(0"Skin");
        
JoueurInfo[playerid][Tuer] = cache_get_field_content_int(0"Tuer");
        
JoueurInfo[playerid][Mort] = cache_get_field_content_int(0"Mort");
        
JoueurInfo[playerid][Logguer] = true;

        return 
TogglePlayerSpectating(playeridfalse);
    }

    new
        
str[MAX_PLAYER_NAME+9] = "Bonjour ";

    
strcat(strGetName(playerid));

    return 
ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Mot de passe fail\n\nEntre ton mot de passe :""Connexion""Quitter");
}

//-----------------------------------------------------------------------------------------------------------------------------

public OnPlayerDeath(playeridkilleridreason)
{
    if(
killerid != INVALID_PLAYER_IDJoueurInfo[killerid][Tuer]++;
    
JoueurInfo[playerid][Mort]++;

    return 
1;
}

//--------------------------------------------------------------------

public OnPlayerText(playeridtext[])
{
    if(!
IsPlayerLogguer(playerid)) return 0;

    return 
1;
}

//--------------------------------------------------------------------

public OnPlayerCommandText(playeridcmdtext[])
{
    if(!
IsPlayerLogguer(playerid)) return 1;

    if(
strcmp(cmdtext"/skinrandom"true) == 0)
    {    
        do 
JoueurInfo[playerid][Skin] = random(300);
        while(
JoueurInfo[playerid][Skin] == 74);

        return 
SetPlayerSkin(playeridJoueurInfo[playerid][Skin]);
    }

    return 
0;

[/INDENT]
[CENTER]Tutoriel enfin, j'ai trиs peu йcrit entre chaque code montrй, car j'ai selon moi, assez expliquй dans les commentaires а chaque ligne.

Si vous constatez qu'il y a un bug, qu'j'ai fait une erreur quelque part ou que vous avez une question car vous ne comprenez pas quelque chose; n'hйsitez pas а vous manifestez dans ce topic !

Allez bisous ![/CENTER]
Reply
#2

Je trouve que tu n'explique pas trop lа. Je prend l'exemple du cache_get_row_count, зa fonctionne comment ? Il y a aucun paramиtre ni rien, tu met juste "Si le compte a йtй trouvй"
Reply
#3

Comme je l'ai dit au dйbut
Quote:Ce tutoriel n'explique pas directement comment fonctionne le plugin mysql de BlueG & Maddinat0r

Je comptais poster un tutoriel sur l'utilisation des fonctions de ce plugin avant d'attaquer des tels tutoriels, mais bon.
Reply
#4

new
str[MAX_PLAYER_NAME+9]

Tu a oubliй le caractиre null du nom (\0 je crois)

Sinon merci, j'en avais fais un aussi
Reply
#5

No'p "Bonjour " = 8 caractиres + le nullbyte = 9 :D
Reply
#6

Trиs bon tutoriel comme toujours !
Reply
#7

Ca ressemble pas а un tutoriel, mais plutфt а un FS.
Reply
#8

J'йditerai pour expliquer mieux, c'vrai qu'y'en qui vont кtre perdus
Reply
#9

Merci du partage.
La prйsentation est trиs belle !
Et trиs bon tutoriel.
Reply
#10

Dutheil;3413390 Wrote:No'p "Bonjour " = 8 caractиres + le nullbyte = 9 :D

Justement le nullbyte c'est l'espace dans ton string ? Un espace c'est un caractиre, donc sa fais 9 ?
Reply
#11

No'p l'espace c'pour pas que le pseudo rajoutй avec strcat (j'ai pas utilisй format, зa consomme trop pour зa) soit collй au "Bonjour"
Reply
#12

Ah d'accord mais sa change pas, que du-coups "Bonjour" (8 caractиres) " " (1 caractиre) "Jean_FrancoisLalaLaLaLaL" (24 caractиres) = 8+1+24 = 33 et ton string fais, 32.
Reply
#13

Faut que tu apprennes а compter... "Bonjour" contient 7 caractиres ptddddr
Reply
#14

Ah merde, donc je me suis taper la honte. Merde, pire que Keukeu qui optimise ses couleurs... :'(
Reply
#15

Essaye pas de clash Kйvin quand tu sais que tu vas te faire clash.

D'ailleurs, si tu veux rйellement optimiser, dйclare les tableaux dйclarant les noms de joueurs avec 21 et non 25 (MAX_PLAYER_NAME+1 par dйfaut) cells. Un joueur ne peut se connecter qu'avec un pseudo de 20 caractиres. Modifie la valeur de MAX_PLAYER_NAME ;)
Reply
#16

Ouais bon fuck hein ils se dйmerdent ptdddr
Reply
#17

Salut,

J'ai un p'tit problиme, lorsque je me connecte je me retrouve en camйra spectateur а Bluebery, mais aucun dialogue ne s'affiche... Et il ne se passe rien enfaоte, rien du tout. Et vu que c'est pas mon code et que en plus de зa j'ai trop de mal avec ta faзon de coder (je comprend plus rien avec les macros etc...), donc help me please !

Merci !
Reply
#18

Montre le code
Reply
#19

Ben, le code c'est le tient mdr. J'ai rien modifiй, j'ai utilisй les mкme trucs dans PHPMyAdmin....

PHP Code:
// This is a comment
// uncomment the line below if you want to write a filterscript

#include <a_samp>
#include <a_mysql>

new mysql;

#define FILTERSCRIPT
#define TABLE_JOUEURS "joueurs"

#define GetName(%0) JoueurInfo[%0][Pseudo] 
// Macro permettant de rйcupйrer le pseudo du joueur 

#define IsPlayerLogguer(%0) (JoueurInfo[%0][Logguer]) 
// Macro permettant de savoir si le joueur s'est logguй 

#define DIALOG_REGISTER 0 
#define DIALOG_CONNECTION 1 
// Les IDs des dialogs

enum Joueur_Informations 

    
IDSql// ID Mysql 
    
bool:Logguer// Si le joueur est logguй ou pas 
    
Pseudo[MAX_PLAYER_NAME+1], // Le pseudo du joueur 
    
Mdp[129], // Le mot de passe 
    
Adminlevel// Son niveau admin 
    
Skin// Son skin 
    
Tuer// Son nombre de kills 
    
Mort // Son nombre de morts 
}

new 
JoueurInfo[MAX_PLAYERS][Joueur_Informations];

native WP_Hash(buffer[], len, const str[]); // La native Whirlpool

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{

    
mysql mysql_connect("localhost""root""SAMP""root");

    print(
"\n--------------------------------------");
    print(
" Inscription/Connexion SQL");
    print(
"--------------------------------------\n");
    return 
1;
}

public 
OnFilterScriptExit()
{
    return 
mysql_close(mysql);
}

public 
OnPlayerRequestClass(playeridclassid// Nous l'utiliserons pour йtablir l'appel de la requкte threadйe 
{

    if(
IsPlayerLogguer(playerid)) return SpawnPlayer(playerid); // Au cas oщ le joueur aurait forcй son retour а la sйlection des classes et qu'il serait dйjа logguй 

    
SetSpawnInfo(playerid000000000000); // Obligatoire, sinon le joueur ne spawnera jamais 
    
TogglePlayerSpectating(playeridtrue); // Pour cacher les boutons en bas 

    
new req[128]; // Tableau dans lequel nous formaterons notre requкte SQL

    
mysql_format(mysqlreqsizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s' LIMIT 1"GetName(playerid)); 
    
// On sйlectionne tous les informations par rapport au pseudo du joueur dans notre table "Joueurs" 
    
mysql_tquery(mysqlreq"Verification""i"playerid); 
    
// On exйcute notre requкte et on ira chercher nos informations dans notre thread "Verification" 
    
return 1;
}

#endif

public OnPlayerConnect(playerid// Nous l'utiliserons pour rйcupйrer seulement le pseudo du joueur 

    return 
GetPlayerName(playeridJoueurInfo[playerid][Pseudo], MAX_PLAYER_NAME+1); 
}

public 
OnPlayerDisconnect(playeridreason

    new 
req[128]; // Le tableau dans lequel nous aurons notre requкte SQL 

    // On update les informations du joueur par rapport а son ID dans la base de donnйe 
    
mysql_format(mysqlreqsizeof(req), "\ 
                                            UPDATE `Joueurs` SET \ 
                                            AdminLevel = %d, \ 
                                            Skin = %d, \ 
                                            Tuer = %d, \ 
                                            Mort = %d \ 
                                            WHERE ID = %d"


                                            
JoueurInfo[playerid][Adminlevel], 
                                            
JoueurInfo[playerid][Skin], 
                                            
JoueurInfo[playerid][Tuer], 
                                            
JoueurInfo[playerid][Mort], 
                                            
JoueurInfo[playerid][IDSql]); 

    
mysql_tquery(mysqlreq); 
    
// On exйcute la requкte 

    
static  
        array[
Joueur_Informations]; 

    
JoueurInfo[playerid] = array; // On rй-initialise les informations du joueurs 

    
return 1


public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[]) // Nous l'utiliserons pour gйrer les dialogues lors que l'inscription et la connexion du joueur

    switch(
dialogid// On scanne la valeur de dialogid 
    

        case 
DIALOG_REGISTER// Si dialogid contient la valeur de notre macro DIALOG_REGISTER 
        

            if(!
response) return Kick(playerid); // Si le joueur a cliquй sur "Quitter" on le kick 
            
if(strlen(inputtext) &lt5) return ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Enregistrement""Pour t'inscrire entre un mot de passe de plus de 4 caractиres.""Enregistrer""Quitter");  
            
// Si le mot de passe entrй est infйrieur а 5 caractиres 

            
new req[129]; // Tableau qui stockera le mot de passe hashй et la requкte SQL 

            
WP_Hash(reqsizeof(req), inputtext); // On hashe le mot de passe et on le stocke dans "req" 

            
mysql_format(mysqlreqsizeof(req), "INSERT INTO `Joueurs` (Pseudo, MotDePasse) VALUES ('%s', '%s')"GetName(playerid), req); 
            
// On formate la requкte SQL en y insйrant le pseudo et le mot de passe 

            
mysql_tquery(mysqlreq); 
            
// On exйcute la requкte sans appeler de fonctions publiques  

            
new str[MAX_PLAYER_NAME+9] = "Bonjour "

            
strcat(strGetName(playerid)); // "Bonjour {Pseudo}" 

            // Il s'est inscrit correctement, il doit maintenant se connecter 
            
return ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Ton compte a bien йtй enregistrй, entre de nouveau ton mot de passe :""Connexion""Quitter"); 
        }

        case 
DIALOG_CONNECTION// Si dialogid contient la valeur de notre macro DIALOG_CONNECTION 
        

            if(!
response) return Kick(playerid); // Si le joueur a cliquй sur "Quitter" on le kick 
            
if(strlen(inputtext) &lt5// Si le mot de passe entrй est infйrieur а 5 caractиres 
            

                new 
str[MAX_PLAYER_NAME+9] = "Bonjour "

                
strcat(strGetName(playerid)); 

                return 
ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Entre ton mot de passe :""Connexion""Quitter"); 
            } 

            
WP_Hash(JoueurInfo[playerid][Mdp], 129inputtext); // On hashe le mot de passe entrй et on le place dans notre table "Mdp" 

            
new req[128]; // Tableau dans lequel on formate notre requкte SQL 

            
mysql_format(mysqlreqsizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s'"GetName(playerid)); 
            
// On sйlectionne toutes les informations par rapport au pseudo du joueur 
            
return mysql_tquery(mysqlreq"Connection""i"playerid); 
            
// On Exйcute la requкte et on appelle la fonction publique "Connection" avec comme paramиtre l'id du joueur 
        
}
    }

    return 
1


//----------------------------------------------------------------------------------------------------------------------------- 

public OnPlayerDeath(playeridkilleridreason

    if(
killerid != INVALID_PLAYER_IDJoueurInfo[killerid][Tuer]++; // On incrйmente le nombre de tuer, si le killerid est une id valide 
    
JoueurInfo[playerid][Mort]++; // On incrйmente le nombre de morts de playerid 

    
return 1


//-------------------------------------------------------------------- 

public OnPlayerText(playeridtext[]) 

    if(!
IsPlayerLogguer(playerid)) return 0// Si le joueur presse F6 lors de l'inscription/connexion, зa l'empкchera d'envoyer un message (merci Vuki) 

    
return 1


//-------------------------------------------------------------------- 

public OnPlayerCommandText(playeridcmdtext[]) 

    if(!
IsPlayerLogguer(playerid)) return 1// Pareil que OnPlayerText 

    
if(strcmp(cmdtext"/skinrandom"true) == 0// Bref vous savez faire une commande avec strcmp.... 
    
{     
        do 
JoueurInfo[playerid][Skin] = random(300); // On appelle random pour qu'il sorte un nombre entre 0 et 299 qu'on stocke dans la variable "Skin" 
        
while(JoueurInfo[playerid][Skin] == 74); // Si celui-ci est йgal а 74, on rappelle le contenu de "do" 

        
return SetPlayerSkin(playeridJoueurInfo[playerid][Skin]); // On retourne la commande en appelant SetPlayerSkin 
    


    return 
0
}

forward Verification(playerid); 
public 
Verification(playerid

    if(
cache_get_row_count()) // Si le compte a йtй trouvй 
    

        new 
str[MAX_PLAYER_NAME+9] = "Bonjour "

        
strcat(strGetName(playerid)); // "Bonjour {Pseudo}" 
        // On lui affiche le dialogue de connexion 
        
return ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Entre ton mot de passe :""Connexion""Quitter"); 
    } 

    
// Sinon on lui affiche le dialogue d'enregistrement 
    
return ShowPlayerDialog(playeridDIALOG_REGISTERDIALOG_STYLE_INPUT"Enregistrement""Pour t'inscrire entre un mot de passe de plus de 4 caractиres.""Enregistrer""Quitter"); 
}

forward Connection(playerid); 
public 
Connection(playerid

    new  
        
mdp[129]; // Tableau dans lequel on va stocker le mot de passe dans la base de donnйe 

    
cache_get_field_content(0"MotDePasse"mdp); // On rйcupиre me mot de passe et on le stocke dans la variable "mdp" 

    
if(strcmp(mdpJoueurInfo[playerid][Mdp], true) == 0// On vйrifie que les mots de passe sont identiques 
    

        
JoueurInfo[playerid][IDSql] = cache_get_field_content_int(0"ID"); 
        
JoueurInfo[playerid][Adminlevel] = cache_get_field_content_int(0"AdminLevel"); 
        
JoueurInfo[playerid][Skin] = cache_get_field_content_int(0"Skin"); 
        
JoueurInfo[playerid][Tuer] = cache_get_field_content_int(0"Tuer"); 
        
JoueurInfo[playerid][Mort] = cache_get_field_content_int(0"Mort"); 
        
JoueurInfo[playerid][Logguer] = true
        
// On rйcupиre toutes les informations 

        // On retourne la fonction en dйsactivant le mode spectateur, зa fera spawn le joueur 
        
return TogglePlayerSpectating(playeridfalse); 
    } 

    
// Si le mot de passe n'йtait pas bon, la suite sera exйcutйe     

    
new 
        
str[MAX_PLAYER_NAME+9] = "Bonjour "

    
strcat(strGetName(playerid)); // "Bonjour {Pseudo}"  

    // On averti le joueur dans le dialogue que le mot de passe n'est pas bon et on lui propose de retaper son mot de passe 
    
return ShowPlayerDialog(playeridDIALOG_CONNECTIONDIALOG_STYLE_INPUTstr"Mot de passe fail\n\nEntre ton mot de passe :""Connexion""Quitter"); 


C'est juste en FS, mais ca revient au mкme (d'ailleurs j'ai le mкme en Gamemode et c'est la mкme chose)

EDIT : du moins, j'ai enlevй les macros de connexion а la BDD et quelque modification d'indentation...
Reply
#20

Ok, dйsolй DP.

Enfaite c'est moi qui suis con, j'aurais pas du mettre "root" dans le pasword pour ma BDD... Dsl du up inutile et du dйrangement зa marche bien ^^....

Ben, j'en profite, merci pour l'tuto' !
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)