Portal SAMP
[Ajuda] Sistema de radar bugando alcance e funçoes - 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] Sistema de radar bugando alcance e funçoes (/showthread.php?tid=3336)



Sistema de radar bugando alcance e funçoes - AllanSG - 14/02/2023

Boa tarde/noite/dia

To fazendo um sistema de radares editaveis e criaveis in-game, essa parte de criar, carregar e editar esta tudo ok. Porém o sistema em sí da funcionabilidade do radar nao está como deveria.

eu tive como base sistema de radares de outros servidores, pois nao sabia como ia criar, entao vo deixar a public e as stocks aq pra q possam me ajudar a identificar o erro.

PROBLEMA: se aumentar o raio do pedagio eu tomo varias multas até sair do raio, se eu diminuir o raio eu passo um pouco mais afastado (tipo na outra mao da rua) e o radar nao pega.

Se eu ficar parado ou passar devagar no pedagio ele vai floodando a mensagem de velocidade registrada enquanto eu estiver no raio.

eu queria saber oq eu faço pra fazer com q o radar faça só uma leitura por cada passada por ele, e isso ja resolveria tambem o bug de floodar caso fique parado nele

Obs: a public é chamada no timer atualizador do velocimetro, nao achei outro lugar q eu pudesse colocar


Citar:forward OnPlayerRadar(playerid);
public OnPlayerRadar(playerid)
{
new id = GetPlayerVehicleID(playerid);                      //bike rural              bike BMX                bike Mountain
if(IsPlayerInAnyVehicle(playerid) && PLAYER_STATE_DRIVER && GetVehicleModel(id) != 481 && GetVehicleModel(id) != 509 && GetVehicleModel(id) != 510)
{
new texto[256];

for(new i; i < MAX_RADAR; i++)
{
if(IsPlayerInCircle(playerid, Radar[i][RadarX], Radar[i][RadarY], 10))
{
if(GetPlayerSpeed(playerid) > Radar[i][rLimite])
{
if(OnRadar[playerid] == 0)
{
TextDrawShowForPlayer(playerid, DrawFlash);
PlayerPlaySound(playerid,1132, 0.0, 0.0, 0.0);
SetTimerEx("flash", 1000, false, "i", playerid);

format(texto, sizeof(texto),"| RADAR | Velocidade registrada: %i Km/h", GetPlayerSpeed(playerid));
SendClientMessage(playerid, verde, texto);
format(texto, sizeof(texto), "| RADAR | Você foi multado por excesso de velocidade no radar (%dKm/h)", Radar[i][rLimite]);
SendClientMessage(playerid, modavancado, texto);
Player[playerid][Multas] ++;
format(texto, sizeof(texto),"| INFO | Você já está acumulando %d multas!", Player[playerid][Multas]);
SendClientMessage(playerid, azul2, texto);



if(Player[playerid][Multas] >= 5 && Player[playerid][HabA] == 1)
{
Player[playerid][HabT] = 0;
Player[playerid][Crimes] += 10;
SetPlayerWantedLevel(playerid, 6);
SendClientMessage(playerid,modavancado,"| INFO | Você perdeu sua habilitação e rebeu 10 pontos de crimes por acumular 6 multas!");
}
if(Player[playerid][HabA] == 0)
{
Player[playerid][Crimes] += 10;
SetPlayerWantedLevel(playerid, 6);
SendClientMessage(playerid,modavancado,"| INFO | Você recebeu 10 pontos de crime por estar sem habilitação");
}

OnRadar[playerid] = 1;

}
}
else
{

if(OnRadar[playerid] == 0)
{
GameTextForPlayer(playerid, "~r~RADAR", 3000, 3);
format(texto, 256,"| RADAR | Velocidade registrada: %iKm/h", GetPlayerSpeed(playerid));
SendClientMessage(playerid, verde, texto);
OnRadar[playerid] = 1;
}
}
}
else OnRadar[playerid] = 0;
}
}
}


IsPlayerInCircle(playerid,Float:x,Float:y,radius)
{
if(GetPlayerDistanceToPoint2(playerid,Float:x,Float:y) < radius)
{
return 1;
}
return 0;
}

GetPlayerDistanceToPoint2(playerid,Float:x,Float:y)
{
new Float:x1,Float:y1,Float:z1; GetPlayerPos(playerid,x1,y1,z1);
new Float:tmpdis = floatsqroot(floatpower(floatabs(floatsub(x,x1)),2)+
floatpower(floatabs(floatsub(y,y1)),2));
return floatround(tmpdis);
}



RE: Sistema de radar bugando alcance e funçoes - Dr Editor - 14/02/2023

Não vou te dar um código pronto, mas vou te ajudar a resolver com uma resposta objetiva.
Esse tipo de lógica parece algo mirabolante quando na verdade é EXTREMAMENTE SIMPLES!!

Como fazer uma verificação com temporizador e evitar flood?
Basicamente, quando um jogador ENTRA no raio você já verificou, correto? Então basta criar uma variável que seja responsável por receber um valor que identifique que o jogador ENTROU no raio e nas próximas verificações você já sabe que ele está no raio, logo não receberá novos avisos.
Após SAIR do raio você reseta o valor para que quando entre neste raio ou em qualquer outro você saiba identificar que aquele jogador precisa ser verificado novamente.


RE: Sistema de radar bugando alcance e funçoes - xbruno1000x - 14/02/2023

O problema está acontecendo pois isso deve estar dentro de um timer e, quanto maior o raio, mais vezes serão verificadas a velocidade.

O ideal para esse sistema seria criar Dynamic's areas com o plugin Streamer e verificar se quando o player entrou na área(na public OnPlayerEnterDynamicArea) se a velocidade estava acima do permitido.


RE: Sistema de radar bugando alcance e funçoes - AllanSG - 14/02/2023

valeu guys! coloquei as variaveis nos locais certos e coloquei os codigos na OnPlayerEnterDynamicArea e OnPlayerLeaveDynamicArea e tudo funcionou certinho