[Tutorial] Strcmp (OnPlayerCommandText) e Sscanf
#1

Antes de comeзar, quero deixar claro que o melhor й se usar sscanf com algum processador de comados (zcmd, jcmd, dcmd, ycmd, entre outros), mas para quem jб se acostumou com strcmp ou o Game Mode estб em strcmp e nгo quer converter ele para algum processador, esse tutorial й muito recomendando. Tambйm serve como estudo de sscanf, ver outras aplicaзхes desse poderoso plugin de ******.

OnPlayerCommandText e Sscanf

Sumбrio

- Sscanf
  • Baixando
  • Como instalar
  • O que й?
- OnPlayerCommandText (strcmp)
  • O que й?
  • Entendendo seus parвmetros
- OnPlayerCommandText e Sscanf
  • Como usar
  • Exemplos

Sscanf


Baixando

Nгo vou falar muito sobre baixar, todos os arquivos necessбrios podem ser encontrados no tуpico oficial do sscanf by ******

Como instalar

Apуs baixar o arquivo sscanf.rar vocк verб 3 pastas:
- pawno
- plugins
- sscanf

A pasta pawno contйm a include sscanf2.inc que serб usada no nosso Game Mode, entгo coloque ela em pawno/include e no topo do seu GameMode:

pawn Код:
#include < sscanf2 >
Depois, й necessбrio colocar o arquivo .dll ou .so na pasta Servidor/plugins e configurб-lo no arquivo server.cfg. Apуs isso, essa incrнvel ferramenta estarб disponнvel para nosso uso

O que й?

Basicamente, sscanf й um separador de strings, ou seja, ela separa dentro de uma determinada strings vбrias sub strings, por exemplo:

pawn Код:
sscanf ( "Tutorial 1" , "s[20]d", texto, numero );
Ira retornar

Tutorial
1

Para mais informaзхes veja o tуpico oficial do plugin.

OnPlayerCommandText


O que й?

OnPlayerCommandText й a callback do SA:MP responsбvel por processar os comandos, ela recebe tudo que for digitado depois de uma barra / CASO a barra esteja no comeзo da caixa de diбlogo de chat. Exemplo:

/Isso й um comando, e nгo aparecerб no chat

Oi Pessoal /Isso nгo й um comando, e tudo isso aparecerб no chat

Basicamente, quando um comando й digitado, essa callback й chamada. Os processadores de comando fazem agilizar esse processo de Digitar > OnPlayerCommandText > Processamento > Retorno.

Entendendo seus parвmetros

Essa callback possui 2 parвmetros: playerid e cmdtext[]. Playerid й уbvio, й o ID do jogador que digitou o comando, e cmdtext й tudo que foi digitado na caixa de chat do SAMP.

Tendo em mente que tudo que foi digitado faz parte do cmdtext, podemos concluir que a primeira substring serб o comando, e todo o resto serгo os parвmetros, que podem ou nгo ser usados. Como o objetivo do sscanf nesse tutorial й extrair parвmetros de um comando, iremos partir desse princнpio: O que nгo й comando, й parвmetro.

OnPlayerCommandText e Sscanf


Como usar

O primeiro passo apуs entender o que й sscanf e OnPlayerCommandText й entender como a string presente nessa callback pode ser extraнda usando sscanf. Vamos ao cуdigo:

pawn Код:
public OnPlayerCommandText ( playerid , cmdtext[] /*Dessa String iremos pegar os parвmetros*/ )
{
    new _cmdtext [ 50 ], params [ 200 ]; //Criamos nossas variбveis

    sscanf ( cmdtext , "s[50]s[200]" , _cmdtext , params ); //Separamos Comando e Parвmetros
   

    return 0; //Essa callback sempre retorna 0;
}
O cуdigo acima irб retornar:

Comando
Parвmetros.


Agora que jб temos comando e parвmetros extraнdos, nгo podemos mais comparar a string bruta (cmdtext[], que contйm comando e parвmetros) com nossos comandos, precisamos comparar agora apenas o comando, que estб na nossa variбvel _cmdtext. Ou seja:

pawn Код:
public OnPlayerCommandText ( playerid , cmdtext[] )
{
    new _cmdtext [ 50 ], params [ 200 ]; //Criamos nossas variбveis

    sscanf ( cmdtext , "s[50]s[200]" , _cmdtext , params ); //Separamos Comando e Parвmetros
   
    if ( !strcmp ( _cmdtext , "/ComandoComParametro" ) )
    {
        return 1;
    }

    return 0; //Essa callback sempre retorna 0
}
Agora que jб comparamos apenas nosso comando, podemos extrair os parвmetros que queremos de dentro dos parвmetros jб extraнdos (caso essa frase fique um pouco confusa, releia e tente entender), novamente usando sscanf, porйm agora extraindo apenas dos parвmetros, nгo da string bruta.

pawn Код:
public OnPlayerCommandText ( playerid , cmdtext[] )
{
    new _cmdtext [ 50 ], params [ 200 ]; //Criamos nossas variбveis

    sscanf ( cmdtext , "s[50]s[200]" , _cmdtext , params ); //Separamos Comando e Parвmetros
   
    if ( !strcmp ( _cmdtext , "/ComandoComParametro" ) )
    {
        new Motivo [ 50 ] , ID;    

        if ( sscanf ( params , "si" , Motivo , ID ) ) //Sscanf retorna 1 quando os parвmetros nгo sгo completados com sucesso
            return SendClientMessage ( playerid , 0xFF0000FF , "Uso Correto /ComandoComParametro [Motivo] [Quantia]" ); //OBS: Parвmetros aleatуrios.

       

        return 1;
    }

    return 0; //Essa callback sempre retorna 0
}
Pronto, agora nуs temos os parвmetros separados

Sobre os tipos de valores que podem ser extraнdos (String, Numero, Float, etc) vejam o tуpico oficial do plugin, jб linkado vбrias vezes nesse tutorial.

Exemplos

Criando um /kick [ID] :

pawn Код:
public OnPlayerCommandText ( playerid , cmdtext[] )
{
    new _cmdtext [ 50 ], params [ 200 ]; //Criamos nossas variбveis

    sscanf ( cmdtext , "s[50]s[200]" , _cmdtext , params ); //Separamos Comando e Parвmetros
   
    if ( !strcmp ( _cmdtext , "/kick" ) )
    {
        if ( !sscanf ( params , "i" , ID ) ) //Caso vocк queria usar sscanf dessa forma, funciona sem problemas, afinal, ela retorna 0 quando os parвmetros sгo completados com sucesso ;)
        {
            if (IsPlayerConnected(ID))
            {
                Kick ( ID );
            }
        }

        return 1;
    }

    return 0;
}
Bem, esse tutorial pode ser um pouco confuso para quem nгo sabia que sscanf separava strings (eu mesmo nгo sabia disso, e criava comandos sem a menor dificuldade usando sscanf) ou que nгo sabia que cmdtext[] era todo o texto digitado.

Qualquer dъvida/sugestгo postem abaixo para que eu possa responder ou acrescentar ao tutorial.

-----------------------------------------------------------------------------------------------

Crйditos desse tutorial:
  • Juniiro3 (Criador)
  • Willian_Luigi (Aprendi algumas funзхes de sscanf com ele)
Reply


Messages In This Thread
Strcmp (OnPlayerCommandText) e Sscanf - by Juniiro3 - 06.10.2013, 23:07
Re: Strcmp (OnPlayerCommandText) e Sscanf - by WLSF - 06.10.2013, 23:08
Re: Strcmp (OnPlayerCommandText) e Sscanf - by Juniiro3 - 06.10.2013, 23:10
Re: Strcmp (OnPlayerCommandText) e Sscanf - by PT - 06.10.2013, 23:10
Re: Strcmp (OnPlayerCommandText) e Sscanf - by Juniiro3 - 06.10.2013, 23:13
Re: Strcmp (OnPlayerCommandText) e Sscanf - by Coe1 - 06.10.2013, 23:26
Re: Strcmp (OnPlayerCommandText) e Sscanf - by Juniiro3 - 06.10.2013, 23:29
Re: Strcmp (OnPlayerCommandText) e Sscanf - by Coe1 - 06.10.2013, 23:34
Re: Strcmp (OnPlayerCommandText) e Sscanf - by Juniiro3 - 06.10.2013, 23:37
Re: Strcmp (OnPlayerCommandText) e Sscanf - by mau.tito - 10.10.2013, 00:01

Forum Jump:


Users browsing this thread: 3 Guest(s)