Getting closest vehicle
#1

Lets say i wanted to check if the closest vehicle next me had its trunk open, How would I do this?
Reply
#2

pawn Код:
stock IsPlayerNearAnyVehiclewTrunk(playerid)
{
    new engine, lights, alarm, doors, bonnet, boot, objective;
    GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    if(IsPlayerNearAnyVehicle(playerid, 100.0) && boot == 1)
    {
         return true;
    }
    else
    {
        return false;
    }
}

stock IsPlayerNearAnyVehicle(playerid, Float:range=100.0)
{
        for(new i; i<MAX_VEHICLES; i++)
        {
                GetVehiclePos(i, p[0], p[1], p[2]);
                if(IsPlayerInRangeOfPoint(playerid, range, p[0], p[1], p[2]))return true;
                return false;
        }
}
untested code, made by me within 5 minutes

EDIT: code repaired a bit:

pawn Код:
stock IsPlayerNearAnyVehiclewTrunk(playerid, Float:range=100.0)
{
        for(new i; i<MAX_VEHICLES; i++)
        {
            new boot;
            GetVehicleParamsEx(i, engine, lights, alarm, doors, bonnet, boot, objective);
            #pragma usused engine
            #pragma usused lights
            #pragma usused alarm
            #pragma usused doors
            #pragma usused bonnet
            #pragma usused objective
            GetVehiclePos(i, p[0], p[1], p[2]);
            if(IsPlayerInRangeOfPoint(playerid, range, p[0], p[1], p[2]) && boot == 0) return true;
            return false;
        }
}
For example:

pawn Код:
CMD:closetrunk(playerid, params[])
{
    if(!IsPlayerConnected(playerid)) return 1;
    if(IsPlayerNearAnyVehiclewTrunk(playerid, 100.0))
    {
        new engine, lights, alarm, doors, bonnet, boot, objective;
        GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
        SetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, 1, objective); //CLOSING THE TRUNK
        SendClientMessage(playerid, red, "You have closed the trunk of the vehicles with trunk open!");
    }
    return 1;
}
Reply
#3

Quote:
Originally Posted by kamzaf
Посмотреть сообщение
pawn Код:
stock IsPlayerNearAnyVehiclewTrunk(playerid)
{
    new engine, lights, alarm, doors, bonnet, boot, objective;
    GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    if(IsPlayerNearAnyVehicle(playerid, 100.0) && boot == 1)
    {
         return true;
    }
    else
    {
        return false;
    }
}

stock IsPlayerNearAnyVehicle(playerid, Float:range=100.0)
{
        for(new i; i<MAX_VEHICLES; i++)
        {
                GetVehiclePos(i, p[0], p[1], p[2]);
                if(IsPlayerInRangeOfPoint(playerid, range, p[0], p[1], p[2]))return true;
                return false;
        }
}
untested code, made by me within 5 minutes

EDIT: code repaired a bit:

pawn Код:
stock IsPlayerNearAnyVehiclewTrunk(playerid, Float:range=100.0)
{
        for(new i; i<MAX_VEHICLES; i++)
        {
            new boot;
            GetVehicleParamsEx(i, engine, lights, alarm, doors, bonnet, boot, objective);
            #pragma usused engine
            #pragma usused lights
            #pragma usused alarm
            #pragma usused doors
            #pragma usused bonnet
            #pragma usused objective
            GetVehiclePos(i, p[0], p[1], p[2]);
            if(IsPlayerInRangeOfPoint(playerid, range, p[0], p[1], p[2]) && boot == 1) return true;
            return false;
        }
}
Still doesn't work.
Reply
#4

code edited once more, try again.
Reply
#5

Quote:
Originally Posted by kamzaf
Посмотреть сообщение
code edited once more, try again.
error 017: undefined symbol "p"
warning 215: expression has no effect
error 001: expected token: ";", but found "]"
error 029: invalid expression, assumed zero
atal error 107: too many error messages on one line
Reply
#6

Doesn't matter.
Reply
#7

I don't know if you still need it, but here:

pawn Код:
stock GetNearestVehicle(playerid, Float:distance = 30.0)
{
    new
        Float:fPos[3],
        Float:sPos[3],
        currentvehicle,
        engine,
        lights,
        alarm,
        doors,
        bonnet,
        boot,
        objective
    ;

    GetPlayerPos(playerid, fPos[0], fPos[1], fPos[2]);

    for(new v = 1; v < MAX_VEHICLES; v++)
    {
        GetVehicleParamsEx(v, engine, lights, alarm, doors, bonnet, boot, objective);
        if(boot == 1)
        {
            GetVehiclePos(v, sPos[0], sPos[1], sPos[2]);
           
            new Float:odist =
               
                floatsqroot(
                    floatpower(floatsub(sPos[0], fPos[0]), 2.0) +
                    floatpower(floatsub(sPos[1], fPos[1]), 2.0) +
                    floatpower(floatsub(sPos[2], fPos[2]), 2.0)
                )
               
            ;

            if (odist < distance)
            {
                currentvehicle = v;
                distance = odist;
            }
        }
    }
    return currentvehicle;
}
Reply
#8

Zalman's solution is completely out to lunch and RealCop's solution is close but incorrect as well obviously you must have misread .

" Lets say i wanted to check if the closest vehicle next me had its trunk open, How would I do this? "

His code will find the closest vehicle with the trunk open but that is not the problem he wants to check if the closest vehicle to him has the trunk open which is completely different, try this it will also double as finding the closest vehicle to you cheers!

Tested and works.

Код:
#include <a_samp>
#include <zcmd>

CMD:getcar(playerid, arg[])
{
	new veh = GetClosestVehicle(playerid, 100.0);
	if(veh != INVALID_VEHICLE_ID)
	{
        if(IsTrunkOpen(veh)) SendClientMessage(playerid, 0xFF00FFFF, "You are near a vehicle with a trunk open!");
        else SendClientMessage(playerid, 0xFF00FFFF, "You are not near a vehicle with a trunk open!");
	}
	else SendClientMessage(playerid, 0xFF00FFFF, "You are not near any vehicles");

	return 1;

}

stock IsTrunkOpen(vehicleid)
{
  	new engine, lights, alarm, doors, bonnet, boot, objective;
   	GetVehicleParamsEx(vehicleid, engine, lights, alarm, doors, bonnet, boot, objective);
    if(boot) return 1;
    return 0;
}

stock GetClosestVehicle(playerid, Float:Range = 100.0)
{
	new ClosestVehicle;
	new Float:ClosestDist = 100000.0;
	new Float:DistX;
	new Float:DistY;
	new Float:DistZ;
	new Float:px;
	new Float:py;
	new Float:pz;
	new Float:CheckDist;

	// Get the players position
	GetPlayerPos(playerid, px, py, pz);

	// Loop through vehicles to find cloest vehicle
	for(new i = 0; i < MAX_VEHICLES; i++)
	{
		// Vehicle doesn't exist
	    if(!GetVehicleModel(i)) continue;

		// Get vehicle position
		GetVehiclePos(i, DistX, DistY, DistZ);

		// Get the distance
		CheckDist = floatsqroot(
                    floatpower(floatsub(DistX, px), 2.0) +
                    floatpower(floatsub(DistY, py), 2.0) +
                    floatpower(floatsub(DistZ, pz), 2.0));

		// Distance less than range?
		if(CheckDist <= Range)
		{
			// Distance less than cloest distance, new cloest distance!
			if(CheckDist < ClosestDist)
			{
				ClosestDist = CheckDist;
				ClosestVehicle = i;
			}
		}
	}
	// Cloest less than or equal to the range return the closest vehicle ID
	if(ClosestDist <= Range) return ClosestVehicle;
	// no vehichle? return INVALID_VEHICLE_ID
	return INVALID_VEHICLE_ID;
}
Reply
#9

maybe this snippet from my FingerPrint include helps you - it only returns the closest vehicle ID, its up to you to add a check (copy from above) for the trunk opened.
pawn Код:
CMD:clv(playerid,params[]){
    new vid;
    if(!sscanf(params,"K<clv>("#playerid")",vid))
    {
        new string[128];
        format(string,sizeof(string),"closest vehicle: %d.",vid);
        SendClientMessage(playerid,MSGSUCC_COLOR,string);
    }
    return 1;
}
using sscanf2's custom specifiers is awesome, especially if the routine gets a speedup by the JIT Compiler plugin :P
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)