[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
#2

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
Reply
#3

Parabens Manolo!!
Excelente!
Reply
#4

Ah se tivesse isso na minha йpoca... Parabйns.
Reply
#5

Gыdi Jуbi mai frendi.
Gostei josminha xP.
Velo da Progressгo ahsuaHSAUshSUAsa.
Reply
#6

Quote:
Originally Posted by Scripter123
Посмотреть сообщение
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
Посмотреть сообщение
Parabens Manolo!!
Excelente!
Obrigado

Quote:
Originally Posted by Luнs Miki
Посмотреть сообщение
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
Посмотреть сообщение
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
Посмотреть сообщение
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 Код:
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.
Reply
#7

Quote:
Originally Posted by DarkPT
Посмотреть сообщение
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.
Reply
#8

Quote:
Originally Posted by Josma_cmd
Посмотреть сообщение
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.
Reply
#9

Josma , me passa essa tua viatura da LSPD ?
Reply
#10

Quote:
Originally Posted by Falcon.Sixe
Посмотреть сообщение
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_
Посмотреть сообщение
Josma , me passa essa tua viatura da LSPD ?
Vou ver se acho o link denovo e te passo por MP.
Reply
#11

So ando de 55 acima
jogo mais quando estou sem sono..ficar parado nos sinais vermelhos me cansa...

Nem tinha notado o velocimetro, ficou legal xD
parabйns ae por ele tambйm
Reply
#12

Quote:
Originally Posted by Falcon.Sixe
View Post
So ando de 55 acima
jogo mais quando estou sem sono..ficar parado nos sinais vermelhos me cansa...

Nem tinha notado o velocimetro, ficou legal xD
parabйns ae por ele tambйm
Valeu, qualquer dia te mostro como estб ficando o servidor que estamos fazendo.

Quote:
Originally Posted by [GangsTa]Bia
View Post
boum tutorial!!!

euri
Code:
Parte 1, criando suas organizaзхes:
Parte 2, criando suas organizaзхes:
Obs: Oque й 'reputation' ?
Fail, parte 1 criando organizaзхes, parte 2 entrando nas organizaзхes, digitei certo kk.

Reputation, em portuguкs reputaзгo sгo os pontos dados quando um usuбrio ajuda o outro, mas nem sempre o usuбrio ajudado dб reputation pro usuбrio que ajudou, pra dar reputation й sу clicar na estrela em baixo da foto do usuбrio que vocк quer.
Reply
#13

belo tudo Nota 10

Obs: so n sei como setar o cara para... PMilitar, Groove, Ballas...

Quote:
Originally Posted by Josma_cmd
View Post
Vou ver se acho o link denovo e te passo por MP.
Se der manda para min tb... obrigado...
Reply
#14

Quote:
Originally Posted by ApolloRJ
View Post
belo tudo Nota 10

Obs: so n sei como setar o cara para... PMilitar, Groove, Ballas...



Se der manda para min tb... obrigado...
Coloque isto no OnPlayerConnect que setarб.
PlayerInfo[playerid][PMilitar] = dini_Int(arquivo, "PMilitar");

Eu deveria ter feito um comando para adm setar org mas esqueci agora to meio sem tempo mais tarde irei fazer...
Vocк pode setar isso tambйm diretamente no dini.
Jб mandei o link pra vocк tambйm, valeu.
Reply
#15

parabens belo tuto , tava procurando 1 achei \o/
Reply
#16

Otimo tutorial.

Mas nгo achei onde as informaзхes do jogador sгo carregadas. '-'
Reply
#17

eu acho que vc n me entendeu.. vou explicar de outra forma..

eu crio as class assim....
pawn Code:
#define Policia 1
#define Bandido 2
#define Mafia 3


new gTeam[MAX_PLAYERS];

---------------
public OnPlayerRequestClass(playerid, classid)
{
if((classid >= 0) && (classid <= 3))  // Ou Seja Igual й Maior que 0. й Menor й Igual a 2. Ou Seja, 0,1 e 2.
{
gTeam[playerid] = Policia; // Setarб ele Para GANG Policia.
SetPlayerInterior(playerid,8);
SetPlayerFacingAngle(playerid,280.0);
SetPlayerPos(playerid,2806.69,-1171.72,1025.07);
SetPlayerCameraPos(playerid,2809.3428,-1170.4800,1025.5703);
SetPlayerCameraLookAt(playerid,2805.69,-1171.72,1025.07);
ApplyAnimation(playerid,"PARK","Tai_Chi_Loop",4.0,1,0,0,0,0);

etc............
como apontar para PMilitar, Groove, Ballas

ou criar as class.. desde ja agradeзo o pack do carro.. obrigado!
Reply
#18

pawn Code:
public OnPlayerRequestClass(playerid, classid)
{
    if(classid >= 0 && classid <= 3))
    {
        PlayerInfo[playerid][PMilitar] = 1;
        return 1;
    }
    else if(classid >= 4 && classid <= 7)
    {
        PlayerInfo[playerid][Groove] = 1;
        return 1;
    }
Seu classid tб errado.
Reply
#19

Parabens, otimo tutorial
Reply
#20

ййй parceiro, parabens, bom trabalho, bem organizado e bem explicado

um dia quero ser um bom scripter assim, espero ser, e se eu ser, preguiзa eu nao vou ter.......bom voltando ao assunto parabens pelo seu trabalho, nгo apenas esse mais tambem os outros
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)