SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Português/Portuguese > Lançamentos/Releases

Reply
 
Thread Tools Display Modes
Old 22/07/2011, 05:16 AM   #1
Josma_cmd
High-roller
 
Josma_cmd's Avatar
 
Join Date: Feb 2010
Location: Dukes - Liberty City
Posts: 1,415
Reputation: 111
Default Criando Organizações[pedido]


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

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 Code:
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 Code:
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 Code:
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 Code:
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 Code:
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 Code:
#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 Code:
new VPMilitar[5];
Está criada a variável de veiculos da Policia Militar, vamos agora criar os veiculos:
No OnGameModeInit(); coloque:
pawn Code:
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 Code:
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 Code:
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 Code:
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.
__________________

Last edited by Josma_cmd; 22/07/2011 at 04:24 PM.
Josma_cmd is offline   Reply With Quote
Old 22/07/2011, 07:41 AM   #2
Scripter123
Banned
 
Join Date: Oct 2010
Location: IN PAWNO PROGRAM :)
Posts: 73
Reputation: 2
Default Re: Criando Organizações[pedido]

Muito bom!!!! Obrigado, realmente sempre quis aprender isto *.*

Agora podia criar um tutorial de BUS DRIVER JOB, para explicar como fazer e como salvar Ah e por checkpoints e claro
Scripter123 is offline   Reply With Quote
Old 22/07/2011, 08:02 AM   #3
Tymer
Big Clucker
 
Tymer's Avatar
 
Join Date: May 2011
Location: Los Santos
Posts: 126
Reputation: 0
Default Re: Criando Organizações[pedido]

Parabens Manolo!!
Excelente!
__________________


PS: Tymer = Alexandre_ExTrEmE

<<<<<< Se Este Post Lhe Foi Útil, Clica Ali <<<<<<<<<<
Tymer is offline   Reply With Quote
Old 22/07/2011, 11:29 AM   #4
steki.
High-roller
 
steki.'s Avatar
 
Join Date: Nov 2010
Location: São Paulo, Brasil
Posts: 2,630
Reputation: 301
Default Re: Criando Organizações[pedido]

Ah se tivesse isso na minha época... Parabéns.
steki. is offline   Reply With Quote
Old 22/07/2011, 12:28 PM   #5
Macintosh
High-roller
 
Macintosh's Avatar
 
Join Date: Aug 2010
Location: Somewhere Far User Type: Administrator
Posts: 3,607
Reputation: 104
Default Re: Criando Organizações[pedido]

Gûdi Jóbi mai frendi.
Gostei josminha xP.
Velo da Progressão ahsuaHSAUshSUAsa.
__________________

"É tão estranho
Os bons morrem jovens
Assim parece ser, quando me lembro de você
Que acabou indo embora, cedo demais
"

Os bons morrem jovens (Legião Urbana).

Um dia a gente irá se encontrar numa bem melhor brother

Macintosh is offline   Reply With Quote
Old 22/07/2011, 01:34 PM   #6
Josma_cmd
High-roller
 
Josma_cmd's Avatar
 
Join Date: Feb 2010
Location: Dukes - Liberty City
Posts: 1,415
Reputation: 111
Default Re: Criando Organizações[pedido]

Quote:
Originally Posted by Scripter123 View Post
Muito bom!!!! Obrigado, realmente sempre quis aprender isto *.*

Agora podia criar um tutorial de BUS DRIVER JOB, para explicar como fazer e como salvar Ah e por checkpoints e claro
Nunca ouvi falar sobre Bus Driver, vou pesquisar, se achar legal quem sabe kk.
Valeu.

Quote:
Originally Posted by Tymer View Post
Parabens Manolo!!
Excelente!
Obrigado

Quote:
Originally Posted by Luís Miki View Post
Ah se tivesse isso na minha época... Parabéns.
kkkkkkk, em tempos antigos os programadores de C Sharp faziam um enorme trabalho pra fazer algo que hoje se faz apenas com uma sintaxe, como o RepairVehicle na 0.2x não tinha.
Valeu.

Quote:
Originally Posted by Shickcard View Post
Gûdi Jóbi mai frendi.
Gostei josminha xP.
Velo da Progressão ahsuaHSAUshSUAsa.
Velo do progressão owna Shickcard, quando fiz ele foi amor a primeira vista kkk.


Quote:
Originally Posted by DarkPT View Post
Não tem necessidade de criar uma calback para verificar se o player é da organização do veículo que entrou, faça logo tudo no OnPlayerStateChange.
E não precisa de criar loop também (mas não está errado).

pawn Code:
public OnPlayerStateChange(playerid, newstate, oldstate)
{
   new
      Veiculo = GetPlayerVehicleID(playerid);

   if((Veiculo >=VPMilitar[0]) && (Veiculo <= VPMilitar[4]))
   {
      if(PlayerInfo[playerid][PMilitar] == 1)
         return false; //Se ele for da org, continua usando o veículo
     
      SendClientMessage(playerid, Branco, "Você não é da Policia Militar");
      RemovePlayerFromVehicle(playerid);
   }
   return true;
}

Ótimo tutorial, gostei
Um GM RPG não terá apenas a verificação de veiculos no OnPlayerStateChange, fiz a callback pra economizar códigos na public, isso não afeta em nada o GM, apenas organiza melhor, o loop serve para economizar o uso de vários operadores relacionais, como: vehicleid == VPMilitar[0] || vehicleid == VPMilitar[1] || vehicleid == VPMilitar[2].
Valeu.
__________________
Josma_cmd is offline   Reply With Quote
Old 22/07/2011, 01:45 PM   #7
Josma_cmd
High-roller
 
Josma_cmd's Avatar
 
Join Date: Feb 2010
Location: Dukes - Liberty City
Posts: 1,415
Reputation: 111
Default Re: Criando Organizações[pedido]

Quote:
Originally Posted by DarkPT View Post
Não era uma critica, apenas uma sugestão (:
Como disse anteriormente, bom trabalho
Sei que não foi uma crítica, é uma alternativa, mas não tenho problema com críticas, servem pra aperfeiçoar meus códigos kk.
Valeu.
__________________
Josma_cmd is offline   Reply With Quote
Old 22/07/2011, 01:59 PM   #8
Falcon.
High-roller
 
Falcon.'s Avatar
 
Join Date: Jul 2010
Location: Brazil
Posts: 1,743
Reputation: 147
Default Re: Criando Organizações[pedido]

Quote:
Originally Posted by Josma_cmd View Post
Nunca ouvi falar sobre Bus Driver, vou pesquisar, se achar legal quem sabe kk.
Valeu.
Bus Driver é um simulador de motorista de ônibus que eu jogo quando estou sem nada para fazer
más neste caso ele se refere a profissão de motorista de ônibus mesmo

Bom tutorial Josma.


Atenciosamente,
Falcon.
__________________
....
Falcon. is offline   Reply With Quote
Old 22/07/2011, 02:05 PM   #9
Ghost_
Big Clucker
 
Join Date: Jun 2011
Posts: 144
Reputation: 6
Default Re: Criando Organizações[pedido]

Josma , me passa essa tua viatura da LSPD ?
Ghost_ is offline   Reply With Quote
Old 22/07/2011, 02:06 PM   #10
Josma_cmd
High-roller
 
Josma_cmd's Avatar
 
Join Date: Feb 2010
Location: Dukes - Liberty City
Posts: 1,415
Reputation: 111
Default Re: Criando Organizações[pedido]

Quote:
Originally Posted by Falcon.Sixe View Post
Bus Driver é um simulador de motorista de ônibus que eu jogo quando estou sem nada para fazer
más neste caso ele se refere a profissão de motorista de ônibus mesmo

Bom tutorial Josma.


Atenciosamente,
Falcon.
Sim, me lembro do Bus Driver, simulador de ônibus, mas como ele falou sobre sa-mp não sabia
Você joga Bus Driver? kk lol, nunca tive paciência pra andar à 30km. kkk.
Valeu Falcon.

Quote:
Originally Posted by Ghost_ View Post
Josma , me passa essa tua viatura da LSPD ?
Vou ver se acho o link denovo e te passo por MP.
__________________
Josma_cmd is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
[Tutorial] Criando um Teleporte Maltz Lançamentos/Releases 20 06/06/2011 01:28 AM
[FilterScript] Organizações [FeK]Knife Lançamentos/Releases 12 29/01/2011 02:01 PM
Criando Familias, Organizações no Geral RP mafelis Português/Portuguese 3 27/12/2010 04:25 PM
[PEDIDO]Ai Galera To Criando Um GM De Gang War Tals Tals... pietrotm Português/Portuguese 1 07/11/2010 02:28 PM
[AJUDA] Criação de Organizações Pesso ajuda por favor de vocês Gabriel6 Português/Portuguese 17 23/08/2010 08:41 PM


All times are GMT. The time now is 10:37 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.