ZCMD + sscanf -
RockFire - 25.08.2011
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
Re: ZCMD + sscanf -
Shadoww5 - 25.08.2011
Bom tutorial, mas isto poderia ser resumido em 4 linhas:
PHP код:
public OnPlayerCommandText( playerid , cmdtext[] )
{
if( !strcmp( cmdtext , "/health" , true ) ) return SetPlayerHealth( playerid , floatstr(cmdtext[9]) );
return 0;
}
Re: ZCMD + sscanf -
RockFire - 25.08.2011
Sim sim, mas eu gosto de criar uma var pra ocupar mais linhas no tuto UEAHUEH
Re: ZCMD + sscanf -
MiTToS - 25.08.2011
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 >?
Re: ZCMD + sscanf -
RockFire - 25.08.2011
< e > fazem parte do p<,> que й o delimitador, por exemplo
"Ponei,33,5.0"
Tem a virgula separando entгo usa-se o p<,>
Re: ZCMD + sscanf -
MiTToS - 25.08.2011
entendi
vlw
EDIT: Sу nгo ganha reputaзгo porque vocк foi o ъltimo que eu
reputiei :P
Re: ZCMD + sscanf -
steki. - 25.08.2011
Й 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. =)
Re: ZCMD + sscanf -
BrunoBSF - 25.08.2011
curti belo tuto