[Tutorial] zcmd + sscanf's how to
#1

Primeiramente eu gostaria de agradecer ao moderador do forum PT/BR que parece que fica o dia inteiro no forum do SAMP e pфde apagar meu post fail. Minhas sinceras desculpas

zcmd + sscanf's how to

Pra que usar ZCMD? E pra que sscanf? Vou falar nesse tutorial porque e como usar!


Zcmd: Qual a diferenзa entre isso e strcmp.

Bem, quando vocк digita um comando, usando strcmp, se vocк tem, por exemplo, 500 comandos e o ъltimo for /teta. Se vocк digitar /teta, vai executar 500 strcmp, o que й meio idiota. Zcmd usa um mйtodo tipo 'hook' ou seja, digitou, jб chama a funзгo do comando.

sscanf: Qual a diferenзa entre isso e strtok?
Bem, na verdade eu nгo sei e nem quero saber. Sу sei eu caн de uma espaзonave. Sйrio. Nunca tentei aprender strtok, mas tenho certeza que sscanf й bem mais fбcil e versбtil.

ZCMD

Um breve exemplo: comando /pular.

pawn Код:
CMD:pular( playerid, params[] )
{
    // params[] nгo usado
    SetPlayerPos( playerid, 0.0, 0.0, 20000.0 );
    return true;
}
Nуs temos CMD:pular( playerid, params )
O que vem depois da tag CMD: й o comando que o player digitar, mas sem a barra '/'.
Isso й modificado no compilador pois й uma macro, entгo tome cuidado com espaзos indevidos!

playerid - A ID do player que Digitou o comando /pular
params[] - Tudo o que o player digitou depois do comando MAIS um espaзo. Ou seja, o espaзo nгo estб contido no params[]


RETURN

Quando criando um comando, retornando true, significa que o comando foi passado ao player e nгo houve problema algum. Retornando false, dependendo de uma callback que eu mostrarei daqui a pouco, mostrarб a clбssica mensagem: SERVER: Unknown Command.


Callbacks //gay -n

OnPlayerCommandReceived(playerid, cmdtext[])

Essa callback й chamada quando um player digita um comando, mas ANTES de executб-lo.
Ai vocк me pergunta com cara de bahiano arretado (sem preconceito) Eae tio, comofas// Pra que que serve saporra?

Bem. Se vocк estб codando um GM de RPG, como eu e usa arrays normais para guardar status do player, deve saber que, se um admin deslogar e um player tiver na login box com o mesmo id que ele vai ter os comandos de admin nй?

Pra nгo ter que fazer um trabalho de peгo (sem discriminaзгo) de colocar um check pra ver se o Player tб logado em CADA FRAKKIN' comando. Faзa isso: (OBS: isso й um exemplo. Um segredo que fica entre nуs й pra silenciar ele tbem hihi ^^ )

pawn Код:
public OnPlayerCommandReceived(playerid, cmdtext[])
{
    if( GetPVarInt( playerid , "Logado" ) == 0 )
    {
        SendClientMessage( playerid , 0xCACACAFF , "Vocк precisa logar primeiro!" );
        return false;
    }
    else
        return true;
}
OnPlayerCommandPerformed(playerid, cmdtext[], success)

Essa tambйm й muito boa, por exemplo, se vocк quiser colocar uma mensagem de comando desconhecido customizada.
Essa callback tambйm й chamada quando um player digita um comando, mas, apуs dele fazer isso. Com o parвmetro sucess, que nada mais significa o que vocк retornou no comando ^^. Lembra?

Exemplo:
pawn Код:
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
    if( !success )
    {
        new msg[180];
        format( msg, 180, "{FFA200}TERRA:{FFFFFF} Comando: {FFA200}%s: {FFFFFF}Este comando nгo existe ou vocк nгo tem permissгo para usб-lo", cmdtext );
        SendClientMessage( playerid, -1, msg );
        SendClientMessage( playerid, -1, "{FFFFFF}Para ter ajuda, digite {FFA200}/ajuda{FFFFFF} para ver os comandos, ou {FFA200}/suporte{FFFFFF} para falar com um dos testers online" );
    }
    return 1;
}
Lembrando que se vocк nгo usar essas callbacks vai ficar a mesma merda. Ou seja, nгo vai interfirir no seu GMzinho da Homehots // lawl

SSCANF, nigguh

Sйrio. Essa merda й o que hб. Quando se fala em velocidade e versatilidade, sscanf domina atб o cu do conde y.y.
Vocк pode usar isso desde em comandos em zcmd, como, se vocк nгo percebeu, estamos fazendo agora, atй consultas em mysql.

let us go.

sscanf( fonte, "formataзгo", destino1, destino2, destino3... );

Vou comeзar com um breve exemplo de comando.

pawn Код:
{
    if( getPlayerAdminLevel(playerid) > 2 )
    {
        new hora;
        if( sscanf( params , "d" , hora ) )
        {
            SendClientMessage( playerid , -1 , "{C2C2C2}AdmCmd: /setarhora [hora]" );
        }
        else
        {
            SetWorldTime( hora );
            new msg[180];
            format( msg , 180 , "AdmCmd: %s(%d) acaba de setar a hora do servidor para (%d)" , getPlayerName( playerid , true ) , playerid , hora );
            adminWarning( msg );
        }
        return 1;
    }
    else
    {
        return 0;
    }
}
O que temos aqui, й o comando mais simples do meu GM. Ele apenas seta a hora do servidor. Observem:

if( sscanf( params , "d" , hora ) )

if - Primeiramente. Pra quк if? Simples. sscanf, quando consegue cumprir sua funзгo, retorna 0 (O que й um costume desconhecido em pawn). Ou seja, quando ele separa a string corretamente e todas as variбvels sгo preenchidas, retorna 0, caso contrбrio 1, o que mostraria a ajuda do comando.

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.

"d"- Aiai, a parte mais divertida.
Vocк lembra no format ou no printf que agente tem que colocar %d ou %s para inserir a variбvel na linha de texto? Isso igual, mas ao contrбrio. Vocк nгo precisa usa '%'.

Quote:
d, ou i, como vocкs jб sabem, significa INTEGER, ou nъmero inteiro. Ou seja. o sscanf vai extrair um nъmero da string. AAAAAAAAAAAAAAH entendeu? Mais alguns exemplos:

s - extrai uma string
f - float
u - Uma mбgica. o u, minъsculo, й bem interessante, pois se vocк estб tanto como uma string ou um nъmero inteiro na string, ele retorna o playerid. Й o famoso [id/ParteDoNome]. Ou retorna 65535, IsPlayerConnected deve ser ultilizado nesses casos. Um breve exemplo:
pawn Код:
sscanf( params, "u", player );
Existem mais. Vб para link
MAS PERA AE MLK. SE EU QUISЙ MAI ALGUM PARMATROW AEW TIOW?

Simples. Se vocк quiser mais parвmetros, apenas coloque mais uma formataзгo.
pawn Код:
if( sscanf( params , "ud" , player , level ) )
Mas, pera ai. Como assim ele 'separa' a string? Como ele descobre o que eu quero?
Simples. sscanf, por padrгo separa as strings por espaзo. Ou seja. Os dados serгo quebrados de espaзo em espaзo, para facilitar nossa vida.

Mas se eu quiser dar um fetch row e separar a string com, por exemplo '|'?
Simples tambйm.

Use um especificador assim "p<DELIMITADOR AQUI>" Exemplo.
pawn Код:
if( sscanf( buff, "p<|>s[50]s[70]s[50]s[50]", sql_host, sql_user, sql_pass, sql_db ) )
Lembrando que vocк pode usar todos esses especificadores como u, d, p, em ordens diferentes ao seu gosto.
Sу um lembrete: Quando for usar string, coloque depois do s[FIELDS], como o exemplo acima, para nгo dar nenhum warning.



Isso й o bбsico para fazer comandinhuz super legais para seu GM editado da Homehots //lol again.

SE EU TE AJUDEI, OU VOCК PERCEBEU QUE EU DIGITEI BASTANTES CARACTERES, NВO CAI O DEDO DAR UM REPUTATION ^^

Eu sei que isso estб meio incompleto. Estarei respondendo dъvidas aqui mesmo, ^^
Reply
#2

Muito bom Miki ^^ eu uso zcmd e sscanf mas essa do delimitador eu queria aprender agora entendi ^^

Sу pra complementar aqui a lista completa dos formatos para o sscanf, tirei do tуpico do 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
Reply
#3

Vlw
Reply
#4

Eu prуprio uso zcmd com sscanf, pela facilidade e rapidez (:І

Esse nigoso de strtok ta com nada ! ZCMD e sscanf ta com tudo! kkk



__________________________________________

...Meus Trabalhos...
[FisterScripts]
Sistema de Admin e Helper Simples
Sistema de Viagem v0.5

[Includes]
Nenhum...

[GameModes]
Nenhum...

[Tutoriais]
Nenhum...

[Maps]
W.D.A. ( Water Dylan Airport )

Se meu post lhe ajudou , lhe deixou confuso Clique nesta imagem >> << abaixo do meu avatar


Estou de Olho em vocк !

[Ass] Assinatura feita por JORGE_HARD

Reply
#5

Quote:
Originally Posted by Luнs Miki
Посмотреть сообщение
Bem, quando vocк digita um comando, usando strcmp, se vocк tem, por exemplo, 500 comandos e o ъltimo for /teta. Se vocк digitar /teta, vai executar 500 strcmp, o que й meio idiota. Zcmd usa um mйtodo tipo 'hook' ou seja, digitou, jб chama a funзгo do comando.
ri nessa parte
Reply
#6

Gostei pra caramba do tуpico ^^

Bom trabalho, +reputation
Reply
#7

pawn Код:
CMD:teta( playerid, params[] )
{
    new tetado;
    if( sscanf( params, "u", tetado ) && IsPlayerConnected( tetado ) )
    {
        SendClientMessage( playerid, COLOR_PINK, "GayCmd: /teta [id/ParteDoNome]" );
    }
    else
    {
        GameTextForPlayer( player, "~r~~h~~h~VOCE FOI ENTETADO", 99999*99999, 1 );
        SendClientMessage( playerid, COLOR_PINK, "GayCmd: Sua mensagem foi mandada ao mundo colorido" );
    }
    return true;
}
Reply
#8

PHP код:
CMD:comando(playeridparams[])
{
    new 
str[128];
    if(
sscanf(params"s[128]"str))
    
format(strsizeof str"%s"str);
    
SendClientMessage(playerid0xFFFF00FFstr);
    return 
1;

Quando eu digito /comando [PARAMETROS], eu recebo a mensagem я.

Mas quando eu este abaixo a mensagem й enviada corretamente.

PHP код:
CMD:comando(playeridparams[])
{
    new 
str[128];
    if(
sscanf(params"s"str))
    
format(strsizeof str"%s"str);
    
SendClientMessage(playerid0xFFFF00FFstr);
    return 
1;

Luнs Miki, poderia me responder por quк ?

OBS: Isto foi sу um exemplo para eu nгo ter que postar o comando todo aqui.
Reply
#9

pawn Код:
CMD:comando( playerid, params[] )
{
    new str[128];
    if( sscanf( params, "s[128]", str ) )
    {
        // Cmd: /comando [params]
    }
    else
    {
        new str2[128];
        format( str2, 128, "%s", str );
        // SendClientMessage
    }
}
o if estб errado
Reply
#10

Quote:
Originally Posted by Luнs Miki
Посмотреть сообщение
pawn Код:
CMD:comando( playerid, params[] )
{
    new str[128];
    if( sscanf( params, "s[128]", str ) )
    {
        // Cmd: /comando [params]
    }
    else
    {
        new str2[128];
        format( str2, 128, "%s", str );
        // SendClientMessage
    }
}
o if estб errado
Han ? Qual й o erro ?
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)