Introdução
Bom, como meus últimos posts têm sido relacionados a IPSI, e melhorias sistemáticas, uma das minhas inclui linguagens relacionadas a cabordava o conceito de 'state machines' o que era algo muito bom, e inovador aqui na placa, nгo sгo lanзados projetos relacionados a isto.
Decidir utilizar o estado não só para hooks, mas também por questões de organização, o que me fez dar início a este tutorial, vou utilizar estados para criar comandos criados com o iCmd 7.0 Apresentado como muitos sabem, o iCmd funciona de forma diferenciada DOS
demais
( para quem ainda nгo sabe, atualize-se.)
Logo podemos assumir essa estrutura:
peão Код:Bom, como meus últimos posts têm sido relacionados a IPSI, e melhorias sistemáticas, uma das minhas inclui linguagens relacionadas a cabordava o conceito de 'state machines' o que era algo muito bom, e inovador aqui na placa, nгo sгo lanзados projetos relacionados a isto.
Decidir utilizar o estado não só para hooks, mas também por questões de organização, o que me fez dar início a este tutorial, vou utilizar estados para criar comandos criados com o iCmd 7.0 Apresentado como muitos sabem, o iCmd funciona de forma diferenciada DOS
demais
( para quem ainda nгo sabe, atualize-se.)
Logo podemos assumir essa estrutura:
- Código:
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
O que eu pretendo sugerir para vocês nesse tutorial é bastante diferente ao que vemos no dia-a-dia, exemplo de estrutura comum utilizando o iCmd 7.0:
peão Код:O que eu pretendo sugerir para vocês nesse tutorial é bastante diferente ao que vemos no dia-a-dia, exemplo de estrutura comum utilizando o iCmd 7.0:
- Código:
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 );
retornar 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 ) ;
retornar 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.
retornar 1 ;
}
case iscmd ( "a,d,m,i,n,s" ) , iscmd ( "a,d,m" ) : //normal
{
//ver admins online
return 1 ;
}
}
retorna 0 ;
}
Especificadores :
Код:normais | Todo mundo pode usar.
administradores | Somente os administradores podem utilizar.
Usando o conceito de estado 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:
- Código:
main ( )
{
estado cmd : jogadores;
}
/*
*
* Comandos em geral, onde qualquer jogador
* Tem acesso e pode utilizar.
*
*/
- Código:
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.
retornar 1 ;
}
case iscmd ( "a,d,m,i,n,s" ) , iscmd ( "a,d,m" ) : //normal
{
//ver admins online
return 1 ;
}
}
//fim dos comandos
- Código:
if ( none ( admin_level, playerid, bit4 ) ) //verificando se o jogador é admin.
retorna 0 ;
estado cmd : administradores;
return OnPlayerCommandText ( playerid, commandid, params ) ;
}
/*
*
* Comandos administrativos, onde somente
* os administradores online podem alcançar e utilizá-los.
*
*/
- Código:
public OnPlayerCommandText ( playerid, commandid, params [ ] ) < cmd :admins >
{
estado cmd : jogadores;
//inicio dos comandos administrativos
- Código:
switch ( commandid )
{
case iscmd ( "k,i,l,l" ) , iscmd ( "m,a,t,a,r" ) : //admin
{
Kill ( id ) ;
retornar 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 ) ;
retornar 1 ;
}
}
//fim dos comandos
- Código:
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 estado é meio confuso para quem nunca o viu, então é necessário um certo cuidado quando para mexer com o mesmo, pois pode ter erros fáceis, como por exemplo:
- Você cria um estado que está aspirando para uma variável inexistente.
- Você cria 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
peão Код:
public metodo ( ) <> //mÉtodo inicial
Logo você precisa apontar a variável para o seu método.
peão Код:
estado var : m;
public metodo ( ) < var : m > // será chamado - Você gera loops infinitos entre os estados, isso pode falhar todo o seu trabalho após gerar um estouro de pilha no servidor, muita atenção para isso.
A finalidade do tutorial era mostrar o uso diferenciado(states) dentro de um conceito de organização utilizando o iCmd 7.0, mas acredito que servirá para outras finalidades também, dъvidas serão bem-vindas.
- Créditos
- Willian Luigi - Tópico, tutorial e aplicativos com estado.
- ipsBruno - Incluir
- [iPs]TeaM
- Agradecimentos a todos BETA-TESTERS e pessoas que aderiram ao uso da lib.(PT, Kronus13, DanDRT, e os demais...)