Digo desde ja que este e o meu primeiro tutorial aqui no forum, e espero vos mostrar juntamente com o SmiT como criar comandos com y_commands e sscanf .
Eu já tinha visto sobre ZCMD, Bcmd, etc... mas ainda não sobre y_command por isso decidir tentar fazer 1 tutorial, e aqui está o resultado.
O que é?
Bem y_commands e o processador de comandos mais rápido e flexível existente até o momento e sscanf й a melhor alternativa para uso substituindo o velho Strtok, ambos foram criados por ****** .
Requesitos e onde colocar
Bom originário terá de fazer download da biblioteca YSI e da sscanf e seu plugin, aqui tem:
Eu já tinha visto sobre ZCMD, Bcmd, etc... mas ainda não sobre y_command por isso decidir tentar fazer 1 tutorial, e aqui está o resultado.
O que é?
Bem y_commands e o processador de comandos mais rápido e flexível existente até o momento e sscanf й a melhor alternativa para uso substituindo o velho Strtok, ambos foram criados por ****** .
Requesitos e onde colocar
Bom originário terá de fazer download da biblioteca YSI e da sscanf e seu plugin, aqui tem:
- Download da YSI Server Inclui .
- Baixar da sscanf .
Após o download copie/corte a pasta "YSI" e coloque na pasta "..pawno/include" e "sscanf2.inc" também copie/corte e coloque na pasta "..pawno/include" .
Quanto ao plugin
No Windows
Quanto ao plugin
No Windows
- Tera de copiar ou cortar a "sscanf.dll" e colocar na pasta "plugins" . Se não existir esta massa, tera de criar-la.
- Depois abra o "server.cfg" e adicione "sscanf.dll" na linha "plugins" , se nao tiver tera de criar-la assim:
Код:
plug-ins sscanf.dll
Sem Linux
- Tera de copiar ou cortar a "sscanf.so" e colocar na pasta "plugins" . Se não existir esta massa, tera de criar-la.
- Depois abra o "server.cfg" e adicione "sscanf.so" na linha "plugins" , se nao tiver tera de criar-la assim:
Код:
plugins sscanf.so
Adicionando ao GameMode
Bem agora temos de carregar o y_commands ea sscanf . Para isso no topo do seu script tera de os incluir (include).
Assim:
peão Код:Bem agora temos de carregar o y_commands ea sscanf . Para isso no topo do seu script tera de os incluir (include).
Assim:
- Código:
#include <YSI\y_commands>
#include <sscanf2>
Isto irá carregar os Codes da pasta "..pawno/include/YSI/y_commands.inc" e "..pawno/include/sscanf2.inc" para o seu script.
Nota
Nota
- Os comandos que criamem não poderão estar dentro de qualquer Callback , tem de ser criados fora.
E já agora uma Callback é uma função cуdigo que já existe no seu script ou seja e uma função nativa, exemplo;
- Código:
public OnGameModeInit ( )
{
return 1 ;
}
- Se colocar os seus comandos dentro desses Callback's irгo ocorrer erros, e com isso podemos ficar abortados e desistir de criar comandos.
Adicionando um comando
- Para adicionar um comando basta estar fora de qualquer Callback e seguir as funções
peão Код:
- Código:
YCMD : teste ( playerid, params [ ] , ajuda )
{
return 1 ;
}
- params e parametro string, playerid e ID do player que executa o comando.
- y_commands tem um sistema de ajuda imbutido.
Nota
Em vez de usar"params"podemos usar"o".
Ficará assim:
peão Код:Em vez de usar"params"podemos usar"o".
Ficará assim:
- Código:
YCMD : teste ( playerid, o [ ] , ajuda )
{
return 1 ;
}
Sistema help do y_commands
Analise o comando abaixo:
peão Код:Analise o comando abaixo:
- Código:
YCMD : oi ( playerid, params [ ] , help )
{
if ( help )
return SendClientMessage ( playerid, - 1 , "fixe" ) ;
SendClientMessage ( playerid, - 1 , "oi" ) ;
retornar 1 ;
}
Como podem verificar se ele possui o parâmetro 'ajuda' preenchido, agora como ler-lo?
Para ler-lo é preciso criar um comando que leia esses parâmetros, por exemplo esse abaixo:
peão Код:Para ler-lo é preciso criar um comando que leia esses parâmetros, por exemplo esse abaixo:
- Código:
YCMD : help ( playerid, params [ ] , help )
{
if ( isnull ( params ) ) return SendClientMessage ( playerid, - 1 , "uso: /help [comando]" ) ;
Command_ReProcess ( playerid, params, true ) ;
// isto ira ler o parâmetro 'help' do comando que colocamos
return 1 ;
}
Com o comando acima sempre que escrever /help [nome do comando] ele ira mostrar o que contém o parâmetro 'help' desse comando que quer ver.
- Nota: O y_commands não traz o comando /help como nativo, tem de o criar para poder ler os parâmetros 'help'.
Criando comandos sem sscanf
- Vamos começar por um simples comando "/ola " sem recorrência ao uso de sscanf .
peão Код:
- Código:
YCMD : ola ( playerid, params [ ] , help )
{
SendClientMessage ( playerid, - 1 , "PT o comando funciona!" ) ;
retornar 1 ;
}
- O player recebe uma mensagem simples, PT o comando funciona!
- Mas se por acaso receberem estes warning's na compilação:
Код:
- Código:
aviso 203: o símbolo nunca é usado "params"
aviso 203: o símbolo nunca é usado "ajuda"
- Esta é a forma de reparar e não usar os parâmetros "params" e "help" no seu comando:
Podemos dizer ao script que não queremos usar os parâmetros "params" e "help" usando a diretiva " #pragma used symbol " no comando, assim:
peão Код:- Código:
YCMD : ola ( playerid, params [ ] , help )
{
#pragma params não utilizados, help
SendClientMessage ( playerid, - 1 , "PT o comando funciona!" ) ;
retornar 1 ;
}
Outro Exemplo
- Vamos criar um comando para admin RCON usar.
peão Код:
- Código:
YCMD : adm ( playerid, params [ ] , ajuda )
{
new string [ 128 ] ;
novo pname [ MAX_PLAYER_NAME ] ;
if ( ! IsPlayerAdmin ( playerid ) ) return SendClientMessage ( playerid, - 1 , "Este comando não podes usar" ) ;
if ( ajuda ) return SendClientMessage ( playerid,- 1 , "Este é um comando de admin RCON" ) ;
if ( isnull ( params ) ) return SendClientMessage ( playerid, - 1 , "Erro: /adm [texto]" ) ;
GetPlayerName ( playerid, pname, sizeof ( pname ) ) ;
formato ( string, sizeof ( string ) , "(RCON) %s: %s" , pname, params ) ;
SendClientMessageToAll( -1 , string ) ; retornar 1 ; }
Corda
- nova string[ 128 ]; Declaramos que a variável "string" tem espaço para 127 caracteres.
pname
- novo pname[ MAX_PLAYER_NAME ]; Declaramos que a variável "pname" ira ter todo o nome do jogador ewich irá conter o nome de um jogador. A variável armazena no máximo 24 caracteres (" MAX_PLAYER_NAME ") que eo tamanho máximo do nome que um player pode ter no SA-MP.
Nota
Em vez de:
peão Код:Em vez de:
- Código:
nova string [ 128 ] ;
novo pname [ MAX_PLAYER_NAME ] ;
Pode fazer assim:
peão Код:- Código:
nova string [ 128 ] , pname [ MAX_PLAYER_NAME ] ;
então fiz essa forma para ser mais fácil de explicar.
Ajuda do sistema
Ajuda do sistema
- peão Код:
- Código:
if ( help ) return SendClientMessage ( playerid, - 1 , "Este é um comando de admin RCON" ) ;
Se o jogador quiser saber mais sobre o comando ( /ajudacomando adm).
É nulo
- peão Код:
- Código:
if ( isnull ( params ) ) return SendClientMessage ( playerid, - 1 , "Erro: /adm [texto]" ) ;
Se o parâmetro estiver vazio ( null ) ou seja o player so escreveu "/adm" ira receber ( return ) a mensagem sobre como usar o comando.
Matrizes
- Uma array e uma variável em que tu podes armazenar informações e acessar-lhe dinamicamente, exemplo:
MAX_PLAYER_NAME
Obtendo o nome do player
- GetPlayerName(playerid, pname, sizeof (pname));
O script ira obter o nome do player que executou o comando (" sizeof ( pname ) " ) e colocá-lo em uma array na variável chamada "pname" com o tamanho máximo de MAX_PLAYER_NAME (24) caracteres.
Formatar
- peão Код:
formato ( string, sizeof ( string ) , "(RCON) %s: %s" , pname, params ) ;
Nos formatamos a nossa mensagem, e ira armazemar-la na variável "string" , e " sizeof (string)" ira obter o tamanho máximo da string , neste caso declaramos 128 .
Espaços reservados
- "%s" insira uma string . O primeiro "%s" é um espaço reservado para o nome do player e o segundo para o texto que ele escreve. (/adm [Texto])
SendClientMessageToAll
- SendClientMessageToAll(-1, string); Isto ira mandar o texto que ele escreveu para todos os jogadores online.
Exemplo de uso
- O adm rcon PT escreve "/adm testando"
resultado:
Код:- Código:
(RCON) PT: testando
Espaços reservados
Код:- Código:
% b Insere um número nesta posição em base binária
% c Insira um caractere único.
% d Insira um (inteiro) número inteiro
% f Insere um número de ponto flutuante (float).
% i Insere um número inteiro.
% s Insira uma string. (usamos este um pouco)
% x Insere um número em nota hexadecimal.
%% Insira o caracter '%'
Criando comandos com sscanf
- Vamos começar com o simples comando "/vida" .
peão Код:
- Código:
YCMD : vida ( playerid, params [ ] , ajuda )
{
novo ID;
if ( help ) return SendClientMessage ( playerid, - 1 , "Este comando dara vida a 1 player!" ) ;
if ( sscanf ( params, "u" , ID ) ) return SendClientMessage ( playerid, - 1 , "Uso: /vida [PlayerName / ID]" ) ;
se (PlayerID == INVALID_PLAYER_ID ) return SendClientMessage ( playerid, - 1 , "[ERRO] Este joga esta OFFLINE" ) ;
SetPlayerHealth ( ID, 100 ) ;
retornar 1 ;
}
declarando
- nova identificação; ea variavel que declara o id do player que vamos dar vida.
Ajuda do sistema
- peão Код:
- Código:
if ( help ) return SendClientMessage ( playerid, - 1 , "Este comando dara vida a 1 player!" ) ;
Como sempre se o parâmetro "help" for usado, vou mostrar a mensagem que escrevemos ou seja a descrição do comando.
SscanfGenericName
- peão Код:
if ( sscanf ( params, "d" , ID ) ) return SendClientMessage ( playerid, - 1 , "Erro: /vida [ID]" ) ;
Usamos o parâmetro, "d" para especificar que e um numero ou seja o id do player, a sscanf ira verificar se colocarmos de forma incorreta os parametros do comando, que neste caso deveria ser por exemplo: /vida 0 se nao colocar assim obtera uma mensagem de erro
INVALID_PLAYER_ID
- peão Код:
- Código:
if ( ID == INVALID_PLAYER_ID ) return SendClientMessage ( playerid, - 1 , "[ERRO] Este joga esta OFFLINE" ) ;
Isto irá verificar se o ID que colocamos e um ID online no servidor, se não for obtem uma mensagem de erro.
SetPlayerHealth
- Código:
SetPlayerHealth(ID, 100);
Isto é para definir a vida do id a 100.
A formula da Sscanf no comando
- A fórmula da sscanf e esta:
peão Код:
- Código:
if ( sscanf ( params, "Especificacoes" , Nossas variaveis ) ) // Se o player sofrer os parametros incorretos
{
// mensagem para avisar o player
}
Especificações
Usamos-las conforme o fim que queremos obter
Код:Usamos-las conforme o fim que queremos obter
- Código:
a - se para um caracter.
f - se for um número de ponto flutuante (float).
i ou d - se for um nъmero inteiro.
s - se para uma string.
x ou h - Insere um nъmero em notaзгo hexadecimal.
z - se para um texto opcional
px - se for um delimitador adicional, onde X em outro player.
'' - para localizar uma string ( texto ).
u - parte de um nome ou um id
Comandos
- y_commands tem um sistema especial que deteta todos os comandos que tu tens no teu script assim nгo precisas e sempre atualiza a tua lista de "/comandos" .
peão Код:
- Código:
YCMD : comandos ( playerid, params [ ] , help )
{
if ( help ) return SendClientMessage ( playerid, - 1 , "Lista de todos os comandos." ) ;
nova contagem = Command_GetPlayerCommandCount ( playerid ) ;
for ( new i = 0 ; i != count; ++ i ) SendClientMessage ( playerid, -1 , Command_GetNext ( i, playerid ) ) ;
retornar 1 ;
}
Mensagem: COMANDO DESCONHECIDO
- Quando um jogador escreve um comando que não existe recebe a mensagem: "SERVER: Unknown Command." então como alterar essa mensagem?
Basta colocar a CallBack OnPlayerCommandPerformed e usar por exemplo assim:
peão Код:
- Código:
public OnPlayerCommandPerformed ( playerid, cmdtext [ ] , sucesso )
{
if ( ! sucesso ) return false;
retornar verdadeiro;
}
Mas podemos colocar uma mensagem para ficar mais agradável de ser ver, para isso usamos assim:
- peão Код:
- Código:
public OnPlayerCommandPerformed ( playerid, cmdtext [ ] , success )
{
if ( ! success )
{
format ( cmdtext, 128 , " ERRO: O comando %s nгo existe veja em /comandos todos " , cmdtext ) ;
SendClientMessage ( playerid, - 1 , cmdtext ) ;
}
retorna verdadeiro;
}
Resultado final
- Fonte:
peão Код:
- Código:
#include <a_samp>
#include <YSI\y_commands>
#include <sscanf2>
main ( )
{
print ( " \n ------------------------ ----------" ) ;
print ( "Modo de jogo em branco com seu nome aqui" ) ;
print ( "--------------------------------- \n " ) ;
}
- Código:
public OnGameModeInit ( )
{
// Não use essas linhas se for um filterscript
SetGameModeText ( "Script em branco" ) ;
0 , 1958.3783 , 1343.1572 , 15.3746 , 269.1425 , 0 , 0 , 0 , 0 , 0 , 0 ) ;
Command_AddAltNamed ( "informações" , "informações" ) ;
retornar 1 ;
}
- Código:
public OnGameModeExit ( )
{
return 1 ;
}
- Código:
public OnPlayerRequestClass ( playerid, classid )
{
SetPlayerPos ( playerid, 1958.3783 , 1343.1572 , 15.3746 ) ;
SetPlayerCameraPos ( playerid, 1958.3783 , 1343.1572 , 15.3746 ) ;
SetPlayerCameraLookAt ( playerid, 1958.3783 , 1343.1572 , 15.3746 ) ;
retornar 1 ;
}
- Código:
public OnPlayerConnect ( playerid )
{
return 1 ;
}
- Código:
públicoOnPlayerDisconnect ( playerid, razão )
{
return 1 ;
}
- Código:
public OnPlayerSpawn ( playerid )
{
return 1 ;
}
- Código:
public OnPlayerDeath ( playerid, killerid, razão )
{
return 1 ;
}
- Código:
public OnVehicleSpawn ( ID do veículo )
{
return 1 ;
}
- Código:
public OnVehicleDeath ( ID do veículo, ID do assassino )
{
return 1;
}
- Código:
public OnPlayerText ( playerid, text [ ] )
{
return 1 ;
}
- Código:
public OnPlayerCommandText ( playerid, cmdtext [ ] )
{
if ( strcmp ( "/mycommand" , cmdtext, true, 10 ) == 0 )
{
// Faça algo aqui
return 1 ;
}
retorna 0 ;
}
- Código:
public OnPlayerEnterVehicle ( id do jogador, id do veículo, ispassenger)
{
retorna 1 ;
}
- Código:
public OnPlayerExitVehicle ( id do jogador, id do veículo )
{
return 1 ;
}
public OnPlayerStateChange ( playerid, newstate, oldstate )
{
return 1 ;
}
public OnPlayerEnterCheckpoint ( playerid )
{
return 1 ;
}
public OnPlayerLeaveCheckpoint ( playerid )
{
return 1 ;
}
públicoOnPlayerEnterRaceCheckpoint ( playerid )
{
return 1 ;
}
public OnPlayerLeaveRaceCheckpoint ( playerid )
{
return 1 ;
}
public OnRconCommand ( cmd [ ] )
{
return 1 ;
}
public OnPlayerRequestSpawn ( playerid )
{
return 1 ;
}
public OnObjectMoved ( id do objeto )
{
return 1 ;
}
public OnPlayerObjectMoved ( playerid, objectid )
{
return 1 ;
}
public OnPlayerPickUpPickup ( playerid, pickupid )
{
return 1 ;
}
public OnVehicleMod ( id do jogador, id do veículo, id do componente )
{
return 1 ;
}
public OnVehiclePaintjob ( playerid, vehiclesid, paintjobid )
{
return 1 ;
}
public OnVehicleRespray( id do jogador, id do veículo, cor1, cor2 )
{
return 1 ;
}
public OnPlayerSelectedMenuRow ( playerid, linha )
{
return 1 ;
}
public OnPlayerExitedMenu ( playerid )
{
return 1 ;
}
public OnPlayerInteriorChange ( playerid, newinteriorid, oldinteriorid )
{
return 1 ;
}
public OnPlayerKeyStateChange ( playerid, newkeys, oldkeys )
{
retornar 1 ;
}
public OnRconLoginAttempt ( ip [ ] , senha [ ] , sucesso )
{
return 1 ;
}
public OnPlayerUpdate ( playerid )
{
return 1 ;
}
public OnPlayerStreamIn ( playerid, forplayerid )
{
return 1 ;
}
public OnPlayerStreamOut ( playerid, forplayerid )
{
return 1;
}
public OnVehicleStreamIn ( ID do veículo, ID do jogador )
{
return 1 ;
}
public OnVehicleStreamOut ( ID do veículo, ID do jogador )
{
return 1 ;
}
public OnDialogResponse ( playerid, dialogid, resposta, listitem, inputtext [ ] )
{
return 1 ;
}
public OnPlayerClickPlayer ( playerid, clickedplayerid, source )
{
return 1 ;
}
public OnPlayerCommandPerformed ( playerid, cmdtext [ ] , success )
{
if ( ! success )
{
format ( cmdtext, 128 , " ERRO: O comando %s nгo existe veja em /comandos todos os comandos disponiveis " , cmdtext ) ;
SendClientMessage ( playerid, - 1 , cmdtext ) ;
}
retorna verdadeiro;
}
- Código:
/* COMANDOS */
YCMD: ajudacomando ( playerid, params [ ] , help )
{
if ( isnull ( params ) ) return SendClientMessage ( playerid, - 1 , "uso: /ajudacomando [comando]" ) ;
Command_ReProcess ( playerid, params, true ) ;
// isto ira ler o parâmetro 'help' do comando que colocamos
return 1 ;
}
YCMD : comandos ( playerid, params [ ] , ajuda)
{
if ( help ) return SendClientMessage ( playerid, - 1 , "Lista de todos os comandos." ) ;
nova contagem = Command_GetPlayerCommandCount ( playerid ) ;
for ( novo i = 0 ; i != contagem; ++ i ) SendClientMessage ( playerid, - 1 , Command_GetNext ( i, playerid ) ) ;
retornar 1 ;
}
YCMD : ola ( playerid, params [ ] , help )
{
#pragma params não utilizados, help
SendClientMessage ( playerid, - 1 , "PT o comando funciona!" ) ;
retornar 1 ;
}
YCMD : testando ( playerid, params [ ] , help )
{
if ( help ) return SendClientMessage ( playerid, - 1, "comando lindo." ) ;
SendClientMessage ( playerid, - 1 , "funciona" ) ;
retornar 1 ;
}
YCMD : testando2 ( playerid, params [ ] , help )
{
if ( help ) return SendClientMessage ( playerid, - 1 , "comando feio." ) ;
SendClientMessage ( playerid, - 1 , "funciona2") ;
retornar 1 ;
}
YCMD : vida ( playerid, params [ ] , ajuda )
{
novo ID;
if ( help ) return SendClientMessage ( playerid, - 1 , "Este comando dara vida a 1 player!" ) ;
if ( sscanf ( params, "u" , ID ) ) return SendClientMessage ( playerid, - 1 ,"Uso: /vida [Nome do jogador/ID]" ) ;
if ( PlayerID == INVALID_PLAYER_ID ) return SendClientMessage ( playerid, - 1 , "[ERRO] Este joga esta OFFLINE" ) ;
SetPlayerHealth ( ID, 100 ) ;
retornar 1 ;
}
YCMD : adm ( playerid, params [ ] , ajuda )
{
new string [ 128 ] ;
novo pname[ MAX_PLAYER_NAME ] ;
if ( ! IsPlayerAdmin ( playerid ) ) return SendClientMessage ( playerid, - 1 , "Este comando não podes usar" ) ;
if ( help ) return SendClientMessage ( playerid, - 1 , "Este é um comando de admin RCON" ) ;
if ( isnull ( params ) ) return SendClientMessage (playerid, - 1 , "Erro: /adm [texto]" ) ;
GetPlayerName ( playerid, pname, sizeof ( pname ) ) ;
formato ( string, sizeof ( string ) , "(RCON) %s: %s" , pname, params ) ;
SendClientMessageToAll ( -1 , string ) ;
retornar 1 ;
}
- Se eu me esqueço de algo ou me expliquei mal em algo, por favor digam. Tentei o meu melhor para explicar direito para vocês.
Creditos
- Desconhecido - pelo processador de comandos e pela sscanf
SA-MP WIKI - pelas referencias
PT e SmiT - Pelo tutorial