KcmD - Criaзгo de Espaзos nos Comandos - rjjj - 02.12.2010
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:
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:
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===========//
Respuesta: Zcmd - Criaзгo de Espaзos nos Comandos -
xenowort - 02.12.2010
Good job!
Re: Zcmd - Criaзгo de Espaзos nos Comandos -
zSuYaNw - 02.12.2010
Tenso....
Isto vocк podia usar o strval[params], й do ZCMD do Zexx. й mesma coisa e melhor.
Re: Zcmd - Criaзгo de Espaзos nos Comandos -
[NWD]Jim._.Carrey - 02.12.2010
Bom tuto manolo =)
Re: Zcmd - Criaзгo de Espaзos nos Comandos -
Falcon. - 02.12.2010
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 !!
Re: Zcmd - Criaзгo de Espaзos nos Comandos -
SlashPT - 02.12.2010
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...
Re: Zcmd - Criaзгo de Espaзos nos Comandos -
TiagoPS - 02.12.2010
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!
Re: Zcmd - Criaзгo de Espaзos nos Comandos -
SlashPT - 02.12.2010
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...
Re: Zcmd - Criaзгo de Espaзos nos Comandos - rjjj - 02.12.2010
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.
Re: Zcmd - Criaзгo de Espaзos nos Comandos -
SlashPT - 02.12.2010
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[]);