Portal SAMP
[Ajuda] Loop - 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] Loop (/showthread.php?tid=1217)



Loop - virtuS_ - 24/05/2021

Fiz um loop através de três posições, para verificar qual destas estão na range de 1000.0 do jogador, mas, está pegando somente a primeira coordenada(LV), e quando perto das outras, exibe a frase que não estou no alcance. Alguém consegue verificar?

Código:
    new Float:x, Float:y, Float:z;
    for(new i = 0; i < sizeof(ACourierDepots); i++)
    {
        if(IsPlayerInRangeOfPoint(playerid, 1000.0, ACourierDepots[i][DepotX], ACourierDepots[i][DepotY], ACourierDepots[i][DepotZ]))
        {
            x = ACourierDepots[i][DepotX];
            y = ACourierDepots[i][DepotY];
            z = ACourierDepots[i][DepotZ];
            break;
        }
        else { return SendClientMessage(playerid, -1, "* Fora do alcance de depósitos."); }
    }

Código:
enum TCourierDepots
{
    Float:DepotX,
    Float:DepotY,
    Float:DepotZ
}
new ACourierDepots[][TCourierDepots] =
{
    {1060.5903, 1915.3047, 10.8203}, // LV
    {-1862.2478, -143.3715, 11.9051}, // SF
    {797.6805, -617.8581, 16.3359} // LS
};



RE: Loop - ProKillerPa - 24/05/2021

Boa tarde.

Sim, seu codigo possui uns errinhos, veja só: Em loops quando voce quer imprimir uma mensagem como a sua que o jogador nao está proximo de um deposito por exemplo, voce precisa usar a criatividade. Eu geralmente uso uma variavel e atribuo um valor a ela, e depois verifico se é igual a 0 ou igual a 1. O Problema do seu script é o seguinte: Voce identifica no loop que começa em 0, que é a coordenada de LV, até aí OK. Porém voce usa um else logo abaixo, fazendo com que o script encerre o loop através do return caso o jogador não esteja na coordenada encontrada pelo primeiro giro do loop ( lv ).
Para sanar seu problema, voce fará o seguinte:

Código PHP:
    new Float:xFloat:yFloat:zpqp 0;
    for(new 0sizeof(ACourierDepots); i++)
    {
        if(IsPlayerInRangeOfPoint(playerid1000.0ACourierDepots[i][DepotX], ACourierDepots[i][DepotY], ACourierDepots[i][DepotZ]))
        {
            x ACourierDepots[i][DepotX];
            y ACourierDepots[i][DepotY];
            z ACourierDepots[i][DepotZ];

            pqp++;

            SendClientMessage(playerid, -1"Voce esta no Range 1000.0 de um dos 3 depositos.");
            break;
        }
    }

    if(pqp == 0SendClientMessage(playerid, -1"* Fora do alcance de depósitos."); 



RE: Loop - virtuS_ - 25/05/2021

(24/05/2021 17:44)ProKillerPa Escreveu: Boa tarde.

Sim, seu codigo possui uns errinhos, veja só: Em loops quando voce quer imprimir uma mensagem como a sua que o jogador nao está proximo de um deposito por exemplo, voce precisa usar a criatividade. Eu geralmente uso uma variavel e atribuo um valor a ela, e depois verifico se é igual a 0 ou igual a 1. O Problema do seu script é o seguinte: Voce identifica no loop que começa em 0, que é a coordenada de LV, até aí OK. Porém voce usa um else logo abaixo, fazendo com que o script encerre o loop através do return caso o jogador não esteja na coordenada encontrada pelo primeiro giro do loop ( lv ).
Para sanar seu problema, voce fará o seguinte:

Código PHP:
    new Float:xFloat:yFloat:zpqp 0;
    for(new 0sizeof(ACourierDepots); i++)
    {
        if(IsPlayerInRangeOfPoint(playerid1000.0ACourierDepots[i][DepotX], ACourierDepots[i][DepotY], ACourierDepots[i][DepotZ]))
        {
            x ACourierDepots[i][DepotX];
            y ACourierDepots[i][DepotY];
            z ACourierDepots[i][DepotZ];

            pqp++;

            SendClientMessage(playerid, -1"Voce esta no Range 1000.0 de um dos 3 depositos.");
            break;
        }
    }

    if(pqp == 0SendClientMessage(playerid, -1"* Fora do alcance de depósitos."); 

Foram erros bobos, muito obrigado! +rep