Portal SAMP
[Ajuda] Cobrar a cada 100 metros - 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] Cobrar a cada 100 metros (/showthread.php?tid=4480)



Cobrar a cada 100 metros - zBarbosa - 30/01/2024

Fiz um sistema de Uber e quero que o valor da corrida seja definida pela distância percorrida pelo Uber.

Como faço para ser cobrado uma taxa de dinheiro a cada 100 metros percorridos?


RE: Cobrar a cada 100 metros - Dr Editor - 30/01/2024

A forma mais simples é quando o jogador entra no veículo salvar a posição.
Depois basta cobrar com base na localização salva usando GetPlayerDistanceFromPoint calculando a distância.


RE: Cobrar a cada 100 metros - zBarbosa - 30/01/2024

(30/01/2024 16:04)Dr Editor Escreveu: A forma mais simples é quando o jogador entra no veículo salvar a posição.
Depois basta cobrar com base na localização salva usando GetPlayerDistanceFromPoint calculando a distância.

Existem outras formas? Quais?


RE: Cobrar a cada 100 metros - Vel - 30/01/2024

A melhor maneira seria determinar um ponto inicial e final e em seguida determinar a distância.

Se você não tiver um ponto final definido, você pode fazer assim:
Código PHP:
static FloatgVehicleDistanceTraveled[MAX_VEHICLES],
  gPlayerVehicleDistanceTimerID[MAX_PLAYERS];

forward CalculatePlayerVehicleDistance(playerid);

public 
OnPlayerStateChange(playeridnewstateoldstate) {
  if (newstate == PLAYER_STATE_DRIVER) {
    gPlayerVehicleDistanceTimerID[playerid] = SetTimerEx("CalculatePlayerVehicleDistance"1000true"d"playerid);
  } else if (oldstate == PLAYER_STATE_DRIVER) {
    KillTimer(gPlayerVehicleDistanceTimerID[playerid]);
  }
}

public 
CalculatePlayerVehicleDistance(playerid) {
  new vehicleid GetPlayerVehicleID(playerid);

  if (!vehicleid) {
    return;
  }

  // y_vehicledata
  // https://github.com/pawn-lang/YSI-Includes/blob/5.x/YSI_Game/y_vehicledata/y_vehicledata_entry.inc#L1275
  new Floatspeed Vehicle_Speed(vehicleid) * 0.27777778;

  gVehicleDistanceTraveled[vehicleid] += speed;

  if (floatround(gVehicleDistanceTraveled[vehicleid]) % 100 speed) {
    // SendClientMessage(playerid, -1, "Seu veículo percorreu 100 metros. (total: %.2f)", gVehicleDistanceTraveled[vehicleid]);
  }


Funciona, no entanto, e é um pouco falho, pois o motorista pode simplesmente dirigir em círculos.


RE: Cobrar a cada 100 metros - xbruno1000x - 30/01/2024

(30/01/2024 16:15)zBarbosa Escreveu:
(30/01/2024 16:04)Dr Editor Escreveu: A forma mais simples é quando o jogador entra no veículo salvar a posição.
Depois basta cobrar com base na localização salva usando GetPlayerDistanceFromPoint calculando a distância.

Existem outras formas? Quais?

Pode colocar um timer e ir cobrando de x em x segundos enquanto estiver dentro do veículo, com base na distância percorrida. Mas de 100 em 100 metros é difícil detectar.


RE: Cobrar a cada 100 metros - Carlos Victor - 31/01/2024

O problema de 100 em 100 metros, é que não importa a distância, só vai apitar se ele se afastar do ponto X 100 metros, não é como se fosse um calculator de quilometragem, se você tiver é mais fácil. Que seria só calcular a quilometragem inicial e verificar se é 100 metros ou maior e cobrar.

Geralmente esses sistemas são cobrados por tempo, a cada X tempo é cobrado um valor, é mais fácil dessa forma.


RE: Cobrar a cada 100 metros - agi.exe - 04/02/2024

(30/01/2024 15:06)zBarbosa Escreveu: Fiz um sistema de Uber e quero que o valor da corrida seja definida pela distância percorrida pelo Uber.

Como faço para ser cobrado uma taxa de dinheiro a cada 100 metros percorridos?

Se armazenar a posição atual do veiculo do uber, e atualizar se a distancia entre o veiculo  e a posição armazenada for maior que 
100 metros, isso pode ser uma solução para o seu problema.
Código PHP:
new Float:corridaMetros[MAX_VEHICLES][3]; // Array com 3 posições  (0, 1, 2)
new UberVeiculo// Para armazenar o ID do veiculo uber

public OnGameModeInit(){
    
UberVeiculo CreateVehicle(....); // Criação do veiculo!
    
return 1;
}

public 
OnPlayerStateChange(playeridnewstateoldstate){
    if(
newstate == PLAYER_STATE_PASSENGER){ // Entrou dentro de um veiculo como passageiro

        
new vehicleid;
        if((
vehicleid=GetPlayerVehicleID(playerid)) == UberVeiculo){ // Entrou no veiculo do uber
            
SetTimerEx("timer_UBER", (1000), false"dd"playeridvehicleid); // o timer e responsável por fazer a verificação a cada 1 segundo.
            
GetVehiclePos(vehicleidcorridaMetros[vehicleid][0],corridaMetros[vehicleid][1],corridaMetros[vehicleid][2]); // pegamos a posição do veiculo (Ponto inicial da corrida e atual ponto)
        
}
    }
    return 
1;
}
forward timer_UBER(vehicleidplayerid);
public 
timer_UBER(vehicleidplayerid){
    
// o playerid e o passageiro!
    
if(GetPlayerState(playerid) == PLAYER_STATE_PASSENGER && GetPlayerVehicleID(playerid) == UberVeiculo){ // Caso todas condicoes sejam verdadeiras continue.
        
        // pegamos a distancia entre o veiculo e o ponto atual da corrida.
        
new Float:distancia 
            
GetVehicleDistanceFromPoint(vehicleidcorridaMetros[vehicleid][0],corridaMetros[vehicleid][1],corridaMetros[vehicleid][2]);

        if(
distancia >= 100.0){ // se a distancia for maior ou igual a 100 metros, armazenamos um novo ponto a partir da posição atual do veiculo.
            // Novo ponto da corrida
            
GetVehiclePos(vehicleidcorridaMetros[vehicleid][0],corridaMetros[vehicleid][1],corridaMetros[vehicleid][2]);
            
            if(
GetPlayerMoney(playerid) < 100){
                
// remover o passageiro do veiculo.
                
RemovePlayerFromVehicle(playerid);
            }else{
                
// descontar o passageiro.
                
GivePlayerMoney(playerid, -100);
                
msg(playerid, -1"100 metros percorridos, você foi descontado $100.");
            }
        }

        
SetTimerEx("timer_UBER", (1000), false"dd"playeridvehicleid); // Seta o timer novamente.
    
}else{
        
// O jogador nao esta no veiculo do UBER ou nao como passageiro.
        
corridaMetros[vehicleid][0] = 0.0;
        
corridaMetros[vehicleid][1] = 0.0;
        
corridaMetros[vehicleid][2] = 0.0;
    }
    return 
1;