Système d'enregistrement
Lun 12 Fév 2018 - 22:33
Vous pouvez retrouver le tutoriel originale sur ce lien : http://forum.sa-mp.com/showthread.php?t=273088
traduit par moi
Système d'enregistrement avec Y_Ini
"J'ai vu plusieurs personnes utilisant Dini, et plusieurs me demandait de créé un tutorial afin de passer a un nouveau système.J'ai donc créé ce tuto pour ces gens afin qu'il passe à un nouveau système, voir l'un des meilleurs"
Qu'est-ce que c'est?
Un simple tutorial afin de créé un système d'enregistrement avec Y_Ini.
Qu'est-ce que Y_Ini?
Qu'est-ce que Y_Ini?
Y_Ini est un système de fichier ini, il a été créé par Y_Less. Il est inclue dans les librairies de Y_Ini et comprend aussi y_commands (YCMD) et y_groups.
Quelle est la différence entre Y_Ini et mon système de fichier
Y_INI a été prouvé qu'il était l'un de plus rapideet les pluséfficace pour un système de fichier .Ini. Vous pouvez en lire plus en visitant ce lien: http://forum.sa-mp.com/showthread.php?t=175565
Comment installer Y_Ini?
Vous devez tout d'abord télécharger y_ini sur ce lien----> http://forum.sa-mp.com/showthread.php?t=175565. Lorsque le téléchargement est terminé, placer le dossier YSI dans le dossierpawno/includes
Étape I
Ajouté l'include Y_Ini dans votre script
[PAWN]
#include
[/PAWN]
Ajouté l'include Y_Ini dans votre script
[PAWN]
#include
[/PAWN]
Il contient le nécessaire a la création d'un système d'enregistrement
Étape II
Nous allons définir quelques dialog.
[PAWN]
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4
[/PAWN]
Étape III
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_SUCCESS_1 3
#define DIALOG_SUCCESS_2 4
[/PAWN]
Étape III
Définissez le chemin des fichiers .Ini. Pour ce tutoriel, nous utiliseront Comptes/ Attention, il vous faudra créé le dossier manuellement dans scriptfiles!
[PAWN]
#define PATH "/Comptes/%s.ini"
[/PAWN]
Étape IV
Ajoutez quelques couleurs.
[PAWN]
#define COL_WHITE "{FFFFFF}"
#define COL_RED "{F81414}"
#define COL_GREEN "{00FF22}"
#define COL_LIGHTBLUE "{00CED1}"
[/PAWN]
Étape V
#define PATH "/Comptes/%s.ini"
[/PAWN]
Étape IV
Ajoutez quelques couleurs.
[PAWN]
#define COL_WHITE "{FFFFFF}"
#define COL_RED "{F81414}"
#define COL_GREEN "{00FF22}"
#define COL_LIGHTBLUE "{00CED1}"
[/PAWN]
Étape V
Nous allons utiliser enum, afin de stocker nos variables.
[PAWN]
enum pInfo
{
pPass,
pCash,
pAdmin,
pKills,
pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];
[/PAWN]
enum pInfo
{
pPass,
pCash,
pAdmin,
pKills,
pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];
[/PAWN]
Étape VI
Nous allons créé une fonction afin de charger les informations du joueur. De préférence, placer le en bas de votre script
[PAWN]
forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
INI_Int("Password",PlayerInfo[playerid][pPass]);
INI_Int("Cash",PlayerInfo[playerid][pCash]);
INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
INI_Int("Kills",PlayerInfo[playerid][pKills]);
INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
return 1;
}
[/PAWN]
forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
INI_Int("Password",PlayerInfo[playerid][pPass]);
INI_Int("Cash",PlayerInfo[playerid][pCash]);
INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
INI_Int("Kills",PlayerInfo[playerid][pKills]);
INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
return 1;
}
[/PAWN]
.Étape VII
Nous allons créé une fonction stock au nom de UserPath. Tout en bas du script de préférence
[PAWN]
stock UserPath(playerid)
{
new string[128],playername[MAX_PLAYER_NAME];
GetPlayerName(playerid,playername,sizeof(playername));
format(string,sizeof(string),PATH,playername);
return string;
}
[/PAWN]
Cette fonction stock nous sera utile afin de charger la position du fichier d'informations du joueur.
stock UserPath(playerid)
{
new string[128],playername[MAX_PLAYER_NAME];
GetPlayerName(playerid,playername,sizeof(playername));
format(string,sizeof(string),PATH,playername);
return string;
}
[/PAWN]
Cette fonction stock nous sera utile afin de charger la position du fichier d'informations du joueur.
.Étape VIII
Ajouter ce code en dessous du stock que vous venez de rajouter
[PAWN]
/*Credits to Dracoblue*/
stock udb_hash(buf[]) {
new length=strlen(buf);
new s1 = 1;
new s2 = 0;
new n;
for (n=0; n {
s1 = (s1 + buf[n]) % 65521;
s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
}
[/PAWN]
[PAWN]
/*Credits to Dracoblue*/
stock udb_hash(buf[]) {
new length=strlen(buf);
new s1 = 1;
new s2 = 0;
new n;
for (n=0; n
s1 = (s1 + buf[n]) % 65521;
s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
}
[/PAWN]
Il permettra de ''Hasher'' les mots de passe pour une plus grande sécurité, Credits à Dracoblue.
Étape IX
Nous allons utiliser le callback OnPlayerConnect pour voir si le joueur est enregistré ou non.
[PAWN]
public OnPlayerConnect(playerid)
{
if(fexist(UserPath(playerid)))
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Connection",""COL_WHITE"Veuillez entrer votre mot de passe pour vous connecter.","Connexion","Quitter");
}
else
{
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Enregistrement",""COL_WHITE"Entrez un mot de passe afin de créer un compte.","S'enregistrer","Quitter");
}
return 1;
}
[/PAWN]
[PAWN]
public OnPlayerConnect(playerid)
{
if(fexist(UserPath(playerid)))
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Connection",""COL_WHITE"Veuillez entrer votre mot de passe pour vous connecter.","Connexion","Quitter");
}
else
{
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Enregistrement",""COL_WHITE"Entrez un mot de passe afin de créer un compte.","S'enregistrer","Quitter");
}
return 1;
}
[/PAWN]
Nous allons utiliser la fonction ''fexist'' afin de rechercher. Les paramètres sont mit a la fonction stock que nous avons créé. Si le fichier existe, nous allons recevoir un message de Connexion. Sinon, un message d'enregistrement
Étape X
[PAWN]
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch( dialogid )
{
case DIALOG_REGISTER:
{
if (!response) return Kick(playerid);
if(response)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_WHITE"Enregistrement",""COL_RED"Vous avez entré un mot de passe invalide\n"COL_WHITE"Entrer un mot de passe afin de vous enregistrer.","S'enregistrer","Quitter");
new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Password",udb_hash(inputtext));
INI_WriteInt(File,"Cash",0);
INI_WriteInt(File,"Admin",0);
INI_WriteInt(File,"Kills",0);
INI_WriteInt(File,"Deaths",0);
INI_Close(File);
SetSpawnInfo(playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
ShowPlayerDialog(playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"Super! Votre système de Y_Ini marche parfaitement. Reconnecter vous afin de sauvegarder vos stats!",'Ok","");
}
}
case DIALOG_LOGIN:
{
if ( !response ) return Kick ( playerid );
if( response )
{
if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);
ShowPlayerDialog(playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"Vous vous êtes correctement connecté!","Ok","");
}
else
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Connection",""COL_RED"Vous avez entré un mot de passe invalide.\n"COL_WHITE"Veuillez entrer votre mot de passe pour vous connecter.","Connexion","Quitter");
}
return 1;
}
}
}
return 1;
}
[/PAWN]
Au lieu d'utiliser if, j'ai utiliser case, il est plus rapide et moins long.(!response) est la fonction si le joueur n'a pas cliqué de bouton, allors il sera kické
Le (!strlen(inputtext)) vérifie si il y a bien quelque chose d'écrit, sinon on affichera un message disant mot de passe invalide.
Si tout se passe bien, votre système devrait correctement charger les fichiers des joueurs. Lorsque démarré,la fonction'INI_WriteInt' est appelé afin d'écrire les informations de joueur. Le udb_hash génèrera un code hashé avec le inputtext(ce que vous avez écrit). Lorsque tout est complété, nous fermons avec "INI_Close".
Lorsque terminé, on vous demandera de vous connecter.
Dans 'DIALOG_LOGIN', si la réponse est false(vous avez cliquer sur 'QUIT), vous serez kické. Si vous avez entré de bonnes informatons (mot de passe présent),la fonction INI_Parsefile Analysera et chargera les fichiers du joueur
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
switch( dialogid )
{
case DIALOG_REGISTER:
{
if (!response) return Kick(playerid);
if(response)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_WHITE"Enregistrement",""COL_RED"Vous avez entré un mot de passe invalide\n"COL_WHITE"Entrer un mot de passe afin de vous enregistrer.","S'enregistrer","Quitter");
new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Password",udb_hash(inputtext));
INI_WriteInt(File,"Cash",0);
INI_WriteInt(File,"Admin",0);
INI_WriteInt(File,"Kills",0);
INI_WriteInt(File,"Deaths",0);
INI_Close(File);
SetSpawnInfo(playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
ShowPlayerDialog(playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"Super! Votre système de Y_Ini marche parfaitement. Reconnecter vous afin de sauvegarder vos stats!",'Ok","");
}
}
case DIALOG_LOGIN:
{
if ( !response ) return Kick ( playerid );
if( response )
{
if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);
ShowPlayerDialog(playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX,""COL_WHITE"Success!",""COL_GREEN"Vous vous êtes correctement connecté!","Ok","");
}
else
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Connection",""COL_RED"Vous avez entré un mot de passe invalide.\n"COL_WHITE"Veuillez entrer votre mot de passe pour vous connecter.","Connexion","Quitter");
}
return 1;
}
}
}
return 1;
}
[/PAWN]
Au lieu d'utiliser if, j'ai utiliser case, il est plus rapide et moins long.(!response) est la fonction si le joueur n'a pas cliqué de bouton, allors il sera kické
Le (!strlen(inputtext)) vérifie si il y a bien quelque chose d'écrit, sinon on affichera un message disant mot de passe invalide.
Si tout se passe bien, votre système devrait correctement charger les fichiers des joueurs. Lorsque démarré,la fonction'INI_WriteInt' est appelé afin d'écrire les informations de joueur. Le udb_hash génèrera un code hashé avec le inputtext(ce que vous avez écrit). Lorsque tout est complété, nous fermons avec "INI_Close".
Lorsque terminé, on vous demandera de vous connecter.
Dans 'DIALOG_LOGIN', si la réponse est false(vous avez cliquer sur 'QUIT), vous serez kické. Si vous avez entré de bonnes informatons (mot de passe présent),la fonction INI_Parsefile Analysera et chargera les fichiers du joueur
Étape XI
N'oubliez pas qu'il faut un moyen pour sauvegarder les variables. Le callback OnPlayerDisconnect ré-ouvre simplement le fichier , récrit les valeurs du joueur et le ferme.
[PAWN]
public OnPlayerDisconnect(playerid, reason)
{
new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
INI_Close(File);
return 1;
}
[/PAWN]
[PAWN]
public OnPlayerDisconnect(playerid, reason)
{
new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
INI_Close(File);
return 1;
}
[/PAWN]
Étape XII
Finalement, Ajouter ceci a OnPLayerDeath afin de mettre des valeurs pour les morts et les kills
[PAWN]
public OnPlayerDeath(playerid, killerid, reason)
{
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
return 1;
}
[/PAWN]
Téléchargement:
public OnPlayerDeath(playerid, killerid, reason)
{
PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;
return 1;
}
[/PAWN]
Téléchargement:
Credits:
Y_Less - Y_INI.
Kush - Tutorial
Raphy963 - Traduction
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|