[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
#2

My name ? holy shit...

Parabйns mais uma vez, sempre mantendo a organizaзгo em dia.

+3 rep.
Reply
#3

Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
My name ? holy shit...

Parabйns mais uma vez, sempre mantendo a organizaзгo em dia.

+3 rep.
Obrigado

Lembra do Extern Rcon? Com aquele code do pawn eu entendi basicamente tudo que eu estou explicando nesse tutorial
Reply
#4

cara
se nao colocar o tamanho da string ( s ) na sscanf aparece um warning no console...

add la isso

Fora isso bom trabalho tou vendo que vc tem evoluido..
Reply
#5

Quote:
Originally Posted by PT
Посмотреть сообщение
cara
se nao colocar o tamanho da string ( s ) na sscanf aparece um warning no console...

add la isso

Fora isso bom trabalho tou vendo que vc tem evoluido..
Obrigado

Bem lembrado, tinha esquecido disso, adicionado
Reply
#6

Quote:
Originally Posted by PT
Посмотреть сообщение
cara
se nao colocar o tamanho da string ( s ) na sscanf aparece um warning no console...

add la isso

Fora isso bom trabalho tou vendo que vc tem evoluido..
Em algumas vezes eu nгo coloquei o tamanho da string no "s", e nгo apareceu nenhum warning no console.


Bom trabalho.
Reply
#7

Quote:
Originally Posted by Coe1
Посмотреть сообщение
Em algumas vezes eu nгo coloquei o tamanho da string no "s", e nгo apareceu nenhum warning no console.


Bom trabalho.
Melhor prevenir para nгo aparecer erros no console

Obrigado
Reply
#8

Quote:
Originally Posted by Juniiro3
Посмотреть сообщение
Melhor prevenir para nгo aparecer erros no console

Obrigado
Nгo existe esse negуcio de prevenir. rs

Ex:
pawn Код:
COMMAND:sexo ( playerid, params[] ) {

    new
        MySex [ 10 ] ;
       
    if ( sscanf ( params, "s", MySex ) )
        return SendClientMessage ( playerid, -1, "[ USE ]: /sexo ( estilo )" ) ;
       
    if ( strcmp ( MySex, "estilo", true ) == 0 ) {
   
        ShowPlayerDialog ( playerid, 1000, DIALOG_STYLE_MSGBOX, "Menu do sexo", "Sexo '-'", #Cont, #Qt ) ;
    }
    return 1 ;
}
Reply
#9

Quote:
Originally Posted by Coe1
Посмотреть сообщение
Nгo existe esse negуcio de prevenir. rs

Ex:
pawn Код:
COMMAND:sexo ( playerid, params[] ) {

    new
        MySex [ 10 ] ;
       
    if ( sscanf ( params, "s", MySex ) )
        return SendClientMessage ( playerid, -1, "[ USE ]: /sexo ( estilo )" ) ;
       
    if ( strcmp ( MySex, "estilo", true ) == 0 ) {
   
        ShowPlayerDialog ( playerid, 1000, DIALOG_STYLE_MSGBOX, "Menu do sexo", "Sexo '-'", #Cont, #Qt ) ;
    }
    return 1 ;
}
Eu tambйm nunca tive erros no console por esse motivo, mas se alguйm jб teve e, colocar o tamanho ou nгo, nгo faz diferenзa alguma, melhor colocar.

#Edit

Eu atualizei meu sscanf para a versгo 2.8.1 e tive esse erro no console:

[19:30:02] sscanf warning: Strings without a length are deprecated, please add a destination size.


Entгo sim, faz diferenзa colocar o length (tamanho) da string no format do sscanf.
Reply
#10

Quote:
Originally Posted by Coe1
Посмотреть сообщение
Nгo existe esse negуcio de prevenir. rs

Ex:
pawn Код:
COMMAND:sexo ( playerid, params[] ) {

    new
        MySex [ 10 ] ;
       
    if ( sscanf ( params, "s", MySex ) )
        return SendClientMessage ( playerid, -1, "[ USE ]: /sexo ( estilo )" ) ;
       
    if ( strcmp ( MySex, "estilo", true ) == 0 ) {
   
        ShowPlayerDialog ( playerid, 1000, DIALOG_STYLE_MSGBOX, "Menu do sexo", "Sexo '-'", #Cont, #Qt ) ;
    }
    return 1 ;
}
sem cortar o barato kkk , vocк deveria botar o valor no s , se nгo vai dar warring no console!
pawn Код:
if ( sscanf ( params, "s[10]", MySex ) )
#Topic
Parabйns gostei da organizaзгo e do codigo ja sabendo como utilizar faz tempinho , mas e um modo que traz bastante bug.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)