[Tutorial] Criando organizaзхes completo [2° Forma]
#1

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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
//**********************************[ 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 Код:
#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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
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 Код:
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.

Duvidas Frequentes
Por que nгo fez o InfoOrg? Porque jб tem um InfoOrg lanзado por um membro do PP no fуrum, e isso puxaria o tуpico pra cуdigo ъtil(O que nгo й meu objetivo).
Reply
#2

up vai ajudar qm nao sabe criar org
Reply
#3

Quote:
Originally Posted by Don_Speed
Посмотреть сообщение
up vai ajudar qm nao sabe criar org
Espero que sim.
Reply
#4

Muito bom, vai ser ъtil pra mim... +rep
Reply
#5

Thanks josma, eu mesmo irei fazer bom proveito dele

+rep.
Reply
#6

Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
Muito bom, vai ser ъtil pra mim... +rep
Valeu.

Quote:
Originally Posted by [Magnus]
Посмотреть сообщение
Thanks josma, eu mesmo irei fazer bom proveito dele

+rep.
Essa й a intenзгo. Valeu. ^^

Mil posts sem floodar. \o/
Reply
#7

Otimo Tutorial e bem Util,parabens Josminha -q
Reply
#8

Useful ._.
Reply
#9

nuss muito bom quando estiver animado para ler eu vorto ake kkk
Reply
#10

Bem Legal
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)