ICMD Versгo 6 (Processador de Comandos) -
ipsBruno - 22.12.2012
ICMD V6
Olб a todos do fуrum SA:MP. Hoje vou postar uma atualizaзгo importante de icmd.
Essa atualizaзгo incluн algumas novas informaзхes importante, bem como uma total reformulaзгo do cуdigo de icmd.
Dessa vez foi usada na estrutura interna um cуdigo que obteve уtimos resultados em testes desempenho, chegando a
marcar 2 a 4 vezes mais rбpido que zcmd no processamento comum, e velocidade equivalente a zcmd + sscanf no processamento avanзado de multi-parametros
Usando icmd:
Existem dois tipos de uso, o processamento comum e o processamento avanзado
Usando
OnPlayerProcessCommand
Assim como os outros sistemas de processamento, icmd tambйm tem uma callback padrгo que recebe todos os comandos informando se o processamento foi sucedido ou nгo:
pawn Код:
public OnPlayerProcessCommand(playerid, comando[], sucesso) {
return true;
}
playerid й o jogador que digitou.
comando й o comando digitado pelo jogador
sucesso tem valor 1 se foi sucedido, caso contrбrio tem valor 0
OnPlayerProcessCommand й chamado apуs o processamento do comando, caso queira detectar quando o jogador digitou algum comando antes de o comando ser chamado, й usada a callback
OnPlayerCallCommand que й chamada antes do comando!
Caso
OnPlayerCallCommand retornar "
false" o comando nгo serб chamado, portanto essa callback й ъtil para proibir comandos de o jogador digitar
PHP код:
public OnPlayerCallCommand(playerid, cmdtext[]) {
return true;
}
cmdtext = o que o jogador digitou
playerid = qual jogador digitou
Exemplo para bloquear comando para quem nгo estб logado
pawn Код:
public OnPlayerCallCommand(playerid, cmdtext[]) {
if(!logado[playerid]) return SendClientMessage(playerid, -1, "Voce nao tб logado"), false;
return true;
}
xD
Processamento comum:
O processamento comum й equivalente ao uso de zcmd e outros processadores similares
pawn Код:
cmd(comando, playerid, params[]) {
return printf("O jogador %d digitou /comando %s", playerid, params);
}
Testes feitos no processamento comum
Код:
zcmd 12171 ms
icmd 4944 ms
Exemplo:
PHP код:
cmd(ann, playerid, params[]) {
new string[128] ;
format(string, 128, "O jogador id %d disse: %s", playerid, params);
return SendClientMessageToAll(-1, string);
}
Modo de uso:
/
ann [
mensagem]
Simples nгo? Й igual a maioria dos processadores de comando
Processamento avanзado
icmd conta com
sscanf (de
******) integrado, assim facilitando de certa forma o uso de multi-parametros em seu comando
pawn Код:
scmd(vida,playerid,erro)<id,Float:vida>scanf("if",id,vida)
{
if(erro)
return SendClientMessage(playerid, -1, "Uso: /vida <id> <vida>");
if(!IsPlayerConnected(playerid))
return SendClientMessage(playerid, -1, "Jogador offline");
SetPlayerHealth(id, osx);
return 1;
}
Oras, mas que
sintaxe й essa?
O QUE Й ERRO:
Caso a variбvel
erro retornar true, significa que o usuбrio fez um erro ao digitar o comando com sscanf, logo coloque no corpo dos comandos:
pawn Код:
if(erro) {
return SendClientMessage(playerid, -1, "[Erro] voce digitou comando errado");
}
// resto do comando
Assim indicarб que o usuбrio cometeu um erro ao digitar o comando!
SIMPLIFICANDO:
scmd(
NOME_DO_COMANDO , playerid, erro)<
VARIAVEIS A DECLARAR>scanf("
FORMATACAO EM SSCANF",
VARIAVEIS DECLARADAS)
DECLARANDO AS VARIAVEIS:
Em
VARIAVEIS A DECLARAR vocк deve colocar especificamente como as variбveis devem ser declaradas, exemplo:
Quote:
string[16]
Float: vida
inteiro,
bool: boolean
|
E outros!
E em
VARIAVEIS DECLARADAS vocк deve por APENAS o nome das variбveis, sem a especificaзгo de como elas sгo.
Logo:
Quote:
string,
vida
inteiro
boolean
|
Entenderam? Sem qualquer tipo de especificaзгo, apenas o nome
Dentro da string
VARIAVEIS DECLARADAS vocк deve colocar como deve ser a formataзгo para as variбveis
Isto vocк jб deve saber, mas vamos enfatizar!
PHP код:
"s" = string
"d" = numeros
"i" = numeros
"f" = floats, nъmeros nгo inteiros
"b" = booleanos
ou em mais de uma:
"sd" = string para primeira variбvel, nъmero para segunda variбvel
Dessa maneira, podemos criar comandos facilmente com
vбrios parвmetros!
Apуs essa breve explicaзгo, vamos a outro exemplo:
PHP код:
scmd( kick, playerid, erro)<outrojogador, motivo[32]> scanf("is", outrojogador, motivo) {
if(erro)
return SendClientMessage(playerid, -1, "USE CORRETAMENTE: /kick ID MOTIVO");
if(! IsPlayerConnected(outrojogador))
return SendClientMessage(playerid, -1, "O JOGADOR DIGITADO ESTБ OFFLINE");
SendClientMessage(outrojogador, -1, "Vocк foi kickado por:");
SendClientMessage(outrojogador, -1, motivo);
Kick(outrojogador);
return true;
}
Explicando:
pawn Код:
scmd(
kick, // nome do comando a ser digitado
playerid, // armazenar quem digitou comando
erro // registrar se houve erro na digitaзгo
)
<
outrojogador, // declarar variбvel simples para armazenar id do jogador
motivo[32] // declarar string para guardar o motivo do jogador ser kickado
>
scanf(
"
i // especificar que "outrojogador" й apenas nъmero "i"
s // especificar que "motivo" й string "s"
",
outrojogador, // especificar que para "i" й a variбvel outrojogador
motivo // especificar que para o "s" й motivo (segue na ordem "is" "outrojogador, motivo")
)
Enfim й isto, nгo sei explicar bem, mas se alguйm se quiser disponibilizar para fazer um tutorial!
Cуdigo
http://pastebin.com/JFejpEiz (atualizado 22/12/2012)
Salve em
"icmd.inc" e carregue como
#include icmd
Autoria:
Criado por
Bruno da Silva
sscanf por
******
Testes por
ReDKiiL e Thiago_Street / Green Wood
Agradeзimentos а [
iPs]TeaM
Й isto! Espero que tenham gostado!
Re: ICMD Versгo 6 (Processador de Comandos) -
ReDKiiL - 22.12.2012
Otimo! Teste tudo deboa

Bem rapido gostei muito conserteza vou usar ^^
@Explicaзao
Perfeito,euaheuaea Depois diz que nгo sabe explicar euaheuahea
Respuesta: ICMD Versгo 6 (Processador de Comandos) -
ipsBruno - 22.12.2012
Obrigado ReDKiiL, eu tentei explicar, atй colori tudo pra ver se dб uma ajudada. Nгo sei explicar muito bem, se alguйm nгo entender avisa! ReDKiiL ou Green WooD ajudam
Re: ICMD Versгo 6 (Processador de Comandos) -
zSuYaNw - 22.12.2012
Bom trabalho
Coruja, mais em questгo de velocidade do sscanf, й melhor em plugin ?
Respuesta: ICMD Versгo 6 (Processador de Comandos) -
ipsBruno - 22.12.2012
sscanf й melhor em plugin sim. Mas nesse caso o processamento a priori do comando acaba compensando e atй sendo melhor que zcmd + plugin sscanf
xD
Re: ICMD Versгo 6 (Processador de Comandos) -
zSuYaNw - 22.12.2012
pawn Код:
scmd(matar, playerid, erro) <giveplayerid> scanf("i", giveplayerid) {
if(erro){
SendClientMessage("Incorrect use.");
return false;
}
if(!IsPlayerConnected(giveplayerid)){
SendClientMessage(playerid,"Player not connected");
return false;
}
SendClientMessage(giveplayerid, -1, "Vocк vai morrrййййй (by Tiririca)");
SetPlayerHealth(giveplayerid, 0);
return true;
}
Seria mais ou menos assim ?
Respuesta: ICMD Versгo 6 (Processador de Comandos) -
ipsBruno - 22.12.2012
Quase isto xD
Й melhor colocar
if (erro)
{
//return para parar comando
}
Pois fazendo o que vocк fez, IsPlayerConnect vai ser executado caso "erro" for true
Mas enfim, vocк entendeu o essencial, que й como usar os parametros de scmd
Abs!
pawn Код:
scmd(matar, playerid, erro) <giveplayerid>scanf("i", giveplayerid) {
if(erro)
return SendClientMessage("Incorrect use.");
if(!IsPlayerConnected(giveplayerid)){
return SendClientMessage(playerid,"Player not connected");
}
SetPlayerHealth(giveplayerid, 0);
return true;
}
Re: ICMD Versгo 6 (Processador de Comandos) -
zSuYaNw - 22.12.2012
Assim,
pawn Код:
scmd(matar, playerid, erro) <giveplayerid> scanf("i", giveplayerid) {
if(erro){
SendClientMessage("Incorrect use.");
return false;
}
if(!IsPlayerConnected(giveplayerid)){
SendClientMessage(playerid,"Player not connected");
return false;
}
SendClientMessage(giveplayerid, -1, "Vocк vai morrrййййй (by Tiririca)");
SetPlayerHealth(giveplayerid, 0);
return true;
}
Respuesta: ICMD Versгo 6 (Processador de Comandos) -
ipsBruno - 22.12.2012
Й isto mesmo
Re: ICMD Versгo 6 (Processador de Comandos) -
ReDKiiL - 22.12.2012
Quote:
Originally Posted by [Full]Garfield[XDB]
Assim,
pawn Код:
scmd(matar, playerid, erro) <giveplayerid> scanf("i", giveplayerid) {
if(erro){ SendClientMessage("Incorrect use."); return false; }
if(!IsPlayerConnected(giveplayerid)){ SendClientMessage(playerid,"Player not connected"); return false; }
SendClientMessage(giveplayerid, -1, "Vocк vai morrrййййй (by Tiririca)"); SetPlayerHealth(giveplayerid, 0); return true; }
|
Belo code!!! kkkkkkkkkk