• 10 Juillet 2025, 20:05:01


Auteur Sujet: Stocker les pseudos des joueurs  (Lu 1770 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Stocker les pseudos des joueurs
« le: 02 Novembre 2008, 11:03:39 »
Bonjour, je vous explique ma situation, j'ai un serveur STUNT/DM, et je voudrais, lorsqu'un joueur choisit son "équipe", son pseudo soit renommé afin d'y ajouter le suffixe "_DM" (pour le DeathMatch) ou "_ST" (pour les Stunters).
Je veux aussi utiliser ces pseudos quand le joueur tape la commande /afk ou /back afin d'ajouter/retirer le préfixe "[AFK]".
Enfin lorsque le joueur fait F4 puis /kill, il revient à l'écran de selection, je voudrais qu'à ce moment-là, son pseudo originel soit rétabli (sans aucun préfixe ni suffixe).

Pour celà, j'utiliser ces fonctions :

En Array :
new PName[MAX_PLAYERS][MAX_PLAYER_NAME]; // Stockage du pseudo originel
new PNameST[MAX_PLAYERS][MAX_PLAYER_NAME];//Stockage du pseudo avec le suffixe _ST
new PNameDM[MAX_PLAYERS][MAX_PLAYER_NAME];//Stockage du pseudo avec le suffixe _DM
new PNameafkDM[MAX_PLAYERS][MAX_PLAYER_NAME];//Stockage du pseudo (_DM) avec le préfixe [AFK]
new PNameafkST[MAX_PLAYERS][MAX_PLAYER_NAME];//Stockage du pseudo (_ST) avec le préfixe [AFK]

J'utilise aussi une variable, à 0 lorsque le joueur se connecte, et à 1 lorsqu'il a choisis une "équipe" (En Array :new EtatTeam[MAX_PLAYERS] = 0;)

Ensuite dans mon OnPlayerRequestClass :
if(EtatTeam[playerid] == 0){
GetPlayerName(playerid, PName, sizeof(PName));
}else if(EtatTeam[playerid] == 0){
SetPlayerName(playerid, PName);
EtatTeam = 0;]

Ensuite dans mon OnPlayerSpawn :
   
if(gTeam[playerid] == TEAM_DEATHMATCH){
SetPlayerColor(playerid,COLOR_RED);
if(EtatTeam[playerid] == 0){
format(string, sizeof(string), "**** %s a choisis le mode DeathMatch.****", PName[playerid]);
SendClientMessageToAll(COLOR_LIGHTRED, string);
print(string);
format (PNameDM[playerid], sizeof(PNameDM), "%s_DM", PName[playerid]);
SetPlayerName (playerid, PNameDM[playerid]);
EtatTeam[playerid] = 1;
}
}
else if(gTeam[playerid] == TEAM_STUNT){
SetPlayerColor(playerid,COLOR_GREEN);
if(EtatTeam[playerid] == 0){
format(string, sizeof(string), "**** %s a choisis le mode Stunt.****", PName[playerid]);
SendClientMessageToAll(COLOR_GREEN, string);
print(string);
format (PNameST[playerid], sizeof(PNameST), "%s_ST", PName[playerid]);
SetPlayerName (playerid, PNameST[playerid]);
EtatTeam[playerid] = 1;
}
}
}
return 1;
}

Et enfin dans mon OnPlayerCommandText (pour les commandes /afk et /back) :

if (strcmp("/afk", cmdtext, true, 4) == 0){
if(EtatAFK[playerid] == 1){
SendClientMessage(playerid, COLOR_RED,"Tu es déjà AFK !");
}
else
{
if(gTeam[playerid] == TEAM_STUNT){
new rand = random(sizeof(STAfkPlayerTeleport));
GetPlayerPos(playerid, PosafkST[playerid][0],PosafkST[playerid][1], PosafkST[playerid][2]);
GetPlayerFacingAngle(playerid, PosafkST[playerid][3]);
format(string, sizeof(string), "**** %s est passé AFK.****", PName[playerid]);
SendClientMessageToAll(COLOR_YELLOW, string);
print(string);
format (PNameafkST[playerid], sizeof(PNameafkST), "[AFK]%s", PNameST[playerid]);
SetPlayerName (playerid, PNameafkST[playerid]);
SetPlayerColor(playerid, COLOR_YELLOW);
SetPlayerPos(playerid, STAfkPlayerTeleport[rand][0], STAfkPlayerTeleport[rand][1], STAfkPlayerTeleport[rand][2]);
SetPlayerFacingAngle(playerid, STAfkPlayerTeleport[rand][3]);
SetCameraBehindPlayer(playerid);
SetPlayerHealth(playerid, 99999);
TogglePlayerControllable(playerid,0);
EtatAFK[playerid] = 1;
}
else if(gTeam[playerid] == TEAM_DEATHMATCH){
new rand = random(sizeof(DMAfkPlayerTeleport));
GetPlayerPos(playerid, PosafkDM[playerid][0],PosafkDM[playerid][1], PosafkDM[playerid][2]);
GetPlayerFacingAngle(playerid, PosafkDM[playerid][3]);
format(string, sizeof(string), "**** %s est passé AFK.****", PName[playerid]);
SendClientMessageToAll(COLOR_YELLOW, string);
print(string);
format (PNameafkDM[playerid], sizeof(PNameafkDM), "[AFK]%s", PNameDM[playerid]);
SetPlayerName (playerid, PNameafkDM[playerid]);
SetPlayerColor(playerid, COLOR_YELLOW);
SetPlayerPos(playerid, DMAfkPlayerTeleport[rand][0], DMAfkPlayerTeleport[rand][1], DMAfkPlayerTeleport[rand][2]);
SetPlayerFacingAngle(playerid, DMAfkPlayerTeleport[rand][3]);
SetCameraBehindPlayer(playerid);
SetPlayerHealth(playerid, 99999);
TogglePlayerControllable(playerid,0);
EtatAFK[playerid] = 1;
}
}
return 1;
}
if (strcmp("/back", cmdtext, true, 5) == 0){
if(EtatAFK[playerid] == 1)
{
if(gTeam[playerid] == TEAM_STUNT){
SetPlayerColor(playerid, COLOR_GREEN);
SetPlayerName (playerid, PNameST[playerid]);
format(string, sizeof(string), "**** %s n'est plus AFK.****", PName[playerid]);
SendClientMessageToAll(COLOR_YELLOW, string);
print(string);
SetPlayerHealth(playerid, 100);
SetPlayerPos(playerid, PosafkST[playerid][0],PosafkST[playerid][1], PosafkST[playerid][2]);
SetPlayerFacingAngle(playerid, PosafkST[playerid][3]);
SetCameraBehindPlayer(playerid);
TogglePlayerControllable(playerid,1);
EtatAFK[playerid] = 0;
}
                else if(gTeam[playerid] == TEAM_DEATHMATCH){
                SetPlayerColor(playerid, COLOR_RED);
SetPlayerName (playerid, PNameDM[playerid]);
format(string, sizeof(string), "**** %s n'est plus AFK.****", PName[playerid]);
SendClientMessageToAll(COLOR_YELLOW, string);
print(string);
SetPlayerHealth(playerid, 100);
SetPlayerPos(playerid, PosafkDM[playerid][0],PosafkDM[playerid][1], PosafkDM[playerid][2]);
SetPlayerFacingAngle(playerid, PosafkDM[playerid][3]);
SetCameraBehindPlayer(playerid);
TogglePlayerControllable(playerid,1);
EtatAFK[playerid] = 0;
}
}
else
{
SendClientMessage(playerid, COLOR_RED, "Tu n'es pas AFK !");
}
return 1;
}

Venons-en au fait :
Le problème se trouve avec les commandes /afk et /back et lorsqu'un joueur fait F4 puis /kill.
Son pseudo devient celui du dernier joueur arrivé en jeu.
J'ai essayé de remplacer tous les PName/PNameDM... en rajoutant [playerid] à la fin, mais rien à faire je ne trouve pas de solution.

Merci à ceux qui oseront se lancer dans une petite analyse !
Jens84

PS : Désolé pour le post "un peu" long ^^.

« Modifié: 02 Novembre 2008, 12:22:37 par Jens84 »
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Stocker les pseudos des joueurs
« Réponse #1 le: 02 Novembre 2008, 11:58:04 »
Regarde dans, plein de sujet parle de ca et donne la réponse.
Ca meme été abordé par moi :)

++
nikko

Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Re : Stocker les pseudos des joueurs
« Réponse #2 le: 02 Novembre 2008, 12:45:21 »
Arf c'est pas vraiment une réponse ca ! ^^
Bon ben j'ai beau chercher, je trouve des topics en relation avec les pseudos mais pas vraiment ce que je recherche.
S'il existe un topic répondant "vraiment" à ma question, pouvez-vous m'en indiquer le lien ?

Merci d'avance à vous !

(PS : J'ai cherché un topic posté par toi Nikko, j'en ai trouvé certains mais pas vraiment ce que je recherche, merci quand même)
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne Bayshore

  • *
  • Grand Banditisme
  • Messages: 923
    • Voir le profil
Re : Stocker les pseudos des joueurs
« Réponse #3 le: 02 Novembre 2008, 12:59:20 »
GetPlayerName(playerid, PName, sizeof(PName));

Tu enregistres dans PName, et non pas dans PName[playerid].

Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Re : Stocker les pseudos des joueurs
« Réponse #4 le: 02 Novembre 2008, 13:23:29 »
J'avais déjà testé il me semble.
Avec ca, la valeur ne se mettrait-elle pas à jour à chaque nouvel arrivant sur le serveur ?
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Stocker les pseudos des joueurs
« Réponse #5 le: 02 Novembre 2008, 14:51:42 »
salut,

si j'ai bien compris, ce que Jens84 veut, c'est stocker les pseudo des joueurs à leur arrivé sur le serveur et ainsi dne pas avoir à utiliser la fonction GetPlayerName mais plutôt avoir recours à une variable...

alors je trouve que tu as un trop grand nombre de string,

tu n'as besoin que du nom original, les autres sont superflus, tu n'as qu'a vérifier la team du joueur puis faire la bonne action etc....

et dans OnPlayerRequestClass, tu as deux fois la même condition...

if(EtatTeam[playerid] == 0){//ICI
GetPlayerName(playerid, PName[playerid], sizeof(PName[playerid]));
}else if(EtatTeam[playerid] == 0){//ET ICI, POURQUOI?
SetPlayerName(playerid, PName[playerid]);
EtatTeam = 0;]

dans ton OnPlayerSpawn, tu dit au joueur: tu as choisi....
alors qu'en réalité, il ne fait que spawner, il n'a pas rien choisi...

if(gTeam[playerid] == TEAM_DEATHMATCH){
SetPlayerColor(playerid,COLOR_RED);//normalement, il devrait l'être encore
if(EtatTeam[playerid] == 0){//Qu'es donc le étatTeam
format(string, sizeof(string), "**** %s a choisis le mode DeathMatch.****", PName[playerid]);//il devrait déjà le savoir..
SendClientMessageToAll(COLOR_LIGHTRED, string);
print(string);
format (PNameDM[playerid], sizeof(PNameDM), "%s_DM", PName[playerid]);
SetPlayerName (playerid, PNameDM[playerid]);//tout ok jusque là
EtatTeam[playerid] = 1;
}
}
else if(gTeam[playerid] == TEAM_STUNT){
SetPlayerColor(playerid,COLOR_GREEN);//pareil, il devrait déjà l'être
if(EtatTeam[playerid] == 0){
format(string, sizeof(string), "**** %s a choisis le mode Stunt.****", PName[playerid]);
SendClientMessageToAll(COLOR_GREEN, string);
print(string);
format (PNameST[playerid], sizeof(PNameST), "%s_ST", PName[playerid]);
SetPlayerName (playerid, PNameST[playerid]);
EtatTeam[playerid] = 1;
}
}
}
return 1;
}

alors il y a le ÉtatTeam que je ne comprend pas, mais le problème est ici, en haut, tu utilise presque toujours les PName comme un array de première dimension alors qu'il en a 2, tu doit toujours mettre le playerid afin d'avoir le bon nom, dans le OnPlayerRequestClass, alors je ne comprend pas comment le script pouvait se compiler.... mais bon, essaie ça

++Sim++






Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Re : Stocker les pseudos des joueurs
« Réponse #6 le: 02 Novembre 2008, 15:16:12 »
Ah oui tout d'abord, je n'avais pas vu l'erreur dans ma double condition (pour le else if, c'est == 1 et non pas == 0 XD)
Ma première condition sert a récuperer le pseudo du joueur et normalement le garder en memoire (ce que je cherche a faire).
Ensuite lorsque le joueur tape F4 puis /kill, ma deuxième condition sert à rétablir son pseudo quand il est à l'écran de selection. (pour éviter les doubles _ST_DM...). Quoi que je pourrais tout le temps utiliser PName uniquement, mais pour celà il faut que la valeur soit attribuée à chaque joueur.

Laissez-tomber tout ce que j'ai fait, je comprend comment mieux faire avec un seul PName.

Donc je veux juste savoir comment attribuer UN Pname à UN joueur et le garder tant que ce joueur est connecté, après je me débrouillerai pour le reste.
Serveur non-terminé  (MAJ Quotidiennes)


Hors ligne S!m

  • *
  • Messages: 2341
    • Voir le profil
Re : Stocker les pseudos des joueurs
« Réponse #7 le: 02 Novembre 2008, 15:19:35 »
Salut,

c'est en plein ce que j'ai tenté de faire,

tu as la place de stocker le nom de chaque joueur, et puis tu utilise se nom auquel tu ajoute les suffixe/préfixe selon les conditions...

++Sim++





Hors ligne Jens84

  • *
  • Tueur
  • Pawn un jour, Pawn toujours
  • Messages: 71
    • Voir le profil
    • Mon Site Web
Re : Stocker les pseudos des joueurs
« Réponse #8 le: 02 Novembre 2008, 15:43:09 »
C'est bon j'ai trouvé, en essayant à partir de vos commentaires, merci !
En fait j'ai laissé un array : new PName[MAX_PLAYERS][MAX_PLAYER_NAME];
et puis à chaque fois que je change le pseudo, je l'utilise :

Ex (commande /afk et /back):
format(string, sizeof(string), "[AFK]%s_ST", PName[playerid]);    // pour les stunters
SetPlayerName(playerid, string);
--------

format(string, sizeof(string), "[AFK]%s_DM", PName[playerid]);   // pour les dm
SetPlayerName(playerid, string);

/back
format(string, sizeof(string), "%s_ST", PName[playerid]); // pour les stunters
SetPlayerName(playerid, string);
---------

format(string, sizeof(string), "%s_DM", PName[playerid]); // pour les dm
SetPlayerName(playerid, string);

Et ca fonctionne, j'ai testé avec un ami, PName ne se met pas a jour avec la venue d'un autre joueur (car il est unique à chaque joueur)

Merci à vous pour votre aide bien précieuse.

PS : Pour ceux qui veulent, mon serveur est enfin hébergé : 91.121.176.208:8007
Serveur non-terminé  (MAJ Quotidiennes)