[Include] ICMD Versão 6 (Processador de Comandos)

22 de dez. de 2012.

ICMD V6

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 Code:
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-Code:
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 Code:
public OnPlayerCallCommand(playerid, cmdtext[]) {     if(!logado[playerid]) return SendClientMessage(playerid, -1, "Voce nao tá logado"), false;     return true; }
Processamento comum:

O processamento comum é equivalente ao uso de zcmd e outros processadores similares
pawn Code:
cmd(comando, playerid, params[]) {    return printf("O jogador %d digitou /comando %s", playerid, params); }
Testes feitos no processamento comum
Code:
zcmd 12171 ms
icmd 4944 ms
Exemplo:
PHP-Code:
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 Y_less) integrado, assim facilitando de certa forma o uso de multi-parametros em seu comando
pawn Code:
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 Code:
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:
Zitat:
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:
Zitat:
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-Code:
"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-Code:

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 Code:
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 Y_less
Testes por ReDKiiL e Thiago_Street / Green Wood

Agradeçimentos à [iPs]TeaM

0 comentários:

Postar um comentário