Portal SAMP
[Ajuda] Não consigo fazer com que não carregue o jogador negativamente. - 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] Não consigo fazer com que não carregue o jogador negativamente. (/showthread.php?tid=3071)

Páginas: 1 2


Não consigo fazer com que não carregue o jogador negativamente. - Rcon2014 - 09/12/2022

Bom dia, gostaria de comentar, estou com esse problema com esse comando, já tentei reparar mas não consegui. A questão com este comando é que cumpre todas as funções que tem de cumprir, mas infelizmente tem um erro que não consigo ver. Este comando é para vender o seu veículo a outro utilizador. Dou /venderveh ID -9999999 O que faz é , deixa o dinheiro em negativo para mim e o jogador que me enviou o pedido de venda dá 9999999 em positivo. É um exemplo, é o problema que tenho com isso. Isso faz com que a economia do servidor quebre e os usuários encha de dinheiro graças a esse bug, você poderia me ajudar?

Código:
    zcmd(venderveh, playerid, params[])
    {
        if(GetPlayerVehicleID(playerid) == PlayerVehicleInfo[playerid][0][pvID])
        {
            new idcar = GetPlayerVehicleID(playerid);
            if(VehicleOwner[idcar] == playerid)
            {
                if(!sscanf(params, "ud", params[0],params[1],params[2]))
                {
                    if(IsPlayerConnected(params[0]))
                    {
                        if(ProxDetectorS(8.0, playerid, params[0]))
                        {
                            if(GetPlayerMoney(params[0]) >= params[1])
                            {
                                if(PlayerVehicleInfo[params[0]][0][pvModel] == 0)
                                {
                                    if(PlayerInfo[params[0]][pLevel] < 2) return Message(playerid, COLOR_GRAD2, "El jugador necesita ser mínimo nivel 2.");
                                    if(SportVehicles(PlayerVehicleInfo[playerid][0][pvModel]))
                                      if(params[2] < 0) return Message(playerid, COLOR_WHITE, "* No puedes hacer esto.");
                                    {
                                        if(PlayerInfo[params[0]][pLevel] < 8) return Message(playerid, COLOR_GRAD2, "El jugador necesita ser mínimo nivel 8 para comprar este vehículo.");
                                    }
                                    SetPVarInt(params[0], "OwnableCarOffer", playerid);
                                    SetPVarInt(params[0], "OwnableCarID", idcar);
                                    SetPVarInt(params[0], "OwnableCarPrice", params[1]);
                                    SetPVarInt(params[0], "Petition_ID", 3);
                                    SetPVarInt(params[0], "Facturing", 1);
                                    new string[128];
                                    format(string, sizeof(string), "Ofreciste a %s tu vehículo por %d$", PlayerName(params[0]), params[1]);
                                       SendClientMessage(playerid, COLOR_WHITE, string);
                                    format(string, sizeof(string), "\t\t-- Compra de Vehículo --\t\t\n\t* %s te ofrece su %s a %d$, ¿acepta?", PlayerName(playerid), GetVehicleFriendlyName(PlayerVehicleInfo[playerid][0][pvID]), params[1]);
                                    SendRequest(params[0],  string);
                                    return 1;
                                } else Message(playerid, COLOR_GRAD2, "El jugador ya tiene un vehículo.");
                            } else Message(playerid, COLOR_GRAD2, "El jugador no tiene fondos suficientes.");
                        } else Message(playerid, COLOR_GRAD2, "Jugador muy lejos.");
                    } else Message(playerid, COLOR_GRAD2, "Jugador desconectado.");
                } else Message(playerid, COLOR_GRAD2, "Utilize: /venderveh <PlayerID> <Cantidad>");
            } else Message(playerid, COLOR_GRAD2, "No estás en tu auto.");
        } else Message(playerid, COLOR_GRAD2, "No estás en tu auto.");
        return 1;
    }



RE: Não consigo fazer com que não carregue o jogador negativamente. - nilat - 09/12/2022

Pelo que entendi desse bug ele é relativamente normal no SA:MP, acredito que no Open-MP isso venha a ser corrigido.
Esse tópico apresenta soluções: https://portalsamp.com/thread-1517.html


RE: Não consigo fazer com que não carregue o jogador negativamente. - xbruno1000x - 09/12/2022

Tem que adicionar verificações para que o valor dado não seja maior que o permitido no GTA SA, para verificar se o jogador tem aquele dinheiro para pagar e afins.


RE: Não consigo fazer com que não carregue o jogador negativamente. - Rcon2014 - 09/12/2022

Uma pergunta, pode ser feito para que o sinal "-" não possa ser colocado no comando? Acho que essa seria a solução, e se sim, como eu faria para estruturar? Já que o problema é quando o usuário usa o sinal de menos "-" Porque se o jogador não tiver o dinheiro, o carro não é vendido para ele, mas se o jogador colocar o valor - ele subtrai o dinheiro do vendedor e dá para ele. entregue ao comprador junto com o veículo


RE: Não consigo fazer com que não carregue o jogador negativamente. - Vel - 09/12/2022

Código:
new alvo,
  valor;

sscanf(params, "rd", alvo, valor);

if (alvo == INVALID_PLAYER_ID) {
  return SendClientMessage(playerid, -1, "Alvo desconectado.");
}

if (valor <= 0) {
  return SendClientMessage(playerid, -1, "O valor é zero ou negativo.");
}

if (GetPlayerMoney(alvo) < valor) {
  return SendClientMessage(playerid, -1, "Alvo não tem o valor.");
}



RE: Não consigo fazer com que não carregue o jogador negativamente. - xbruno1000x - 09/12/2022

(09/12/2022 13:13)Rcon2014 Escreveu: Uma pergunta, pode ser feito para que o sinal "-" não possa ser colocado no comando? Acho que essa seria a solução, e se sim, como eu faria para estruturar? Já que o problema é quando o usuário usa o sinal de menos "-" Porque se o jogador não tiver o dinheiro, o carro não é vendido para ele, mas se o jogador colocar o valor - ele subtrai o dinheiro do vendedor e dá para ele. entregue ao comprador junto com o veículo

Cara, pelo amor de deus, é literalmente só adicionar uma verificação para ver se o valor é menor que 0. Se for menor que 0, consequentemente é negativo. Para que o player não dê dinheiro demais até bugar, basta limitar o valor máximo ao máximo de dinheiro permitido no GTA SA. Adicionando essas duas verificações, você se livra dos problemas.


RE: Não consigo fazer com que não carregue o jogador negativamente. - White_Blue - 09/12/2022

(09/12/2022 13:13)Rcon2014 Escreveu: Uma pergunta, pode ser feito para que o sinal "-" não possa ser colocado no comando? Acho que essa seria a solução, e se sim, como eu faria para estruturar? Já que o problema é quando o usuário usa o sinal de menos "-" Porque se o jogador não tiver o dinheiro, o carro não é vendido para ele, mas se o jogador colocar o valor - ele subtrai o dinheiro do vendedor e dá para ele. entregue ao comprador junto com o veículo

É simples...

Um valor negativo consequentemente é menor que zero, fazendo essa verificação, se for menor que zero, retorna o que você quiser, pode ser uma mensagem ou simplesmente retorna 1(Nada).

[Imagem: np2.jpg]

Código PHP:
if(variavel 0) return ... 



RE: Não consigo fazer com que não carregue o jogador negativamente. - Rcon2014 - 09/12/2022

(09/12/2022 17:19)xbruno1000x Escreveu:
(09/12/2022 13:13)Rcon2014 Escreveu: Uma pergunta, pode ser feito para que o sinal "-" não possa ser colocado no comando? Acho que essa seria a solução, e se sim, como eu faria para estruturar? Já que o problema é quando o usuário usa o sinal de menos "-" Porque se o jogador não tiver o dinheiro, o carro não é vendido para ele, mas se o jogador colocar o valor - ele subtrai o dinheiro do vendedor e dá para ele. entregue ao comprador junto com o veículo

Cara, pelo amor de deus, é literalmente só adicionar uma verificação para ver se o valor é menor que 0. Se for menor que 0, consequentemente é negativo. Para que o player não dê dinheiro demais até bugar, basta limitar o valor máximo ao máximo de dinheiro permitido no GTA SA. Adicionando essas duas verificações, você se livra dos problemas.

Não me dê apoio de novo se for fazer isso com aquele amigo arrogante.


Muito obrigado aos demais, não entendi como fazer mas vou me aventurar a fazer com os dados que me deram.


RE: Não consigo fazer com que não carregue o jogador negativamente. - xbruno1000x - 10/12/2022

(09/12/2022 21:35)Rcon2014 Escreveu:
(09/12/2022 17:19)xbruno1000x Escreveu:
(09/12/2022 13:13)Rcon2014 Escreveu: Uma pergunta, pode ser feito para que o sinal "-" não possa ser colocado no comando? Acho que essa seria a solução, e se sim, como eu faria para estruturar? Já que o problema é quando o usuário usa o sinal de menos "-" Porque se o jogador não tiver o dinheiro, o carro não é vendido para ele, mas se o jogador colocar o valor - ele subtrai o dinheiro do vendedor e dá para ele. entregue ao comprador junto com o veículo

Cara, pelo amor de deus, é literalmente só adicionar uma verificação para ver se o valor é menor que 0. Se for menor que 0, consequentemente é negativo. Para que o player não dê dinheiro demais até bugar, basta limitar o valor máximo ao máximo de dinheiro permitido no GTA SA. Adicionando essas duas verificações, você se livra dos problemas.

Não me dê apoio de novo se for fazer isso com aquele amigo arrogante.


Muito obrigado aos demais, não entendi como fazer mas vou me aventurar a fazer com os dados que me deram.

Em nenhum momento fui arrogante, peço desculpas se achou isso.

Acontece que o que você estava querendo fazer era o equivalente a reinventar a roda. Um exemplo de como fazer isso que você falou seria transformar a variável em string e usar o strfind para localizar "-". Depois você obtendo a posição do caractere "-", teria que deleta-lo da string. É uma volta muito grande para algo tão simples, porque se variavel < 0 então ela é negativa.


RE: Não consigo fazer com que não carregue o jogador negativamente. - CoelhaO_LokaO - 12/12/2022

Caralho o tanto de chave faz um loop