[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


Messages In This Thread
KcmD - Criaзгo de Espaзos nos Comandos - by rjjj - 02.12.2010, 13:00
Respuesta: Zcmd - Criaзгo de Espaзos nos Comandos - by xenowort - 02.12.2010, 13:04
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by zSuYaNw - 02.12.2010, 13:05
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by [NWD]Jim._.Carrey - 02.12.2010, 14:21
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by Falcon. - 02.12.2010, 15:16
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by SlashPT - 02.12.2010, 16:01
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by TiagoPS - 02.12.2010, 16:11
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by SlashPT - 02.12.2010, 16:12
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by rjjj - 02.12.2010, 16:23
Re: Zcmd - Criaзгo de Espaзos nos Comandos - by SlashPT - 02.12.2010, 17:18

Forum Jump:


Users browsing this thread: 2 Guest(s)