Portal SAMP
[Ajuda] Localizar e identificar player mais próximo - 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] Localizar e identificar player mais próximo (/showthread.php?tid=787)



Localizar e identificar player mais próximo - KruCz - 17/02/2021

Boa tarde, users.
Estou tentado fazer uma função para localizar e identificar o jogador mais próximo a partir de um comando.

Estou tentando da seguinte maneira:

Código PHP:
CMD:teste(playeridparams[])
{
    new 
Float:PosCP[3], str[40];
    
GetPlayerPos(playeridPosCP[0], PosCP[1], PosCP[2]);
    for(new 
iMAX_PLAYERSi++)
    {
           if(
IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i10PosCP[0], PosCP[1], PosCP[2]))
           {
                
// ação para o jogador mais próximo.
                
format(strsizeof(str),"Você está mais próximo do jogador %s, você deu 1000 reais à ele."nome(i));
                
SCM(playerid, -1str);
           
                
GivePlayerMoney(i1000);
           }
    }
    return 
1;


Porém, acredito que irá haver problemas pois se tiver dois ou mais jogadores próximos, ele irá identificar os dois.

Alguém poderia me ajudar?


RE: Localizar e identificar player mais próximo - xbruno1000x - 17/02/2021

Ao utilizar Max_Players você cria um loop que irá verificar quantos jogadores estão próximos em comparação com o todo. Use GetDistanceBetweenPlayers para buscar o player mais próximo, e descartar o restante.


RE: Localizar e identificar player mais próximo - KruCz - 18/02/2021

(17/02/2021 15:53)xbruno1000x Escreveu: Ao utilizar Max_Players você cria um loop que irá verificar quantos jogadores estão próximos em comparação com o todo. Use GetDistanceBetweenPlayers para buscar o player mais próximo, e descartar o restante.

Obrigado, funcionou perfeitamente  Smile


RE: Localizar e identificar player mais próximo - MisteriumBr - 11/01/2023

Código PHP:
CMD:teste(playeridparams[])
{
    new Float:PosCP[3], str[40];
    GetPlayerPos(playeridPosCP[0], PosCP[1], PosCP[2]);
    for(new iMAX_PLAYERSi++)
    {
           if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i10PosCP[0], PosCP[1], PosCP[2]))
           {
                // ação para o jogador mais próximo.
                format(strsizeof(str),"Você está mais próximo do jogador %s, você deu 1000 reais à ele."nome(i));
                SCM(playerid, -1str);
           
                GivePlayerMoney
(i1000);
           }
    }
    return 1;


Opa, como ficaria o codigo acima com a função GetDistanceBetweenPlayers?


RE: Localizar e identificar player mais próximo - xbruno1000x - 11/01/2023

(11/01/2023 09:29)MisteriumBr Escreveu: Opa, como ficaria o codigo acima com a função GetDistanceBetweenPlayers?

Função GetDistanceBetweenPlayers:

Código:
forward Float:GetDistanceBetweenPlayers(p1,p2);
public Float:GetDistanceBetweenPlayers(p1,p2)
{
    new Float:Pos1[3], Float:Pos2[3];

    if(!IsPlayerConnected(p1) || !IsPlayerConnected(p2))
        return -1.00;

    GetPlayerPos(p1, Pos1[0], Pos1[1], Pos1[2]),
    GetPlayerPos(p2, Pos2[0], Pos2[1], Pos2[2]);

    return floatsqroot(floatpower(floatabs(floatsub(Pos2[0],Pos1[0])),2)+floatpower(floatabs(floatsub(Pos2[1],Pos1[1])),2)+floatpower(floatabs(floatsub(Pos2[2],Pos1[2])),2));
}

Comando:
Código:
CMD:teste(playerid, params[])
{
    new Float:PosCP[3], str[40];
    GetPlayerPos(playerid, PosCP[0], PosCP[1], PosCP[2]);
    for(new i; i < MAX_PLAYERS; i++)
    {
           if(GetDistanceBetweenPlayers(playerid, i) <= 10)
           {
                format(str, sizeof(str),"Você está próximo do jogador %s, você deu 1000 reais à ele.", nome(i));
                SCM(playerid, -1, str);
           
                GivePlayerMoney(i, 1000);
           }
    }
    return 1;

Vale ressaltar que para dar o dinheiro apenas para 1 jogador, terá que usar o break para parar o looping.


RE: Localizar e identificar player mais próximo - Colono - 22/09/2023

(11/01/2023 12:20)xbruno1000x Escreveu:
(11/01/2023 09:29)MisteriumBr Escreveu: Opa, como ficaria o codigo acima com a função GetDistanceBetweenPlayers?

Função GetDistanceBetweenPlayers:

Código:
forward Float:GetDistanceBetweenPlayers(p1,p2);
public Float:GetDistanceBetweenPlayers(p1,p2)
{
    new Float:Pos1[3], Float:Pos2[3];

    if(!IsPlayerConnected(p1) || !IsPlayerConnected(p2))
        return -1.00;

    GetPlayerPos(p1, Pos1[0], Pos1[1], Pos1[2]),
    GetPlayerPos(p2, Pos2[0], Pos2[1], Pos2[2]);

    return floatsqroot(floatpower(floatabs(floatsub(Pos2[0],Pos1[0])),2)+floatpower(floatabs(floatsub(Pos2[1],Pos1[1])),2)+floatpower(floatabs(floatsub(Pos2[2],Pos1[2])),2));
}

Comando:
Código:
CMD:teste(playerid, params[])
{
    new Float:PosCP[3], str[40];
    GetPlayerPos(playerid, PosCP[0], PosCP[1], PosCP[2]);
    for(new i; i < MAX_PLAYERS; i++)
    {
           if(GetDistanceBetweenPlayers(playerid, i) <= 10)
           {
                format(str, sizeof(str),"Você está próximo do jogador %s, você deu 1000 reais à ele.", nome(i));
                SCM(playerid, -1, str);
           
                GivePlayerMoney(i, 1000);
           }
    }
    return 1;

Vale ressaltar que para dar o dinheiro apenas para 1 jogador, terá que usar o break para parar o looping.
E como ficaria esse código se fosse pra pegar o máximo de jogadores em volta do player? (um exemplo pra ficar mais facil de entender) /darvidaperto e retorna dando vida a todos os players que estão envolta.


RE: Localizar e identificar player mais próximo - xbruno1000x - 22/09/2023

(22/09/2023 11:32)Colono Escreveu: E como ficaria esse código se fosse pra pegar o máximo de jogadores em volta do player? (um exemplo pra ficar mais facil de entender) /darvidaperto e retorna dando vida a todos os players que estão envolta.

Ao invés de GivePlayerMoney, usaria SetPlayerHealth. O resto segue igual(obviamente necessitando adaptar funções que eram próprias do gamemode, como substituir SCM por SendClientMessage).

Documentação:
https://www.open.mp/pt-BR/docs/scripting/functions/SetPlayerHealth