Criando organizações completo [2° Forma]

21 de dez. de 2012.
Bom, são quase 5 da madrugada, atendendo à pedidos venho dar continuidade ao meu tutorial sobre como criar organizações. Tentarei trazer uma nova forma de cria-las e utilizarei o zcmd + sscanf.
Este tutorial é mais uma atualização ou uma alternativa ao antigo, porem, com algumas coisas a mais e melhorias assim também como a estrutura é outra; claro, estarei à disposição para tirar duvidas, criticas apenas se forem construtivas, sugestões, aceito desde que não seja sobre um novo tutorial sobre o mesmo tema.

Lembrando, este não é um código útil e sim um tutorial, não vai adiantar você sair copiando os códigos e editando os nomes, leia, se não entender releia, se ainda assim não entender pergunte, esqueça que tem ctrl+c no teclado.

Índice

 Criar organizações, cargos e seus respectivos nomes.
 Criar cores paras orgs
 Criar veículos para organizações e impedindo que outros os 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 & constantes
 Saber utilizar operadores
 Saber o mínimo sobre as funções nativas do samp.
 Saber utilizar manipulador de arquivos(No caso usaremos SII).

Introdução

Primeiramente, quero deixar claro que isto não se aplica à GF, é editável e pode ser adaptado mas você terá grandes dores de cabeça pois o GF usa um sistema de organização completamente diferente principalmente na parte de veículos.


● Criar organizações, cargos e seus respectivos nomes.


Evitando a criação de varias variáveis todas com o valor MAX_PLAYERS iremos criar um enum (Enumerado ou enumérico) que utilizaremos posteriormente em uma variável aproveitando da mesma array. Neste enum colocaremos as seguintes informações.

pawn Code:
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? Bom, com ele poderá ser definido e verificado à qualquer momento qual o cargo do player e a organização que ele pertence.
Vamos definir os nomes para as organizações, eu vou criar 5 organizações para usar como exemplo, para adicionar mais é só seguir o mesmo processo.

pawn Code:
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 o valor NULL, então não pode conter um valor, a ultima 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 maior numero de caracteres é a [4] que contem 16 caracteres, 16 + o Null que é equivalente à 1 dá 17 então está ai o valor.
Calma, em breve veremos como getar estes nomes.


● Criar cores paras orgs


Temos várias maneiras de fazer isto, seja com a diretiva define, variáveis com arrays, constantes entre outros metodos, utilizaremos neste tutorial o const(Derivado de constant, um valor que não pode ser alterado posteriormente como as variáveis).

pawn Code:
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 podem 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 os peguem.


A criação de veículos exclusivos para organizações é relativamente simples apesar de um tanto chato de se fazer, eu meu sistema uso um loop que carrega os veículos da scriptfiles mas acho que não é uma boa pra este tutorial pois o tornaria um código útil, então vamos lá.
Primeiro passo, você deve criar as variáveis de cada organização com o numero de veículos que as mesma terão.
Exemplo:

pawn Code:
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ículos.
É bom lembrar que é contado o caracter NULL, então se a org tem 3 veículos você conta à partir do 0 mas sempre deixando 1 valor à sobra. 0, 1, 2 o 3 é NULL.

As variáveis estão criadas, vamos aplicar agora os carros à elas.
Vocês podem fazer isso no OnGameModeInit, ou em uma callback, fica à escolha de cada um.

pawn Code:
//**********************************[ 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.
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, vários comparadores em um loop entre outras coisas, mas vamos utilizar de um macro que eu fiz.

pawn Code:
#define VDaOrg(%0,%1,%2) GetPlayerVehicleID(playerid) >= %0[%1] && GetPlayerVehicleID(playerid) <= %0[%2]
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.
pawn Code:
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 numero inicial de veículos à ser comparado, no caso, 0, e no terceiro, o numero de veículos que a organização tem, começando do 0 e sem o caracter NULL.
Como podem perceber, utilizamos as cores das organizações que criamos com o const no inicio do tutorial.

● Criar comando /membros /equipar /chatorg
Bom, vamos por sequencia, começando pelo /membros, crie uma variável global com o numero de arrays considerável. Vou criar a variável Texto.
pawn Code:
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 em SendClientMessage caso queira e isso dispensaria tantas arrays na variável Texto.
pawn Code:
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 ele está no local de equipamentos da organização dele, caso sim, lhe dará as armas.
Claro, esse comando pode ficar MUITO mais complexo até com o uso de enum e loops mas creio que isso se aprende na prática se arriscando com a criatividade e não teoricamente.

pawn Code:
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 e/ou mudar as mesmas neste código, fica à sua escolha este é apenas um exemplo.
Chat da organização, enfim botaremos em prática o SSCANF.

pawn Code:
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.

pawn Code:
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.

pawn Code:
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.

pawn Code:
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 pra obter o ID do player sendo promovido a a variável Cargo pra obter o nível à qual ele será promovido, ambas são intenger, acumulam valores inteiros.
Logo após usasse o sscanf para verificar os parametros, verifica-se se o player é líder e também se a organização do player promovido é a mesma organização do player promovente, caso um desses resultados seja falso retornará à mensagem.

O comando demitir é o mais simples da categoria 'Líder".

pawn Code:
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 à mensagem.
Caso seja verdadeiro, setará a organização do player demitido para 0, que é equivalente à 'Civil", setará o cargo dele para 0 e mandará a mensagem ao demitidor 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, usaremos SII.

pawn Code:
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.

pawn Code:
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 ultimo cargo e o id da ultima 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 do fórum então se tiver pequenos detalhes como falta de vírgula entre outros avise-me, estou procurando pra corrigir(Até agora não achei nenhum) mas caso ache, comente. ^^

Bom, é isso ai, não espero que gostem, mas espero que lhe seja útil. 



Creditos: Josma

0 comentários:

Postar um comentário