[Ajuda] Bug random
#1

Olб estou tentando fazer um sistema de vender veнculos, mas estou muito perdido com essa funзгo random.

Eu consegui fazer tudo certinho mas quando ele vai verificar o veнculo a ser vendido ele chama a funзгo random e fica escolhendo aleatoriamente mudando do funзгo, alguйm pode dar uma ajudinha?



Eu pretendo fazer isso com vбrios veнculos ainda...
Reply
#2

Estб repetindo vбrias vezes? Se sim, da uma olhada no timer.
Код:
SetTimerEx("VenderCarro",1000, true, "i", plid); //false = chama o timer uma vez sу.
Sinceramente, nгo entendi muito bem seu cуdigo. Da pra fazer isso de uma forma bem mais simplificada e otimizada.
Reply
#3

Quote:
Originally Posted by Abravanel
Посмотреть сообщение
Estб repetindo vбrias vezes? Se sim, da uma olhada no timer.
Код:
SetTimerEx("VenderCarro",1000, true, "i", plid); //false = chama o timer uma vez sу.
Sinceramente, nгo entendi muito bem seu cуdigo. Da pra fazer isso de uma forma bem mais simplificada e otimizada.
Se eu colocar 1 vez sу ele terб que ficar 1 minuto esperando na garagem com o modelo especificado e seu eu colocar para repetir a cara 1 minuto ele vai ficar repetindo e trocando o modelo de veнculo
Reply
#4

Poste seu cуdigo que te dou uma ajuda, alem de que nгo entendi muito bem sua pergunta. :P
Reply
#5

Quote:
Originally Posted by Dr_Pawno
Посмотреть сообщение
Poste seu cуdigo que te dou uma ajuda, alem de que nгo entendi muito bem sua pergunta. :P
Aqui amigo eu tinha colocado mas como ng ajudou eu tirei
http://pastebin.com/nnU5PAtU
Reply
#6

Poderia me explicar melhor qual o bug e qual o objetivo do cуdigo?
Reply
#7

Eu queria fazer assim: A cada 1 hora 1 tipo de carro seria vendido, mas a random que eu fiz ta chamando muitas vezes e nгo consigo verificar o IsPlayerInArea sem chamar a random junto olha:


PHP код:
//Aqui ele verifica a cara 1 segundo se ele tб na posiзгo
if(IsPlayerInArea(playerid, -1964.867553253.466934, -1925.898315309.475463)) 
MAS

PHP код:
        if(Veh == VeiculosBBO[RandomMSG[randMSG][0]] || Veh == VeiculosBBO[RandomMSG[randMSG][1]] || Veh == VeiculosBBO[RandomMSG[randMSG][2]] || Veh == VeiculosBBO[RandomMSG[randMSG][3]] || Veh == VeiculosBBO[RandomMSG[randMSG][4]] || Veh == VeiculosBBO[RandomMSG[randMSG][5]])
//Aqui ele fica chamando a cada 1 minuto alterando o modelo o que nгo deveria acontecer...
        
{
            
SendClientMessage(playerid0xFF0000FF,"VENDIDO!");
            for(new 
plid=0;plid<MAX_PLAYERS;++plid)
            {
                
KillTimer(TimerEstaNaGarragem[plid]);
                
SetVehicleToRespawn(Veh);
                
Block[plid] = false;
            }
        } 
Reply
#8

O que eu entendi, me corrija se eu estiver errado.
Код:
* A cada 60 minitos um veнculo diferente.
* A cada um minuto o servidor verifica se o jogador estб em um veнculo.
* Sу um veнculo й vendido por hora.

O objetivo do seu cуdigo й, em ordem:
- O jogador estar na Бrea Correta;
- O jogador estar no Carro Correto;

Se todos essas condiзхes forem verdadeiras ele vai:
- Exibir "VENDIDO!" no Chat;
- Parar o Timer do Jogador que estб no carro que acabou de 'comprar'; -> Estou usando um timer para todos jogadores, entгo nгo hб um Timer para cara jogador.
- Respawnar o Veнculo Comprado;
O cуdigo para a lуgica acima й algo do tipo:

pawn Код:
//Maneira fбcil de calcular tempo para um timer: (Horas*Minutos*Segundos*1000), ignorando valores 1.
//                   (Minutos * Segundos * 1000)
new newVehicleTime = (60      * 60       * 1000);
new updatePlayerTime = (60 * 1000); //Um minuto
new currentVehicle = -1; //Guardarб o veнculo atual

new bool:isInGaragem[MAX_PLAYERS];

public OnFilterScriptInit() {
    SetTimer("AtualizarVeiculo", newVehicleTime, true); //Executara 'AtualizarVeiculo' a cada uma hora apуs este Script ser iniciado.
    AtualizarVeiculo(); //Como o 'SetTimer' sу executarб daqui uma hora, atualize o veнculo pela primeira vez.
   
    SetTimer("AtualizarCarro", updatePlayerTime, true); //Executara 'AtualizarCarro' a cada minuto para todos jogadores.
   
    //Seus veнculos
    VeiculosBBS[] = ...
}

//Ter certeza de que o jogador nгo inicie 'na garagem'.
public OnPlayerConnect(playerid) {
    isInGaragem[playerid] = false;
    return 1;
}

forward AtualizarVeiculo();
public AtualizarVeiculo() {
    //Respawna o Veнculo Antigo no caso de ele nгo estar vendido.
    if(currentVehicle != -1)
        SetVehicleToRespawn(VeiculosBBO[currentVehicle]);

    //Faz com que o veнculo nгo repita.
    new oldVeh = currentVehicle;
    while(oldVeh != currentVehicle)
        currentVehicle = random(sizeof(VeiculosBBO)); //Seleciona um veнculo Aleatуrio.

    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++) {
        if(!IsPlayerConnected(playerid)
        || !isInGaragem[playerid])
            continue;
       
        SendClientMessage(playerid, -1, "Este veнculo nгo estб mais а venda.");
    }

    SendClientMessageToAll(-1, "Hб um novo veнculo а venda!");
    return;
}

forward VenderCarro();
public VenderCarro() {
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++) {
        if(IsPlayerInArea(playerid, /* AREA DA GARAGEM */)
        && currentVehicle != -1) {
            isInGaragem[playerid] = true;

            new v = GetPlayerVehicleID(playerid);
            if(v == VeiculosBBO[currentVehicle]) {
                SendClientMessage(playerid, -1, "Vendido!");
               
                SetVehicleToRespawn(v);
                currentVehicle = -1; //Veнculo nгo estarб mais а venda
                isInGaragem[playerid] = false;
            }
            continue;
        }
        isInGaragem[playerid] = false;
        continue;
    }
    return;
}
Tambйm fiz uma correзгo no seu IsPlayerInArea():
pawn Код:
IsPlayerInArea(playerid, Float:MinX, Float:MinY, Float:MaxX, Float:MaxY) {
    if(MinX > MaxX) {
        new min = MinX;
        MinX = MaxX;
        MaxX = min;
    }
    if(MinY > MaxY) {
        new min = MinY;
        MinY = MaxY;
        MaxY = min;
    }

    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X >= MinX && X <= MaxX && Y >= MinY && Y <= MaxY)
        return true;
    return false;
}
Reply
#9

Nгo deu certo, apareceu que um novo veнculo foi vendido mas... Nгo aparece que o veнculo й invбlido e nгo vende.

Код:
Eu tava tentando fazer assim:

|*| Uma mensagem falando o modelo de veнculo chamado...
|*| Um modelo de veнculo seria vendido a cada 1 hora...
|*| A cada 1 minuto ele verificaria se ele estб na posiзгo e o modelo chamado...

Eu consegui fazer mas criando vбrias forwards e a random chamando cada uma mas se eu fizer com vбrios veнculos isso darб muitas linhas e bagunзa...
Tб assim atй agora:

PHP код:
#include <a_samp>
//Maneira fбcil de calcular tempo para um timer: (Horas*Minutos*Segundos*1000), ignorando valores 1.
//                   (Minutos * Segundos * 1000)
//new newVehicleTime = (60      * 60       * 1000);
//new updatePlayerTime = (60 * 1000); //Um minuto
//Eu desativei para poder testar melhor - /\
//E usei isso \/
new newVehicleTime = (60000);
new 
updatePlayerTime = (1000);
new 
currentVehicle = -1//Guardarб o veнculo atual
new VeiculosBBO[12];
new 
bool:isInGaragem[MAX_PLAYERS];
public 
OnFilterScriptInit()
{
        
SetTimer("AtualizarVeiculo"newVehicleTimetrue); //Executara 'AtualizarVeiculo' a cada uma hora apуs este Script ser iniciado.
        
AtualizarVeiculo(); //Como o 'SetTimer' sу executarб daqui uma hora, atualize o veнculo pela primeira vez.
        
SetTimer("AtualizarCarro"updatePlayerTimetrue); //Executara 'AtualizarCarro' a cada minuto para todos jogadores.
        //Seus veнculos
        
VeiculosBBO[0] = CreateVehicle(559,-1990.7375,170.9375,27.1953,270.0000000,0,3,15); //Jester-BBO
        
VeiculosBBO[1] = CreateVehicle(559,-1990.7375,170.9375,27.1953,270.0000000,0,3,15); //Jester-BBO
        
VeiculosBBO[2] = CreateVehicle(559,-1991.0796,159.3297,27.1953,270.0000000,0,3,15); //Jester-BBO
        
VeiculosBBO[3] = CreateVehicle(559,-1991.4545,146.6407,27.1953,270.0000000,0,3,15); //Jester-BBO
        
VeiculosBBO[4] = CreateVehicle(559,-1991.9436,130.0406,27.1953,270.0000000,0,3,15); //Jester-BBO
        
VeiculosBBO[5] = CreateVehicle(559,-1992.5179,110.5918,27.1954,270.0000000,0,3,15); //Jester-BBO
        
VeiculosBBO[6] = CreateVehicle(411,-1990.7375,170.9375,27.1953,270.0000000,0,3,15); //Infernus-BBO
        
VeiculosBBO[7] = CreateVehicle(411,-1990.7375,170.9375,27.1953,270.0000000,0,3,15); //Infernus-BBO
        
VeiculosBBO[8] = CreateVehicle(411,-1991.0796,159.3297,27.1953,270.0000000,0,3,15); //Infernus-BBO
        
VeiculosBBO[9] = CreateVehicle(411,-1991.4545,146.6407,27.1953,270.0000000,0,3,15); //Infernus-BBO
        
VeiculosBBO[10] = CreateVehicle(411,-1991.9436,130.0406,27.1953,270.0000000,0,3,15); //Infernus-BBO
        
VeiculosBBO[11] = CreateVehicle(411,-1992.5179,110.5918,27.1954,270.0000000,0,3,15); //Infernus-BBO
        
return 1;
}
//Ter certeza de que o jogador nгo inicie 'na garagem'.
public OnPlayerConnect(playerid) {
    
isInGaragem[playerid] = false;
    return 
1;
}
forward AtualizarVeiculo();
public 
AtualizarVeiculo()
{
    
//Respawna o Veнculo Antigo no caso de ele nгo estar vendido.
    
if(currentVehicle != -1)
        
SetVehicleToRespawn(VeiculosBBO[currentVehicle]);
    
//Faz com que o veнculo nгo repita.
    
new oldVeh currentVehicle;
    while(
oldVeh != currentVehicle)
        
currentVehicle random(sizeof(VeiculosBBO)); //Seleciona um veнculo Aleatуrio.
    
for(new playerid 0playerid MAX_PLAYERSplayerid++)
    {
        if(!
IsPlayerConnected(playerid)
        || !
isInGaragem[playerid])
            continue;
        
SendClientMessage(playerid, -1"Este veнculo nгo estб mais а venda.");
    }
    
SendClientMessageToAll(-1"Hб um novo veнculo а venda!");
    return;
}
forward VenderCarro();
public 
VenderCarro()
{
    for(new 
playerid 0playerid MAX_PLAYERSplayerid++)
    {
        if(
IsPlayerInArea(playerid, -1964.867553253.466934, -1925.898315309.475463)
        && 
currentVehicle != -1)
        {
            
isInGaragem[playerid] = true;
            new 
GetPlayerVehicleID(playerid);
            if(
== VeiculosBBO[currentVehicle])
            {
                
SendClientMessage(playerid, -1"Vendido!");
                
SetVehicleToRespawn(v);
                
currentVehicle = -1//Veнculo nгo estarб mais а venda
                
isInGaragem[playerid] = false;
            }
            continue;
        }
        
isInGaragem[playerid] = false;
        continue;
    }
    return;
}
IsPlayerInArea(playeridFloat:MinXFloat:MinYFloat:MaxXFloat:MaxY)
{
    new 
Float:XFloat:YFloat:Z;
    
GetPlayerPos(playeridXYZ);
    if(
>= MinX && <= MaxX && >= MinY && <= MaxY) {
        return 
1;
    }
    return 
0;
}
//ficou dando erro no IsPlayerInArea que vocк fez...
/*
COP.pwn(111) : warning 219: local variable "min" shadows a variable at a preceding level
COP.pwn(111) : warning 213: tag mismatc
COP.pwn(116) : warning 219: local variable "min" shadows a variable at a preceding level
COP.pwn(116) : warning 213: tag mismatch
*/
/*
IsPlayerInArea(playerid, Float:MinX, Float:MinY, Float:MaxX, Float:MaxY) {
    if(MinX > MaxX) {
        new min = MinX;
        MinX = MaxX;
        MaxX = min;
    }
    if(MinY > MaxY) {
        new min = MinY;
        MinY = MaxY;
        MaxY = min;
    }
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X >= MinX && X <= MaxX && Y >= MinY && Y <= MaxY)
        return true;
    return false;
}*/ 
Reply
#10

Correзгo do IsPlayerInArea():
pawn Код:
IsPlayerInArea(playerid, Float:MinX, Float:MinY, Float:MaxX, Float:MaxY) {
    if(MinX > MaxX) {
        new Float:min = MinX;
        MinX = MaxX;
        MaxX = min;
    }
    if(MinY > MaxY) {
        new Float:min = MinY;
        MinY = MaxY;
        MaxY = min;
    }

    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X >= MinX && X <= MaxX && Y >= MinY && Y <= MaxY)
        return true;
    return false;
}
Correзгo para mostrar que o veнculo й invбlido:
pawn Код:
public VenderCarro() {
    if(currentVehicle != -1)
        return;

    for(new playerid = 0; playerid < MAX_PLAYERS; playerid++) {
        if(currentVehicle != -1) {
            if(IsPlayerInArea(playerid, /* AREA DA GARAGEM */) {
                isInGaragem[playerid] = true;

                new v = GetPlayerVehicleID(playerid);
                if(v == VeiculosBBO[currentVehicle]) {
                    SendClientMessage(playerid, -1, "Vendido!");
               
                    SetVehicleToRespawn(v);
                    currentVehicle = -1; //Veнculo nгo estarб mais а venda
                    isInGaragem[playerid] = false;
                }
                else {
                    SendClientMessage(playerid, -1, "Veнculo Invбlido!");
                }
                continue;
            }
        }
        isInGaragem[playerid] = false;
        continue;
    }
    return;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)