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(playeridFloat:range)
{
    new 
FloatxFloatyFloatz;
    new 
Floatclosedist range;
    new 
closeveh;
    for(new 
1MAX_VEHICLESi++)
    {
        if(
GetVehiclePos(ixyz))
        {
            
dist GetPlayerDistanceFromPoint(playeridxyz);
            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(playeridFloat:range)
{
    new 
FloatxFloatyFloatz;
    new 
Floatclosedist range;
    new 
closeveh;
    for(new 
1MAX_VEHICLESi++)
    {
        if(
GetVehiclePos(ixyz))
        {
            if (
IsPlayerInVehicle(playeridi)) continue;
            
dist GetPlayerDistanceFromPoint(playeridxyz);
            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 FloatxFloatyFloatz
You have to define the tag every time after the comma.

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

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

PHP код:
stock GetClosestVehicle(playeridFloat:range

    new 
FloatxFloatyFloatz
    new 
Floatclosedist range
    new 
closeveh
    new 
playerveh;
    
playerveh GetPlayerVehicleID(playerid);
    for(new 
1MAX_VEHICLESi++) 
    {
         if(
playerveh == i) continue; 
        if(
GetVehiclePos(ixyz)) 
        {  
            
dist GetPlayerDistanceFromPoint(playeridxyz); 
            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(playeridFloatrange)
{
    new 
FloatPosXFloatPosYFloatPosZFloatCloseDist rangeFloatDistFetchVehPlayerVeh;
    
PlayerVeh GetPlayerVehicleID(playerid);
    for(new 
GetVehiclePoolSize(); != 0i--)
    {
        if(!
IsValidVehicle(i)) continue;
        if(
== PlayerVeh) continue;
        
GetVehiclePos(iPosXPosYPosZ);
        
Dist GetPlayerDistanceFromPoint(playeridPosXPosYPosZ);
        
        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)