Get nearest vehicle while in vehicle
#1

How can I get the closest vehicle while I'm in any vehicle?

Currently, I have this function, but it only works while on foot.

Код:
stock GetClosestVehicle(playerid, Float:range)
{
	new Float: x, Float: y, Float: z;
	new Float: dist, closeveh;
	for(new i = 1; i < MAX_VEHICLES; i++)
	{
		if(GetVehiclePos(i, x, y, z))
		{
			dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
			if(dist < range)
			{
				//closedist = dist;
				closeveh = i;
			}
		}
	}
	return closeveh;
}
Reply
#2

I don't understand why you're assigning a vehicle id into a float variable.

PHP код:
stock GetClosestVehicle(playerid, Float:range)
{
    new 
Float: x, Float: y, Float: z;
    new 
Float: closedist = range;
    new 
closeveh;
    for(new 
i = 1; i < MAX_VEHICLES; i++)
    {
        if(
GetVehiclePos(i, x, y, z))
        {
            
dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
            if(
dist < closedist)
            {
                
closedist = dist;
                
closeveh = i;
            }
        }
    }
    return 
closeveh;
} 
If you want to not count the vehicle you are currently in. Then use this.

PHP код:
stock GetClosestVehicle(playerid, Float:range)
{
    new 
Float: x, Float: y, Float: z;
    new 
Float: closedist = range;
    new 
closeveh;
    for(new 
i = 1; i < MAX_VEHICLES; i++)
    {
        if(
GetVehiclePos(i, x, y, z))
        {
            if (
IsPlayerInVehicle(playerid, i)) continue;
            
dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
            if(
dist < closedist)
            {
                
closedist = dist;
                
closeveh = i;
            }
        }
    }
    return 
closeveh;
} 
Reply
#3

Quote:
Originally Posted by Skimmer
Посмотреть сообщение
I don't understand why you're assigning a vehicle id into a float variable.
Tags are per-definition only, which are separated by a comma.

As an example
PHP код:
new Float: x, Float: y, Float: z; 
You have to define the tag every time after the comma.

Here, closeveh is an integer value, not a float value.
PHP код:
new Float: dist, closeveh; 
Reply
#4

This could be optimized like this, you don't have to call IsPlayerInVehicle each time in the loop.

PHP код:
stock GetClosestVehicle(playerid, Float:range) 
{ 
    new 
Float: x, Float: y, Float: z; 
    new 
Float: closedist = range; 
    new 
closeveh; 
    new 
playerveh;
    
playerveh = GetPlayerVehicleID(playerid);
    for(new 
i = 1; i < MAX_VEHICLES; i++) 
    {
         if(
playerveh == i) continue; 
        if(
GetVehiclePos(i, x, y, z)) 
        {  
            
dist = GetPlayerDistanceFromPoint(playerid, x, y, z); 
            if(
dist < closedist) 
            { 
                
closedist = dist; 
                
closeveh = i; 
            } 
        } 
    } 
    return 
closeveh; 
} 
Reply
#5

Optimized this code as much it could be, made checks to avoid invalid vehicle in the loop and so on.

PHP код:
stock GetClosestVehicle(playerid, Float: range)
{
    new 
Float: PosX, Float: PosY, Float: PosZ, Float: CloseDist = range, Float: Dist, FetchVeh, PlayerVeh;
    
PlayerVeh = GetPlayerVehicleID(playerid);
    for(new 
i = GetVehiclePoolSize(); i != 0; i--)
    {
        if(!
IsValidVehicle(i)) continue;
        if(
i == PlayerVeh) continue;
        
GetVehiclePos(i, PosX, PosY, PosZ);
        
Dist = GetPlayerDistanceFromPoint(playerid, PosX, PosY, PosZ);
        
        if(
Dis <= CloseDist)
        {
            
FetchVeh = i;
            
CloseDist = Dist;
        }
    }
    return 
FetchVeh;
} 
Reply
#6

Thanks everybody for the help! It's so useful.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)