Portal SAMP
[Ajuda] Detectar cidade principal por POS - 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] Detectar cidade principal por POS (/showthread.php?tid=3146)



Detectar cidade principal por POS - hiwyn - 06/01/2023

É simples de criar uma função que recebe X,Y,Z

E a partir dessa posição retornar se ela é de LV,LS,SF?


RE: Detectar cidade principal por POS - MarcosBrazz - 06/01/2023

Sim, aqui tem elas ja criadas.
Código PHP:
stock IsPlayerInLS(playerid)
{
    new Float:xls,Float:yls,Float:zls;
    
GetPlayerPos(playerid,xls,yls,zls);
    if(
xls && yls 0) return 1;
    return 
0;
}

stock IsPlayerInSF(playerid)
{
   new Float:xls,Float:yls,Float:zls;
    
GetPlayerPos(playerid,xls,yls,zls);
    if(
xls 0) return 1;
    return 
0;
}

stock IsPlayerInLV(playerid)
{
   new Float:xls,Float:yls,Float:zls;
    
GetPlayerPos(playerid,xls,yls,zls);
    if(
xls && yls 0) return 1;
    return 
0;




RE: Detectar cidade principal por POS - hiwyn - 06/01/2023

(06/01/2023 13:36)MarcosBrazz Escreveu: Sim, aqui tem elas ja criadas.
Código PHP:
stock IsPlayerInLS(playerid)
{
    new Float:xls,Float:yls,Float:zls;
    
GetPlayerPos(playerid,xls,yls,zls);
    if(
xls && yls 0) return 1;
    return 
0;
}

stock IsPlayerInSF(playerid)
{
   new Float:xls,Float:yls,Float:zls;
    
GetPlayerPos(playerid,xls,yls,zls);
    if(
xls 0) return 1;
    return 
0;
}

stock IsPlayerInLV(playerid)
{
   new Float:xls,Float:yls,Float:zls;
    
GetPlayerPos(playerid,xls,yls,zls);
    if(
xls && yls 0) return 1;
    return 
0;



Só deu problema nas cidades pequenas....

As cidades do deserto de LV (forst carson, castillo del diablo, bony county, tierra robada, el quebrados)
estão marcando como SF
E as cidades do norte de LS ali de Red Country algumas marcaram como LV (montgomery, palomino)


Tem como arrumar pra pra essas do norte de LS (montgomery, palomino) marcar LS e as do deserto de LV marcar (forst carson, castillo del diablo, bony county, tierra robada, el quebrados) LV?


Ou então fazer uma separação dessas cidades do deserto de LV, outra pras cidades de red country, angel pine, bayside, lv, sf, ls?


RE: Detectar cidade principal por POS - MarcosBrazz - 06/01/2023

Tente com essas, acredito que sejam mais precisas:
Código PHP:
static stock IsPlayerInSF(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);
      if(>= -2954.502 && >=  -3012.892 && <= -957.5858 && <= 1436.379) return 1;
      else return 0;
}
static 
stock IsPlayerInLS(playerid)
{
     new Float:x,Float:y,Float:z;
     GetPlayerPos(playeridxyz);
     if(>= -922.5522 && >=   -2791.012 && <= 2954.502 && <= 385.3699) return 1;
     else return 0;
}
static 
stock IsPlayerInLV(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);
      if(>= -1307.922 && >=   490.4708 && <=  2977.858 && <= 3153.026) return 1;
      else return 0;

Essas e as outras foram retiradas da internet.


RE: Detectar cidade principal por POS - k2bi_YT - 06/01/2023

Se eu entendi, você quer que o jogador dar spawn na cidade que estiver mais próxima? Caso seja, vê se essa função pode ser util.

Você pode pegar a posição do local onde queira que o player spawna, e definir na variavel LocalSpawn, Ao usar a função, ele irá detectar qual a distancia menor em relação da posição do player para o local de spawn, e será setado para as coordenadas definida

Código PHP:
new Float:LocalSpawn[][] =
{
    {
1687.2244,1441.6006,10.7686},//LV
    
{-1984.6943,146.1562,27.6875},//SF
    
{1540.2509,-1684.9756,13.5502}//LS
};

SpawnPlayerProx(playerid)
{
    new 
distance 999999, var = -1;
    for(new 
i!= sizeof(LocalSpawn); ++i)
    {
        if(
GetPlayerDistanceFromPoint(playeridLocalSpawn[i][0], LocalSpawn[i][1], LocalSpawn[i][2]) < distance)
        {
            
distance GetPlayerDistanceFromPoint(playeridLocalSpawn[i][0], LocalSpawn[i][1], LocalSpawn[i][2]);
            var = 
i;
        }
    }
    if(var != -
1SetPlayerPos(playeridLocalSpawn[var][0], LocalSpawn[var][1], LocalSpawn[var][2]);
    return 
true;




RE: Detectar cidade principal por POS - hiwyn - 07/01/2023

(06/01/2023 20:30)MarcosBrazz Escreveu: Tente com essas, acredito que sejam mais precisas:
Código PHP:
static stock IsPlayerInSF(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);
      if(>= -2954.502 && >=  -3012.892 && <= -957.5858 && <= 1436.379) return 1;
      else return 0;
}
static 
stock IsPlayerInLS(playerid)
{
     new Float:x,Float:y,Float:z;
     GetPlayerPos(playeridxyz);
     if(>= -922.5522 && >=   -2791.012 && <= 2954.502 && <= 385.3699) return 1;
     else return 0;
}
static 
stock IsPlayerInLV(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);
      if(>= -1307.922 && >=   490.4708 && <=  2977.858 && <= 3153.026) return 1;
      else return 0;

Essas e as outras foram retiradas da internet.

Nossa mano, muito obrigado, tá quase lá
Como vc fez isso?

Só teve problemas em: Bayside (SF), El Quebrados (LV) e Montgomery (LS)
O resto tá lindão

Anotações:
Código:
SF:
() bayside não marcou nenhuma cidade (nem LS,LV,SF)
(x) angel pine marcou como SF

as cidades do deserto de LV:
() el quebrados não marcou nenhuma cidade (nem LS,LV,SF)
(x) tierra roubada, fort carson, las payassadas ta marcando como LV

LS Red Contry:
() montgomery ta marcando como LS, mas se vc for muito pro norte, perto do postinho que tem lá ele fica sem marcar nada (nem LS, LV, SF)
(x) palo mino ta marcando como LS
(x) bluy berry ta marcando LS

Sabe como resolver?

(06/01/2023 21:34)k2bi_YT Escreveu: Se eu entendi, você quer que o jogador dar spawn na cidade que estiver mais próxima? Caso seja, vê se essa função pode ser util.

Você pode pegar a posição do local onde queira que o player spawna, e definir na variavel LocalSpawn, Ao usar a função, ele irá detectar qual a distancia menor em relação da posição do player para o local de spawn, e será setado para as coordenadas definida

Código PHP:
new Float:LocalSpawn[][] =
{
    {1687.2244,1441.6006,10.7686},//LV
    {-1984.6943,146.1562,27.6875},//SF
    {1540.2509,-1684.9756,13.5502}//LS
};

SpawnPlayerProx(playerid)
{
    new distance 999999, var = -1;
    for(new i!= sizeof(LocalSpawn); ++i)
    {
        if(GetPlayerDistanceFromPoint(playeridLocalSpawn[i][0], LocalSpawn[i][1], LocalSpawn[i][2]) < distance)
        {
            distance GetPlayerDistanceFromPoint(playeridLocalSpawn[i][0], LocalSpawn[i][1], LocalSpawn[i][2]);
            var = i;
        }
    }
    if(var != -1SetPlayerPos(playeridLocalSpawn[var][0], LocalSpawn[var][1], LocalSpawn[var][2]);
    return true;


Não, é o que o @MarcosBrazz  está me quase ajudando a fazer mesmo, detectar qual cidade main (LV,SF,LS) a partir de uma posição


RE: Detectar cidade principal por POS - MarcosBrazz - 07/01/2023

Essas corrigem seus problemas:
Bayside & El quebrados marcando SF (El quebrados não achei qual o "estado" oficial de la então coloquei para o "estado" mais próximo, SF e por estar bem próximo de bayside)
Montgomery completo marcando em LS 

Código PHP:
static stock IsPlayerInSF(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);

      if(>= -2954.502 && >=  -3012.892 && <= -1072.0885 && <= 3226.4199) return 1;
      else if(>= -1346.4348 && >= 2365.0273 && <= -2911.6282 && <= 3081.9246) return 1;
      else return 0;
}
static 
stock IsPlayerInLS(playerid)
{
     new Float:x,Float:y,Float:z;
     GetPlayerPos(playeridxyz);
     if(>= -922.5522 && >= -2791.012 && <= 2985.7551 && <= 524.7400) return 1;
     else return 0;
}
static 
stock IsPlayerInLV(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);
      if(>= -1307.922 && >=   490.4708 && <=  2977.858 && <= 3153.026) return 1;
      else return 0;

Veja essa mensagem citada para tentar entender como é feita essas funções:
Citar:Malz por não te responder antes, fiquei um tempo sem entrar.

Então cara, essas cordenadas são pegas na transversal, você pega a primeira coordenada no ponto A e depois anda/corre em linha reta e pega a segunda coordenada no ponto B.
Observação: Só vai preicsar de X e Y.

Ex.:

Ponto A: X, Y

1683.59375-2160.15625,-33.5000000

Ponto B: X, Y

1958.984375-1960.9375,-20.5000000




Ponto A: X
Mínimo1683.59375
Ponto B: X
Máximo1958.984375

Ponto A: Y
Y Máximo: -1960.9375
Ponto B: Y
Y Mínimo: -2160.15625
Lembrete: Quando o numeral está negativo o que se aproximar mais de ZERO é maior, -1960.9375 > -2160.15625.


if(x >= Mínimo1683.59375 && y >= Y Mínimo: -2160.15625 && x <= Máximo1958.984375 && y <= -Y Máximo: -1960.9375) return 1;





if(x >= 1683.59375 && y >= -2160.15625 && x <= 1958.984375 && y <= -1960.9375) return 1;

if(x >= minx && y >= miny && x <= maxx && y <= -maxy) return 1;



OU



Você pode usar esse site para pegar as posições com mais facilidade,

https://dev.prineside.com/en/gtasa_gangzone_editor/
Mensagem do: @Mathews


RE: Detectar cidade principal por POS - hiwyn - 08/01/2023

(07/01/2023 11:16)MarcosBrazz Escreveu: Essas corrigem seus problemas:
Bayside & El quebrados marcando SF (El quebrados não achei qual o "estado" oficial de la então coloquei para o "estado" mais próximo, SF e por estar bem próximo de bayside)
Montgomery completo marcando em LS 

Código PHP:
static stock IsPlayerInSF(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);

      if(>= -2954.502 && >=  -3012.892 && <= -1072.0885 && <= 3226.4199) return 1;
      else if(>= -1346.4348 && >= 2365.0273 && <= -2911.6282 && <= 3081.9246) return 1;
      else return 0;
}
static 
stock IsPlayerInLS(playerid)
{
     new Float:x,Float:y,Float:z;
     GetPlayerPos(playeridxyz);
     if(>= -922.5522 && >= -2791.012 && <= 2985.7551 && <= 524.7400) return 1;
     else return 0;
}
static 
stock IsPlayerInLV(playerid)
{
      new Float:x,Float:y,Float:z;
      GetPlayerPos(playeridxyz);
      if(>= -1307.922 && >=   490.4708 && <=  2977.858 && <= 3153.026) return 1;
      else return 0;

Veja essa mensagem citada para tentar entender como é feita essas funções:
Citar:Malz por não te responder antes, fiquei um tempo sem entrar.

Então cara, essas cordenadas são pegas na transversal, você pega a primeira coordenada no ponto A e depois anda/corre em linha reta e pega a segunda coordenada no ponto B.
Observação: Só vai preicsar de X e Y.

Ex.:

Ponto A: X, Y

1683.59375-2160.15625,-33.5000000

Ponto B: X, Y

1958.984375-1960.9375,-20.5000000




Ponto A: X
Mínimo1683.59375
Ponto B: X
Máximo1958.984375

Ponto A: Y
Y Máximo: -1960.9375
Ponto B: Y
Y Mínimo: -2160.15625
Lembrete: Quando o numeral está negativo o que se aproximar mais de ZERO é maior, -1960.9375 > -2160.15625.


if(x >= Mínimo1683.59375 && y >= Y Mínimo: -2160.15625 && x <= Máximo1958.984375 && y <= -Y Máximo: -1960.9375) return 1;





if(x >= 1683.59375 && y >= -2160.15625 && x <= 1958.984375 && y <= -1960.9375) return 1;

if(x >= minx && y >= miny && x <= maxx && y <= -maxy) return 1;



OU



Você pode usar esse site para pegar as posições com mais facilidade,

https://dev.prineside.com/en/gtasa_gangzone_editor/
Mensagem do: @Mathews


nossa mano obrigado, vou fazer muitas coisas com essas funções, muito obrigado mesmo

2 ultimas perguntas:

1
el quebrados é uma cidade de deserto bem perto de bayside, as cidades de deserto são demarcadas como LV
teria como fazer el quebrados ser LV ao inves de SF?
nao sei se vc consegue pq tem q fazer um quadradao tipo uma gz pra demarcar tudo

2
pra pegar essas coordenadas vc vai no ponto mais alto no norte esquerda pra pegar o X,Y 1 e dps vai pro ponto mais baixo na direita pra pegar o X,Y 2?