Dъvida simples "IsPlayerInRangeOfPoint" -
RafaelMau - 23.10.2015
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(playerid, 10.0, X, Y, Z ))
Para
PHP код:
if(IsPlayerInRangeOfPoint(playerid, 10.0, X, Y ))
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
Dr_Pawno - 23.10.2015
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;
}
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
RafaelMau - 23.10.2015
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 '-'
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
Abravanel - 23.10.2015
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...
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
Dr_Pawno - 23.10.2015
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.
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
RafaelMau - 23.10.2015
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 (=
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
Abravanel - 23.10.2015
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

.
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
Kuddy - 23.10.2015
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.
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
Dr_Pawno - 23.10.2015
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;
}
Re: Dъvida simples "IsPlayerInRangeOfPoint" -
Abravanel - 23.10.2015
Quote:
Originally Posted by Kuddy
|
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