[Tutorial] Funзгo simples e armazenar em DOF2
#1

Minha primeira contribuiзгo para o fуrum, й algo bem simples, pois o fуrum jб possui conhecimento atй um certo e bom nнvel(Ao meu ver, atualmente, sim).

Entгo, vim fazer uma base mais explicativa para os que possuem uma dificuldade em produzir as funзхes.

Vamos aprender a desenvolver profissхes, variantes e etc...?
Vamos comeзar!

Primeiro de tudo, vamos precisar das diretivas, "o que й uma diretiva?"
Resposta: Uma diretiva, й uma funзгo ou regra que se deve ser seguida.

Ainda nгo entendeu? pra ser mais prбtico...
Sabe isso que tem logo no topo do seu GameMode/Filterscript?
PHP код:
#include ... 
Esse "#include", significa que vocк estб incluindo uma biblioteca que as regras dela se devem ser seguidas.
Ou seja, as diretivas que iremos chegar a utilizar, serгo as seguintes:
PHP код:
#include <a_samp>
#include <dof2>
#include <pawn.cmd> 
O Link de encontro para as includes, estгo logo abaixo:
a_samp - Jб vem incluнdo ao baixar a pasta completa de create server. (Link direto da pasta - SA-MP 0.3.7-R2 Windows Server/SA-MP 0.3.7-R2 Linux Server (x86))
Double-O-Files 2 (DOF2) - Download
Pawn.CMD - Pawn.CMD - the fastest and most functional command processor

Agora, como instalamos?
O DOF2, vocк arrasta para a pasta do seu servidor e depois vai em pawno/include e cola lб.
Um exemplo do destino da pasta й assim:
Код:
C:\Users\Dell\Downloads\samp037_svr_R2-1-1_win32\pawno\include
Agora que jб baixamos as diretivas, vamos para a inicializaзгo das nossas funзхes.

Primeiro, entenda que uma base que irei citar aqui, jб servirб para vocк produzir as outras.
Entгo, vamos criar uma profissгo de lixeiro.

Vamos criar uma variбvel.
Mas a variбvel que vamos criar, serб em booleano.
PHP код:
new bool:prof_lixeiro[MAX_PLAYERS]; 
Apуs, criarmos a variбvel com a funзгo em matriz de MAX_PLAYERS, vamos na callback OnPlayerConnect e fazer a funзгo de armazenamento em DOF2, e os comandos e funзхes.

Passo-a-passo:
  • Primeiro, procure pela callback, que geralmente, ao criar um novo Filtercript/GameMode, virб da seguinte forma:
    PHP код:
    public OnPlayerConnect(playerid)
    {
        return 
    1;

    ---------------------------------------------
  • Agora, crie uma variбvel com uma quantidade de cйlulas de acordo com o nome da pasta que irб armazenar os dados. E tambйm, uma variбvel com uma referкncia em armazenamento do nome do jogador.
    Agora, vamos fazer uma verificaзгo se a pasta "Lixeiros" existe e resultar com funзхes lуgicas.
    Tambйm, nгo esquecer de contas as cйlulas, vн um amigo corrigindo um outro em um tуpico sobre a contagem de cйlulas, entгo aqui, temos uma base bem explicativa:
    Quote:
    Originally Posted by Cycle
    Посмотреть сообщение
    Aviso: Vou consertar a quantidade de celulas nas variбveis utilizadas para fazer a formataзгo de string, mas antes vou explicar como funciona.
    • Conte a quantidade de caracteres presentes na mensagem. Recomendo esse site -> Contador de Caracteres
    • Se a sua mensagem for referente a nomes, adicione mais 25, pois й o limite do nome. Exemplo:
    PHP код:
    /* Nessa funзгo necessita de +25 cйlulas. */
    new str[56], var_name[MAX_PLAYER_NAME];
    GetPlayerName(playeridvar_namesizeof(var_name));
    format(strsizeof(str), "Vocк %s, possui vida infinita."var_name);
    SendClientMessage(playerid, -1str);
    /* Mas porquк necessita de +25 cйlulas? Por conta do limite do nome. 
        A mensagem em si, possui 30 cйlulas, iremos adicionar mais 25 pois o referencial de nome estб incluso. 
        30 + 25 = 55 
        Entгo o valor que ficarб dentro dos colchetes serб o 55, mas eu sempre adiciono mais um por precauзгo.*/
    /* Nessa funзгo, nгo necessita de +25 cйlulas */
    new string[27];
    format(stringsizeof(string), "Vocк, possui vida infinita");
    /* Fazendo a conta normal, darб 26 celulas, mas eu sempre adiciono mais um por precauзгo */ 
    Com a explicaзгo, pode-se fazer a verificaзгo dessa forma:
    PHP код:
    new prof_lixeiro[MAX_PLAYERS];
    public 
    OnPlayerConnect(playerid)
    {
        new 
    save[40], nome[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridnomesizeof(nome));
        
    format(savesizeof(save), "Lixeiros/%s.ini"nome);
        if(!
    fexist(save))
        {
            
    DOF2::CreateFile(save);
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
        }
        else
            
    prof_lixeiro[playerid] = DOF2::GetBool(save"Lixeiro");
        return 
    1;

    ---------------------------------------------
  • Agora, vamos para salvar quando o jogador for desconectar do servidor.
    Tudo se resume no mesmo acima, apenas o contrбrio de 'Get', vamos apenas usar 'Set'. Nгo se pode esquecer de um SaveFile tambйm...
    PHP код:
    public OnPlayerDisconnect(playerid)
    {
        new 
    save[40], nome[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridnomesizeof(nome));
        
    format(savesizeof(save), "Lixeiros/%s.ini"nome);
        if(!
    fexist(save))
        {
            
    DOF2::CreateFile(save);
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
            
    DOF2::SaveFile();
        }
        else
        {
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
            
    DOF2::SaveFile();
        }
        return 
    1;

    ---------------------------------------------
  • Agora, vamos acrescentar uma coisa bбsica, vб na callback "OnFilterScriptExit"/"OnGameModeExit", e adicione o "DOF2::Exit"(Que de acordo com a diretiva, й o mesmo que a funзгo "DOF2::WriteFile"). que й pra caso o client-server resultar em algum problema e fechar, irб armazenar os dados.
    PHP код:
    public OnFilterScriptExit()
    {
        
    DOF2::Exit();
        return 
    true;
    }
    /* Caso sua preferкncia seja pra um GameMode, utilize a funзгo abaixo: */
    public OnGameModeExit()
    {
        
    DOF2::Exit();
        return 
    true;

    ---------------------------------------------
  • Agora que jб fizemos a funзгo de armazenamento, vamos para a funзгo de setamento para o jogador ser um lixeiro.

    A funзгo de setamento, irб depender de sua preferкncia, vamos ao mais simples possнvel.
    Vamos setar o jogador de lixeiro ao entrar, e ao sair, remover a funзгo.

    A funзхes em destaque, serгo as:
    PHP код:
    prof_lixeiro[playerid] = true;
    prof_lixeiro[playerid] = false
    Agora, aqui, й ao player se conectar, ele serб setado com a profissгo de lixeiro ao entrar no servidor!
    PHP код:
    public OnPlayerConnect(playerid)
    {
        new 
    save[40], nome[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridnomesizeof(nome));
        
    format(savesizeof(save), "Lixeiros/%s.ini"nome);
        if(!
    fexist(save))
        {
            
    DOF2::CreateFile(save);
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
        }
        else
            
    prof_lixeiro[playerid] = DOF2::GetBool(save"Lixeiro");
        
    prof_lixeiro[playerid] = true;
        return 
    1;

    Agora, aqui, ele perderб a profissгo de lixeiro ao desconectar do servidor.
    Agora, caso queira setar a funзгo para o player, vamos utilizar mais uma diretiva, parabйns pra vocк que veio atй aqui lendo e acompanhando e nгo foi direto ao 'CTRL+C' e 'CTRL+V'.
    A diretiva que vamos utilizar, й a sscanf2, e a sua instalaзгo й a mesma que as demais, passar para a pasta pawno/include. (Link download SSCANF2 - GitHub - Southclaws/sscanf2)
    Seguindo isso, vamos para o comando...
    PHP код:
    /* O desenvolvimento do comando, й semelhante a zcmd. */
    CMD:setlixeiro(playeridparams[])
    {
        new 
    id;
        if(!
    sscanf(params"u"id))
        {
            
    prof_lixeiro[id] = true;    
        }
        else return 
    SendClientMessage(playerid, -1"Use - /setlixeiro [ID]");
        return 
    true;

    Agora, vamos tentar entender por partes o que eu fiz...

    1є - Eu dei o nome para o comando de acordo com a syntax, e selecionei os parвmetros "playerid" e "params".
    PHP код:
    CMD:setlixeiro(playeridparams[]) 
    2є - Abri a chave do comando para executar as funзхes.
    PHP код:

            
    /* Apуs finalizar as funзхes, fechб-lo. */
        

    3є - Criei uma variбvel para exprimir o valor para ser setado ao jogador selecionado utilizando o sscanf2.
    PHP код:
    new id
    4є - Fiz a verificaзгo juntamente com a base das especificaзхes bбsicas do sscanf2 e retornei com uma mensagem ao final da condicional.
    (Como podem ver, fiz algo que nгo й visto como normal no sscanf, abri o sinal de false por introduзгo da condicional. Sabe quando vocк utiliza algum comando pra setar um jogador de administrador/organizador, e vocк digita apenas '/setadm', e ele retorna com uma mensagem semelhante a essa? 'Use - /setadm [ID]', entгo, й o sscanf que faz isso acontecer!)
    PHP код:
    if(!sscanf(params), "u"id))
        {
            
    /* ... */
        
    }
        else return 
    SendClientMessage(playerid, -1"Use - /setlixeiro [ID]"); 
    5є - Abri uma chave de verificaзгo dentro da condicional do sscanf.
    6є - Setei o jogador escolhido com a profissгo de lixeiro.

    Agora, caso queira fazer algo mais arrumadinho e que o jogador saiba?

    Vamos lб!
    1є - crie uma variбvel com uma quantidade de cйlulas exatas de quanto iremos utilizar no comando, e tambйm uma para ser derivada do nome do jogador.
    PHP код:
    new str[], name_of_player[MAX_PLAYER_NAME];
        
    /* Eu, sempre deixo sem a quantidade. Quando eu for contar, aн que eu coloco a quantidade certa! 
        Jбjб, vocк vai entender que й melhor assim.    */ 
    2є - Vocк vai formatar essa variбvel com uma mensagem, e vamos utilizar a funзгo GetPlayerName(Para selecionar o name do player) na variбvel 'name_of_player'.
    3є - Formate a variбvel 'name_of_player'.
    PHP код:
    GetPlayerName(playeridname_of_playersizeof(name_of_player)); 
    4є - Agora, vamos formatar a variбvel str(abreviaзгo de 'string').
    PHP код:
    format(strsizeof(str), "O Jogador %s te deu a profissгo de lixeiro."name_of_player); 
    5є - Agora, vamos contar as cйlulas para colocar nos colchetes a quantidade certa. (R = 6
    Obs.: A mesma regra que o Cycle deu acima, se aplica aqui tambйm.
    6є - Entгo, vamos colocar a quantidade '68', nos colchetes.
    PHP код:
    new str[68]; 
    7є - Formatamos todas as variбveis, agora o que falta? Exato, mostrar a mensagem para o player. Entгo, iremos fazer com que a mensagem seja enviada para o jogador que foi setado com a profissгo de lixeiro.
    PHP код:
    SendClientMessage(id, -1str);
    /* Colocamos o 'id' invйs de 'playerid', pois й o id que for setado irб aparecer a mensagem. 'str' invйs das aspas й porque, na formataзгo a funзгo jб vem setada com as aspas duplas. */ 
    E, para setar o jogador como lixeiro em um comando, й assim!

    Entгo, por fim, a conclusгo do comando й essa:
    PHP код:
    CMD:setlixeiro(playeridparams[])
    {
        new 
    id;
        if(!
    sscanf(params"u"id))
        {
            
    prof_lixeiro[id] = true;    
        }
        else return 
    SendClientMessage(playerid, -1"Use - /setlixeiro [ID]");
        return 
    true;

    Agora, algo que mais й interessante, й...
    "Mas, Pool, e se o cara nгo tiver online? vai setar ele mesmo assim?"

    Boa pergunta meu caro amigo, agora, vamos fazer uma pequena alteraзгo para verificar se o player estб conectado ao servidor!
    Simples, vamos fazer uma verificaзгo, caso o jogador nгo esteja presente no servidor, retorne com uma mensagem!
    PHP код:
    if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1"ERRO: O jogador escolhido nгo estб presente!"); 
    E por fim, a conclusгo final do comando e do tutorial, serб essa:
    Obs.: A forma abaixo, й o setamento por comando:
    PHP код:
    #include <a_samp>
    #include <dof2>
    #include <pawn.cmd>
    #include <sscanf2>
    new bool:prof_lixeiro[MAX_PLAYERS];
    public 
    OnPlayerConnect(playerid)
    {
        new 
    save[40], nome[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridnomesizeof(nome));
        
    format(savesizeof(save), "Lixeiros/%s.ini"nome);
        if(!
    fexist(save))
        {
            
    DOF2::CreateFile(save);
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
        }
        else
            
    prof_lixeiro[playerid] = DOF2::GetBool(save"Lixeiro");
        return 
    1;
    }
    public 
    OnPlayerDisconnect(playeridreason)
    {
        new 
    save[40], nome[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridnomesizeof(nome));
        
    format(savesizeof(save), "Lixeiros/%s.ini"nome);
        if(!
    fexist(save))
        {
            
    DOF2::CreateFile(save);
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
            
    DOF2::SaveFile();
        }
        else
        {
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
            
    DOF2::SaveFile();
        }
        return 
    1;
    }
    public 
    OnFilterScriptExit()
    {
        
    DOF2::Exit();
        return 
    true;
    }
    CMD:setlixeiro(playeridparams[])
    {
        new 
    idstr[68], name_of_player[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridname_of_playersizeof(name_of_player));
        if(!
    sscanf(params"u"id))
        {
            if(!
    IsPlayerConnected(id))
                return 
    SendClientMessage(playerid, -1"ERRO: O jogador escolhido nгo estб presente!");
            
    format(strsizeof(str), "O Jogador %s te deu a profissгo de lixeiro.");
            
    SendClientMessage(id, -1str);
            
    prof_lixeiro[id] = true;    
        }
        else return 
    SendClientMessage(playerid, -1"Use - /setlixeiro [ID]");
        return 
    true;

    Agora, a forma abaixo, й a forma em que se deve setar ao player entrar e desconectar do servidor.
    PHP код:
    #include <a_samp>
    #include <dof2>
    #include <pawn.cmd>
    #include <sscanf2>
    new bool:prof_lixeiro[MAX_PLAYERS];
    public 
    OnPlayerConnect(playerid)
    {
        new 
    save[40], nome[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridnomesizeof(nome));
        
    format(savesizeof(save), "Lixeiros/%s.ini"nome);
        if(!
    fexist(save))
        {
            
    DOF2::CreateFile(save);
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
        }
        else
            
    prof_lixeiro[playerid] = DOF2::GetBool(save"Lixeiro");
        
    prof_lixeiro[playerid] = true;
        return 
    1;
    }
    public 
    OnPlayerDisconnect(playeridreason)
    {
        new 
    save[40], nome[MAX_PLAYER_NAME];
        
    GetPlayerName(playeridnomesizeof(nome));
        
    format(savesizeof(save), "Lixeiros/%s.ini"nome);
        if(!
    fexist(save))
        {
            
    DOF2::CreateFile(save);
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
            
    DOF2::SaveFile();
        }
        else
        {
            
    DOF2::SetBool(save"Lixeiro"prof_lixeiro[playerid]);
            
    DOF2::SaveFile();
        }
        
    prof_lixeiro[playerid] = false;    
        return 
    1;
    }
    public 
    OnFilterScriptExit()
    {
        
    DOF2::Exit();
        return 
    true;

    Confira se estб de acordo com o que vocк fez!
    Obrigado, й algo bem bбsico mesmo, mas pode ajudar quem tem uma certa dificuldade!
    Abraзo!
Reply
#2

Boa iniciativa mano, parabйns! +algunsREP.
Reply
#3

Deu preguiзa de ler, poderia ter usado o tuto do don para incorporar no salvamento ficaria melhor do que usar bool.
Reply
#4

Bem gostei do que fez poderia talvez melhorar um pouco a apresentaзгo do tуpico mas o conteъdo estгo bom


Bom trabalho
Reply
#5

Seria o tнpico de tutorial que funcionaria melhor ter feito em vнdeo (em termos de explicaзгo). Mas, o conteъdo no geral ficou muito bom. Parabйns.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)