[Tutorial] Truque iCmd 7.0 (organizaзгo)
#1

Introduзгo

Bom, como meus ultimos posts tem sido relacionados a IPSI, e melhorias sistemбticas, uma das minhas includes lanзadas relacionadas a hooks(w!hooks) abordava o conceito de 'state machines' oque era algo muito bom, e inovador aqui na board, nгo sгo lanзados projetos relacionados a isto.

Decidi utilizar o state nгo sу para hooks, mas tambйm por questхes de organizaзгo, oque me fez dar inicio a este tutorial, irei utilizar states para organizar comandos criados com o iCmd 7.0




Apresentaзгo

como muitos sabem, o iCmd funciona de forma diferenciada dos demais(para quem ainda nгo sabe, atualize-se aqui.)

Logo podemos assumir essa estrutura:
pawn Код:
public OnPlayerCommandText(playerid, commandid, params[])
{

    switch (commandid)
    {
        case iscmd("c,m,d"):
        {
            //comando
        }
        //comandos a mais
    }

    return 1;
}
Como sendo a estrutura padrгo para os usuбrios do iCmd 7.0





Oque eu pretendo sugerir para vocкs nesse tutorial й bastante diferente ao que vemos no dia-a-dia, exemplo de estrutura comum utilizando iCmd 7.0:
pawn Код:
public OnPlayerCommandText(playerid, commandid, params[])
{

    switch (commandid)
    {
        case iscmd("h,e,l,p"), iscmd("a,j,u,d,a"): //normal
        {
            //comando de ajuda
            return 1;
        }
        //comandos a mais

        case iscmd("k,i,l,l"), iscmd("m,a,t,a,r"): //admin
        {
            Kill(id);
            return 1;
        }

        case iscmd("s,l,a,y"), iscmd("t,a,p,a"): //admin
        {
            //tapa
            return 1;
        }

        case iscmd("b,a,n"), iscmd("b,a,n,i,r"): //admin
        {
            Ban(id);
            //comando de ban
            return 1;
        }

        case iscmd("k,i,c,k"), iscmd("c,h,u,t,a,r"): //admin
        {
            Kick(id);
            return 1;
        }

        case iscmd("m,y,p,r,o,p"), iscmd("m,i,n,h,a,e,m,p"): //normal
        {
            //comando da empresa
            return 1;
        }

        case iscmd("m,y,h,o,u,s,e"), iscmd("m,i,n,h,a,c,a,s,a"): //normal
        {
            //comando da casa
            return 1;
        }

        case iscmd("s,t,a,t,s"), iscmd("r,g"): //normal
        {
            //comando de mostrar o RG
            return 1;
        }

        case iscmd("r,e,p,o,r,t"), iscmd("r,e,l,a,t,o,r,i,o"): //normal
        {
            //comando de enviar relatуrio para os admins.
            return 1;
        }

        case iscmd("a,d,m,i,n,s"), iscmd("a,d,m"): //normal
        {
            //ver admins online
            return 1;
        }
    }

    return 0;
}
Especificadores:
Код:
normal		|	Todo mundo pode utilizar.
admins		|	Somente administradores podem utilizar.

Utilizando o conceito de state podemos manipular estes comandos com uma certa organizaзгo a agradar os olhos...
E isso й bom para manipulaзгo, atualizaзгo, e atй mesmo em questгo de execuзгo, quando se trata de comandos normais(players).






Estrutura sugerida por mim:
pawn Код:
main()
{
    state cmd:players;
}


/*
*
* Comandos em geral, onde qualquer jogador
* Tem acesso e pode utilizar.
*
*/


public OnPlayerCommandText(playerid, commandid, params[]) <cmd:players>
{

//inicio dos comandos gerais.
    switch (commandid)
    {
        case iscmd("h,e,l,p"), iscmd("a,j,u,d,a"): //normal
        {
            //comando de ajuda
            return 1;
        }
        //comandos a mais

        case iscmd("m,y,p,r,o,p"), iscmd("m,i,n,h,a,e,m,p"): //normal
        {
            //comando da empresa
            return 1;
        }

        case iscmd("m,y,h,o,u,s,e"), iscmd("m,i,n,h,a,c,a,s,a"): //normal
        {
            //comando da casa
            return 1;
        }

        case iscmd("s,t,a,t,s"), iscmd("r,g"): //normal
        {
            //comando de mostrar o RG
            return 1;
        }

        case iscmd("r,e,p,o,r,t"), iscmd("r,e,l,a,t,o,r,i,o"): //normal
        {
            //comando de enviar relatуrio para os admins.
            return 1;
        }

        case iscmd("a,d,m,i,n,s"), iscmd("a,d,m"): //normal
        {
            //ver admins online
            return 1;
        }
    }
//fim dos comandos
   

    if (none(admin_level, playerid, bit4)) //verificando se o jogador й admin.
        return 0;



    state cmd:admins;

    return OnPlayerCommandText(playerid, commandid, params);
}


/*
*
* Comandos administrativos, onde somente
* administradores online podem alcanзar e utiliza-los.
*
*/


public OnPlayerCommandText(playerid, commandid, params[]) <cmd:admins>
{

    state cmd:players;


//inicio dos comandos administrativos
    switch (commandid)
    {
        case iscmd("k,i,l,l"), iscmd("m,a,t,a,r"): //admin
        {
            Kill(id);
            return 1;
        }

        case iscmd("s,l,a,y"), iscmd("t,a,p,a"): //admin
        {
            //tapa
            return 1;
        }

        case iscmd("b,a,n"), iscmd("b,a,n,i,r"): //admin
        {
            Ban(id);
            //comando de ban
            return 1;
        }

        case iscmd("k,i,c,k"), iscmd("c,h,u,t,a,r"): //admin
        {
            Kick(id);
            return 1;
        }
    }
//fim dos comandos


    return 0;
}




[offtopic] O 'state machine' pode ser aplicado desta forma(organizaзгo) em outros locais tambйm, como por exemplo, um sistema de login

Vocк pode diferenciar login de um admin, para o login de um player normal.

Vale ressaltar tambйm, que nгo й utilizado somente entre organizaзгo player X admin,
pode ser utilizado de vбrias outras maneiras, vai da criatividade de cada um.




OBS: O state й meio confuso para quem nunca o viu, entгo й necessбrio um certo cuidado quando for mexer com o mesmo, pois pode ter fбceis erros, como por exemplo:
  • Vocк criar um state que estб apontando para uma variбvel inexistente.
  • Vocк criar um mйtodo utilizando state com nomes aleatуrios, o mйtodo nгo serб executado, pois o mйtodo chamado primeiro sempre serб o vбzio
    pawn Код:
    public metodo() <> //mйtodo inicial
    Logo vocк precisa apontar a variбvel para o seu mйtodo.
    pawn Код:
    state var:m;
    public metodo() <var:m> //serб chamado
  • Vocк gerar loops infinitos entre os states, isso pode falhar todo o seu trabalho apуs gerar um stack overflow no servidor, muita atenзгo para isto.(Eu prуprio jб tive problemas, por falta de atenзгo.)


A finalidade do tutorial era mostrar o uso diferenciado(states) dentro de um conceito de organizaзгo utilizando iCmd 7.0, mas creio que servirб para outras finalidades tambйm, dъvidas serгo bem-vindas.



  • Crйditos
    • Willian Luigi - Tуpico, tutorial e aplicaзхes com state.
    • ipsBruno - Include
    • [iPs]TeaM
    • Agradecimentos a todos BETA-TESTERS e pessoas que aderiram ao uso da lib.(PT, Kronus13, DanDRT, e os demais...)



Tуpicos relacionados:

- Includes
beta iBits
beta iCmd 7.0(rбpido)
beta iLoops
beta iEach



- Tutoriais
Como usar iLoops!
Usando iBits!
Truques com icmd7

- FilterScripts
Sistema de admin
Sistema de Registro & Login
Reply
#2

Bom tutorial!
Reply
#3

Pode Ser Rбpido e tudo.

Mais Prefiro algo que me dк facilidade. Nгo ficar botando:
pawn Код:
switch (commandid)
    {
        case iscmd("i,c,m,d"), iscmd("a,j,u,d,a"):
        {
             return 1;
        }
Уtima include. porйm poderia melhorar neste aspecto. E nгo somente pensar em Velocidade.
Reply
#4

Bom gostei.
Reply
#5

Eu nem sabia que essa keyword existia ( state ), mas poderia me explicar uma coisa? Qual й a funзгo de <> no fim da callback? Isso permite que a callback seja usada 2 vezes?

Se permitir, acaba de surgir um novo mйtodo de hook '--' (ou nгo)
Reply
#6

Quote:
Originally Posted by _SysTeM_OFF
Посмотреть сообщение
Pode Ser Rбpido e tudo.

Mais Prefiro algo que me dк facilidade. Nгo ficar botando:
pawn Код:
switch (commandid)
    {
        case iscmd("i,c,m,d"), iscmd("a,j,u,d,a"):
        {
             return 1;
        }
Уtima include. porйm poderia melhorar neste aspecto. E nгo somente pensar em Velocidade.
Na verdade nгo й tгo complicado.

"oi" e "o,i" sгo a mesma coisa a diferenзa que tem uma vнrgula no meio, que no caso й considerado um caractere alfa-numйrico, logo nгo hб do que reclamar em questгo de facilidade de uso.

E se for o caso de vocк usar ZCMD, como vocк linkaria um comando ao outro ?

pawn Код:
CMD:cmd1(playerid)
{
    //comando
    return 1;
}

CMD:cmd2(playerid)
{
    cmd_cmd2();
    return 1;
}
Realmente acha mais fбcil isto /\, do que isto \/ ?!
pawn Код:
case iscmd("c,m,d,1"), iscmd("c,m,d,2"): //normal
{
    //comando
    return 1;
}

Sem esquecer que iCmd estб em versгo beta, estб sim sendo trabalhado possibilidades de melhoras.
Mas sinceramente falando, do jeito que estб, nгo estб difнcil.




Quote:
Originally Posted by Juniiro3
Посмотреть сообщение
Eu nem sabia que essa keyword existia ( state ), mas poderia me explicar uma coisa? Qual й a funзгo de <> no fim da callback? Isso permite que a callback seja usada 2 vezes?

Se permitir, acaba de surgir um novo mйtodo de hook '--' (ou nгo)
Exatamente isso, o w!hooks foi baseado nisso, pode perceber lб no tуpico.
Reply
#7

Usando state machine...? muito interessante Willian, esta de parabйns
Reply
#8

Belo tutorial Willian!
Reply
#9

vc й o segundo kara mais foda ke konhesso luigi,o primeiro й o super mario :B Parabйns
Reply
#10

Existe testes de velocidades referente ao iCmd vs Zcmd ?
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)