Bom, vim em resposta à um pedido criar um tutorial completo de como fazer orgs/profissões/gangs em seu GameMode RPG.
Antes de tudo quero pedir desculpa pelos BR
nos códigos, retirem eles caso tentem fazer seus códigos pois isto é proporcional ao código HTML do blooger(O qual não pude tirar).
Í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.
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.
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.
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...
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.
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.
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.
Está criada a variável de veiculos da Policia Militar, vamos agora criar os veiculos:
No OnGameModeInit(); coloque:
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...
Notem que tem uma sintaxe que não é padrão nesta public, a sintaxe VerificarVeiculo, bom, teremos que criar ela então vamos lá.
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.
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 estou ocupado então em breve estarei aqui com mais postagens construtivas.
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.
nos códigos, retirem eles caso tentem fazer seus códigos pois isto é proporcional ao código HTML do blooger(O qual não pude tirar).
Í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.
1 2 3 4 5 6 | enum Info <br>{ <br>PMilitar, <br>Groove, <br>Ballas <br>}; |
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.
1 | 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | if (strcmp(cmd, "/convidar" , true ) == 0) <br>{ <br>tmp = strtok(cmdtext, idx); <br> new PlayerB; <br> if (!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /convidar [id]" ); <br>PlayerB = strval(tmp); <br> if (!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador não está conectado" ); <br> if (PlayerInfo[playerid][PMilitar] >= 6) <br>{ <br> PlayerInfo[PlayerB][PMilitar] = 1; <br> SendClientMessage(PlayerB, Branco, "Você entrou à Polícia Militar" ); <br> SetPlayerColor(PlayerB, Cor_PMilitar); <br> return 1; <br>} <br> else if (PlayerInfo[playerid][Groove] >= 6) <br>{ <br> PlayerInfo[PlayerB][Groove] = 1; <br> SendClientMessage(PlayerB, Branco, "Você entrou à Groove" ); <br> SetPlayerColor(PlayerB, Cor_Groove); <br> return 1; <br>} <br> else if (PlayerInfo[playerid][Ballas] >= 6) <br>{ <br> PlayerInfo[PlayerB][Ballas] = 1; <br> SendClientMessage(PlayerB, Branco, "Você entrou aos Ballas" ); <br> SetPlayerColor(PlayerB, Cor_Ballas); <br> return 1; <br>} <br> return 1; <br>} |
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...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | if (strcmp(cmd, "/promover" , true ) == 0) <br>{ <br>tmp = strtok(cmdtext, idx); <br> new PlayerB, level; <br> if (!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /promover [id] [cargo]" ); <br>PlayerB = strval(tmp); <br> if (!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador não está conectado" ); <br>tmp = strtok(cmdtext, idx); <br> if (!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /promover [id] [cargo]" ); <br>level = strval(tmp); <br> if (level < 1 || level > 6) return SendClientMessage(playerid, Branco, "O level deve ser maior que 0 e menor que 7" ); <br> new string[128], promovedor[MAX_PLAYER_NAME]; <br>GetPlayerName(playerid, promovedor, sizeof(promovedor)); <br> if (PlayerInfo[playerid][PMilitar] >= 6) <br>{ <br> 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) <br>{ <br> 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) <br>{ <br> 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | if (strcmp(cmd, "/demitir" , true ) == 0) <br>{ <br>tmp = strtok(cmdtext, idx); <br> new PlayerB, string[128], demitidor[MAX_PLAYER_NAME]; <br> if (!strlen(tmp)) return SendClientMessage(playerid, Branco, "Uso correto: /demitir [id]" ); <br>PlayerB = strval(tmp); <br>GetPlayerName(playerid, demitidor, sizeof(demitidor)); <br> if (!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, Branco, "Este jogador não está conectado" ); <br> if (PlayerInfo[playerid][PMilitar] >= 6) <br>{ <br> 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) <br>{ <br> 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) <br>{ <br> 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.
1 2 3 4 | #define Cor_PMilitar 0x4169E199 <br> #define Cor_Groove 0x00FF0099 <br> #define Cor_Ballas 0xA020F099 <br> #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.
1 | new VPMilitar[5]; |
Está criada a variável de veiculos da Policia Militar, vamos agora criar os veiculos:
No OnGameModeInit(); coloque:
1 2 3 4 | VPMilitar[0] = CreateVehicle(modelo, X, Y, Z, Rotação, Cor1, Cor2, RespawnDelay); //Veiculo numero 0 <br>VPMilitar[1] = CreateVehicle(modelo, X, Y, Z, Rotação, Cor1, Cor2, RespawnDelay); //Veiculo numero 1 <br>VPMilitar[2] = CreateVehicle(modelo, X, Y, Z, Rotação, Cor1, Cor2, RespawnDelay); //Veiculo numero 2 <br>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...
1 2 3 4 5 6 | public OnPlayerStateChange(playerid, newstate, oldstate) <br>{ <br> if (newstate == PLAYER_STATE_DRIVER) VerificarVeiculo(playerid); <br> return 1; <br>} <br> |
Notem que tem uma sintaxe que não é padrão nesta public, a sintaxe VerificarVeiculo, bom, teremos que criar ela então vamos lá.
1 2 3 4 | forward VerificarVeiculo(playerid); <br>public VerificarVeiculo(playerid) <br>{ <br> 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | forward SalvarOrg(playeri); <br>public SalvarOrg(playerid) <br>{ <br> new arquivo[60], nome[MAX_PLAYER_NAME]; <br>GetPlayerName(playerid, nome, sizeof(nome)); <br>format(arquivo, sizeof(arquivo), "Contas\%s.ini" , nome); <br> if (!dini_Exists(arquivo)) <br>{ <br>dini_Create(arquivo); <br>} <br> if (PlayerInfo[playerid][PMilitar] > 0) dini_IntSet(arquivo, "PMilitar" , PlayerInfo[playerid][PMilitar]); <br> if (PlayerInfo[playerid][Groove] > 0) dini_IntSet(arquivo, "Groove" , PlayerInfo[playerid][Groove]); <br> if (PlayerInfo[playerid][Ballas] > 0) dini_IntSet(arquivo, "Ballas" , PlayerInfo[playerid][Ballas]); <br> return 1; <br>} |
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 estou ocupado então em breve estarei aqui com mais postagens construtivas.
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.
Créditos: Josma_CMD
Agradecimento: Progressão Pawn
Progressão Pawn envolvendo jogadores revolucionando servidores.
0 comentários:
Postar um comentário