25.08.2011, 19:54
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:
strcmp:
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
Usando strcmp:
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.
...
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
Agora uma lista dos parвmetros usados em sscanf
Agradeзo ao ****** pelo plugin sscanf e Zeex pelo processador de comandos ZCMD
Comparando um comando em ZCMD com um em strcmp
ZCMD:
pawn Код:
CMD:health( playerid , params[] )
return SetPlayerHealth( playerid , strval( params ) );
pawn Код:
public OnPlayerCommandText( playerid , cmdtext[] )
{
if( !strcmp( cmdtext , "/health" , true ) )
{
new Float:health = cmdtext[9];
return SetPlayerHealth( playerid , health );
}
return 0;
}
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 );
}
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