[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


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)