[Tutorial] sscanf and zcmd
#1

Olб pessoal, bem estavo muito tempo inativo ao forum e decide criar esse tutorial sobre SSCANF e ZCMD

No topo do Gm/Fs adicione:
pawn Код:
#include zcmd
#include sscanf
pawn Код:
CMD:ola(playerid,params[]) return SendClientMessage(playerid, -1, "Olб!");
Como vocкs podem ver zcmd й bem mas rapido e oculpa menos espaзo й claro se fosse strcmp iria oculpar mais ou menos 4 a 5 linhas.

Tudo que vocк precisa adicionar um comando й sу fazer uma funзгo pъblica usando macro prй-definido especial, como este:
pawn Код:
COMMAND:ola (playerid, params []) // ou CMD:ola (playerid, params [])
{
  //Funзгo
  return 1;
}
ou vocк pode faser de outro estilo:

pawn Код:
command(ola, playerid, params[]) // ou cmd(ola, playerid, params[])
{
  // Funзгo
  return 1;
}
Entaum agora vamos a criaзгo de um simples comando.

pawn Код:
CMD:an(playerid, params[])
{
    new texto,id;
    new string[128];
    if(sscanf(params, "us[128]",id,texto)) return
        SendClientMessage(playerid, -1, "/an [id] [texto].");
    if(IsPlayerConnected(id)) return
        SendClientMessage(playerid, -1, "Este jogador nгo estб conectado");
    else {
    format(string, sizeof(string), "%s", texto);
    GameTextForPlayer(id, string, 3000, 4);
    }
    return 1;
}
Bem agora vamos falar um pouco sobre esse comando.

sscanf tem dois parвmetros principais, a seqькncia que vocк deseja obter informaзхes a partir de (neste caso params) eo tipo de informaзгo que vocк quer sair. Em seguida, toma parвmetros adicionais, em nъmero igual а quantidade de dados que vocк deseja, neste exemplo, nуs sу queremos um pedaзo de dados (o texto para mandar a todos os players), os textos sгo especiais, para que possamos usar o 's' que as pessoas possam digitar o texto.
Se sscanf obtйm todos os dados corretamente, retorna 0, para que possamos verificar que nгo й 0 e se for, entгo ele falhou eo jogador digitando o comando nгo informar os dados corretamente.

pawn Код:
CMD:an(playerid, params[])
Aqui "params[]" й a seqькncia de parвmetros, й um playerid ID do jogador que enviar este comando.

pawn Код:
if(sscanf(params, "us[128]",id,texto)) return
        SendClientMessage(playerid, -1, "/an [text].");
params - Como vocк jб sabe, no zcmd, params й o que vem depois do /comando. Ou seja, seu objetivo й quebrar a string 'params' para poder pegar a hora para setar o servidor. (Stewie)

us - Vocк sabe quando temos que usar o %s %d para pegar nome/id do player? sscanf й mesma coisa mas sem o %, sгo variaveis que defenimos, caso reparar o sscanf й parecido ao format, ou seja, ambos usam parametros, sу que o format usa %s, mas no fim vocк deve defenir as variaveis para nгo dar nenhum erro.

Код:
d ou i - utilizado quando й usado numeros.
s - utilizado quando se й usado letras famose string *-*
Claro que existe muito mas, estarб no final deste tutorial
pawn Код:
if(IsPlayerConnected(id)) return
SendClientMessage(playerid, -1, "Este jogador nгo estб conectado");
if(IsPlayerConnected(id)) - verifica se o player citado existe, caso exista retornara 0, caso naum exista retorna a mensagem.

pawn Код:
else  {
    format(string, sizeof(string), "%s", texto);
    GameTextForPlayer(id, string, 3000, 4);
}
return - caso o player digite o comando sem nenhum parametro, simplesmente retorna a mesagem "SendClientMessage(playerid, -1, "/an [text].");".

else - caso o player digite o comando certo ou seja "/an ola" retorna.");".

format - Formatara a mensagem.

sizeof - Determina o tamanho da array ''string''.

%s - Obtemos as strings.

GameTextForPlayer(id, string, 3000, 4); - Envia a gametext ao id desejado.

Parametros Sscanf:

Код:
Format					Use
L(true/false)				Optional logical truthity
l					Logical truthity
B(binary)				Optional binary number
b					Binary number
N(any format number)			Optional number
n					Number
C(character)				Optional character
c					Character
I(integer)				Optional integer
i					Integer
D(integer)				Optional integer
d					Integer
H(hex value)				Optional hex number
h					Hex number
O(octal value)				Optional octal value
o					Octal value
F(float)				Optional floating point number
f					Floating point number
G(float/INFINITY/-INFINITY/NAN/NAN_E)	Optional float with IEEE definitions
g					Float with IEEE definitions
{					Open quiet section
}					Close quiet section
P<delimiter>				Invalid delimiter change
p<delimiter>				Delimiter change
Z(string)[length]			Invalid optional string
z(string)[length]			Deprecated optional string
S(string)[length]			Optional string
s[length]				String
U(name/id)				Optional user (bot/player)
u					User (bot/player)
Q(name/id)				Optional bot (bot)
q					Bot (bot)
R(name/id)				Optional player (player)
r					Player (player)
A<type>(default)[length]		Optional array of given type
a<type>[length]				Array of given type
E<specification>(default)		Optional enumeration of given layout
e<specification>			Enumeration of given layout
'string'				Search string
%
sscanf tem inbuilt proteзгo contra o acidente de nъmero longo (onde os nъmeros muito longos podem falhar strval).
IsNumeric incluнdo, sscanf nгo tentarб avaliar strings como nъmeros (que sу vai retornar 0) se digitou o comando errado.
Simples de adicionar mais parвmetros para um comando sem reestruturaзгo cуdigo principal.

Crйditos

whiX - Pelo Tutorial
BlueX - Pelo Tutorial: "Usando sscanf em zcmd"
Zeex - Criador do ZCMD
****** - Criador do sscanf

Espero que tenha gostado, aceito criticas CONSTRUTIVAS e sugestхes.
Reply
#2

bacana =)
Reply
#3

boa a iniciativa mas ja existem milhхes desses tutoriais por aqui
Reply
#4

Obrigado aos dois ^^

@Lucas

Gosto sempre de deixar a board atualizada
Reply
#5

Quote:
Originally Posted by whiXґ
Посмотреть сообщение
Obrigado aos dois ^^

@Lucas

Gosto sempre de deixar a board atualizada
Tem muito tutorial, mas seria legal vocк ensinar mais cosias com o sscanf e tals, ah outra coisa, pelo que eu aprendi nгo usa sscanf com 1 parвmetro vocк perde desempenho no servidor, eu achei bem legal, parabйns :P
Reply
#6

Legal Bem explicado parabens
Reply
#7

Legal, melhor que o outro que tinham postado, lololol '-'
Reply
#8

Уtimo tutorial, bem explicado.
Continue assim, parabйns.
Reply
#9

Ouvi dizer que com um ъnico parвmetro й melhor usar 'isnull(params)' a menos que seja um caso para usar o especificador 'u'
Reply
#10

pawn Код:
CMD:an(playerid, params[])
{
    new string[128];
    if(isnull(params)) return
        SendClientMessage(playerid, -1, "/an [text].");
    else {
    format(string, sizeof(string), "%s", params);
    GameTextForAll(string, 1000, 5);
    }
    return 1;
}
Como sу tem 1 paramкtro no comando, nгo й necessario usar sscanf

Isnull й para checar se o que ele digitou й NULO(ou seja 0), nгo digitou nada.
ex:
/an
(irб retorna a mensagem de erro.)

Desculpe-me esse erro. Logo darei um edit.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)