Portal SAMP
[Ajuda] saber player próximo algum caixa - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] saber player próximo algum caixa (/showthread.php?tid=3368)



saber player próximo algum caixa - Cirilo_Samp - 23/02/2023

Bom, queria colocar no neu gps localizar caixa eletrônico mais próximo, qual funcao devo usar para saber que tem um caixa mais próximo?


RE: saber player próximo algum caixa - xbruno1000x - 23/02/2023

IsPlayerInRangeOfPoint ou GetPlayerDistanceFromPoint. Depois tem que adaptar ao seu sistema.


RE: saber player próximo algum caixa - Carlos Victor - 27/02/2023

Dá uma olhada nesse código e adapte para você:

Código PHP:
stock ReturnNearestATM(playerid)
{
    new 
        Float:x
        Float:y
        Float:z,
        Float:distance 999999.999,
        id = -1;
 
    for(new 
1MAX_ATMSi++) if(AtmInfo[i][atmExists])
    {                
        x 
AtmInfo[i][atmPos][0];
        y AtmInfo[i][atmPos][1];
        z AtmInfo[i][atmPos][2];

        if(GetPlayerDistanceFromPoint(playeridxyz) < distance)
        {
            distance GetPlayerDistanceFromPoint(playeridxyz);
            id i;            
        
}
    }
    return id;




RE: saber player próximo algum caixa - strelo - 09/03/2023

Para encontrar o caixa eletrônico mais próximo, você precisaria ter uma lista de localizações de caixas eletrônicos em sua região. Em seguida, você pode usar a função GetPlayerPos para obter a localização atual do jogador e, em seguida, calcular a distância entre a localização atual do jogador e as localizações dos caixas eletrônicos em sua lista.

Você pode usar a função GetPlayerPos para obter a posição atual do jogador:
Código:
GetPlayerPos(playerid, &Float:x, &Float:y, &Float:z);

Em seguida, você pode usar a fórmula de distância euclidiana para calcular a distância entre a posição atual do jogador e a posição de cada caixa eletrônico em sua lista. Você pode armazenar as posições dos caixas eletrônicos em uma matriz de estruturas:
Código:
new struct ATMLocation
{
    Float:x, y, z;
};
new ATMLocation:ATMLocations[MAX_ATMS];

Em seguida, você pode usar um loop for para calcular a distância entre a posição atual do jogador e cada caixa eletrônico em sua lista:
Código:
new Float:distance, Float:minDistance = 99999.0;
new nearestATM = -1;
for (new i = 0; i < MAX_ATMS; i++)
{
    distance = sqrt(
        pow(playerPos[0] - ATMLocations[i].x, 2.0) +
        pow(playerPos[1] - ATMLocations[i].y, 2.0) +
        pow(playerPos[2] - ATMLocations[i].z, 2.0)
    );
    if (distance < minDistance)
    {
        minDistance = distance;
        nearestATM = i;
    }
}

Ao final do loop, a variável nearestATM conterá o índice do caixa eletrônico mais próximo. Você pode usar essa informação para exibir a localização do caixa eletrônico mais próximo para o jogador.