[Include] ICMD Versгo 6 (Processador de Comandos)
#1

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(playeridcmdtext[]) {
    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(annplayeridparams[]) {
    new 
string[128] ;
    
format(string128"O jogador id %d disse: %s"playeridparams);
    return 
SendClientMessageToAll(-1string);

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" floatsnъ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
kickplayeriderro)<outrojogadormotivo[32]> scanf("is"outrojogadormotivo) {
    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, -1motivo);
    
    
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!
Reply
#2

Otimo! Teste tudo deboa Bem rapido gostei muito conserteza vou usar ^^

@Explicaзao
Perfeito,euaheuaea Depois diz que nгo sabe explicar euaheuahea
Reply
#3

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
Reply
#4

Bom trabalho Coruja, mais em questгo de velocidade do sscanf, й melhor em plugin ?
Reply
#5

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
Reply
#6

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 ?
Reply
#7

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;
}
Reply
#8

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;
}
Reply
#9

Й isto mesmo
Reply
#10

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
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)