Strcmp (OnPlayerCommandText) e Sscanf -
Juniiro3 - 06.10.2013
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
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:
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)
Re: Strcmp (OnPlayerCommandText) e Sscanf -
WLSF - 06.10.2013
My name ? holy shit...
Parabйns mais uma vez, sempre mantendo a organizaзгo em dia.
+3 rep.
Re: Strcmp (OnPlayerCommandText) e Sscanf -
Juniiro3 - 06.10.2013
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
Re: Strcmp (OnPlayerCommandText) e Sscanf -
PT - 06.10.2013
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..
Re: Strcmp (OnPlayerCommandText) e Sscanf -
Juniiro3 - 06.10.2013
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
Re: Strcmp (OnPlayerCommandText) e Sscanf -
Coe1 - 06.10.2013
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.
Re: Strcmp (OnPlayerCommandText) e Sscanf -
Juniiro3 - 06.10.2013
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
Re: Strcmp (OnPlayerCommandText) e Sscanf -
Coe1 - 06.10.2013
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 ;
}
Re: Strcmp (OnPlayerCommandText) e Sscanf -
Juniiro3 - 06.10.2013
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.
Re: Strcmp (OnPlayerCommandText) e Sscanf -
mau.tito - 10.10.2013
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.