Bonjour,
après avoir compris le système je me suis dit que tous les débutants aurai besoin d'aide.
Vous avez besoin des includes "
dini" et "
dudb" qui sont téléchargeable sur ces liens :
DudbDini1.Infos à sauvegarder :Nous commençons par créer une variable qui dit
si le joueur est loggé :
nous l'appelons "
IsPlayerLogged" et sa nous donne
new IsPlayerLogged[MAX_PLAYERS];
Maintenant il faut mettre quels chose sauvegarder (score,argent,...) :
nous mettons tous dans un "
enum" qui se nommera "
PlayersInfo",
un exemple avec
argent,
score,
armes et
skin :
enum PlayersInfo
{
Score, Argent, Skin, Arme1, Arme2, Arme3, Arme4, Arme5, Arme6, Arme7, Arme8, Arme9, Arme10, Arme11, Arme12,
Munitions1, Munitions2, Munitions3, Munitions4, Munitions5, Munitions6, Munitions7, Munitions8, Munitions9, Munitions10, Munitions11, Munitions12,
}
Pour les armes placer :
new w1[MAX_PLAYERS],w2[MAX_PLAYERS],w3[MAX_PLAYERS],w4[MAX_PLAYERS],w5[MAX_PLAYERS],w6[MAX_PLAYERS],w7[MAX_PLAYERS],w8[MAX_PLAYERS],w9[MAX_PLAYERS],w10[MAX_PLAYERS],w11[MAX_PLAYERS],w12[MAX_PLAYERS];
new a1[MAX_PLAYERS],a2[MAX_PLAYERS],a3[MAX_PLAYERS],a4[MAX_PLAYERS],a5[MAX_PLAYERS],a6[MAX_PLAYERS],a7[MAX_PLAYERS],a8[MAX_PLAYERS],a9[MAX_PLAYERS],a10[MAX_PLAYERS],a11[MAX_PLAYERS],a12[MAX_PLAYERS];
Puis dans un
Timer, pour récupérer les armes du joueur, placer :
forward NomDuTimer();
public NomDuTimer()
{
for(new i;i<MAX_PLAYERS;i++)
{
GetPlayerWeaponData(i,1,w1[i],a1[i]); //soit w1[i] = l'arme du slot 1, et a1[i] = munitions du slot 1 (slot 1 = armes blanches)
GetPlayerWeaponData(i,2,w2[i],a2[i]); //slot 2
GetPlayerWeaponData(i,3,w3[i],a3[i]); //slot 3
GetPlayerWeaponData(i,4,w4[i],a4[i]); //etc...
GetPlayerWeaponData(i,5,w5[i],a5[i]);
GetPlayerWeaponData(i,6,w6[i],a6[i]);
GetPlayerWeaponData(i,7,w7[i],a7[i]);
GetPlayerWeaponData(i,8,w8[i],a8[i]);
GetPlayerWeaponData(i,9,w9[i],a9[i]);
GetPlayerWeaponData(i,10,w10[i],a10[i]);
GetPlayerWeaponData(i,11,w11[i],a11[i]);
GetPlayerWeaponData(i,12,w12[i],a12[i]);
}
}
Sans oublier de le lancer dans le callback "
OnGameModeInit"
SetTimer("NomDuTimer",1000,true); //Une timer de 1sec
2./register :Tout d'abord il faut mettre dans le callback "
OnPlayerCommandText" :
public OnPlayerCommandText(playerid, cmdtext[])
{
{ //ceci permet de ne pas infecter les autres commandes de votre GameMode
new cmd[256], idx, file[128], tmp[256], tmp2[256];
cmd = strtok(cmdtext, idx); //cmd = la commande
} //ceci permet de ne pas infecter les autres commandes de votre GameMode
return 0;
}
Passons à la commande
/register <MotdePasse>, ce qui nous donne :
if(strcmp(cmd, "/register", true) == 0)
{
new name[MAX_PLAYER_NAME]; //name est le nom du joueur, cela va permettre de rechercher si un compte existe à ce nom
tmp = strtok(cmdtext, idx); //ici on prend ce que l'on écrit après register
GetPlayerName(playerid, name, sizeof(name)); //on prend le nom du joueur
if(strlen(tmp) == 0) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /register [MotdePasse]"); //si on n'écrit rien après register, changez la couleur si vous voulez, ici c'est blanc
format(file,sizeof(file),"User/%s.ini",name); //file = dans .../scriptfiles/User un fichier au nom du joueur .ini
if(!fexist(file)) //si ce fichier n'existe pas
{
dini_Create(file); //créer le fichier au nom du joueur en format .ini
dini_IntSet(file, "Password", udb_hash(tmp)); //dans le ficher .ini, ajout de la ligne "Password" (udb_hash(tmp) = le mot de passe après /register)
dini_IntSet(file,"Score", GetPlayerScore(playerid)); //on prend le score au moment de l'enregistrement
dini_IntSet(file,"Argent", GetPlayerMoney(playerid)); //pareil pour l'argent
dini_IntSet(file,"Skin", GetPlayerSkin(playerid)); //ici pour le skin
dini_IntSet(file,"Arme1", w1[playerid]); //arme et munitions slot 1
dini_IntSet(file,"Arme2", w2[playerid]); //slot 2
dini_IntSet(file,"Arme3", w3[playerid]); //slot 3
dini_IntSet(file,"Arme4", w4[playerid]); //etc...
dini_IntSet(file,"Arme5", w5[playerid]);
dini_IntSet(file,"Arme6", w6[playerid]);
dini_IntSet(file,"Arme7", w7[playerid]);
dini_IntSet(file,"Arme8", w8[playerid]);
dini_IntSet(file,"Arme9", w9[playerid]);
dini_IntSet(file,"Arme10", w10[playerid]);
dini_IntSet(file,"Arme11", w11[playerid]);
dini_IntSet(file,"Arme12", w12[playerid]);
dini_IntSet(file,"Munitions1", a1[playerid]);
dini_IntSet(file,"Munitions2", a2[playerid]);
dini_IntSet(file,"Munitions3", a3[playerid]);
dini_IntSet(file,"Munitions4", a4[playerid]);
dini_IntSet(file,"Munitions5", a5[playerid]);
dini_IntSet(file,"Munitions6", a6[playerid]);
dini_IntSet(file,"Munitions7", a7[playerid]);
dini_IntSet(file,"Munitions8", a8[playerid]);
dini_IntSet(file,"Munitions9", a9[playerid]);
dini_IntSet(file,"Munitions10", a10[playerid]);
dini_IntSet(file,"Munitions11", a11[playerid]);
dini_IntSet(file,"Munitions12", a12[playerid]);
SendClientMessage(playerid, 0x00FF00FF, "Le compte a bien été créé"); //changez la couleur si vous voulez, ici c'est vert
PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
GetPlayerName(playerid, name, sizeof(name)); //on prend le nom du joueur
printf("[Compte]%s C'est enregistré", name); //dans la fenêtre noir (sont nom m'échappe) un message s'affiche pour dire que le joueur s'est enregistré
}
else
{
SendClientMessage(playerid, 0xFF0000FF, "Ce compte existe déjà"); //changez la couleur si vous voulez, ici c'est rouge
PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
}
return 1;
}
3./login:Je pense que la suite vous pouvez le faire seul, mais je vais quand même expliquer.
La commande
/login <MotdePasse> :
if(strcmp(cmd, "/login", true) == 0)
{
new PlayerName[24];
tmp = strtok(cmdtext, idx);
if(strlen(tmp) == 0) return SendClientMessage(playerid, 0xFFFFFFFF, "USAGE: /login [MotdePasse]"); //changez la couleur si vous voulez, ici c'est blanc
new name[MAX_PLAYER_NAME];
if(IsPlayerLogged[playerid] == 1) //si le joueur est loggé
{
SendClientMessage(playerid, 0xFF0000FF, "Tu est déjà loggé");
PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
return 1;
}
else
{
GetPlayerName(playerid, name, sizeof(name));
format(file,sizeof(file),"User/%s.ini",name);
if(fexist(file))
{
tmp2 = dini_Get(file, "Password"); //on prend le mot de passe enregistré
if(udb_hash(tmp) != strval(tmp2)) //si le mot de passe écrit n'est pas celui enregistré
{
SendClientMessage(playerid, 0xFF0000FF, "Mauvais mot de passe!"); //changez la couleur si vous voulez, ici c'est rouge
PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
printf("[Compte]%s C'est trompé de mot de passe", name);
}
else
{
IsPlayerLogged[playerid] = 1; //le joueur est maintenant loggé
SetPlayerMoney(playerid, dini_Int(file, "Argent")); //on donne l'argent enregistré par le joueur
SetPlayerScore(playerid, dini_Int(file, "Score")); //pareil pour le score
SetPlayerSkin(playerid, dini_Int(file, "Skin")); //le skin
ResetPlayerWeapons(playerid); //on efface les armes que le joueur avait avant de se loggé
GivePlayerWeapon(playerid,dini_Int(file, "Arme1"),dini_Int(file, "Munitions1")); //on lui donne l'arme et les munitions enregistré slot 1
GivePlayerWeapon(playerid,dini_Int(file, "Arme2"),dini_Int(file, "Munitions2")); //slot 2
GivePlayerWeapon(playerid,dini_Int(file, "Arme3"),dini_Int(file, "Munitions3")); //etc...
GivePlayerWeapon(playerid,dini_Int(file, "Arme4"),dini_Int(file, "Munitions4"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme5"),dini_Int(file, "Munitions5"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme6"),dini_Int(file, "Munitions6"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme7"),dini_Int(file, "Munitions7"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme8"),dini_Int(file, "Munitions8"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme9"),dini_Int(file, "Munitions9"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme10"),dini_Int(file, "Munitions10"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme11"),dini_Int(file, "Munitions11"));
GivePlayerWeapon(playerid,dini_Int(file, "Arme12"),dini_Int(file, "Munitions12"));
SendClientMessage(playerid, 0x00FF00FF, "Tu est maintenant loggé"); //changez la couleur si vous voulez, ici c'est vert
PlayerPlaySound(playerid,1057,0.0,0.0,0.0);
GetPlayerName(playerid, PlayerName, sizeof(PlayerName));
printf("[Compte]%s C'est loggé", name);
}
}
}
return 1;
}
4.Sauvegarder une parti après déconnexion:Voila maintenant sans doute le plus important, sauvegarder.
Pour sauvegarder il faut placer dans le callback "
OnPlayerDisconnect" les informations à sauvegarder,
de la met façon que dans le /register :
public OnPlayerDisconnect(playerid)
{
if(IsPlayerLogged[playerid] == 1) //si le joueur est loggé lors de sa déconnexion
{
new file[128];
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(file,sizeof(file),"User/%s.ini",file);
if(fexist(file))
{
dini_Set(file,"Score", GetPlayerScore(playerid));
dini_Set(file,"Argent", GetPlayerMoney(playerid));
dini_Set(file,"Skin", GetPlayerSkin(playerid));
dini_Set(file,"Arme1", w1[playerid]);
dini_Set(file,"Arme2", w2[playerid]);
dini_IntSet(file,"Arme3", w3[playerid]);
dini_IntSet(file,"Arme4", w4[playerid]);
dini_Set(file,"Arme5", w5[playerid]);
dini_Set(file,"Arme6", w6[playerid]);
dini_IntSet(file,"Arme7", w7[playerid]);
dini_Set(file,"Arme8", w8[playerid]);
dini_IntSet(file,"Arme9", w9[playerid]);
dini_Int(file,"Arme10", w10[playerid]);
dini_IntSet(file,"Arme11", w11[playerid]);
dini_Set(file,"Arme12", w12[playerid]);
dini_IntSet(file,"Munitions1", a1[playerid]);
dini_Int(file,"Munitions2", a2[playerid]);
dini_IntSet(file,"Munitions3", a3[playerid]);
dini_Set(file,"Munitions4", a4[playerid]);
dini_Set(file,"Munitions5", a5[playerid]);
dini_Int(file,"Munitions6", a6[playerid]);
dini_Int(file,"Munitions7", a7[playerid]);
dini_Set(file,"Munitions8", a8[playerid]);
dini_Set(file,"Munitions9", a9[playerid]);
dini_Set(file,"Munitions10", a10[playerid]);
dini_Set(file,"Munitions11", a11[playerid]);
dini_Set(file,"Munitions12", a12[playerid]);
}
IsPlayerLogged[playerid] = 0; //une fois déconnecté le joueur n'est plus loggé
}
return 1;
}
ATTENTION /!\ J'ai volontairement placé des erreurs dans le dernier script, pour que vous ne copiez pas bêtement!Voila, merci d'avoir lu, désoler pour les faut d'orthographe et c'est un plaisir de vous aider ^^