Jump to content
Sign in to follow this  
OkazakiTomoya

Système d'appels de PNJ pour job Taxi

Recommended Posts

Bonjour,

 

Je bosse actuellement sur une base de LSM et South Central, mon  problème est le suivant je ne comprends pas d'ou viens l'erreur concernant cette partie du script, c'est un système de PNJ pour le job taxi.

 

IG quand j'accepte l'appels du PNJ et que je me rapproche de lui rien ne ce passe dans la console j'obtiens un:

Taxi_Nearest: -1 | pTaxiPNJ: ID (0,1,2,3,4 etc...)

 

Le checkpoints disparaît mais je n'ai pas de "script executed" donc je pense que l'erreur viens de la ligne juste après le premier printf.

 

Merci d'avance pour votre aide!

public OnPlayerEnterCheckpoint(playerid)
{
	if (GetFactionType(playerid) == FACTION_POLICE || PlayerData[playerid][pJobDuty] == JOB_MECHANIC)
	{
		DisablePlayerCheckpoint(playerid);
	}
	new
	    taxi_id = -1;

	printf("Taxi_Nearest: %d | pTaxiPNJ: %d", Taxi_Nearest(playerid), PlayerData[playerid][pTaxiPNJ]);
	if ((taxi_id = Taxi_Nearest(playerid)) != -1 && PlayerData[playerid][pTaxiPNJ] != -1 && PlayerData[playerid][pTaxiStep] == 1 && IsPlayerInAnyVehicle(playerid) && taxi_id == PlayerData[playerid][pTaxiPNJ])
	{
	    printf("script executed");
	    Waypoint_Set(playerid, GetLocation(TaxiData[taxi_id][tDest][0], TaxiData[taxi_id][tDest][1], TaxiData[taxi_id][tDest][2]), TaxiData[taxi_id][tDest][0], TaxiData[taxi_id][tDest][1], TaxiData[taxi_id][tDest][2], 6.0);

		PlayerData[playerid][pTaxiStep] = 2;

		SendClientMessageEx(playerid, COLOR_INFO, "Vous avez récuperer votre client, emmenez le à %s", GetLocation(TaxiData[taxi_id][tDest][0], TaxiData[taxi_id][tDest][1], TaxiData[taxi_id][tDest][2]));
		Reset_TaxiCalls(taxi_id);
		return 1;
	}
	if (PlayerData[playerid][pTaxiPNJ] != -1 && PlayerData[playerid][pTaxiStep] == 2 && IsPlayerInAnyVehicle(playerid))
	{
		DisablePlayerCheckpoint(playerid);
		DisableWaypoint(playerid);

		PlayerData[playerid][pTaxiPNJ] = -1;
		PlayerData[playerid][pTaxiStep] = -1;

		new
			money = (50+random(60)),
			string[150];

		GiveMoney(playerid, money);

		format(string, sizeof(string), "Vous gagné la somme de ~r~$%d~w~ grâce à votre travail.", money);
		ShowPlayerFooter(playerid, string);
		return 1;
	}

 

Taxi_Nearest(playerid)
{
	for (new i = 0; i != MAX_TAXIS_CALLS; i ++) if (TaxiData[i][tExists] && IsPlayerInRangeOfPoint(playerid, 3.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))
	{
		return i;
	}
	return -1;
}

 

Edited by OkazakiTomoya

Share this post


Link to post
Share on other sites

EDIT : Après relecture, peut-être que tu devrais essayer d'augmenter la portée dans ton

IsPlayerInRangeOfPoint(playerid, 3.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))

Et la mettre à 20 ou même 50 histoire de voir si ça vient de là ou non?

if ((taxi_id = Taxi_Nearest(playerid)) != -1

Car en fait ton code le dit lui-même, "Si Taxi_Nearest(playerid) est différent de -1 ..." et il n'y a pas de else à la suite donc, forcemment, puisque taxi_id est = à -1 il ne se passe rien.

Edited by Sudiste
Meilleure compréhension du code.

Share this post


Link to post
Share on other sites
Le 29/09/2020 à 11:21, Sudiste a dit :

EDIT : Après relecture, peut-être que tu devrais essayer d'augmenter la portée dans ton


IsPlayerInRangeOfPoint(playerid, 3.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))

Et la mettre à 20 ou même 50 histoire de voir si ça vient de là ou non?


if ((taxi_id = Taxi_Nearest(playerid)) != -1

 

 

Ok merci à toi je vais de ce pas essayé d'augmenter la distance et je reviens vers toi après.

Edited by OkazakiTomoya

Share this post


Link to post
Share on other sites

Okay dans ce cas peut-être que ça vient de ta boucle, dans Taxi_Nearest(playerid){ ... } remplace :

for (new i = 0; i != MAX_TAXIS_CALLS; i ++) if (TaxiData[i][tExists] && IsPlayerInRangeOfPoint(playerid, 3.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))
{
	return i;
}
return -1;

par :

foreach(i : Player) if(TaxiData[i][tExists] && IsPlayerInRangeOfPoint(playerid, 10.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))
{
	return i;
}
return -1;

et revient vers-moi pour me dire si ça passe ou toujours pas.

 

Je pense que la boucle de ton for() s'arrête dès qu'elle trouve un 'i' donc un foreach va checker tous les joueurs avant de s'arrêter et ça pourrait régler le soucis.

Edited by Sudiste

Share this post


Link to post
Share on other sites
Le 02/10/2020 à 22:18, Sudiste a dit :

Okay dans ce cas peut-être que ça vient de ta boucle, dans Taxi_Nearest(playerid){ ... } remplace :


for (new i = 0; i != MAX_TAXIS_CALLS; i ++) if (TaxiData[i][tExists] && IsPlayerInRangeOfPoint(playerid, 3.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))
{
	return i;
}
return -1;

par :


foreach(i : Player) if(TaxiData[i][tExists] && IsPlayerInRangeOfPoint(playerid, 10.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))
{
	return i;
}
return -1;

et revient vers-moi pour me dire si ça passe ou toujours pas.

 

Je pense que la boucle de ton for() s'arrête dès qu'elle trouve un 'i' donc un foreach va checker tous les joueurs avant de s'arrêter et ça pourrait régler le soucis.

 

J'ai essayé et j'obtiens plusieurs erreurs:

CRP.pwn(31323) : error 017: undefined symbol "i"
CRP.pwn(31323) : warning 206: redundant test: constant expression is non-zero
CRP.pwn(31323) : error 017: undefined symbol "i"
CRP.pwn(31323) : warning 221: label name "_Y_ITER_C0" shadows tag name
CRP.pwn(31323) : warning 225: unreachable code
CRP.pwn(31323) : error 017: undefined symbol "i"
CRP.pwn(31323) : fatal error 107: too many error messages on one line

Compilation aborted.Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase


4 Errors.

 

Après j'ai donc essayé de déclarer le "i" mais rien ne change In Game.

 

Taxi_Nearest(playerid)
{
    for(new i=0; i<MAX_TAXIS_CALLS; i++)
    {
 		foreach(i : Player) if(TaxiData[i][tExists] && IsPlayerInRangeOfPoint(playerid, 10.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2]))
		{
			return i;
		}
	}
	return -1;
}

 

 

Share this post


Link to post
Share on other sites

Salut, ce sujet date un peu mais si c'est toujours d'actualité je vais essayer de te tendre une perche.

 

Taxi_Nearest(playerid)
{ 
	for(new i = 0; i <= MAX_TAXIS_CALLS; i++)
    {
    	if(TaxiData[i][tExists] && IsPlayerInRangeOfPoint(playerid, 5.0, TaxiData[i][tPos][0], TaxiData[i][tPos][1], TaxiData[i][tPos][2])) return i;
    }
    return -1;
}

 

public OnPlayerEnterCheckpoint(playerid)
{
	if (GetFactionType(playerid) == FACTION_POLICE || PlayerData[playerid][pJobDuty] == JOB_MECHANIC)
	{
		DisablePlayerCheckpoint(playerid);
	}
	
  	new taxi_id = Taxi_Nearest(playerid);
	if (taxi_id != -1 && PlayerData[playerid][pTaxiPNJ] != -1 && PlayerData[playerid][pTaxiStep] == 1 && IsPlayerInAnyVehicle(playerid))
	{
	    printf("script executed");
	    Waypoint_Set(playerid, GetLocation(TaxiData[taxi_id][tDest][0], TaxiData[taxi_id][tDest][1], TaxiData[taxi_id][tDest][2]), TaxiData[taxi_id][tDest][0], TaxiData[taxi_id][tDest][1], TaxiData[taxi_id][tDest][2], 6.0);

		PlayerData[playerid][pTaxiStep] = 2;

		SendClientMessageEx(playerid, COLOR_INFO, "Vous avez récuperer votre client, emmenez le à %s", GetLocation(TaxiData[taxi_id][tDest][0], TaxiData[taxi_id][tDest][1], TaxiData[taxi_id][tDest][2]));
		Reset_TaxiCalls(taxi_id);
		return 1;
	}
	if (PlayerData[playerid][pTaxiPNJ] != -1 && PlayerData[playerid][pTaxiStep] == 2 && IsPlayerInAnyVehicle(playerid))
	{
		DisablePlayerCheckpoint(playerid);
		DisableWaypoint(playerid);

		PlayerData[playerid][pTaxiPNJ] = -1;
		PlayerData[playerid][pTaxiStep] = -1;

		new
			money = (50+random(60)),
			string[150];

		GiveMoney(playerid, money);

		format(string, sizeof(string), "Vous gagné la somme de ~r~$%d~w~ grâce à votre travail.", money);
		ShowPlayerFooter(playerid, string);
		return 1;
	}

 

Share this post


Link to post
Share on other sites

Ouais autant pour moi l'idée du foreach() était mauvaise, j'avais mal compris le code.

 

Sinon le code qu'Heaven te propose à l'air pas mal, il a changé

if ((taxi_id = Taxi_Nearest(playerid)) != -1 && PlayerData[playerid][pTaxiPNJ] != -1 && PlayerData[playerid][pTaxiStep] == 1 && IsPlayerInAnyVehicle(playerid) && taxi_id == PlayerData[playerid][pTaxiPNJ])

par

new taxi_id = Taxi_Nearest(playerid);
if (taxi_id != -1 && PlayerData[playerid][pTaxiPNJ] != -1 && PlayerData[playerid][pTaxiStep] == 1 && IsPlayerInAnyVehicle(playerid))

 

Share this post


Link to post
Share on other sites

Du coup sa ne change rien au problème, la seul différence est que le checkpoints ne disparaît pas.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Contact

Email : contact@sa-mp-fr.com

Communauté San Andreas Multiplayer France

 

La plateforme San Andreas Multiplayer France (sa-mp-fr.com) est un site communautaire indépendant mettant en avant la communauté française du mod San Andreas Multiplayer (SA:MP).

 

sa-mp-fr.com et son contenu ne sont pas affiliés à Rockstar Games, Rockstar North ou Take-Two Interactive Software Inc.

Grand Theft Auto et Grand Theft Auto: San Andreas sont des marques déposées de Take-Two Interactive Software Inc.

×
×
  • Create New...