[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


Messages In This Thread
Truque iCmd 7.0 (organizaзгo) - by WLSF - 21.10.2013, 00:11
Respuesta: Truque iCmd 7.0 (organizaзгo) - by DanDRT - 21.10.2013, 00:18
Re: Truque iCmd 7.0 (organizaзгo) - by SeV_ - 21.10.2013, 00:22
Re: Truque iCmd 7.0 (organizaзгo) - by smiiir - 21.10.2013, 00:24
Re: Truque iCmd 7.0 (organizaзгo) - by Juniiro3 - 21.10.2013, 00:29
Re: Truque iCmd 7.0 (organizaзгo) - by WLSF - 21.10.2013, 00:31
Re: Truque iCmd 7.0 (organizaзгo) - by Dolby - 21.10.2013, 01:13
Re: Truque iCmd 7.0 (organizaзгo) - by zSuYaNw - 21.10.2013, 01:50
Re: Truque iCmd 7.0 (organizaзгo) - by AlieN_. - 21.10.2013, 05:00
Re: Truque iCmd 7.0 (organizaзгo) - by Russo66 - 21.10.2013, 14:26

Forum Jump:


Users browsing this thread: 2 Guest(s)