[Tutorial] Criando Organizaзхes[pedido]
#1

================================================== ================================================

Bom, vim em resposta a este tуpico criar um tutorial completo de como fazer orgs/profissхes/gangs em seu GameMode RPG.

Нndice

● Criar orgs com cargos
● Criar veiculos para orgs
● Criar comando /membros
● Criar comandos para lнderes /convidar /promover /demitir
● Banco de dados para salvamento de orgs
● Criar cores paras orgs

Necessбrio

● Saber utilizar strtok
● Saber utilizar variбveis
● Saber utilizar operadores
● Saber utilizar database(No caso usaremos dini).

Bom, antes de tudo quero esclarecer que este nгo й um cуdigo ъtil e sim um tutorial, nгo copie e edite, leia, entenda e crie seu sistema.

Parte 1, criando suas organizaзхes: Bom, decidi sair do velho esquema rotineiro de orgs do GF, entгo nosso enum serб diferente, o enum cria arrays dentro de arrays, fazendo juz ao nome, enumйricos ou enumerados, o enum funciona quase como o new, vocк pode criar vбrias variбveis a partir dele utilizando vнrgula para separar umas das outras, irei criar aqui 3 organizaзхes como exemplo neste enum.

pawn Код:
enum Info
{
    PMilitar,
    Groove,
    Ballas
};
Nгo й obrigatуrio e tambйm nгo faz diferenзa a utilizaзгo de vнrgula na ultima variбvel da enum, eu nгo coloco mas isso й uma opзгo de cada um, enfim, o enum criado precisaremos de uma variбvel como tipo de dados para podermos usa-la em diferentes situaзхes e para diferentes players, para isso usaremos o MAX_PLAYERS que no caso cria uma variбvel para cada ID de player, o MAX_PLAYERS й equivalente a 500 entгo й aconselhбvel que vocк crie uma diretiva no inнcio do GM definindo o numero de slots que seu servidor usa, logo apуs, utilize essa diretivo no lugar do MAX_PLAYERS prй definido no a_samp.
pawn Код:
new PlayerInfo[MAX_PLAYERS][Info];
Como podem perceber acima criei a variбvel PlayerInfo, o nome й de sua preferencia, esta variбvel tem o valor MAX_PLAYERS, ou seja, poderei usar em diversas ocasiхes utilizando playerid, giveplayerid ou qualquer outro tipo de variбvel que acumule o id de um player, na outra array eu utilizo o enum Info, assim poderemos usar qualquer uma das variбveis disponнveis no enum.

Parte 2, entrando nas organizaзхes: Bom, criada as organizaзхes, agora deveremos entrar nelas, pra isso iremos fazer 3 comandos, /Convidar, /Demitir, /Promover.
Nгo esqueзa de criar o new tmp[128]; no inicio da OnPlayerCommandText junto com as outras variбveis, cmd e idx, tambйm coloque o strtok no fim do gamemode.
pawn Код:
if(strcmp(cmd, "/convidar", true) == 0)
    {
        tmp = strtok(cmdtext, idx);
        new PlayerB;
        if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /convidar [id]");
        PlayerB = strval(tmp);
        if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador nгo estб conectado");
        if(PlayerInfo[playerid][PMilitar] >= 6)
        {
            PlayerInfo[PlayerB][PMilitar] = 1;
            SendClientMessage(PlayerB, Branco, "Vocк entrou а Polнcia Militar");
            SetPlayerColor(PlayerB, Cor_PMilitar);
            return 1;
        }
        else if(PlayerInfo[playerid][Groove] >= 6)
        {
            PlayerInfo[PlayerB][Groove] = 1;
            SendClientMessage(PlayerB, Branco, "Vocк entrou а Groove");
            SetPlayerColor(PlayerB, Cor_Groove);
            return 1;
        }
        else if(PlayerInfo[playerid][Ballas] >= 6)
        {
            PlayerInfo[PlayerB][Ballas] = 1;
            SendClientMessage(PlayerB, Branco, "Vocк entrou aos Ballas");
            SetPlayerColor(PlayerB, Cor_Ballas);
            return 1;
        }
        return 1;
    }
Existem diversas formas de fazer um comando /convidar, essa nгo й a mais otimizada porйm achei a mais simples para explicar sobre o cуdigo, nгo vou explicar sobre o que o strtok faz pois creio que muitos jб sabem e caso nгo saibam й sу dizer que explico ou crio outro tutorial, enfim, voltando ao cуdigo, ao digitar /convidar [id] o if se encarregarб de verificar se o jogador й da PMilitar, e se ele tem o cargo igual ou maior que 6, que no caso estamos utilizando como um padrгo para lнder, mude conforme sua escolha, caso ele seja da Policia Militar e tiver o cargo requerido serб setado ao PlayerB(convidado) a cor da policia militar e a org Policia militar, o mesmo processo acontece mas 3 orgs seguintes, foi apenas adicionado o else para a cadeia de decisхes, se, mas se...

pawn Код:
if(strcmp(cmd, "/promover", true) == 0)
    {
        tmp = strtok(cmdtext, idx);
        new PlayerB, level;
        if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /promover [id] [cargo]");
        PlayerB = strval(tmp);
        if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador nгo estб conectado");
        tmp = strtok(cmdtext, idx);
        if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /promover [id] [cargo]");
        level = strval(tmp);
        if(level < 1 || level > 6) return SendClientMessage(playerid, Branco, "O level deve ser maior que 0 e menor que 7");
        new string[128], promovedor[MAX_PLAYER_NAME];
        GetPlayerName(playerid, promovedor, sizeof(promovedor));
        if(PlayerInfo[playerid][PMilitar] >= 6)
        {
            if(PlayerInfo[PlayerB][PMilitar] < 1) return SendClientMessage(playerid, Branco, "Este jogador nгo й da sua org");
            PlayerInfo[PlayerB][PMilitar] = level;
            format(string, sizeof(string), "Vocк foi promovido a level %d por %s", level, promovedor););
            SendClientMessage(PlayerB, Branco, string);
            return 1;
        }
        else if(PlayerInfo[playerid][Groove] >= 6)
        {
            if(PlayerInfo[PlayerB][Groove] < 1) return SendClientMessage(playerid, Branco, "Este jogador nгo й da sua org");
            PlayerInfo[PlayerB][Groove] = level;
            format(string, sizeof(string), "Vocк foi promovido a level %d por %s", level, promovedor););
            SendClientMessage(PlayerB, Branco, string);
            return 1;
        }
        else if(PlayerInfo[playerid][Ballas] >= 6)
        {
            if(PlayerInfo[PlayerB][Ballas] < 1) return SendClientMessage(playerid, Branco, "Este jogador nгo й da sua org");
            PlayerInfo[PlayerB][Ballas] = level;
            format(string, sizeof(string), "Vocк foi promovido a level %d por %s", level, promovedor););
            SendClientMessage(PlayerB, Branco, string);
            return 1;
        }
        return 1;
    }
O comando /promover acima segue a mesma ordem do /convidar, verifica a organizaзгo do player primбrio na aзгo e executa a ordem no player secundбrio que no caso seria o PlayerB, como disse no outro comando, nгo vou explicar sobre strtok neste tutorial.

pawn Код:
if(strcmp(cmd, "/demitir", true) == 0)
    {
        tmp = strtok(cmdtext, idx);
        new PlayerB, string[128], demitidor[MAX_PLAYER_NAME];
        if(!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /demitir [id]");
        PlayerB = strval(tmp);
        GetPlayerName(playerid, demitidor, sizeof(demitidor));
        if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador nгo estб conectado");
        if(PlayerInfo[playerid][PMilitar] >= 6)
        {
            if(PlayerInfo[PlayerB][PMilitar] < 1) return SendClientMessage(playerid, Branco, "Este jogador nгo й da sua organizaзгo");
            PlayerInfo[PlayerB][PMilitar] = 0;
            format(string, sizeof(string), "Vocк foi demitido por %s", demitidor);
            SendClientMessage(PlayerB, Branco, string);
            return 1;
        }
        else if(PlayerInfo[playerid][Groove] >= 6)
        {
            if(PlayerInfo[PlayerB][Groove] < 1) return SendClientMessage(playerid, Branco, "Este jogador nгo й da sua organizaзгo");
            PlayerInfo[PlayerB][Groove] = 0;
            format(string, sizeof(string), "Vocк foi demitido por %s", demitidor);
            SendClientMessage(PlayerB, Branco, string);
            return 1;
        }
        else if(PlayerInfo[playerid][Ballas] >= 6)
        {
            if(PlayerInfo[PlayerB][Ballas] < 1) return SendClientMessage(playerid, Branco, "Este jogador nгo й da sua organizaзгo");
            PlayerInfo[PlayerB][Ballas] = 0;
            format(string, sizeof(string), "Vocк foi demitido por %s", demitidor);
            SendClientMessage(PlayerB, Branco, string);
            return 1;
        }
        return 1;
    }
O comando demitir й Muito bбsico, entendendo os dois primeiros vocк entenderб ele tambйm, creio que todo mundo saibam se quiserem explicaзхes mais detalhadas sobre o comando sу perguntar.

Bom, como vocкs viram estes comandos utilizam algumas cores, provavelmente vocкs nгo terгo essas cores em seus GMґs entгo й sу criar algumas diretivas relativas as cores.

pawn Код:
#define Cor_PMilitar 0x4169E199
#define Cor_Groove 0x00FF0099
#define Cor_Ballas 0xA020F099
#define Branco 0xFFFFFFFF
O cуdigo de cor na diretiva й muito simples, 0x = definiзгo de que "Й" uma cor, os 6 primeiros caracters apуs o 0x sгo do cуdigo da cor e os 2 ultimos da transparкncia da cor.

Parte 3, Criando veiculos paras organizaзхes: Antes de tudo vocк precisa aprender a mexer com variбveis entгo se ainda nгo souber leia outro tutorial, Vamos criar os veiculos paras orgs, para isso, tenha em mгos as coordenadas e os modelos dos veiculos que deseja criar, vamos lб.

Vamos supor que a Policia Militar tenha 4 carros, entгo criaremos a variбvel com o valor 4 pois comeзaremos do 0 e nгo podemos esquecer do Null, deixaremos isso quase como se fosse uma margem de erro.

pawn Код:
new VPMilitar[5];
Estб criada a variбvel de veiculos da Policia Militar, vamos agora criar os veiculos:
No OnGameModeInit(); coloque:
pawn Код:
VPMilitar[0] = CreateVehicle(modelo, X, Y, Z, Rotaзгo, Cor1, Cor2, RespawnDelay); //Veiculo numero 0
VPMilitar[1] = CreateVehicle(modelo, X, Y, Z, Rotaзгo, Cor1, Cor2, RespawnDelay); //Veiculo numero 1
VPMilitar[2] = CreateVehicle(modelo, X, Y, Z, Rotaзгo, Cor1, Cor2, RespawnDelay); //Veiculo numero 2
VPMilitar[3] = CreateVehicle(modelo, X, Y, Z, Rotaзгo, Cor1, Cor2, RespawnDelay); //Veiculo numero 3
Estб criado os veiculos da Policia Militar, siga o mesmo exemplo para criar os veнculos de outras organizaзхes, apenas troque o numero das variбveis e os nomes das mesmas conforme o numero de veнculos e o nome da prуxima org.

Parte 4, Impedindo que outros peguem seus veiculos: Bom, vamos bloquear os veнculos para que membros de outras organizaзхes nгo o peguem, existem inicialmente duas maneiras de fazer isso, com a public OnPlayerEnterVehicle ou com a public OnPlayerStateChange, vou usar a OnPlayerStateChange...

pawn Код:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
    if(newstate == PLAYER_STATE_DRIVER) VerificarVeiculo(playerid);
    return 1;
}
Notem que tem uma sintaxe que nгo й padrгo nesta public, a sintaxe VerificarVeiculo, bom, teremos que criar ela entгo vamos lб.

pawn Код:
forward VerificarVeiculo(playerid);
public VerificarVeiculo(playerid)
{
    for(new c = 0; c <= 4; c++)
    {
        if(IsPlayerInVehicle(playerid, VPMilitar[c]) && PlayerInfo[playerid][PMilitar] < 1)
        {
            SendClientMessage(playerid, Branco, "Vocк nгo й da Policia Militar");
            RemovePlayerFromVehicle(playerid);
            return 1;
        }
    }
    return 1;
}
O laзo for irб fazer uma conta rбpida verificando possнveis valores do 0 ao 4, na if seguinte ele verificarб se o Player estб no veiculo C que pode ser equivalente de 0 a 4 e se ele nгo й da policia militar, caso a resposta para esta aзгo seja SIM ele removerб o player do veiculo e dirб a ele que aquele veiculo nгo pertence a sua organizaзгo.

Para reproduzir este cуdigo com outras organizaзхes vocк pode usar o mesmo laзo for e adicionar mais if's, else if's e aumentar o numero do laзo conforme o numero de veiculos da org maxнma ou pode criar outros laзos de conta, vocк pode tambйm verificar resultado por resultado usando o GetPlayerVehicleID.

Parte 5, Salvando sua org: Bom, salvaremos a org do player em dini, entгo ai vai o cуdigo.
pawn Код:
forward SalvarOrg(playeri);
public SalvarOrg(playerid)
{
    new arquivo[60], nome[MAX_PLAYER_NAME];
    GetPlayerName(playerid, nome, sizeof(nome));
    format(arquivo, sizeof(arquivo), "Contas\%s.ini", nome);
    if(!dini_Exists(arquivo))
    {
        dini_Create(arquivo);
    }
    if(PlayerInfo[playerid][PMilitar] > 0) dini_IntSet(arquivo, "PMilitar", PlayerInfo[playerid][PMilitar]);
    if(PlayerInfo[playerid][Groove] > 0) dini_IntSet(arquivo, "Groove", PlayerInfo[playerid][Groove]);
    if(PlayerInfo[playerid][Ballas] > 0) dini_IntSet(arquivo, "Ballas", PlayerInfo[playerid][Ballas]);
    return 1;
}
Explicaзгo: criei as variбveis arquivo e nome para acumularem dado do tipo char, elas vгo acumular strings, nome vai acumular o nome do player na aзгo e arquivo o caminho onde serб salva suas informaзхes, GetPlayerName pega o nome do playerid e salva na variбvel nome, o format seta o caminho onde serб salvo as informaзхes na variбvel arquivo, e pra isso ele precisa da variбvel nome, para criar um arquivo pra cada player.
if(!dini_Exists(arquivo)) << Verifica se NГO existe, caso nгo exista ele executa o que estб entre as chaves, no caso, dini_Create(arquivo) ou seja, se nгo existir ele criarб, logo apуs vem uma sequencia de if, esses vгo verificar se o cara й da PMilitar, caso seja ele salvarб o cargo dele no dini com o nome de PMilitar, a mesma coisa pras organizaзхes seguintes, se quiser aprender mais sobre dini procure outro tutorial no fуrum e bendito seja o search.

Vou atualizar o tutorial depois, implementar, melhorar os cуdigos, explicar melhor etc, no momento to com sono e o vinho acabou entгo vou dormir.

Bom, й isso, tutorial meio corrido mas estб ai, nгo pude explicar detalhadamente sobre alguns detalhes pois fugiriam do tema do tutorial como dini, strtok, variбveis enfim, QUALQUER duvida й sу perguntar, se nгo tiver conseguindo montar seu cуdigo poste aqui.
Reply


Messages In This Thread
Criando Organizaзхes[pedido] - by Josma_cmd - 22.07.2011, 05:16
Re: Criando Organizaзхes[pedido] - by Scripter123 - 22.07.2011, 07:41
Re: Criando Organizaзхes[pedido] - by Tymer - 22.07.2011, 08:02
Re: Criando Organizaзхes[pedido] - by steki. - 22.07.2011, 11:29
Re: Criando Organizaзхes[pedido] - by Macintosh - 22.07.2011, 12:28
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 22.07.2011, 13:34
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 22.07.2011, 13:45
Re: Criando Organizaзхes[pedido] - by Falcon. - 22.07.2011, 13:59
Re: Criando Organizaзхes[pedido] - by Ghost_ - 22.07.2011, 14:05
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 22.07.2011, 14:06
Re: Criando Organizaзхes[pedido] - by Falcon. - 22.07.2011, 14:17
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 22.07.2011, 14:42
Re: Criando Organizaзхes[pedido] - by ApolloRJ - 22.07.2011, 16:06
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 22.07.2011, 16:22
Re: Criando Organizaзхes[pedido] - by histire - 22.07.2011, 16:28
Re: Criando Organizaзхes[pedido] - by Shadoww5 - 22.07.2011, 16:36
Re: Criando Organizaзхes[pedido] - by ApolloRJ - 22.07.2011, 16:47
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 22.07.2011, 17:06
Re: Criando Organizaзхes[pedido] - by Dark.Angel - 22.07.2011, 18:23
Re: Criando Organizaзхes[pedido] - by ByladeN - 22.07.2011, 23:22
Re: Criando Organizaзхes[pedido] - by URSS_Morelli - 22.07.2011, 23:49
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 23.07.2011, 01:48
Re: Criando Organizaзхes[pedido] - by Rodox_Mortein - 23.07.2011, 10:29
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 23.07.2011, 12:07
Re: Criando Organizaзхes[pedido] - by Rodox_Mortein - 25.07.2011, 04:28
Re: Criando Organizaзхes[pedido] - by Richardstn - 25.07.2011, 04:31
Re: Criando Organizaзхes[pedido] - by RebeloX - 25.07.2011, 10:22
Re: Criando Organizaзхes[pedido] - by Josma_cmd - 25.07.2011, 13:36
Re: Criando Organizaзхes[pedido] - by Cobertozinho - 25.07.2011, 19:56
Re: Criando Organizaзхes[pedido] - by Rodox_Mortein - 27.07.2011, 03:14
Re: Criando Organizaзхes[pedido] - by Devastador - 28.07.2011, 18:40

Forum Jump:


Users browsing this thread: 1 Guest(s)