[TUTORIAL] Criando casas/empresas/carros sem limites por jogador
#1

[TUTORIAL]
Criando casas/empresas/carros sem limites por jogador



By: LeLeTe
ATENЗГO: Este tutorial foi desenvolvido para programadores com um mнnimo de conhecimento sobre arrays. Se vocк nгo sabe o que sгo arrays, e nгo sabe como funciona o sistema de informaзхes das casas/jogadores/empresas/carros de seu servidor, pare de ler imediatamente, antes que vocк f*$% seu script inteiro.

Bom, galera, vamos ao que interessa.

O que й que este tutorial vai te ensinar?
- Ele vai te ensinar a criar carros/empresas/carros/oquevocкquiser sem ter um limite prй-definido por arrays. Um exemplo й em servidores de RPG, onde existe um limite de 1 ~ 3 carros por jogador, ou 1 casa por jogador. Com este tutorial, vocк irб aprender a remover este problema.

Como ele funciona?
- Ele funciona checando um id ъnico por jogador, que serб o mesmo para todas as coisas que o jogador possui.




Passo 1: Crie um novo valor no seu sistema de informaзхes de jogadores
Se vocк usa o famoso PlayerInfo (PlayerInfo[playerid][pQualquerCoisa]), vб lб atй a array PlayerInfo, e adicione:

pawn Код:
//Na array PlayerInfo (Ou qualquer que seja o nome da sua array de informaзхes) ...
    pIDUnica,
Assim, sua array ficarб algo como isso:

pawn Код:
//Seus valores...
    Float:pPosicaoZ,
    pDinheiro,
    pVida,
    pIDUnica, //O novo valor criado.
    pColete,
    ///... continua sua array...
Passo 2: Crie um novo valor nos sistemas de informaзхes que serгo ъnicos
Agora, vб atй a array do seu sistema de casas/carros/empresas/etcetera, e adicione:

pawn Код:
//Na array...
    cIDUnica, //Use cIDUnica para array de carros, bIDUnica para de empresas, e hIDUnica para de casas, para seu script nгo bugar.
    //... continua sua array...
Assim, suas arrays ficarгo mais ou menos assim:

pawn Код:
//Array de carros, use cIDUnica.
    cPreco,
    cTranca,
    cIDUnica, //Valor novo.
    cDono[24],
    //... continua sua array...
pawn Код:
//Array de casas, use hIDUnica.
    hPreco,
    hTranca,
    hIDUnica, //Valor novo.
    hDono[24],
    //... continua sua array...
pawn Код:
//Array de empresas, use bIDUnica.
    bPreco,
    bTranca,
    bIDUnica, //Valor novo.
    bDono[24],
    //... continua sua array...

Passo 3: Salve as novas informaзхes
Nгo se esqueзa de modificar no seu sistema de salvar as informaзхes os dados, para que eles salvem o novo valor.

Passo 4: Criando a verificaзгo dos dados
Agora que vocк jб tem as arrays e valores prontos, como fazer pra checar?
Simples.

pawn Код:
stock ChecarVeiculoUnico(playerid, carro)
{
    if(CarInfo[id][cIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1;  //Aqui, CarInfo й o nome da Array de Carros. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
    return 0;
}
Assim, se vocк fizer para casas, empresas, e carros, ficarб assim:

pawn Код:
stock ChecarVeiculoUnico(playerid, carro)
{
    if(CarInfo[carro][cIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1;  //Aqui, CarInfo й o nome da Array de Carros. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
    return 0;
}

stock ChecarCasaUnica(playerid, casa)
{
    if(HouseInfo[casa][hIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1;  //Aqui, HouseInfo й o nome da Array de Casas. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
    return 0;
}

stock ChecarEmpresaUnica(playerid, empresa)
{
    if(BizzInfo[empresa][bIDUnica] == PlayerInfo[playerid][pIDUnica]) return 1;  //Aqui, BizzInfo й o nome da Array de Empresas. Substitua pela sua array. Assim como PlayerInfo, se necessбrio, deverб ser substituido pela sua.
    return 0;
}

Passo 5: Verificando o que o jogador possui
Legal, atй aqui a gente fez tudo necessбrio. O sistema jб pode ser usado, e tudo.
Mas, e como eu sei quantas casas alguйm tem?
Й simples, й sу usar o mesmo princнpio acima.
Abaixo eu lhes darei um exemplo, mas, se vocк quiser, vocк pode customizar as mensagens.

pawn Код:
stock VerificarVeiculos(verificador, verificado) //Aqui, verificador seria o ID de quem estб verificando, e verificado seria o ID de quem as informaзхes seriam retiradas.
{
    for(new c = 0; c < sizeof(CarInfo); c++) //Aqui, й um loop bбsico da array de carros. Substitua pela sua array caso necessбrio
    {
        if(CarInfo[c][cIDUnica] == PlayerInfo[verificado][pIDUnica]) //Mesmo esquema, substitua aqui pela suas arrays, se necessбrio
        {
            format(string, 128, "[VEНCULO] || Nome: [%s] || ID: [%d] || Preзo: [R$%d] || Cor 1: [%d] || Cor 2: [%d] || Trancado: [%d] ||",CarInfo[c][cName], c,CarInfo[c][cValue], CarInfo[c][cColorOne], CarInfo[c][cColorTwo], CarInfo[c][cLocked]); // Um exemplo de mensagem. Vocк pode modificar e adicionar suas prуprias informaзхes, se necessбrio.
            SendClientMessage(verificador, 0xFF8000FF, string);
        }
    }
}

stock VerificarCasas(verificador, verificado) //Para empresas. Mesmo esquema de acima. Substitua as arrays caso necessбrio.
{
    for(new h = 0; h < sizeof(HouseInfo); h++)
    {
        if(HouseInfo[h][hCasaUnica] == PlayerInfo[verificado][pIDUnica])
        {
            format(string, 128, "[CASA] || ID: [%d] || Preзo: [R$%d]",h, HouseInfo[h][hHousePrice]); //Outro exemplo de mensagem.
            SendClientMessage(verificador, 0x00FF00FF, string);
        }
    }
}

stock VerificarEmpresas(verificador, verificado) //Para empresas. Mesmo esquema de acima. Substitua as arrays caso necessбrio.
{
    for(new b = 0; b < sizeof(BizzInfo); b++)
    {
        if(BizzInfo[b][bIDUnica] == PlayerInfo[verificado][pIDUnica])
        {
            format(string, 128, "[EMPREENDIMENTO] || Nome: [%s] || ID: [%d] || Fundos: [R$%d]",BizzInfo[b][bName],b,BizzInfo[b][bVault]); //Outro exemplo de mensagem.
            SendClientMessage(verificador, 0x0080FFFF, string);
        }
    }
}
Aqui, eu usei uma funзгo com verificador e verificado para simplificar sua vida.

Assim, vocк pode criar um comando tanto pra admins quanto pra jogadores utilizando a mesma funзгo.

ATENЗГO: Se vocк nгo entender a funзгo abaixo, no final dela, haverб outra, utilizando OnPlayerCommandText...

Exemplo:
pawn Код:
//Substitua qualquer array, se necessбria.

//Atenзгo: As estruturas abaixo sгo feitas utilizando ZCMD (Crйditos: Zeex) e sscanf (Crйditos: ******).
//Caso vocк nгo utilize e/ou nгo entenda as estruturas abaixo, vб para o final deste exemplo.
//Lб terб um modelo usando OnPlayerCommandText.

CMD:meusveiculos(playerid, params[]) {
    SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    VerificarVeiculos(playerid, playerid); //Mostra os veiculos do jogador que digitou o comando para ele mesmo ...
    return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}

CMD:veiculosdoplayer(playerid, params[]) {
    if(PlayerInfo[playerid][pAdminLevel] >= 1) {
        new
            targetid;

        if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_GREY, SYNTAX_MESSAGE"/veiculosdoplayer [playerid]");
        SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        VerificarVeiculos(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
        return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    }
    else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
    return 1;
}

CMD:minhascasas(playerid, params[]) {
    SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    VerificarCasas(playerid, playerid); //Mostra as casas do jogador que digitou o comando para ele mesmo ...
    return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}

CMD:casasdoplayer(playerid, params[]) {
    if(PlayerInfo[playerid][pAdminLevel] >= 1) {
        new
            targetid;

        if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_GREY, SYNTAX_MESSAGE"/veiculosdoplayer [playerid]");
        SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        VerificarCasas(playerid, targetid);//Mostra as casas do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
        return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    }
    else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
    return 1;
}

CMD:minhasempresas(playerid, params[]) {
    SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    VerificarEmpresas(playerid, playerid);//Mostra as empresas do jogador que digitou o comando para ele mesmo ...
    return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
}

CMD:empresasdoplayer(playerid, params[]) {
    if(PlayerInfo[playerid][pAdminLevel] >= 1) {
        new
            targetid;

        if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, COLOR_GREY, SYNTAX_MESSAGE"/veiculosdoplayer [playerid]");
        SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        VerificarEmpresas(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
        return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    }
    else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
    return 1;
}
Exemplo utilizando OnPlayerCommandText...
pawn Код:
//Substitua qualquer array, se necessбria.

//No meio do seu OnPlayerCommandText...

    if(!strcmp(cmd, "/meusveiculos", true))
    {
        SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        VerificarVeiculos(playerid, playerid); //Mostra os veiculos do jogador que digitou o comando para ele mesmo ...
        return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    }

    if(!strcmp(cmd, "/veiculosdoplayer", true))
    {
        if(PlayerInfo[playerid][pAdminLevel] >= 1)
        {
            new
                targetid;

            tmp = strtok(cmdtext, idx);
            if(!strlen(tmp))
            {
                SendClientMessage(playerid, 0xAFAFAFFF, "Uso: /veiculosdoplayer [playerid]");
                return 1;
            }
            targetid = strval(tmp);
            SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
            VerificarVeiculos(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
            return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        }
        else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
    }

    if(!strcmp(cmd, "/minhascasas", true))
    {
        SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        VerificarCasas(playerid, playerid); //Mostra as casas do jogador que digitou o comando para ele mesmo ...
        return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    }

    if(!strcmp(cmd, "/casasdoplayer", true))
    {
        if(PlayerInfo[playerid][pAdminLevel] >= 1)
        {
            new
                targetid;

            tmp = strtok(cmdtext, idx);
            if(!strlen(tmp))
            {
                SendClientMessage(playerid, 0xAFAFAFFF, "Uso: /casasdoplayer [playerid]");
                return 1;
            }
            targetid = strval(tmp);
            SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
            VerificarCasas(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
            return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        }
        else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
    }
    return 1;

    if(!strcmp(cmd, "/minhasempresas", true))
    {
        SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        VerificarEmpresas(playerid, playerid);//Mostra as empresas do jogador que digitou o comando para ele mesmo ...
        return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
    }

    if(!strcmp(cmd, "/empresasdoplayer", true))
    {
        if(PlayerInfo[playerid][pAdminLevel] >= 1) {
            new
                targetid;

            tmp = strtok(cmdtext, idx);
            if(!strlen(tmp))
            {
                SendClientMessage(playerid, 0xAFAFAFFF, "Uso: /empresasdoplayer [playerid]");
                return 1;
            }
            targetid = strval(tmp);
            SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
            VerificarEmpresas(playerid, targetid);//Mostra os veнculos do targetid (no caso, o jogador que vocк quer verificar) para o playerid (o jogador que digitou o comando)...
            return SendClientMessage(playerid, 0xFFFFFFFF, "===========================================================================");
        }
        else return SendClientMessage(playerid, 0xFFFFFFFF, "ERRO: Vocк nгo й admin!");
    }
    return 1;
E, com estas funзхes, vocк pode agora verificar quantos carros/empresas/casas o jogador tem.

[OPCIONAL] Passo X: Limitando o que o jogador possui
Caso vocк queira limitar a quantidade de coisas que alguйm pode comprar (por exemplo, para fazer um sistema de vip onde quem nгo й vip sу pode comprar 3 carros, e quem й vip, pode comprar infinitos), vocк pode usar uma funзгo assim: (Para utilizar para casas/carros, й sу editar o necessбrio)

pawn Код:
//Coloque isso em algum lugar do script...
stock ContagemDeCasas(playerid)
{
    new i;
    for(new h = 0; h < sizeof(HouseInfo); h++)//Substitua HouseInfo se necessбrio.
    {
        if(HouseInfo[h][hIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
        {
            i++;
        }
    }
    return i;
}

//Coloque isso no seu comando ou funзгo de comprar carros/casas/empresas

    if(ContagemDeCasas(playerid) > 3) //Substitua ContagemDeCasas por ContagemDeCarros ou Empresas caso necessбrio, e substitua 3 pelo limite que vocк desejar...
        return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais casas!"); //Substitua a mensagem caso necessбrio...
Assim, vocк irб ficar com algo parecido com isso se usar o sistema para carros, empresas e casas:

pawn Код:
//Coloque isso em algum lugar do script...

stock ContagemDeCasas(playerid)    //Para Casas...
{
    new i;
    for(new h = 0; h < sizeof(HouseInfo); h++)//Substitua HouseInfo se necessбrio.
    {
        if(HouseInfo[h][hIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
        {
            i++;
        }
    }
    return i;
}

stock ContagemDeCarros(playerid)       //Para Carros...
{
    new i;
    for(new c = 0; c < sizeof(CarInfo); c++)//Substitua CarInfo se necessбrio.
    {
        if(CarInfo[c][cIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
        {
            i++;
        }
    }
    return i;
}

stock ContagemDeEmpresas(playerid)     //Para Empresas...
{
    new i;
    for(new b = 0; b < sizeof(BizzInfo); b++)//Substitua BizzInfo se necessбrio.
    {
        if(BizzInfo[b][bIDUnica] == PlayerInfo[playerid][pIDUnica])//Substitua as arrays se necessбrio...
        {
            i++;
        }
    }
    return i;
}



//Coloque isso no seu comando ou funзгo de comprar casas

    if(ContagemDeCasas(playerid) > 3) //Substitua 3 pelo limite de compra que vocк desejar...
        return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais casas!");


//Coloque isso no seu comando ou funзгo de comprar carros

    if(ContagemDeCarros(playerid) > 3) //Substitua 3 pelo limite de compra que vocк desejar...
        return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais carros!");


//Coloque isso no seu comando ou funзгo de comprar empresas

    if(ContagemDeEmpresas(playerid) > 3) //Substitua 3 pelo limite de compra que vocк desejar...
        return SendClientMessage(playerid, 0xAFAFAFFF, "Vocк nгo pode comprar mais empresas!");
Passo 6: Verificando se o jogador possui algo especнfico
Lembra das funзхes criadas no passo 4?
Entгo, iremos utilizб-las agora.

Digamos que vocк queira trancar um carro.
Como vocк vai fazer pra saber se o carro que o jogador quer trancar й dele mesmo?
Simples.

pawn Код:
if(ChecarVeiculoUnico(playerid, iddocarro)) //substitua iddocarro pela id do carro que vocк quer verificar.
    {
        //Aqui dentro vocк programa o que acontece caso o carro seja do jogador.
    }
O mesmo vale para casas e empresas. Sу substituir ChecarVeiculoUnico por CasaUnica ou EmpresaUnica, e iddocarro pela id da casa ou empresa que vocк deseja checar.


Passo 7: Criando as ID's Ъnicas
Todo o sistema funciona, bonitinho, porйm, existe um problema:
As ID's ъnicas. Como fazer para elas serem ъnicas?
Na verdade й bem simples.
Acesse o seu sistema de registro de jogadores (ou seja, o sistema que cria jogadores novos e salva-os), e adicione algo como isso:
pawn Код:
PlayerInfo[playerid][pIDUnica] = 1000000+random(8999999);
(OBS: se vocк usa SQL, fica mais fбcil de realizar o sistema, pois com SQL existem maneiras muito fбceis de checar se dois players possuem a mesma ID.)

Assim, a nova ID ъnica do jogador serб gerada =).

Alternativamente, vocк pode optar pelo sistema de checagem por NOMES ao invйs de ID's ъnicas, o que garante 100% que o sistema funcione.

E com isso, este tutorial estб finalizado.

Obrigado a todos que leram atй o final deste tutorial. Ele ainda tб um pouco lixoso porquк eu tф com um pouco de sono. Qualquer pergunta ou dъvida, sу postar que eu respondo.
Reply
#2

Areб errada :S
Reply
#3

Wrong area.
Reply
#4

Sorry =(

Alguйm pode mover pra mim pf?
Reply
#5

Creio que vao excluir este tуpico, ai vc cria denovo na area correta que seria aqui

http://forum.sa-mp.com/forumdisplay.php?f=56
Reply
#6

A бrea estб errada, mas nгo deixa de ser um tutorial..
"bom, muito bom, muito mais do que bom. Й excelente! ♫"
Reply
#7

Parabйns muito bom +REP!
Mais poderia ter criado um vнdeo ficaria 100% para provar que funciona..

@Off
Areб errada amigo!
Reply
#8

Otimo tutorial, sу faltou explicar como faz para incrementar o cIDUnico =]
Reply
#9

Pode crer, foi mal =(
Reply
#10

Serб que nгo seria possнvel 2 pessoa terem o ID ъnico? LOOOL deve ser mto poco provavel
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)