Í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).
Este não é um código útil e sim
um tutorial, não (apenas) decore, leia, entenda e crie seu sistema.
Parte 1, criando suas organizações:
Bom, iremos 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, iremos criar aqui 3 organizações como exemplo
neste enum.
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, não colocamos, 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.
new PlayerInfo[MAX_PLAYERS][Info];
Como podem perceber acima criamos a variável PlayerInfo, o nome é de sua
preferencia, esta variável tem o valor MAX_PLAYERS, ou seja, podemos
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 utilizamos 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.
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 estamos mostrando a mais simples para explicar sobre o 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...
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.
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.
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.
#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.
new VPMilitar[5];
Está criada a variável de veiculos da Policia Militar, vamos agora criar os veiculos:
No OnGameModeInit(); coloque:
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. Iremos
usar a OnPlayerStateChange...
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á.
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.
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: Criamos 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.