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; }
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;
}
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; }
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); }
Code:
zcmd 12171 ms
icmd 4944 ms
PHP-Code:
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 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; }
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
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 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 |
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
"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;
}
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") )
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