[Tutorial] ZCMD + sscanf
#1

ZCMD й um avanзado processador de comandos que usa "CallRemoteFunction", sscanf faz o mesmo trabalho que strtok mas й muito mais rбpido, fбcil e trabalha com multiread.

Comparando um comando em ZCMD com um em strcmp

ZCMD:
pawn Код:
CMD:health( playerid , params[] )
    return SetPlayerHealth( playerid , strval( params ) );
strcmp:
pawn Код:
public OnPlayerCommandText( playerid , cmdtext[] )
{
    if( !strcmp( cmdtext , "/health" , true ) )
    {
        new Float:health = cmdtext[9];
        return SetPlayerHealth( playerid , health );
    }
    return 0;
}
Veja a diferenзa, usando ZCMD gastei 2 linhas, com strcmp gastei 9 linhas.
Sabe por que й muito melhor usar ZCMD ? ZCMD tem um argumento que pega todos os parвmetros que o player digitou e coloca em uma string, exceto o comando, vou fazer um exemplo:


O player digitou "/health 24 100"
no argumento " params[] " ele vai guardar o "24 100", agora entra o sscanf


pawn Код:
CMD:health( playerid , params[] )
{
    new
        id,
        Float:health
    ;

    if( sscanf( params , "uf" , id , health ) )
        return 0;
   
    return SetPlayerHealth( id , health )
}
Usando strcmp:

pawn Код:
public OnPlayerCommandText( playerid , cmdtext[] )
{
    if( !strcmp( cmdtext , "/health" , true ) )
    {
        new
            string[ 128 ],
            id,
            health,
            index
        ;
       
        string = strtok( cmdtext , index );
        id = strval( string );
        string = strtok( cmdtext , index );
        health = strval( string );

        return SetPlayerHealth( id , health );
    }
    return 0;
}

Com strcmp e strtok gastei 21 linhas, com zcmd e sscanf gastei 12 linhas.

Agora vamos para a prбtica:

ZCMD usa CallRemoteFunction, ou seja, vai chamar uma callback.

Por traz desse CMD:cmd( playerid , params[] ) estб uma callback.


pawn Код:
CMD:kickme( playerid , params[] )
    return Kick( playerid );
...
pawn Код:
forward cmd_kickme( playerid , params[] );
public cmd_kickme( playerid , params[] )
    return Kick( playerid );

Sгo a mesma coisa, esse CMD / COMMAND й apenas uma macro ( Tambйm conhecida por "define" ).

Agora sscanf, й um plugin que procura um delimitador e separa as strings/valores

pawn Код:
public OnPlayerSpawn( playerid )
{
    new
        string[] = "PoneisMalditos,55,75.3",
        StringPoneis[14],
        Float:Fracionado,
        Inteiro
    ;

    sscanf( string , "p<,>s[14]if", StringPoneis , Inteiro , Fracionado );
   
    SendClientMessage( playerid , -1 , StringPoneis );
    SetPlayerMoney( playerid , Inteiro );
    SetPlayerHealth( playerid , Fracionado );
}

Agora uma lista dos parвmetros usados em 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
%					Deprecated optional specifier prefix
Agradeзo ao ****** pelo plugin sscanf e Zeex pelo processador de comandos ZCMD
Reply
#2

Bom tutorial, mas isto poderia ser resumido em 4 linhas:

PHP код:
public OnPlayerCommandTextplayerid cmdtext[] )
{
    if( !
strcmpcmdtext "/health" true ) ) return SetPlayerHealthplayerid floatstr(cmdtext[9]) );
    return 
0;

Reply
#3

Sim sim, mas eu gosto de criar uma var pra ocupar mais linhas no tuto UEAHUEH
Reply
#4

Jб tem vбrias tutoriais sobre o mesmo assunto, mas cada tutorial agente descobre uma coisa nova.
muito bom, parabens!

pawn Код:
sscanf( string , "p<,>s[14]if", StringPoneis , Inteiro , Fracionado );
porque se usa < e >?
Reply
#5

< e > fazem parte do p<,> que й o delimitador, por exemplo

"Ponei,33,5.0"

Tem a virgula separando entгo usa-se o p<,>
Reply
#6

entendi

vlw

EDIT: Sу nгo ganha reputaзгo porque vocк foi o ъltimo que eu reputiei :P
Reply
#7

Й dever de todos membro do forum que a vida nгo й editar GF fazer um tutorial de zcmd e sscanf.

Que merda, o meu deve tar na 5Є pбgina. Nem li direito, mas toma rep. =)
Reply
#8

curti belo tuto
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)