[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


Messages In This Thread
zcmd + sscanf's how to - by steki. - 15.07.2011, 20:02
Re: zcmd + sscanf's how to - by RockFire - 15.07.2011, 20:05
Re: zcmd + sscanf's how to - by steki. - 15.07.2011, 20:07
Re: zcmd + sscanf's how to - by [R] ousenber [K] - 15.07.2011, 20:18
Re: zcmd + sscanf's how to - by RockFire - 15.07.2011, 20:22
Re: zcmd + sscanf's how to - by Ricop522 - 15.07.2011, 20:25
Re: zcmd + sscanf's how to - by steki. - 15.07.2011, 20:29
Re: zcmd + sscanf's how to - by Shadoww5 - 15.07.2011, 20:42
Re: zcmd + sscanf's how to - by steki. - 15.07.2011, 20:45
Re: zcmd + sscanf's how to - by Shadoww5 - 15.07.2011, 21:22

Forum Jump:


Users browsing this thread: 2 Guest(s)