Verecundus

Problème IsPlayerConnected

55 messages dans ce sujet

Bonjour tout le monde,

Je viens ici pour vous faire part d'un problème plutôt étrange.
J'apprends petit à petit le pawn et après avoir appris les bases j'ai décidé de télécharger quelques gamemodes pour les tester et regarder le contenu.

Afin de les tester entièrement je fais souvent appel à des amis pour tester certains systèmes nécessitant la présence de plus d'une personne.

Seulement sur l'un des gamemode que j'ai téléchargé je me suis retrouvé avec un bug étrange et que je n'arrive pas à régler.

J'ai utilisé le gamemode LVRP de @DarkRider29, je l'ai bien installé etc. Et le problème est que lorsqu'un ami à moi s'inscrit et joue, la première fois qu'il se connecte il n'a pas de problème, mais quand il se connecte plus tard le serveur à l'impression qu'il est déconnecté. Par là je veux dire que toutes les parties du code faisant appel à "IsPlayerConnected", ne fonctionnent pas.

J'ai aussi installé le site, et dans la liste des membres connectés, mon ami est marqué comme connecté.

Imaginons j'utilise la commande /a gethere 1, alors j'aurai le message d'erreur suivant: "{FF2727}» Admin «{FFABAD} Ce joueur n'est pas connecté."

if (IsPlayerConnected(giveplayerid) && giveplayerid != INVALID_PLAYER_ID)
					{
						GetPlayerPos(playerid, plocx, plocy, plocz);
						server_SetPlayerInterior(giveplayerid,PlayerInfo[playerid][pInt]);
						server_SetPlayerVirtualWorld(giveplayerid,PlayerInfo[playerid][pVirWorld]);
						if (GetPlayerState(giveplayerid) == 2)
							{SafeSetVehiclePos(GetPlayerVehicleID(giveplayerid), plocx, plocy+4, plocz);}
						else
							{SafeSetPlayerPos(giveplayerid,plocx,plocy+2, plocz);}
						msg_Client(giveplayerid, COLOR_INFO, "{CF9756}» Info «{FFFFFF} Vous avez été téléporté.");
					}
					else
						{msg_Client(playerid, COLOR_WHITE, "{FF2727}» Admin «{FFABAD} Ce joueur n'est pas connecté.");}

Lorsque je reboot le serveur le problème n'apparait plus pendant un petit bout de temps puis refait surface...

J'espère que vous pourrez m'aider

Merci d'avance.

Partager ce message


Lien à poster
Partager sur d’autres sites

donne noue dans le pastebin onplayerspawn, onplayerdisconnect, onplayerconnect les public

Partager ce message


Lien à poster
Partager sur d’autres sites

Surtout le OnPlayerConnect. Il doit y avoir une erreur dans le code.

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est étrange, ce problème n'a jamais eu lieu auparavant.

Le GameMode étant loin d'être optimisé, il est assez gourmand.

Pour moi c'est un problème de désynchro du client, tu héberges le serveur en local ou sur un hébergeur ?

 

En ce qui concerte un reboot (Pour le demarrage du serveur), le chargement depuis la base de données prend un certain temps.

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Le pastebin avec OnPlayerConnect OnPlayerDisconnect et OnPlayerSpawn: https://pastebin.com/K1ZLSd4X

Et j'héberge le serveur sur un hébergeur.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 32 minutes, Verecundus a dit :

Le pastebin avec OnPlayerConnect OnPlayerDisconnect et OnPlayerSpawn: https://pastebin.com/K1ZLSd4X

Et j'héberge le serveur sur un hébergeur.

Ça le fait qu'à tes amis ou à toi aussi ? Es que tu as touché au code ou il est d'origine ?

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 18 heures, vic1997 a dit :

Ça le fait qu'à tes amis ou à toi aussi ? Es que tu as touché au code ou il est d'origine ?

Lorsque je me connecte après mes amis ça me le fait. Et le code est tel que je l'ai téléchargé.

EDIT: J'ai remarqué, en allant sur la panneau de contrôle du vps, que le SWAP (je ne sais pas ce que c'est) est utilisé à 100%. Est-ce que ça peut venir de là?

Modifié par Verecundus

Partager ce message


Lien à poster
Partager sur d’autres sites

Désolé je up mais je n'aime pas du tout les problèmes, et je trouve celui-là très gênant :/ j'ai essayé avec d'autres gamemodes sur le même VPS, je n'ai jamais eu ce problème... Des gens m'ont dit que ça pouvait être des problèmes d'id, donc j'ai mis des pnj pour en supprimer, mais le problème est quand même revenu, donc j'ai retiré les PNJ.

Le VPS a 10% de RAM utilisée, le processeur est à 0% utilisé et le SWAP à 100%. J'héberge dessus quelques serveurs de jeux, un teamspeak, et un site web.

Désolé du double post...

Modifié par Verecundus

Partager ce message


Lien à poster
Partager sur d’autres sites

Le swap si je me rappel bien, c'est sur Unix (je sais pas si sur Windows ça existe), quand ta plus de ram il utilise une partie du DD comme si c'était de la ram.

Pour le problème, je regarde ce soir plus précisément, car là je n'ai pas le temps. N'hésite pas à me mentionner ce soir si je ne t'ai pas répondu.

Partager ce message


Lien à poster
Partager sur d’autres sites

@vic1997 je te mentionne comme demandé :P

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 16 minutes, Verecundus a dit :

@vic1997 je te mentionne comme demandé :P

Oui :D,

Alors pour le problème, vérifie la condition pour que le joueur soit marqué comme connecté sur le site. (voir quel variable ou quel table il utilise dans la bdd)

Es que sans se déconnecté, il se peut qu'au début du jeu ça marche puis ensuite plus ?

 

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, vic1997 a dit :

Oui :D,

Alors pour le problème, vérifie la condition pour que le joueur soit marqué comme connecté sur le site. (voir quel variable ou quel table il utilise dans la bdd)

Es que sans se déconnecté, il se peut qu'au début du jeu ça marche puis ensuite plus ?

 

Il utilise la variable "connected".

Et non, si le jeu marche au début il marche jusqu'à ce que le joueur se déconnecte.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 45 minutes, Verecundus a dit :

Il utilise la variable "connected".

Et non, si le jeu marche au début il marche jusqu'à ce que le joueur se déconnecte.

T'as essayé de voir si à chaque fois que tu te connecte pour la deuxième fois ça marche ? Ou ça marche jamais ?

 

Pour la variable ==> Elle est get de la BDD nan ?

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 1 minute, vic1997 a dit :

T'as essayé de voir si à chaque fois que tu te connecte pour la deuxième fois ça marche ? Ou ça marche jamais ?

 

Pour la variable ==> Elle est get de la BDD nan ?

Parfois ça marche, parfois non. Mais si il n'y a que moi qui me suit connecté et que quelques heures après j'y reviens alors ça marche. Mais si quelqu'un d'autre est venu entre temps ça ne marche pas.

 

Oui, dans la table du joueur. Dans le gamemode la variable est mise sur 1.

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 3 minutes, Verecundus a dit :

Parfois ça marche, parfois non. Mais si il n'y a que moi qui me suit connecté et que quelques heures après j'y reviens alors ça marche. Mais si quelqu'un d'autre est venu entre temps ça ne marche pas.

 

Oui, dans la table du joueur. Dans le gamemode la variable est mise sur 1.

Vérifie si quand le joueur est connecté mais qu'il est bugé, que cette variable est bien sur 1. (normalement elle doit bien être sur 1 vu que tu m'as dis que ça ça marchait)

Du coup je sais pas là.

Partager ce message


Lien à poster
Partager sur d’autres sites
à l’instant, vic1997 a dit :

Vérifie si quand le joueur est connecté mais qu'il est bugé, que cette variable est bien sur 1. (normalement elle doit bien être sur 1 vu que tu m'as dis que ça ça marchait)

Du coup je sais pas là.

Oui j'ai déjà vérifié, elle est bien sur 1...

Partager ce message


Lien à poster
Partager sur d’autres sites

Yo'p,

 

Tu récupères comment giveplayerid visible dans ton premier post ? 

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 13 heures, Vichenz0 a dit :

Yo'p,

 

Tu récupères comment giveplayerid visible dans ton premier post ? 

Le "new giveplayerid;" est au début de OnPlayerCommandText, et il est récupéré ainsi:                  

giveplayerid = ReturnUser(tmp);
ReturnUser(text[], playerid = INVALID_PLAYER_ID)
{
	new posR = 0;
	while (text[posR] < 0x21) // Strip out leading spaces
	{
		if (text[posR] == 0) return INVALID_PLAYER_ID; // No passed text
		posR++;
	}
	new userid = INVALID_PLAYER_ID;
	if (IsNumeric(text[posR])) // Check whole passed string
	{
		// If they have a numeric name you have a problem (although names are checked on id failure)
		userid = strval(text[posR]);
		if(userid >= 1000) // Cagoule
		{
		    for(new i = 0; i<MAX_PLAYERS_CURRENT+1; i++)
			{
			    if(IsPlayerConnected(i) && gPlayerMask[i] == userid)
			    	{userid = i; return userid;}
			}
		}
		if (userid >=0 && userid <MAX_PLAYERS_CURRENT+1)
		{
			if(!IsPlayerConnected(userid))
				{userid = INVALID_PLAYER_ID;}
			else
				{return userid;}
		}
	}
	// They entered [part of] a name or the id search failed (check names just incase)
	new len = strlen(text[posR]);
	new count = 0;
	new name[MAX_PLAYER_NAME];
	for (new i = 0; i <MAX_PLAYERS_CURRENT+1; i++)
	{
		if (IsPlayerConnected(i))
		{
			GetPlayerName(i, name, sizeof (name));
			if (strcmp(name, text[posR], true, len) == 0) // Check segment of name
			{
				if (len == strlen(name)) // Exact match
					{return i;}
				else // Partial match
					{count++;userid = i;}
			}
		}
	}
	if (count != 1)
	{
		if (playerid != INVALID_PLAYER_ID)
		{
			if (count)
				{msg_Client(playerid, 0xFF0000AA, "Multiple users found, please narrow earch");}
			else
				{msg_Client(playerid, 0xFF0000AA, "No matching user found");}
		}
		userid = INVALID_PLAYER_ID;
	}
	return userid; // INVALID_USER_ID for bad return
}

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu devrais mettre des debugs un peu partout dedans (à chaque étape print("Debug 0"); print("Debug 1"); etc) puis puis quand tu as le soucis IG check la console voir la ou ça bloque 

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 6 heures, Vichenz0 a dit :

Tu devrais mettre des debugs un peu partout dedans (à chaque étape print("Debug 0"); print("Debug 1"); etc) puis puis quand tu as le soucis IG check la console voir la ou ça bloque 

Exact et encore mieux, afficher les valeurs des variables qu'on suspects. Comme ça tu verra quelle variable bug et à quel moment.

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 17 heures, Vichenz0 a dit :

Tu devrais mettre des debugs un peu partout dedans (à chaque étape print("Debug 0"); print("Debug 1"); etc) puis puis quand tu as le soucis IG check la console voir la ou ça bloque 

Il y a 11 heures, vic1997 a dit :

Exact et encore mieux, afficher les valeurs des variables qu'on suspects. Comme ça tu verra quelle variable bug et à quel moment.

D'accord j'essaierai dans l'après-midi ! Merci!

 

Edit @vic1997 @Vichenz0, grâce au débug je sais d'où vient le problème ! Dès fois les joueurs utilisent des commandes ou parlent dans le chat sans être connecté ou ce genre de choses, donc "ReturnUser" les met en INVALID_PLAYER_ID, et comme à leur déconnexion ça ne se remet pas à 0 le problème ne se règle pas, donc il faut juste que je change à la déconnexion que ça remette à 0 ? Du moins je pense ?

Edit 2: J'ai essayé mais je n'ai pas réussi, deux choses à rajouter: à un moment quelqu'un était bug et il a déco peu de temps après j'ai crash et quand il a reco il n'était plus bug et moi non plus. Un autre moment, j'ai AFK en Alt+Tab alors que je n'étais pas bug et à mon retour je l'étais...

Modifié par Verecundus

Partager ce message


Lien à poster
Partager sur d’autres sites

Up ^^, il n'y aurai pas un moyen d'utiliser ces fonctions sans le ReturnUser ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Es tu sur que c'est ça qui te fait bugé ? A quoi sert ce returnUser ?

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 7 minutes, vic1997 a dit :

Es tu sur que c'est ça qui te fait bugé ? A quoi sert ce returnUser ?

Je dois avouer que je n'ai pas bien compris à quoi il sert, mais il est partout. Et je ne suis pas sûr à 100% que c'est lui qui fait bugger mais il y a des chances je pense.
A chaque fois il permet de vérifier si giveplayerid == INVALID_PLAYER_ID, et je ne comprends pas à quoi sert INVALID_PLAYER_ID.
Mais d'après quelqu'un (je n'ai pas pu vérifier), le nom de celui qui bug n'apparait pas non plus quand il bug dans le /admins:

 

else if(strcmp(cmd, "/admins", true) == 0)
	{
	    format(string,sizeof(string),"{FFFFFF}======== {FF9300}Staff de %s connecté {FFFFFF}========",NICK_NAME);
	    msg_Client(playerid, COLOR_BLUE, string);
		for(new i = 0; i <MAX_PLAYERS_CURRENT+1; i++)
		{
			if(IsPlayerConnected(i))
			{
				if(PlayerInfo[i][pAdmin] >= 1)
		  		{
		  		    new afk[6], duty[24];
					if(AdminDuty[i] == 1)
						{format(duty, sizeof(duty), "(En Service Admin)");}
                    if(afk_Check[i]==-1)
						{format(afk, sizeof(afk), "(AFK)");}
					format(string, 256, "- %s, %s %s %s", GetAdminName(PlayerInfo[i][pAdmin]), PlayerInfo[i][pRealName],duty,afk);
					msg_Client(playerid, COLOR_WHITE, string);
				}
			}
		}
		return 1;
	}

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Quand tu avais mis des débugs dans la console, ça bloquait à quel niveau ?

 

Je comprends pas pourquoi " for(new i = 0; i <MAX_PLAYERS_CURRENT+1; i++) "

Je remplacerais par "foreach (new i : Player)"

 

Tu peux toujours essayer dans ReturnUser de modifier par ça aussi (Il te faut l'include foreach) et puis tente une commande sur quelqu'un, il déco/reco puis retente 

Modifié par Vichenz0

Partager ce message


Lien à poster
Partager sur d’autres sites
Guest
Ce sujet ne peut plus recevoir de nouvelles réponses.