25.03.2015, 17:09
(
Последний раз редактировалось Dutheil; 03.11.2015 в 15:44.
)
[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]
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 :
Nous partirons d'une page blanche pour ce tutoriel, tout d'abord, nous allons placer toutes les callbacks que nous utiliserons :
Nous allons commencer en crйer toutes nos variables et йnumйration :
Now, j'vais vous passer quelque macro dont on aura besoin pour ce systиme :
Trиs bien, la base de la base est faite, on va attaquer la connexion et la dйconnexion а la base de donnйe.
Rйcupйrons maintenant le pseudo du joueur :
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!
Vйrifions maintenant si le joueur possиde ou non un compte sur votre serveur :
On va
Passons а la connexion :
On va vйrifier maintenant si le joueur a tapй le bon mot de passe et lui attribuer ses informations.
On finit par la sauvegarde des informations lorsque le joueur se dйconnecte :
Aller en bonus j'vous ai fait зa car c'est trиs important pour 2 trus :
[COLOR="Red"]Le code entier, mкme si j'aime pas faire зa, le voici : [/COLOR]
[/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]
[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]
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(playerid, reason) // Nous l'utiliserons pour sauvegarder les informations et les rй-initialisйes
{
return 1;
}
public OnPlayerRequestClass(playerid, classid) // Nous l'utiliserons pour йtablir l'appel de la requкte threadйe
{
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) // Nous l'utiliserons pour gйrer les dialogues lors que l'inscription et la connexion du joueur
{
return 1;
}
//-----------------------------------------------------------------------------------------------------------------------------
public OnPlayerDeath(playerid, killerid, reason) // Bonus
{
return 1;
}
//--------------------------------------------------------------------
public OnPlayerText(playerid, text[]) // Bonus
{
return 1;
}
//--------------------------------------------------------------------
public OnPlayerCommandText(playerid, cmdtext[]) // 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_HOST, MYSQL_USER, MYSQL_DB, MYSQL_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(playerid, JoueurInfo[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(playerid, classid)
{
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(playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); // Obligatoire, sinon le joueur ne spawnera jamais
TogglePlayerSpectating(playerid, true); // Pour cacher les boutons en bas
new
req[128]; // Tableau dans lequel nous formaterons notre requкte SQL
mysql_format(mysql, req, sizeof(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(mysql, req, "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(str, GetName(playerid)); // "Bonjour {Pseudo}"
// On lui affiche le dialogue de connexion
return ShowPlayerDialog(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "Entre ton mot de passe :", "Connexion", "Quitter");
}
// Sinon on lui affiche le dialogue d'enregistrement
return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_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(playerid, dialogid, response, listitem, inputtext[])
{
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) < 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_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(mdphash, sizeof(mdphash), inputtext); // On hashe le mot de passe et on le stocke dans "mdphash"
mysql_format(mysql, req, sizeof(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(mysql, req);
// On exйcute la requкte sans appeler de fonctions publiques
new
str[MAX_PLAYER_NAME+9] = "Bonjour ";
strcat(str, GetName(playerid)); // "Bonjour {Pseudo}"
// Il s'est inscrit correctement, il doit maintenant se connecter
return ShowPlayerDialog(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "Ton compte a bien йtй enregistrй, entre de nouveau ton mot de passe :", "Connexion", "Quitter");
}
}
return 1;
}
Passons а la connexion :
PHP Code:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
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) < 5) // Si le mot de passe entrй est infйrieur а 5 caractиres
{
new
str[MAX_PLAYER_NAME+9] = "Bonjour ";
strcat(str, GetName(playerid));
return ShowPlayerDialog(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "Entre ton mot de passe :", "Connexion", "Quitter");
}
WP_Hash(JoueurInfo[playerid][Mdp], 129, inputtext); // 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(mysql, req, sizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s'", GetName(playerid));
// On sйlectionne toutes les informations par rapport au pseudo du joueur
return mysql_tquery(mysql, req, "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(mdp, JoueurInfo[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(playerid, false);
}
// Si le mot de passe n'йtait pas bon, la suite sera exйcutйe
new
str[MAX_PLAYER_NAME+9] = "Bonjour ";
strcat(str, GetName(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(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "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(playerid, reason)
{
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(mysql, req, sizeof(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(mysql, req);
// 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(playerid, killerid, reason)
{
if(killerid != INVALID_PLAYER_ID) JoueurInfo[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(playerid, text[])
{
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(playerid, cmdtext[])
{
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(playerid, JoueurInfo[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_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASSWORD);
return 1;
}
public OnGameModeExit()
return mysql_close(mysql);
public OnPlayerConnect(playerid)
return GetPlayerName(playerid, JoueurInfo[playerid][Pseudo], MAX_PLAYER_NAME+1);
public OnPlayerDisconnect(playerid, reason)
{
new
req[128];
mysql_format(mysql, req, sizeof(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(mysql, req);
static
array[Joueur_Informations];
JoueurInfo[playerid] = array;
return 1;
}
public OnPlayerRequestClass(playerid, classid)
{
if(IsPlayerLogguer(playerid)) return SpawnPlayer(playerid);
SetSpawnInfo(playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
TogglePlayerSpectating(playerid, true);
new
req[128];
mysql_format(mysql, req, sizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s' LIMIT 1", GetName(playerid));
mysql_tquery(mysql, req, "Verification", "i", playerid);
return 1;
}
forward Verification(playerid);
public Verification(playerid)
{
if(cache_get_row_count())
{
new
str[MAX_PLAYER_NAME+9] = "Bonjour ";
strcat(str, GetName(playerid));
return ShowPlayerDialog(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "Entre ton mot de passe :", "Connexion", "Quitter");
}
return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Enregistrement", "Pour t'inscrire entre un mot de passe de plus de 4 caractиres.", "Enregistrer", "Quitter");
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch(dialogid)
{
case DIALOG_REGISTER:
{
if(!response) return Kick(playerid);
if(isnull(inputtext) || strlen(inputtext) < 5) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_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(mdphash, sizeof(mdphash), inputtext);
mysql_format(mysql, req, sizeof(req), "INSERT INTO `Joueurs` (Pseudo, MotDePasse) VALUES ('%s', '%s')", GetName(playerid), mdphash);
mysql_tquery(mysql, req);
new
str[MAX_PLAYER_NAME+9] = "Bonjour ";
strcat(str, GetName(playerid));
return ShowPlayerDialog(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "Entre ton mot de passe :", "Connexion", "Quitter");
}
case DIALOG_CONNECTION:
{
if(!response) return Kick(playerid);
if(isnull(inputtext) || strlen(inputtext) < 5)
{
new
str[MAX_PLAYER_NAME+9] = "Bonjour ";
strcat(str, GetName(playerid));
return ShowPlayerDialog(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "Entre ton mot de passe :", "Connexion", "Quitter");
}
WP_Hash(JoueurInfo[playerid][Mdp], 129, inputtext);
new
req[128];
mysql_format(mysql, req, sizeof(req), "SELECT * FROM `Joueurs` WHERE `Pseudo` = '%s'", GetName(playerid));
return mysql_tquery(mysql, req, "Connection", "i", playerid);
}
}
return 1;
}
forward Connection(playerid);
public Connection(playerid)
{
new
mdp[129];
cache_get_field_content(0, "MotDePasse", mdp);
if(strcmp(mdp, JoueurInfo[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(playerid, false);
}
new
str[MAX_PLAYER_NAME+9] = "Bonjour ";
strcat(str, GetName(playerid));
return ShowPlayerDialog(playerid, DIALOG_CONNECTION, DIALOG_STYLE_INPUT, str, "Mot de passe fail\n\nEntre ton mot de passe :", "Connexion", "Quitter");
}
//-----------------------------------------------------------------------------------------------------------------------------
public OnPlayerDeath(playerid, killerid, reason)
{
if(killerid != INVALID_PLAYER_ID) JoueurInfo[killerid][Tuer]++;
JoueurInfo[playerid][Mort]++;
return 1;
}
//--------------------------------------------------------------------
public OnPlayerText(playerid, text[])
{
if(!IsPlayerLogguer(playerid)) return 0;
return 1;
}
//--------------------------------------------------------------------
public OnPlayerCommandText(playerid, cmdtext[])
{
if(!IsPlayerLogguer(playerid)) return 1;
if(strcmp(cmdtext, "/skinrandom", true) == 0)
{
do JoueurInfo[playerid][Skin] = random(300);
while(JoueurInfo[playerid][Skin] == 74);
return SetPlayerSkin(playerid, JoueurInfo[playerid][Skin]);
}
return 0;
}
[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]