[Ajuda] Dъvida simples "IsPlayerInRangeOfPoint"
#1

Olб vim sу pedir uma ajudinha de como fazer para nгo identificar a altura com o IsPlayerInRangeOfPoint, eu to tentando fazer um anti cheater mas a posiзгo "Z" incomodarб para faze-lo /= tem outra funзгo ou um jeito de nгo usar a posiзгo "Z" ?

Tipo:

PHP код:
if(IsPlayerInRangeOfPoint(playerid10.0XY)) 
Para
PHP код:
if(IsPlayerInRangeOfPoint(playerid10.0X)) 
Reply
#2

Claro.

pawn Код:
stock IsPlayerInRangeOfPoint2D(playerid, Float:range, Float:x, Float:y) {
    new Float:posX, Float:posY, Float:posZ;
    GetPlayerPosition(playerid, posX, posY, posZ);
   
    new Float:newX = (posX - x > 0 ? (posX - x) : (x - posX)),
        Float:newY = (posY - y > 0 ? (posY - y) : (y - posY));
   
    new Float:distance = floatsqroot((newX * newX) + (newY * newY)); //Pitбgoras bбsico
    if(distance <= range)
        return true;
    return false;
}
Obs: Nгo verifiquei o code pois nгo possuo mais SA:MP no meu computador.

No caso do cуdigo acima nгo funcionar, pensei nesta outra maneira (mais lуgica, menos calculo):
pawn Код:
stock IsPlayerInRangeOfPoint2D(playerid, Float:range, Float:x, Float:y) {
    new Float:posX, Float:posY, Float:posZ;
    GetPlayerPosition(playerid, posX, posY, posZ);
   
    if(IsPlayerInRangeOfPoint(playerid, range, x, y, posZ))
        return true;
    return false;
}
Reply
#3

Quote:
Originally Posted by Dr_Pawno
Посмотреть сообщение
Claro.

pawn Код:
stock IsPlayerInRangeOfPoint2D(playerid, Float:range, Float:x, Float:y) {
    new Float:posX, Float:posY, Float:posZ;
    GetPlayerPosition(playerid, posX, posY, posZ);
   
    new Float:newX = (posX - x > 0 ? (posX - x) : (x - posX)),
        Float:newY = (posY - y > 0 ? (posY - y) : (y - posY));
   
    new Float:distance = Floatsqrt((newX * newX) + (newY * newY)); //Pitбgoras bбsico
    if(distance <= range)
        return true;
    return false;
}
Obs: Nгo verifiquei o code pois nгo possuo mais SA:MP no meu computador.

No caso do cуdigo acima nгo funcionar, pensei nesta outra maneira (mais lуgica, menos calculo):
pawn Код:
stock IsPlayerInRangeOfPoint2D(playerid, Float:range, Float:x, Float:y) {
    new Float:posX, Float:posY, Float:posZ;
    GetPlayerPosition(playerid, posX, posY, posZ);
   
    if(IsPlayerInRangeOfPoint(playerid, range, x, y, posZ))
        return true;
    return false;
}
Vou tentar aqui amigo, jб te dou respostas '-'
Reply
#4

Usei a lуgica do antigo PlayerToPoint (usado antes do IsPlayerInRangeOfPoint ser adicionado).

pawn Код:
IsPlayerInRangeOfXY(playerid, Float:radius, Float:x, Float:y) {

    if (IsPlayerConnected(playerid) | IsPlayerNPC(playerid)) {
        new
            Float:velha[3],
            Float:nova[2];
        GetPlayerPos(playerid, velha[0], velha[1], velha[2]);
        nova[0] = (velha[0]-x), nova[1] = (velha[1]-y);

        if (((nova[0] < radius) && (nova[1] > -radius))) return 0x1;
    }
   
    return 0x0;
}
No meu teste, funcionou perfeitamente. Pode ser usado em npcs...
Reply
#5

Quote:
Originally Posted by Abravanel
Посмотреть сообщение
Usei a lуgica do antigo PlayerToPoint (usado antes do IsPlayerInRangeOfPoint ser adicionado).

pawn Код:
IsPlayerInRangeOfXY(playerid, Float:radius, Float:x, Float:y) {

    if (IsPlayerConnected(playerid) | IsPlayerNPC(playerid)) {
        new
            Float:velha[3],
            Float:nova[2];
        GetPlayerPos(playerid, velha[0], velha[1], velha[2]);
        nova[0] = (velha[0]-x), nova[1] = (velha[1]-y);

        if (((nova[0] < radius) && (nova[1] > -radius))) return 0x1;
    }
   
    return 0x0;
}
No meu teste, funcionou perfeitamente. Pode ser usado em npcs...
Sу comentando:
Sua lуgica funciona em uma бrea quadrada, enquanto as minhas funciona em бrea circular.
Reply
#6

Funcionou Dr_Pawno

usei assim


if(IsPlayerInRangeOfPoint(playerid, 70.0, Pos_Hack[playerid][hX], Pos_Hack[playerid][hY], Pos_Hack[playerid][hZ]))


Funcionou mas acho que nгo consigo dar +rep ainda

Mas muito obrigado (=
Reply
#7

Quote:
Originally Posted by Dr_Pawno
Посмотреть сообщение
Sу comentando:
Sua lуgica funciona em uma бrea quadrada, enquanto as minhas funciona em бrea circular.
Circular?

Colega, vocк usou Floatsqrt (vocк quis dizer Floatsqroot - SQUARE ROOT (16.0 = 4x4) ). O que um quadrado tem a ver com sua бrea circular?

Para manipular circulos vocк deve usar PI. No caso, seria o dobro ( 6,28 ). Isso junto, provavelmente, ao seno e cosseno.

Na verdade, na verdade, isso й ъtil na criaзгo de algo circular e nгo na verificaзгo. Como o raio й o centro do ponto, sу colocar o raio normalmente seja na minha ou na sua funзгo que vai funcionar em um circulo .
Reply
#8

Quote:
Originally Posted by Abravanel
Посмотреть сообщение
Circular?

Colega, vocк usou Floatsqrt (vocк quis dizer Floatsqroot - SQUARE ROOT (16.0 = 4x4) ). O que um quadrado tem a ver com sua бrea circular?

Para manipular circulos vocк deve usar PI. No caso, seria o dobro ( 6,28 ). Isso junto, provavelmente, ao seno e cosseno.

Na verdade, na verdade, isso й ъtil na criaзгo de algo circular e nгo na verificaзгo. Como o raio й o centro do ponto, sу colocar o raio normalmente seja na minha ou na sua funзгo que vai funcionar em um circulo .
Nгo precisa de PI, ele estб checando a distancia entre 2 pontos.
http://freespace.virgin.net/hugo.eli...nes/r_dist.htm


PS: Seu cуdigo estб completamente errado. E confuso.
Reply
#9

Entгo, fiz um Debug grбfico na UnityEngine:

Dados de Entrada:
Бrea = 201x201
Posiзгo de Verificaзгo = (100;100)
Distвncia verificada = 10

Dados de Saнda:
Esquerda: Meu cуdigo
Direita: Seu cуdigo
* Verde: Na distвncia
* Vermelho: Fora da distвncia
* Pontinho Azul no meio da Imagem: X e Y verificado.


Source Code:
http://pastebin.com/2xQrhzU4
PS: Fiz questгo de deixar seu cуdigo o mais idкntico possнvel do seu post (Estб em C#), enquanto jб o meu fiz como deveria ser feito no C#.

--

Sу lembrando que Floatsqroot (Sim, escrevi errado) ou Sqrt como й chamado, retorna o valor da Raiz Quadrada, Raiz quadrada de 16 й 4, e nгo 4x4.

Corrigindo e fazendo uma pequena optimizaзгo:
pawn Код:
stock IsPlayerInRangeOfPoint2D(playerid, Float:range, Float:x, Float:y) {
    new Float:posX, Float:posY, Float:posZ;
    GetPlayerPosition(playerid, posX, posY, posZ);
   
    new Float:newX = posX - x,
        Float:newY = posY - y;
   
    new Float:distance = floatabs(floatsqroot((newX * newX) + (newY * newY))); //Pitбgoras bбsico
    if(distance <= range)
        return true;
    return false;
}
Reply
#10

Quote:
Originally Posted by Kuddy
Посмотреть сообщение
Nгo precisa de PI, ele estб checando a distancia entre 2 pontos.
http://freespace.virgin.net/hugo.eli...nes/r_dist.htm


PS: Seu cуdigo estб completamente errado. E confuso.
Destaquei bem para vocк ler novamente o que eu escrevi. E gostaria de saber, como meu cуdigo estб completamente errado?!?! Nгo tem nada de errado. Ъnico equнvoco foi eu nгo ter igualado ao ponto ( <= | >= ), fator que nгo tem muita importвncia jб que funciona quase da mesma forma. E sinceramente, o cуdigo estб bastante claro, se vocк nгo consegue enxergar, desfaзa-o e recria de uma forma mais simples, se isso for possнvel rs.
Quote:
Originally Posted by Abravanel
Посмотреть сообщение
Para manipular circulos vocк deve usar PI. No caso, seria o dobro ( 6,28 ). Isso junto, provavelmente, ao seno e cosseno.

Na verdade, na verdade, isso й ъtil na criaзгo de algo circular e nгo na verificaзгo. Como o raio й o centro do ponto, sу colocar o raio normalmente seja na minha ou na sua funзгo que vai funcionar em um circulo .
@Dr_Pawno
Quote:
Originally Posted by Abravanel
Посмотреть сообщение
Colega, vocк usou Floatsqrt (vocк quis dizer Floatsqroot - SQUARE ROOT (16.0 = 4x4) ). O que um quadrado tem a ver com sua бrea circular?
Vocк interpretou errado o que eu quis dizer em 16.0 = 4x4. Tentei expressar que square root retorna a raiz e nгo o 4x4 como vocк entendeu rs.

De qualquer forma, houve um equнvoco no meu cуdigo realmente. Nгo programo em C# entгo fiz um teste com javascript. Porйm, devo ressaltar, que meu cуdigo, se usado um raio correto, pegarб grande parte do cнrculo .
http://i.imgur.com/PvhvJnK.jpg
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)