GetClosestPlayer (originally posted by cessil)
#1

Hello! I took this code from some post by cessil, somebody tell what's wrong in this code!
It takes all players around san andreas instead of taking the closest one.

pawn Код:
stock Float:GetDistanceBetweenPoints(Float:rx1,Float:ry1,Float:rz1,Float:rx2,Float:ry2,Float:rz2)
{
    return floatadd(floatadd(floatsqroot(floatpower(floatsub(rx1,rx2),2)),floatsqroot(floatpower(floatsub(ry1,ry2),2))),floatsqroot(floatpower(floatsub(rz1,rz2),2)));
}

stock GetClosestPlayer(playerid,Float:limit)
{
    new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2;
    GetPlayerPos(playerid,x1,y1,z1);
    new Float:Range = 999.0; //What is float suppose to mean? i change it to 5.0 and still doesn't work
    new id = -1;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i) && playerid != i)
        {
            GetPlayerPos(i,x2,y2,z2);
            new Float:Dist = GetDistanceBetweenPoints(x1,y1,z1,x2,y2,z2);
            if(floatcmp(Range,Dist) == 1 && floatcmp(limit,Range) == 1)
            {
                Range = Dist;
                id = i;
            }
        }
    }
    return id;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if ((newkeys & KEY_LOOK_BEHIND) && !(oldkeys & KEY_LOOK_BEHIND)) //if he press this key, it will take the closest wanted player but it takes all wanted players in the game o_O"
    {
        GetClosestPlayer(playerid,5.0); //The wanted player must be in range of 5.0 from the cop
        for(new i=0; i<MAX_PLAYERS; i++)
        {
            if(IsCop[playerid] == true && IsWanted[i] == true)
            {
                //rest of code
            }
        }
    }
}
Reply
#2

Wrong usage
Why do you even loop?

Use it like
pawn Код:
new
    x = GetClosestPlayer( playerid, 5.0 );
if ( id != -1 ) // ID is valid
{
    // Rest of code
}
Reply
#3

I already tried that and didn't work too. Bump!
Reply
#4

pawn Код:
stock Float:GetDistanceBetweenPoints(Float:rx1,Float:ry1,Float:rz1,Float:rx2,Float:ry2,Float:rz2)
{
    return floatadd(floatadd(floatsqroot(floatpower(floatsub(rx1, rx2), 2)), floatsqroot(floatpower(floatsub(ry1, ry2), 2))), floatsqroot(floatpower(floatsub(rz1, rz2), 2)));
}

stock GetClosestPlayer(playerid, Float:limit)
{
    new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, Float:Dist, id = INVALID_PLAYER_ID;
    GetPlayerPos(playerid,x1,y1,z1);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(!IsPlayerConnected(i)) continue;
        if(i == playerid) continue;
        GetPlayerPos(i, x2, y2, z2);
        Dist = GetDistanceBetweenPoints(x1, y1, z1, x2, y2, z2);
        if(Dist < limit || id == INVALID_PLAYER_ID)
        {
            limit = Dist;
            id = i;
        }
    }
    return id;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if((newkeys & KEY_LOOK_BEHIND) && !(oldkeys & KEY_LOOK_BEHIND))
    {
        if(IsCop[playerid])
        {
            new target = GetClosestPlayer(playerid,5.0); //The wanted player must be in range of 5.0 from the cop
            if(target != INVALID_PLAYER_ID)
            {
                if(IsWanted[target])
                {
                    //Rest of code...
                }
            }
        }
    }
    return 1;
}
Reply
#5

Doesn't work! It arrest the wanted player even if you are so far away from him. Here is the full code:
pawn Код:
stock Float:GetDistanceBetweenPoints(Float:rx1,Float:ry1,Float:rz1,Float:rx2,Float:ry2,Float:rz2)
{
    return floatadd(floatadd(floatsqroot(floatpower(floatsub(rx1, rx2), 2)), floatsqroot(floatpower(floatsub(ry1, ry2), 2))), floatsqroot(floatpower(floatsub(rz1, rz2), 2)));
}

stock GetClosestPlayer(playerid, Float:limit)
{
    new Float:x1, Float:y1, Float:z1, Float:x2, Float:y2, Float:z2, Float:Dist, id = INVALID_PLAYER_ID;
    GetPlayerPos(playerid,x1,y1,z1);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(!IsPlayerConnected(i)) continue;
        if(i == playerid) continue;
        GetPlayerPos(i, x2, y2, z2);
        Dist = GetDistanceBetweenPoints(x1, y1, z1, x2, y2, z2);
        if(Dist < limit || id == INVALID_PLAYER_ID)
        {
            limit = Dist;
            id = i;
        }
    }
    return id;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if ((newkeys & KEY_LOOK_BEHIND) && !(oldkeys & KEY_LOOK_BEHIND))
    {
        if(IsCop[playerid] == true)
        {
            new targetid = GetClosestPlayer(playerid,5.0);
            if(IsKidnapped[playerid] == true && Spawned[playerid] == false) return 1;
            if(targetid == INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_WHITE, "{FF0000}[Error:] {FFFFFF}There are no players close enough to arrest.");
            if(GetPlayerWantedLevel(targetid) == 0) return SendClientMessage(playerid, COLOR_WHITE, "{FF0000}[Error:] {FFFFFF}There are no players close enough to arrest.");
            if(IsSpawned[targetid] == false || IsFreezed[targetid] == true) return SendClientMessage(playerid, COLOR_WHITE, "{FF0000}[Error:] {FFFFFF}There are no players close enough to arrest.");

            if(GetPlayerWantedLevel(targetid) >= 4)
            {
                //rest of code
                return 1;
            }
        }
    }
    return 1;
}
Reply
#6

pawn Код:
stock GetClosestPlayer(playerid, Float:dis)
{
    new x, Float:dis2, player;
    player = -1;
    for (x = 0; x < MAX_PLAYERS; x++)
    {
        if(IsPlayerConnected(x) && GetPlayerState(x) != PLAYER_STATE_SPECTATING)
        {
            if(x != playerid)
            {
                dis2 = GetDistanceBetweenPlayers(x,playerid);
                if(dis2 < dis && dis2 != -1.00)
                {
                    dis = dis2;
                    player = x;
                }
            }
        }
    }
    return player;
}
Try this, I tweaked it a little bit to try to suit the one you posted.
Reply
#7

Thanks! I will, but first you should post how do you return GetDistanceBetweenPlayers function.
Reply
#8

Quote:
Originally Posted by Juvanii
Посмотреть сообщение
Thanks! I will, but first you should post how do you return GetDistanceBetweenPlayers function.
Well, I have a different function than you do. So here's mine:
pawn Код:
public Float:GetDistanceBetweenPlayers(p1,p2) //p1 stands for player1, and p2 for player2
{
    new Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
    if(!IsPlayerConnected(p1) || !IsPlayerConnected(p2))
    {
        return -1.00;
    }
    GetPlayerPos(p1,x1,y1,z1);
    GetPlayerPos(p2,x2,y2,z2);
    return floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
And you can call it by using (I looped it):
pawn Код:
for(new i=0;i<MAX_PLAYERS;i++)
{
    GetDistanceBetweenPlayers(playerid, i);
}
return 1;
Reply
#9

Thanks man, works perfect! +REP
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)