[Tutorial] KcmD - Criaзгo de Espaзos nos Comandos
#1

Tutorial: KcmD - Criaзгo de Espaзos nos Comandos




* Crйditos do KcmD б Ken_xD/rjjj e б Wiki sa-mp.



Bem, como vi que muitos estavam fazendo tutoriais sobre temas diversos da programaзгo PAWN, resolvi fazer sobre um tema que pra min foi muito difнcil, a criaзгo de espaзos nos comandos. Claro que existe o famoso strtok mas o mesmo me confundia muito (nem conseguia fazer mais de 1 espaзo), e o KcmD apresenta melhoras se comparado ao strtok.



Em fim, espero que gostem, й meu primeiro tutorial aqui no SA-MP Fуrum, comemoraзгo do meu centйsimo post





* Como assim criaзгo de espaзos nos comandos ?



Sгo simplesmente os espaзos em que durante um comando, digitamos determinados valores:



Код:
/pagar [id] [preзo]


Os espaзos os quais citei sгo os em azul no cуdigo acima.





* Mas para que vгo servir esses espaзos e os valores que sгo digitados neles ?





Podemos durante o jogo, por exemplo, usar o comando /pagar 2 5000.

Fazendo isto estarнamos dando uma quantia de 5000 ao ID 2 do servidor, podemos isso graзas б funзхes criadoras de espaзos, dentre elas a mais conhecida strtok. Mas no caso, vamos aprender KcmD




Atenзгo: Veja sempre o nъmero de dнgitos que forma a palavra do comando e troque no comeзo dele, por exemplo:


A palavra LOL tem 3 dнgitos.


Entгo na linha do comeзo do comando /LOL ficarб


Код:
if(strcmp("/LOL", cmdtext, true, 4) == 0)//4 devido ao nъmero de dнgitos do nome do comando (contando com barra / ).

- Bom, antes de mais nada vamos ver um comando sem espaзos:



Agora continuando:

pawn Код:
if(strcmp("/desisto", cmdtext, true, 8) == 0)//Texto do Comando
    {
        Ban(playerid);//Bane quem usou o comando
        return 1;
    }



O comando acima й digitado sem espaзos ou seja, vocк apenas digita /desisto e o comando executa perfeitamente hehe.





Agora um comando com espaзos, vamos usar KcmD a partir de agora .

Antes de mais nada coloque no final do seu gamemode:


pawn Код:
stock KcmD(param, cmdtext[])
{
    new string[128], pos, var;
    format(string, sizeof(string), "%s ", cmdtext);

    while((pos = strfind(string, " ", true)) != -1)
    {
        if(var == param) return string;
        var++;

        strdel(string, 0, pos + 1);
        if(strcmp(string, " ", true, pos) == 0) goto end;
    }

end:
    string[0] = '\0';
    return string;
}


Acima й a funзгo do KcmD, agora poderemos programar usando ela.


//============ Comando Simples com 1 Espaзo ============//

pawn Код:
if(strcmp("/Oie", cmdtext, true, 4) == 0) //Define o nome do comando.
    {
        new Vazio[256]; //Essa linha cria a variбvel Vazio que serб usada para indicar um Espaзo no Comando.
        Vazio = KcmD(1, cmdtext); //Essa linha iguala a variбvel Vazio (criada antes) ao primeiro espaзo do comando.
        //Acima, o nъmero 1 de "KcmD(1, cmdtext)"  indica o espaзo, ou seja, 1 = Primeiro Espaзo.
        if(!strlen(Vazio))//Dб uma Checada para ver se o Jogador Digitou a Variбvel Vazio (criada antes) de forma correta.
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Digite /Oie [texto]");//Mostra ao jogador como se usa de forma correta.
            return 1;//Encerra o comando.
        }
        //Se o jogador tiver digitado corretamente, o comando continua
        SendClientMessage(playerid, 0xFFFFFFFF, Vazio);//Manda uma mensagem б quem usou o comando, ou seja, o jogador "playerid".
        return 1;//Encerra o comando.
    }


Agora entendendo: Apуs a criaзгo da variбvel "Vazio" igualamos ela ao primeiro espaзo que aparece no comando, por exemplo:


Код:
/kick [id] [motivo]

E depois disso, o que aparece ? A funзгo SendClientMesage, mas perceba que no lugar onde normalmente fica o texto que serб enviado ao jogador, estб a variбvel Vazio:

Код:
Normalmente ==>>    SendClientMessage(playerid, 0xFFFFFFFF, "Texto Aqui");
No Caso       ==>>    SendClientMessage(playerid, 0xFFFFFFFF, Vazio);
E o que significa a variбvel Vazio ? Significa o Primeiro Espaзo do Comando (definido antes), em outras palavras, o que vocк digitar no Primeiro Espaзo do Comando(durante o jogo) irб ser a variбvel Vazio que alйm de ser o Primeiro Espaзo do Comando, й tambйm o Texto de SendClientMessage.




//============ Comando Avanзado de 1 Espaзo ============//

pawn Код:
if(strcmp("/Oie", cmdtext, true, 4) == 0)//Texto do comando
    {
        new Vazio[256];
        Vazio = KcmD(1, cmdtext);
        if(!strlen(Vazio))
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Digite /Oie [id]");
            return 1;
        }
        SendClientMessage(strval(Vazio), 0xFFFFFFFF, "Koe");
        return 1;
    }
Note que o cуdigo acima й igual ao de antes, mas com 2 detalhes, agora (na SendClientMessage) a Variбvel Vazio estб no lugar onde normalmente fica o playerid, e o parвmetro de Texto estб normal:



Код:
Normalmente ==>>    SendClientMessage(playerid, 0xFFFFFFFF, "Texto Aqui";
No Caso       ==>>    SendClientMessage(strval(Vazio), 0xFFFFFFFF, "Texto Aqui"[/color]);
oO, mas espera aн ! Nгo era pra estar escrito Vazio no Lugar do playerid ?

Sempre estarб escrito Vazio quando o parвmetro for um Texto, no caso da SendClientMessage que tem um parвmetro de Texto (algo entre " ").

Mas quando se tratar de algo que nгo seja um Texto, como playerid por exemplo deverб ser usado strval(NomeDaVariбvel), no caso, strval(Vazio) .





//============ Comando de mais de 1 Espaзo ============//

Agora usando tudo que vocк aprendeu atй agora sobre KcmD, vamos entender o de 2 variбveis ! :

pawn Код:
if(strcmp("/pagar", cmdtext, true, 6) == 0)//Texto do comando
    {
        new Vazio1[256];//Cria variбvel Vazio1
        new Vazio2[256];//Cria variбvel Vazio2
        Vazio1 = KcmD(1, cmdtext);//Define que a variбvel Vazio 1 й igual ao Primeiro Espaзo do Comando
        Vazio2 = KcmD(2, cmdtext);//Define que a variбvel Vazio 2 й igual ao Segundo Espaзo do Comando
        if(!strlen(Vazio1))//Checa para ver se o jogador digitou a variбvel Vazio 1 corretamente
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Digite /pagar [id] [preзo]");//Informa uso correto
            return 1;
        }
        if(!strlen(Vazio2))//Checa para ver se o jogador digitou a variбvel Vazio 2 corretamente
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Digite /pagar [id] [preзo]");//Informa uso correto
            return 1;
        }
        GivePlayerMoney(strval(Vazio1), strval(Vazio2));//Darб ao ID (Vazio1) uma grana (Vazio2)
        return 1;
    }

Qual o motivo do cуdigo acima ?

O motivo й dar dinheiro a um determinado jogador, por isso usamos strval(NomeDaVariбvel):

Код:
GivePlayerMoney(strval(Vazio1), strval(Vazio2));
Pois na funзгo normal de dar dinheiro nгo hб presenзa de Texto (algo entre " "), veja:


Код:
GivePlayerMoney(playerid, 10000);


E й isso galera !!


//===========FIM===========//
Reply
#2

Good job!
Reply
#3

Tenso....
Isto vocк podia usar o strval[params], й do ZCMD do Zexx. й mesma coisa e melhor.
Reply
#4

Bom tuto manolo =)
Reply
#5

Fiquei me imaginando se eu lesse isso tudo 0.0 /brinks
-----
Li metade =D
Muito bom esta explicando tudo direitinho e deve ter dado um grande trabalho para ser feito !!

Meus parabйns para vocк nesta data querida..........ficou Bom !!
Reply
#6

se faz favor muda o nome do "tipo de comandos que fizeste"

pois imagina que eu faзo um release e alguem me diz onde esta a include ZCMD que й conhecido como um sistema de comandos (feito por Zeex), e de repente encontram isto .. e pensam que й isto...
Reply
#7

Bom Tutorial, Nem Sabia Q ZCMD Era Para Isso LOL, COmo SOu Burro, Agora Sei Usa-lo Ele Ocupa Menos Linha Q O STRTOK Yeah!
Reply
#8

ves o porque de eu dizer mudares o titulo do topico... o ZCMD REAL feito por ZEEX nгo tem nada a ver com isto...
Reply
#9

Muito Obrigado б todos , tutorial deu bastante trabalho.



Pronto, agora o nome do cуdigo й Kcmd jб que jб existe o nome Zcmd e jб que ambos, de acordo com o Dark Team PT nгo tкm nada em comum .



Nгo dб pra mudar o tнtulo do tуpico, moderador mude por favor, apenas a palavra Zcmd por KcmD ou delete este tуpico assim eu faзo outro. Desculpe pela confusгo a respeito do nome.
Reply
#10

como eu disse e tenho razao ..

primeiro e um sistema de comandos completo e nгo um "params system"...

olha:

pawn Код:
/**********************************
 *                                *
 *   @Author:      ZeeX           *
 *   @Version:     0.3.1          *
 *   @Released:    31/10/2009     *
 *                                *
 **********************************/


#if defined _zcmd_included
    #endinput
#endif
#define _zcmd_included

#define MAX_FUNC_NAME (32)

#define COMMAND:%1(%2)          \
            forward cmd_%1(%2); \
            public cmd_%1(%2)

#define CMD:%1(%2) \
            COMMAND:%1(%2)

#define command(%1,%2,%3) \
            COMMAND:%1(%2, %3)

#define cmd(%1,%2,%3) \
            COMMAND:%1(%2, %3)

#if !defined isnull
    #define isnull(%1) \
                ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif


forward OnPlayerCommandReceived(playerid, cmdtext[]);
forward OnPlayerCommandPerformed(playerid, cmdtext[], success);


static
    bool:zcmd_g_HasOPCS = false,
    bool:zcmd_g_HasOPCE = false;

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    zcmd_g_HasOPCS = funcidx("OnPlayerCommandReceived") != -1;
    zcmd_g_HasOPCE = funcidx("OnPlayerCommandPerformed") != -1;
    return CallLocalFunction("zcmd_OnFilterScriptInit", "");
}

#if defined _ALS_OnFilterScriptInit
    #undef OnFilterScriptInit
#else
    #define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit zcmd_OnFilterScriptInit
forward zcmd_OnFilterScriptInit();

#else /*not a filterscript*/

public OnGameModeInit()
{
    zcmd_g_HasOPCS = funcidx("OnPlayerCommandReceived") != -1;
    zcmd_g_HasOPCE = funcidx("OnPlayerCommandPerformed") != -1;
    if (funcidx("zcmd_OnGameModeInit") != -1)
    {
        return CallLocalFunction("zcmd_OnGameModeInit", "");
    }  
    return 1;
}

#if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
#else
    #define _ALS_OnGameModeInit
#endif
#define OnGameModeInit zcmd_OnGameModeInit
forward zcmd_OnGameModeInit();

#endif /*if defined FILTERSCRIPT*/

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (zcmd_g_HasOPCS && !CallLocalFunction("OnPlayerCommandReceived", "is", playerid, cmdtext))
    {
        return 1;
    }
    new
        pos,
        funcname[MAX_FUNC_NAME];
    while (cmdtext[++pos] > ' ')
    {
        funcname[pos-1] = tolower(cmdtext[pos]);
    }
    format(funcname, sizeof(funcname), "cmd_%s", funcname);
    while (cmdtext[pos] == ' ') pos++;
    if (!cmdtext[pos])
    {
        if (zcmd_g_HasOPCE)
        {
            return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, "\1"));
        }
        return CallLocalFunction(funcname, "is", playerid, "\1");
    }
    if (zcmd_g_HasOPCE)
    {
        return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, cmdtext[pos]));
    }
    return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}

#if defined _ALS_OnPlayerCommandText
    #undef OnPlayerCommandText
#else
    #define _ALS_OnPlayerCommandText
#endif
#define OnPlayerCommandText zcmd_OnPlayerCommandText
forward zcmd_OnPlayerCommandText(playerid, cmdtext[]);
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)