22.12.2012, 06:57
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;
}
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;
}
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;
}
![Tongue](images/smilies/razz.gif)
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);
}
Код:
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);
}
/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
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 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 |
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
"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
![Tongue](images/smilies/razz.gif)
Й isto! Espero que tenham gostado!
![afro](images/smilies/mrgreen.gif)