================================================== ================================================
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.
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.