0

TUTORIAL - Criando Orgs Completo


Apartir deste tutorial você irá aprender a criar organizações utilizando o ZCMD e o Sscanf, qualquer dúvidas ou críticas que forem contrutivas e sugestões serão aceitas, lembrando que este não é um código útil e sim um tutorial, e não irá adiantar você sair copiando os códigos e editando os nomes, leia e se não entender releia, caso não entenda novamente pergunte, esqueça que existe CTRL+C no teclado.

Índice

Criar organizações, cargos e seus respectivos nomes
Criar cores paras as Organizações
Criar veículos para tal organização e impedir que outras peguem
Criar comando /membros /equipar /chatorg
Criar comandos para líderes /convidar (em dialog) /promover /demitir
Banco de dados para salvamento de orgs

Necessário

Saber utilizar ZCMD
Saber utilizar variáveis e constantes
Saber utilizar operadores
Saber o mínimo sobre as funções nativas do SAMP
Saber utilizar manipulador de arquivos (utilizaremos o SII)

Introdução

O tutorial não se aplica à GF, é editável e pode ser adaptado, porém você terá grandes dores de cabeça pois o GF utiliza um sistema de organização completamente diferente principalmente na parte de veículos.

Criando Orgs Completo


Autor: Josma_CMD
Tamanho: N/A
Tutorial: Criar organizações, cargos e seus respectivos nomes
Evitando a criação de várias variáveis todas com o valor MAX_PLAYERS iremos criar um enum que utilizaremos posteriormente em uma variável aproveitando da mesma array. Neste enum colocaremos as seguintes informações:
enum Info
{
    Membro,    //Identifica de que organização o player é membro. 0 para civil.
    Cargo,      //Identifica qual o cargo do player. 10 para líder.
};
new ProgressaoInfo[MAX_PLAYERS][Info]; //Utilizaremos essa variável com arrays em conjunto com o enum
Pra que servirá o código acima? Ele poderá ser definido e verificado a qualquer momento qual o cargo do player e a organização que ele pertence.
Vamos definir os nomes para as organizações, criando 5 organizações para usar como exemplo, para adicionar mais é só seguir o mesmo processo.
new Nomeorgs[5][128] =  //[5] representa o numero de linhas iniciando do 0 e [128] o numero de caracters máximo de cada string.
{
 "Civil",            //Org [0]: Como dito no enum, a org 0 é civil, não é propriamente uma org mas é necessário ter pois o player será automaticamente membro da org 0 caso não definido.
 "Assassinos",       //Org [1]: Assassinos por contrato, Hitmans.
 "Aeronautica"       //Org [2]: Aeronautica, controle aéreo.
 "Drifters",         //Org [3]: Drifters, corredores de derrapagem.
 "Policial Federal"  //Org [4]: Policiais Federais, casos de escala nacional.
};
O [5] é uma array com valor NULL, então não pode conter um valor, a última array da variável não necessita de vírgula como as anteriores pois não terá um próximo valor.
Como notaram ali coloquei [17] por um motivo simples, a string com o mair número de caracteres é a [4] que contém 16 + o NULL que é equivalente á 1 dá 17 então está ai o valor. Em-breve veremos como getar esses nomes.

Criar cores para Orgs

Tem várias maneiras de fazer isto, seja com uma diretiva define, variáveis com arrays, constantes entre outros métodos, utilizaremos neste tutorial o const (Derivado do constant, um valor que não pode ser alterado posteriormente com as variáveis).
const C_Civil   = 0xFFFFFFFF; //Cor dos civis, branco.
const C_Assassinos  = 0x000000FF; //Cor dos assassinos, preto.
const C_Aeronautica = 0x1E90FF99; //Cor da aeronautica, azul.
const C_Drifters  = 0x1E90AA99; //Cor dos drifters, verde.
const C_PFederal    = 0x6C7B8BFF; //Cor da Policia Federal, azul escuro.
Como pode perceber, as cores foram definidas em hexadecimal, 0x seguido do código da cor (Que são os 6 próximos caracteres) seguido da transparência da cor que são os dois últimos caracteres.

Criar veículos para organizações e impedindo que outros peguem

A criação de veículos exclusivos para organizações é relativamente simples apesar de ser um pouco chato de se fazer, eu utilizo um loop que carrega os veículos da scriptfiles mas acho que não é uma boa para este tutorial pois se tornaria um código útil, então vamos lá.
Você deve criar as variáveis de cada organização com o número de veículos que as mesmas terão, Exemplo.
new VCivil[3];    //Os Civis tem 3 veículos
new VAssassinos[5];  //Os Assassinos tem 5 veículos.
new VAeronautica[7]; //A Aeronautica tem 7 veículos.
new VDrifters[4];    //Os Drifters tem 4 veículos.
new VPFederal[6];    //A Policia Federal tem 6 veículo
É bom lembrar que é contado o caracter NULL, então se a org tem 3 veículos, você conta apartir do 0 mas sempre deixando 1 valor à sobra. 0, 1, 2 o 3 é o NULL.
As variáveis estão criadas, vamos aplicar agora os carros à elas.
Você poderá fazer isso no OnGameModeInit ou em uma Callback, fica a sua escolha.
//**********************************[ Veículos Civis]*************************************************
VCivil[0] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VCivil[1] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VCivil[2] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);

//******************************[ Veículos dos Assassinos]*************************************************
VAssassinos[0] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VAssassinos[1] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VAssassinos[2] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
//E assim vai até criar todos os veículos pra completar as arrays da variável.

//******************************[ Veículos da Aeronautica]*************************************************
VAeronautica[0] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VAeronautica[1] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VAeronautica[2] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
//E assim vai até criar todos os veículos pra completar as arrays da variável.

//******************************[ Veículos dos Drifters]*************************************************
VDrifters[0] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VDrifters[1] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VDrifters[2] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
//E assim vai até criar todos os veículos pra completar as arrays da variável.

//***************************[ Veículos da Policia Federal]**********************************************
VPFederal[0] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VPFederal[1] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
VPFederal[2] = CreateVehicle(modelo, Float:X, Float:Y, Float:Z, Float:Rotação, cor1, cor2, respawnDelay);
//E assim vai até criar todos os veículos pra completar as arrays da variável./pre>
Não preenchi os parâmetros pra que possam compreender melhor, apesar de saber que vocês conhecem os parâmetros do CreateVehicle.
Vamos ao passo seguinte, impedir que um membro de outra organização entre no veículo de sua organização, para isso poderíamos usar loop, de vários comparadores em um loop entre outras coisas, mas vamos utilizar um macro que eu fiz.
#define VDaOrg(%0,%1,%2) GetPlayerVehicleID(playerid) >= %0[%1] && GetPlayerVehicleID(playerid) <= %0[%2]
Com este código é possível verificar se o veículo é da org sem loops e/ou ter que especificar cada veículo com operadores relacionais, apenas setando à partir de qual veículo vai verificar, até qual e o nome da variável...
Exemplo de como usar
if(VDaOrg(VPCivil,0,8) && ProgressaoInfo[playerid][Membro] != 1) return RemovePlayerFromVehicle(playerid), SendClientMessage(playerid, C_PCivil, "Você não é um policial civil");
if(VDaOrg(VPMilitar,0,16) && ProgressaoInfo[playerid][Membro] != 2) return RemovePlayerFromVehicle(playerid), SendClientMessage(playerid, C_PCivil, "Você não é um {1E90FF}Policial Militar");
Com este macro verificaremos se o veículo que o player está é o mesmo veículo de uma das arrays setadas na função, veja o exemplo abaixo.
public OnPlayerStateChange(playerid, newstate, oldstate) //Verificará a mudança de estado do player
{
 if(newstate == PLAYER_STATE_DRIVER) //O novo estado do player é de motorista.
 {
     if(VDaOrg(VPCivil,0,2)) SendClientMessage(playerid, C_Civil, "Você entrou em um veículo Civil");
     if(VDaOrg(VAssassinos,0,4)  && ProgressaoInfo[playerid][Membro] != 2) return RemovePlayerFromVehicle(playerid), SendClientMessage(playerid, C_Assassinos, "Você não é um Assassino");
     if(VDaOrg(VAeronautica,0,6) && ProgressaoInfo[playerid][Membro] != 3) return RemovePlayerFromVehicle(playerid), SendClientMessage(playerid, C_Aeronautica, "Você não é da Aeronautica");
     if(VDaOrg(VDrifters,0,3)    && ProgressaoInfo[playerid][Membro] != 4) return RemovePlayerFromVehicle(playerid), SendClientMessage(playerid, C_Drifters, "Você não é um Drifter");
     if(VDaOrg(VPFederal,0,5)    && ProgressaoInfo[playerid][Membro] != 5) return RemovePlayerFromVehicle(playerid), SendClientMessage(playerid, C_PFederal, "Você não é um Policial Federal");
 }
 return true;
}
No primeiro parâmetro desse macro, você vai utilizar o nome da variável dos veículos da org desejada, em seguida no segundo parâmetro o número inicial de veículos a ser comparado, no caso 0 e no terceiro o número de veículos que a organização tem, começando do 0 e sem o caracter NULL.
Como pode perceber, utilizamos as cores das organizações que criamos com o const do início do tutorial.

Criar comandos /membros /equipar /chatorg

Bom, vamos por sequência, começando pelo /membros crie uma variável global com o número de arrays considerável. Exemplo
new Texto[256]; //Lembrando, é uma variável global, não deve ser posta dentro de qualquer estrutura que use chaves.
Vou criar o comando em dialog e utilizar strcat, mas você poderá fazer isso em SendClientMessage caso queira e isso dispensaria tantas arrays na variável Texto.
cmd(membros, playerid, params[])
{
 #pragma unused params //Não estamos usando parametros no comando, por isso o pragma.
 new corda[70];
 for(new i, PP = GetMaxPlayers(); i < PP; i++)
 {
     if(!IsPlayerConnected(PP)) continue;    //Caso o player não esteja conectado ele dará continuidade no loop
     if(ProgressaoInfo[i][Membro] == ProgressaoInfo[playerid][Membro]) //Caso a org do player [i] for igual a org do player [playerid] Executará o que vem abaixo.
     {
         new nome[MAX_PLAYER_NAME]; //Criará a variável que acumulará o nome do player membro da org.
         GetPlayerName(playerid, nome, sizeof(nome)); //Pegará o nome do player membro da org pra acumular na variável acima.
         format(corda, sizeof(corda), "%s membro da org %s cargo %d\n", nome, Orgnome[ProgressaoInfo[i][Membro]], ProgressaoInfo[i][Cargo]); //Formatará a string corda com o nome, cargo e nome da org pertencente.
         strcat(Texto, corda, 70);
     }
 }
 ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Lista de membros online", Texto, "OK", ""); //Mostratá ao player o dialog com a lista de membros.
 strdel(Texto, 0, sizeof(Texto)); //Deletará os dados da string pra que ela possa ser reutilizada e evitando um 'bug' que repete as mensagens.
 return true;
}
O /equipar eu vou tentar fazer de modo simples, sendo mais compreensível. O processo será o seguinte, ao digitar /equipar verificará a organização do player e se esle está no local de equipamentos da organização dele, caso sim, lhe dará armas.
Claro, esse comando pode ficar muito mais complexo até o uso de enum e loops mas creio que isso se aprende na prática e se arriscando com a criatividade e não teoricamente.
cmd(equipar, playerid, params[])
{
 #pragma unused params //Não estamos usando parametros no comando, por isso o pragma.
 if(ProgressaoInfo[playerid][Membro] == 1 && IsPlayerInRangeOfPoint(playerid, 3.0, Float:X, Float:Y, Float:Z)) //No X, Y e Z as coordenadas do local de equipe da org 1 = Assassinos
 {
     ResetPlayerWeapons(playerid); //Tirará as armas do player evitando que ele se equipe várias vezes pra conseguir munição infinita.
     GivePlayerWeapon(playerid, 31, 500); //Lhe equipará com uma M4 e 500 balas.
     GivePlayerWeapon(playerid, 24, 300); //Lhe equipará com uma Eagle e 300 balas.
     GivePlayerWeapon(playerid, 25, 250); //Lhe equipará com uma Shotgun e 250 balas.
     SendClientMessage(playerid, C_Assassinos, "Você foi equipado");
     return true;
 }
 else if(ProgressaoInfo[playerid][Membro] == 2 && IsPlayerInRangeOfPoint(playerid, 3.0, Float:X, Float:Y, Float:Z)) //No X, Y e Z as coordenadas do local de equipe da org 2 = Aeronautica
 {
     ResetPlayerWeapons(playerid); //Tirará as armas do player evitando que ele se equipe várias vezes pra conseguir munição infinita.
     GivePlayerWeapon(playerid, 31, 500); //Lhe equipará com uma M4 e 500 balas.
     GivePlayerWeapon(playerid, 24, 300); //Lhe equipará com uma Eagle e 300 balas.
     GivePlayerWeapon(playerid, 25, 250); //Lhe equipará com uma Shotgun e 250 balas.
     SendClientMessage(playerid, C_Aeronautica, "Você foi equipado");
     return true;
 }
 else if(ProgressaoInfo[playerid][Membro] == 2 && IsPlayerInRangeOfPoint(playerid, 3.0, Float:X, Float:Y, Float:Z)) //No X, Y e Z as coordenadas do local de equipe da org 3 = Drifters
 {
     ResetPlayerWeapons(playerid); //Tirará as armas do player evitando que ele se equipe várias vezes pra conseguir munição infinita.
     GivePlayerWeapon(playerid, 31, 500); //Lhe equipará com uma M4 e 500 balas.
     GivePlayerWeapon(playerid, 24, 300); //Lhe equipará com uma Eagle e 300 balas.
     GivePlayerWeapon(playerid, 25, 250); //Lhe equipará com uma Shotgun e 250 balas.
     SendClientMessage(playerid, C_Drifters, "Você foi equipado");
     return true;
 }
 else if(ProgressaoInfo[playerid][Membro] == 2 && IsPlayerInRangeOfPoint(playerid, 3.0, Float:X, Float:Y, Float:Z)) //No X, Y e Z as coordenadas do local de equipe da org 4 = Policia Federal
 {
     ResetPlayerWeapons(playerid); //Tirará as armas do player evitando que ele se equipe várias vezes pra conseguir munição infinita.
     GivePlayerWeapon(playerid, 31, 500); //Lhe equipará com uma M4 e 500 balas.
     GivePlayerWeapon(playerid, 24, 300); //Lhe equipará com uma Eagle e 300 balas.
     GivePlayerWeapon(playerid, 25, 250); //Lhe equipará com uma Shotgun e 250 balas.
     SendClientMessage(playerid, C_PFederal, "Você foi equipado");
     return true;
 }
 return true;
}
Lógico, você poderá adicionar mais armas, retirar ou mudar as mesmas neste código, fica a sua escolha, este é apenas um exemplo.
No chat da organização, colocaremos em prática o SSCANF
cmd(chatorg, playerid, params[])
{
 //Usaremos parâmetros então não precisaremos do pragma.
 new corda[128];
 if(sscanf(params, "s[128]", corda)) return SendClientMessage(playerid, GetPlayerColor(playerid), "Uso correto: /ChatOrg [Mensagem]");
 if(ProgressaoInfo[playerid][Membro] == 0) return SendClientMessage(playerid, 0xFFFFFFFF, "Civis não tem chat próprio"); //Caso o player tente utilizar chat sendo civil.
 new nome[MAX_PLAYER_NAME]; //Criamos a variável que acumulará o nome do player que está mandando a mensagem à org.
 GetPlayerName(playerid, nome, sizeof(nome)); //Getamos o nome do player e acoplamos à variável criada acima.
 format(Texto, 128, "%s[%d] diz: %s", nome, ProgressaoInfo[playerid][Cargo], corda); //Lembra da variável global chamada de Texto que criamos? Reutilizaremos ela para armazenar o texto que será mandado aos membros da org. Junto com o mandante e seu cargo.
 for(new PP, Progressao = GetMaxPlayers(); PP < Progressao; PP++)
 {
     if(!IsPlayerConnected(PP)) continue; //Caso o player do loop não esteja conectado ele dará continuidade no loop sem executar o que está abaixo.
     if(ProgressaoInfo[PP][Membro] == ProgressaoInfo[playerid][Membro]) //Verificará se o player no Loop é da mesma organização do player que mandou a mensagem à org.
     {
         SendClientMessage(PP, GetPlayerColor(playerid), Texto); //Mandará a mensagem ao player no loop com a cor do player que mandou que lógicamente será a cor da org dele.
     }
 }
 return true;
}
Criar comandos para líderes /convidar (em dialog) /promover /demitir

Vamos partir então para os comandos de líderes, você poderia criar um bool em nosso enum para verificar se o player é ou não Líder, ao invés de fazer isto, criei apenas o cargo e se ele tiver o cargo 10 será equivalente à líder, vamos ao código.
cmd(convidar, playerid, params[])
{
 new PlayerB, nome[MAX_PLAYER_NAME]; //Criará as variáveis PlayerB que acumulará o ID do player convidado e nome que acumulará o nome de dois players(Um de cada vez, claro).
 if(sscanf(params, "d", PlayerB)) return SendClientMessage(playerid, 0x1E90FF99, "Uso correto: /convidar [id]"); //Caso o player não digite o comando completo retornará à esta mensagem.
 if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, 0x1E90FF99, "Este jogador não está online"); //Caso o jogador convidado não esteja online retornará à esta mensagem.
 GetPlayerName(PlayerB, nome, sizeof(nome)); //Pegará o nome do player convidado para usar ao formatar a variável Texto.
 format(Texto, 70, "Você convidou %s para sua organização", nome); //Formatará a variável texto com a mensagem e o nome do convidante.
 SendClientMessage(playerid, GetPlayerColor(playerid), Texto); //Mandará a mensagem ao convidante informando-o que ele convidou um player.
 GetPlayerName(playerid, nome, sizeof(nome)); //Pegará o nome do player convidante para usar ao formatar a variável Texto
 format(Texto, 128, "%s está lhe convidando para fazer parte da organização: %s \nDeseja aceitar?", nome, Nomeorgs[ProgressaoInfo[playerid][Membro]]); //Formatará a variável Texto com o nome do player convidante e o nome da organização
 ShowPlayerDialog(PlayerB, 100, DIALOG_STYLE_MSGBOX, "Convite para organização", Texto, "Sim", "Não"); //Mostrará ao player convidado o dialog de aceitação da org.
 SetPVarInt(PlayerB, "OrgConvidado", ProgressaoInfo[playerid][Membro]); //Setará a PVar do player convidado com o id da org que ele está sendo convidado, caso aceite, será setado.
 return true;
}
Antes de partir para o próximo comando, vamos conferir o OnDialogResponse, afinal, é preciso determinar o que acontecerá caso o player aceite o convite para a organização.
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
 if(dialogid == 100 && response) //100 é o ID do dialog que usamos no ShowPlayerDialog do comando /convidar. Response é a resposta ao primeiro botão do dialog, no caso, "Sim".
 {
     ProgressaoInfo[playerid][Membro] = GetPVarInt(playerid, "OrgConvidado"); //Setaremos a org do player = a org setada no PVar dele, que é a mesma do player que o convidou.
     ProgressaoInfo[playerid][Cargo] = 1; //Setaremos o cargo do player para 1 afinal ele acabou de entrar na nova organização.
     DeletePVar(playerid, "OrgConvidado"); //Deletaremos a PVar que usamos no comando /convidar.
     return true;
 }
 return true;
}
O comando /promover consiste em verificar se o player promovido é da mesma organização que o player promovedor, se o player promovedor é líder e se o player promovido está conectado.
cmd(promover, playerid, params[])
{
 new PlayerB, cargo;
 if(sscanf(params, "dd", PlayerB, Cargo)) return SendClientMessage(playerid, 0x1E90FF99, "Uso correto: /Promover [id] [cargo]");
 if(ProgressaoInfo[playerid][Cargo] != 10) return SendClientMessage(playerid, 0x1E90FF99, "Você não é líder");
 if(ProgressaoInfo[PlayerB][Membro] != ProgressaoInfo[playerid][Membro]) return SendClientMessage(playerid, 0x1E90FF99, "Este jogador não é da mesma organização que você.");
 ProgressaoInfo[playerid][Cargo] = cargo;
 return true;
}
Criamos ali a variável PlayerB para obter o ID do player sendo promovido a variável cargo para obter o nível a qual ele será promovido, ambas são intenger, acumulam valores inteiros. Logo após usasse o sscanf para verificar os parametros, verifica-se o player é líder e também se a organização do player promovido é a mesma do player promovente, caso um desses resultados seja falso, retornará a mensagem.
O comando demitir é o mais simples da categoria "Líder'
cmd(demitir, playerid, params[])
{
 new PlayerB;
 if(sscanf(params, "d", PlayerB)) return SendClientMessage(playerid, 0x1E90FF99, "Uso correto: /Demitir [id]");
 if(!IsPlayerConnected(PlayerB)) return SendClientMessage(playerid, 0x1E90FF99, "Este jogador não está online");
 if(ProgressaoInfo[playerid][Membro] != ProgressaoInfo[PlayerB][Membro]) return SendClientMessage(playerid, 0x1E90FF99, "Este jogador não é da sua organização");
 if(ProgressaoInfo[playerid][Cargo] != 10) return SendClientMessage(playerid, 0x1E90FF99, "Você não é líder da organização");
 ProgressaoInfo[PlayerB][Membro] = 0; //Tornará o player demitido um civil novamente.
 ProgressaoInfo[PlayerB][Cargo] = 0; //Atribuirá o cargo 0 ao player demitido, afinal, agora ele não pertence à org alguma.
 SendClientMessage(PlayerB, C_Civil, "Você foi demitido");
 SetPlayerColor(playerid, C_Civil);
 SendClientMessage(playerid, 0x1E90FF99, "Jogador demitido");
 return true;
}
Como nos comandos anteriores, criamos a variável intenger 'PlayerB' para acumular o valor do ID do segundo player na ação, no caso, o player demitido.
Em baixo verificaremos se o player demitido está ou não no SAMP, em baixo se a organização dele é igual à organização do player demitidor e em baixo se o player demitidor é líder, caso um desses resultados seja falso será retornado a mensagem.
Caso seja verdadeiro, setará a organização do player demitido para 0 que é equivalente a Civil setará o cargo dele para 0 e mandará a mensagem ao demetidor e ao demitido informando sobre a demissão.

Banco de dados para salvamento de orgs

E agora por fim, vamos salvar a organização do player assim como o cargo do mesmo, para isso utilizaremos o SII
public OnPlayerDisconnect(playerid, reason)
{
 SalvarPlayer(playerid);
 return true;
}

stock SalvarPlayer(playerid)
{
 new nome[MAX_PLAYER_NAME];
 GetPlayerName(playerid, nome, sizeof(nome));
 format(Texto, 35, "Jogadores/%s", nome); //Formatará na variável Texto o caminho onde ficará o arquivo com os dados do player.
 INI_Open(Texto); //Abrirá o arquivo para escrever as informações, caso não exista, ele criará automaticamente.
 INI_WriteInt("Organização", ProgressaoInfo[playerid][Membro]); //Setará na TAG Organização o valor inteiro da variável Membro do playerid(No caso o ID da org dele).
 INI_WriteInt("Cargo", ProgressaoInfo[playerid][Cargo]); //Setará na TAG Cargo o valor inteiro da variável Cargo do playerid(No caso, o cargo dele na org).
 INI_Save(); //Salvar é necessário, caso não salve, não verá nada escrito no arquivo.
 INI_Close(); //Também é necessário Fechar oa rquivo aberto.
 return true;
}
É necessário salvar a conta do player quando ele desconecta. Ou caso prefira, sete um timer pra salvar periodicamente. Vamos carregar as informações salvas.
public OnPlayerConnect(playerid)
{
 new nome[MAX_PLAYER_NAME];
 GetPlayerName(playerid, nome, sizeof(nome));
 format(Texto, 35, "Jogadores/%s", nome); //Formatará na variável Texto o caminho onde fica o arquivo com os dados do player.
 if(fexist(Texto)) //Verificará se o arquivo existe, caso exista executará o que vem entre as chaves abaixo.
 {
     INI_Open(Texto); //É necessário abrir o arquivo antes de tudo.
     ProgressaoInfo[playerid][Membro] = INI_ReadInt("Organização");
     ProgressaoInfo[playerid][Cargo] = INI_ReadInt("Cargo");
     INI_Close(); //É necessário apenas fechar o arquivo sem salvar, pois nada foi modificado nele.
 }
 return true;
}
Com o progressaoInfo seguido das variáveis do enum, e o INI_ReadInt estaremos atribuindo o valor presente na TAG à variável, no caso, repondo o último cargo e a ID da última org que o player tinha ao deslogar do servidor, claro, isso se o arquivo existir.
As partes citadas em códigos não foram compiladas, fiz diretamente na janela de post então se tiver pequenos detalhes como falta de vírgula entre outros me avise, estou procurando para corrigir.
FACEBOOK
0 BLOGGER

Nenhum comentário:

Postar um comentário

www.FAMILIA-SAMP.blogspot.com

1. Não pedir parceria nesta postagem
2. Não Ofender
3. Aguarde, que iremos responder seu comentário o mais rápido possível

Nossa equipe agradece por sua compreensão

Seu comentário, só irá para a nossa caixa de comentários, quando aparecer uma pequena mensagem na caixa branca, onde você comenta. A mensagem é: "Seu comentário estará visível depois de ser aprovado." Assim que aparecer essa mensagem, tenha a certeza que foi publicado, enquanto não aparecer, comente novamente.

Samp vicio, Vicio samp, Forum Samp, Samp forum, Baixaki, Hacker, GTA Modes, GTA San Andreas, Samp team, Y_less, Facebook samp, samp exclusivo, Exclusivo, dominio, samp, gta, multiplayer, gamemodes, filterscripts, ds, dominiosamp, sa-mp, xat, online, powers, days, xats, downloads, gm, fs, sobeit, xiter, 0.3a, 0.3b, 0.3c, 0.3d, 0.3e, 0.3x, versões, pawno, pawn, c++, scripter, mapper, scripters, mappers, codar, exclusiva, divulgar, servidores, server, servidor, social, redes, facebook, socialsamp, samphost, host, painel, ls, sf, lv, los, santos, san, fierro, las, venturas, forum, blog, gratis, banner, mta, hts, chucksamp, knd, homehots, sampknd, chuck, pastebin, scriptfiles, plugin, DS, Jogar, Brasil, Eua, English, San Andreas, GTA Online, Mods, TuToriais, Mapas, RPG, DM, DRIFT, Video Aulas, Includes, Download, Rc1, Rc3, Rc6, Rc7, 0.3c, rcon, Baixar Completo, Codigos, pwn, amx, public, Armas, Carros, Parceria, Como Jogar, Hackers Sobeit, Xiter, Aplicativos, novidades, novas versoes, Host Para Samp, MTA Editor, Hts, Tudo Gratis, Ajuda, Divulgue, seu Servidor samp, No Chat, Xat, PublicSAMP, SAMP GM, GM RPG, gm 0.3x , SAMP 0.3x 0.3d 0.3c 0.3e, GTA SA, SA-MP GM, GM RPG Gratis, GM Dten, TDM, Mata mata, Roleplay, Facebook, 0.3z, gm 0.3z, fs 0.3z, aplicativos, códigos, tutoriais, videogames,video games,video game, SAMP, gamemode, gta samp, homehots, san mods, matheus, matheus felype, youtube, google, marck zuckenberg, reality textures v3, homehots, samp-vicio, samp vicio, vicio samp, hotshome, sampknd, samp knd, knd samp, google, familia, familiasamp, famíliasamp, familiasamp.com, carros para gta, mods gta, gta mods, gta sa mods, modificaes gta, gta rio, gta v, gta 5, v, 5, gta, san andreas, iv, grand theft auto, elite, mods, skins, programas, trainers, carros, vw, ford, gol, trainer, fraps, cleo 3, carros brasileiros, detonados, cheats, cdigos, tropa de elite, top gta, gta sa, gta 4, caminhes, carretas, rodas, equipamentos, series, tutoriais, tutorial, Gta,grand theft auto,gta,gta enb series,Grand theft auto 5,Grand theft auto V,Grand theft auto SA IV ,Grand theft auto SA vice,Tommy Vercetty,Ricardo Diaz,Gonzales,Phil Cassidy,Big Mitch Baker,Pastor Richards, inferno, stretch, freeway, voodoo,walton, virgo,GPX,banshee,rancher,videogames,video games,video game, SAMP, gamemode, gta samp, homehots, san mods, eraldo, Matheus Felype, youtube, google, marck zuckenberg, reality textures v3, Felype Matheus, san mods, texugo mods, gta rockstar, renovar gta, bras edition, google, sla, nada, carro, moto, facebook, samp, gamemode, filterscript, fs, include, server, samp, 0.3z, gamemode, filterscript, eraldo, jonathan, san mods, gta rockstar, google, asdasd, asdasd, mc daleste, Mods gta, mods, carros gta sa, motos gta sa, mods gta iv, mods, gta sa, download gta v pc, download gta iv, download gta sa pc, zmodeler, gta inside, carros para gta, mods gta, gta mods, gta sa mods, modificaes gta, gta rio, gta v, gta 5, v, 5, gta, san andreas, iv, grand theft auto, elite, mods, skins, programas, trainers, carros, vw, ford, gol, trainer, fraps, cleo 3, carros brasileiros, detonados, cheats, cdigos, tropa de elite, top gta, gta sa, gta 4, caminhes, carretas, rodas, equipamentos, series, tutoriais, tutorial, Gta,grand theft auto,gta,gta enb series,Grand theft auto 5,Grand theft auto V,Grand theft auto SA IV ,Grand theft auto SA vice,Tommy Vercetty,Ricardo Diaz,Gonzales,Phil Cassidy,Big Mitch Baker,Pastor Richards, inferno, stretch, freeway, voodoo,walton, virgo,GPX,banshee,rancher,videogames,video games,video game, SAMP, gamemode, gta samp, homehots, san mods, eraldo, matheus felype, youtube, google, marck zuckenberg, reality textures v3, carros para gta, mods gta, gta mods, gta sa mods, modificações gta, gta rio, gta v, gta 5, v, 5, gta, san andreas, vice city, iv, iii, grand theft auto, elite, mods, skins, programas, trainers, carros, vw, ford, gol, trainer, fraps, cleo 3, carros brasileiros, detonados, cheats, BAIXAR, GTA, FILTERSCRIPT, FIX, GAMEMODE, INCLUDE, MAPA, MODIFICAÇÕES, PLUGIN, PROGRAMA, TEXTURA, TUTORIAL, Tudo Para seu servidor SA-MP - Download Gamemodes, Filterscripts, Plugins, Tutoriais, Download de servidor SA-MP (GTA San Andreas), GTA Online, gamemodes, filterscipts, plugins, matheus felype, mods gta, mods para gta, gta sa, brothers designs, gta rockstar, san mods, eraldo, fábio, tudo para gta, mods de gta, como instalar, youtube, facebook, google, eraldo okado, okado eraldo, mods para gta v, gta v, gta sa, gta iv, gta vc, gta iii, tudo para gta, carros para gta, mods gta, gta mods, gta sa mods, modificaes gta, gta rio, gta v, gta 5, v, 5, gta, san andreas, iv, grand theft auto, elite, mods, skins, programas, trainers, carros, vw, ford, gol, trainer, fraps, cleo 3, carros brasileiros, detonados, cheats, cdigos, tropa de elite, top gta, gta sa, gta 4, caminhes, carretas, rodas, equipamentos, series, tutoriais, tutorial, Gta,grand theft auto,gta,gta enb series,Grand theft auto 5,Grand theft auto V,Grand theft auto SA IV ,Grand theft auto SA vice,Tommy Vercetty,Ricardo Diaz,Gonzales,Phil Cassidy,Big Mitch Baker,Pastor Richards, inferno, stretch, freeway, voodoo,walton, virgo,GPX,banshee,rancher,videogames,video games,video game, SAMP, gamemode, gta samp, homehots, san mods, eraldo, eraldo okado, youtube, google, marck zuckenberg, reality textures v3, bdgtamods, Mods para GTA SA e outros, Carros para GTA, Mods GTA San Andreas, GTA Mods, San Andreas, Carros, Mapas, Mods, Cleo 3, Cleo 4 Armas, Aviões, Barcos, Cheats, Detonados, Helicópteros, Motos, Patches, Programas, Savegames, Skins, Tutoriais para GRAND THEFT AUTO San Andreas, gta san andreas, san andreas, codigos gta,download gta,gta para pc,manhas,manhas gta,jogos gta,baixar gta,carros de gta,gta iv,gta v,mods,mods gta,mods para gta,mods cleo,cleo 4,skins,mapas gta,motos, hornet, honda, cbr, 2015, xat, xat.com, bdgtamods.com, brasil equipe na fixa, familia samp.