Usando y_commands e sscanf -
PT - 26.08.2013
Digo desde ja que este e o meu primeiro tutorial aqui no forum, e irei vos mostrar juntamente com o SmiT como criar comandos com
y_commands e
sscanf.
Eu ja tinha ca visto sobre ZCMD, Bcmd, etc... mas nгo ainda sobre y_command por isso decidi tentar fazer 1 tutorial, e aqui estб o resultado.
O que й?
Bem
y_commands e o processador de comandos mais rapido e flexivel existente ate ao momento e
sscanf й a melhor alternativa para uso substituindo a velha Strtok, ambos foram criados por
******.
Requesitos e onde colocar
Bom primeiramente terб de fazer download da biblioteca YSI e da sscanf e sua plugin, aqui tem:
Apуs o download copie/corte a pasta
"YSI" e coloque na pasta
"..pawno/include" e a
"sscanf2.inc" tambйm copie/corte e coloque na pasta "..pawno/include".
Quanto ao plugin
No Windows
- Tera de copiar ou cortar a "sscanf.dll" e colocar na pasta "plugins". Se nao existir esta pasta, tera de criar-la.
- Depois abra o "server.cfg" e adicione "sscanf.dll" na linha "plugins", se nao tiver tera de criar-la assim:
No Linux
- Tera de copiar ou cortar a "sscanf.so" e colocar na pasta "plugins". Se nao existir esta pasta, tera de criar-la.
- Depois abra o "server.cfg" e adicione "sscanf.so" na linha "plugins", se nao tiver tera de criar-la assim:
Adicionando ao GameMode
Bem agora temos de carregar o y_commands e a sscanf. Para isso no topo do seu script tera de os incluir (include).
Assim:
pawn Код:
#include <YSI\y_commands>
#include <sscanf2>
Isto ira carregar os Codes da pasta "..pawno/include/YSI/y_commands.inc" e "..pawno/include/sscanf2.inc" para o seu script.
Nota
- Os comandos que criarem nao poderao estar dentro de qualquer Callback, tem de ser criados fora.
E ja agora uma Callback й uma funзгo cуdigo que jб existe no seu script ou seja e uma funзгo nativa, exemplo;
pawn Код:
public OnGameModeInit()
{
return 1;
}
- Se colocar os seus comandos dentro destas Callback's irгo ocorrer erros, e com isso poderemos ficar aborrecidos e desistir de criar comandos.
Adicionando um comando
- Para adicionar um comando basta estar fora de qualquer Callback e seguir as funзхes
pawn Код:
YCMD:teste(playerid, params[], help)
{
return 1;
}
- params e o parametro string, playerid e o ID do player que executa o comando.
- y_commands tem um sistema help imbutido.
Nota
Em vez de usar
"params" podemos usar
"o".
Ficara assim:
pawn Код:
YCMD:teste(playerid, o[], help)
{
return 1;
}
Sistema help do y_commands
Analise o comando abaixo:
pawn Код:
YCMD:oi(playerid, params[], help)
{
if(help)
return SendClientMessage(playerid, -1, "fixe");
SendClientMessage(playerid, -1, "oi");
return 1;
}
Como podem verificar ele possui o parametro 'help' preenchido, agora como ler-lo?
Para ler-lo й preciso criar um comando que leia esses parametros, por exemplo esse abaixo:
pawn Код:
YCMD:help(playerid, params[], help)
{
if (isnull(params)) return SendClientMessage(playerid, -1, "uso: /help [comando]");
Command_ReProcess(playerid, params, true);
// isto ira ler o parametro 'help' do comando que colocarmos
return 1;
}
Com o comando acima sempre que escrever
/help [nome do comando] ele ira mostrar o que contem o paramentro 'help' desse comando que quer ver.
- Nota: O y_commands nao traz o comando /help como nativo, tem de o criar para poder ler os parametros 'help'.
Criando comandos sem sscanf
- Vamos comecar por um simples comando "/ola" sem recurrendo ao uso de sscanf.
pawn Код:
YCMD:ola(playerid, params[], help)
{
SendClientMessage(playerid, -1, "PT o comando funciona!");
return 1;
}
- O player recebera a simples menssagem , PT o comando funciona!
- Mas se por acaso receberem estes warning's na compilaзгo:
Код:
warning 203: symbol is never used "params"
warning 203: symbol is never used "help"
- Esta e a forma de reparar e nao usar os parametros "params" e "help" no seu comando:
Podemos dizer ao script que nao queremos usar os paramentros
"params" e
"help" usando a
diretiva "#pragma unused symbol" no comando, assim:
pawn Код:
YCMD:ola(playerid, params[], help)
{
#pragma unused params, help
SendClientMessage(playerid, -1, "PT o comando funciona!");
return 1;
}
Outro Exemplo
- Vamos criar um comando para admin RCON usar.
pawn Код:
YCMD:adm(playerid, params[], help)
{
new string[ 128 ];
new pname[ MAX_PLAYER_NAME ];
if( !IsPlayerAdmin(playerid) ) return SendClientMessage(playerid, -1, "Este comando nao podes usar");
if( help ) return SendClientMessage(playerid, -1, "Este e um comando de admin RCON");
if( isnull( params ) ) return SendClientMessage(playerid, -1, "Erro: /adm [texto]");
GetPlayerName( playerid, pname, sizeof( pname ) );
format( string, sizeof( string ),"(RCON) %s: %s", pname, params);
SendClientMessageToAll(-1, string);
return 1;
}
String- new string[ 128 ]; Declaramos que a variavel "string" tem espaзo para 127 caracteres.
pname- new pname[ MAX_PLAYER_NAME ]; Declaramos que a variavel "pname" ira ter todo o nome do player ewich will hold the name of a player. A variavel armazena no maximo 24 carateres ("MAX_PLAYER_NAME") que e o tamanho maximo do nome que um player podera ter no SA-MP.
Nota
Em vez de:
pawn Код:
new string[ 128 ];
new pname[ MAX_PLAYER_NAME ];
Pode fazer assim:
pawn Код:
new string[ 128 ], pname[ MAX_PLAYER_NAME ];
so fiz daquela forma para ser mais facil explicar.
Sistema Help-
pawn Код:
if( help ) return SendClientMessage(playerid, -1, "Este e um comando de admin RCON");
Se o player quiser saber mais sobre o comando ( /ajudacomando adm).
Isnull-
pawn Код:
if( isnull( params ) ) return SendClientMessage(playerid, -1, "Erro: /adm [texto]");
Se o parametro estiver vazio (null) ou seja o player so escreveu "/adm" ira receber (return) a mensagem sobre como usar o comando.
Arrays- Uma array e uma variavel em que tu podes armazenar informaзao e aceder-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 colocar-lo em uma array na variavel chamada "pname" com o tamanho maximo de MAX_PLAYER_NAME (24) caracteres.
Format
pawn Код:
format( string, sizeof( string ),"(RCON) %s: %s", pname, params);
Nos formatamos a nossa mensagem, e ira armazemar-la na variavel "string", e "sizeof( string )" ira obter o tamanho maximo da string, neste caso declaramos 128.
Placeholders- "%s" insere a string. O primeiro "%s" e um placeholder para o nome do player e o segundo para o texto que ele escrever. (/adm [Texto])
SendClientMessageToAll- SendClientMessageToAll(-1, string); Isto ira mandar o texto que ele escreveu para todos os players online.
Examplo de uso
- O adm rcon PT escreve "/adm testando"
resultado:
Placeholders
Код:
% b Insere um nъmero nesta posiзгo em base binбria
% c Insere um ъnico caracter.
% d Insere um (inteiro) nъmero inteiro
% f Insere um nъmero de ponto flutuante (float).
% i Insere um nъmero inteiro.
% s Insere uma string. (usamos este a pouco)
% x Insere um nъmero em notaзгo hexadecimal.
%% Insere o caracter '%'
Criando comandos com sscanf
- Vamos comecar com o simples "/vida" command.
pawn Код:
YCMD:vida(playerid, params[], help)
{
new 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]");
if( PlayerID == INVALID_PLAYER_ID ) return SendClientMessage(playerid, -1, "[ERRO] Este playes esta OFFLINE");
SetPlayerHealth(ID, 100);
return 1;
}
Declarando
- new ID; e a variavel que declara o id do player que vamos dar vida.
Sistema help
pawn Код:
if( help ) return SendClientMessage(playerid, -1, "Este comando dara vida a 1 player!");
Como sempre se o paramentro "help" for usado, ira mostrar a mensagem que escrevemos ou seja a descricao do comando.
Sscanf
pawn Код:
if( sscanf( params, "d", ID ) ) return SendClientMessage(playerid, -1, "Erro: /vida [ID]");
Usamos o parametro, "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 deveriam ser por exemplo: /vida 0 se nao colocar assim obtera a mensagem de erro
INVALID_PLAYER_ID
pawn Код:
if( ID == INVALID_PLAYER_ID ) return SendClientMessage(playerid, -1, "[ERRO] Este playes esta OFFLINE");
Isto ira verificar se o ID que colocamos e um ID online no servidor, se nao for obtem a mensagem de erro.
SetPlayerHealth
- SetPlayerHealth(ID, 100);
Isto e para setar a vida do id a 100.
A formula da Sscanf no comando
- A formula da sscanf e esta:
pawn Код:
if(sscanf( params, "Especificacoes", Nossas variaveis ) ) // Se o player introduziu os parametros incorretos
{
// mensagem para avisar o player
}
Especificacoes
Usamos-las conforme o fim que queremos obter
Код:
a - se for um caracter.
f - se for um nъmero de ponto flutuante (float).
i ou d - se for um nъmero inteiro.
s - se for uma string.
x ou h - Insere um nъmero em notaзгo hexadecimal.
z - se for 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 andar sempre atualizar a tua lista de "/comandos".
pawn Код:
YCMD:comandos(playerid, params[], help)
{
if ( help ) return SendClientMessage(playerid, -1, "Lista de todos os comandos.");
new count = Command_GetPlayerCommandCount( playerid );
for ( new i = 0; i != count; ++i) SendClientMessage( playerid, -1, Command_GetNext ( i, playerid ) );
return 1;
}
Mensagem: UNKNOWN COMMAND
- Quando um player escreve um comando que nao existe recebe a mensagem: "SERVER: Unknown Command." entao como alterar essa mensagem?
Basta colocar a CallBack OnPlayerCommandPerformed e usar por exemplo assim:
pawn Код:
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if( !success ) return false;
return true;
}
Mas podemos colocar uma mensagem para ficar mais agradavel de ser ver, para isso usamos assim:
-
pawn Код:
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 );
}
return true;
}
Resultado final
- Source:
pawn Код:
#include <a_samp>
#include <YSI\y_commands>
#include <sscanf2>
main()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
}
public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
Command_AddAltNamed("information", "info");
return 1;
}
public OnGameModeExit()
{
return 1;
}
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);
return 1;
}
public OnPlayerConnect(playerid)
{
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
return 1;
}
public OnPlayerSpawn(playerid)
{
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
return 1;
}
public OnVehicleSpawn(vehicleid)
{
return 1;
}
public OnVehicleDeath(vehicleid, killerid)
{
return 1;
}
public OnPlayerText(playerid, text[])
{
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (strcmp("/mycommand", cmdtext, true, 10) == 0)
{
// Do something here
return 1;
}
return 0;
}
public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
return 1;
}
public OnPlayerExitVehicle(playerid, vehicleid)
{
return 1;
}
public OnPlayerStateChange(playerid, newstate, oldstate)
{
return 1;
}
public OnPlayerEnterCheckpoint(playerid)
{
return 1;
}
public OnPlayerLeaveCheckpoint(playerid)
{
return 1;
}
public OnPlayerEnterRaceCheckpoint(playerid)
{
return 1;
}
public OnPlayerLeaveRaceCheckpoint(playerid)
{
return 1;
}
public OnRconCommand(cmd[])
{
return 1;
}
public OnPlayerRequestSpawn(playerid)
{
return 1;
}
public OnObjectMoved(objectid)
{
return 1;
}
public OnPlayerObjectMoved(playerid, objectid)
{
return 1;
}
public OnPlayerPickUpPickup(playerid, pickupid)
{
return 1;
}
public OnVehicleMod(playerid, vehicleid, componentid)
{
return 1;
}
public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
return 1;
}
public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
return 1;
}
public OnPlayerSelectedMenuRow(playerid, row)
{
return 1;
}
public OnPlayerExitedMenu(playerid)
{
return 1;
}
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
return 1;
}
public OnRconLoginAttempt(ip[], password[], success)
{
return 1;
}
public OnPlayerUpdate(playerid)
{
return 1;
}
public OnPlayerStreamIn(playerid, forplayerid)
{
return 1;
}
public OnPlayerStreamOut(playerid, forplayerid)
{
return 1;
}
public OnVehicleStreamIn(vehicleid, forplayerid)
{
return 1;
}
public OnVehicleStreamOut(vehicleid, forplayerid)
{
return 1;
}
public OnDialogResponse(playerid, dialogid, response, 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 );
}
return true;
}
/* 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 parametro 'help' do comando que colocarmos
return 1;
}
YCMD:comandos(playerid, params[], help)
{
if ( help ) return SendClientMessage(playerid, -1, "Lista de todos os comandos.");
new count = Command_GetPlayerCommandCount( playerid );
for ( new i = 0; i != count; ++i) SendClientMessage( playerid, -1, Command_GetNext ( i, playerid ) );
return 1;
}
YCMD:ola(playerid, params[], help)
{
#pragma unused params, help
SendClientMessage(playerid, -1, "PT o comando funciona!");
return 1;
}
YCMD:testando(playerid, params[], help)
{
if (help) return SendClientMessage(playerid, -1, "comando lindo.");
SendClientMessage(playerid, -1, "funciona");
return 1;
}
YCMD:testando2(playerid, params[], help)
{
if (help) return SendClientMessage(playerid, -1, "comando feio.");
SendClientMessage(playerid, -1, "funciona2");
return 1;
}
YCMD:vida(playerid, params[], help)
{
new 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]");
if( PlayerID == INVALID_PLAYER_ID ) return SendClientMessage(playerid, -1, "[ERRO] Este playes esta OFFLINE");
SetPlayerHealth(ID, 100);
return 1;
}
YCMD:adm(playerid, params[], help)
{
new string[ 128 ];
new pname[ MAX_PLAYER_NAME ];
if( !IsPlayerAdmin(playerid) ) return SendClientMessage(playerid, -1, "Este comando nao podes usar");
if( help ) return SendClientMessage(playerid, -1, "Este e um comando de admin RCON");
if( isnull( params ) ) return SendClientMessage(playerid, -1, "Erro: /adm [texto]");
GetPlayerName( playerid, pname, sizeof( pname ) );
format( string, sizeof( string ),"(RCON) %s: %s", pname, params);
SendClientMessageToAll(-1, string);
return 1;
}
- Se eu me esqueзi de algo ou me expliquei mal em algo, por favor digam. Tentei o meu melhor para explicar direito para vos.
Creditos
- ****** - pelo processador de comandos e pela sscanf
SA:MP Wiki - pelas referencias
PT e SmiT - Pelo tutorial
Re: Usando y_commands e sscanf -
Diogo123 - 26.08.2013
Cara seu tuto e 100% incrнvel meu deus eu li ele por inteiro ;p isso vai ajudar muitas pessoas cara parabйns
Re: Usando y_commands e sscanf -
PT - 26.08.2013
Quote:
Originally Posted by Diogo123
Cara seu tuto e 100% incrнvel meu deus eu li ele por inteiro ;p isso vai ajudar muitas pessoas cara parabйns
|
vlw

tou pensando fazer y_ini agora mas ainda tenho de aprender umas coisinhas direito.
Biblioteca YSI e muito boa pra se usar no samp
Re: Usando y_commands e sscanf -
darkxdll - 26.08.2013
Уtimo tutorial , apesar de ter umas horas ali que vocк se enrolou kkk mais ficou legal.
Parabйns , isto sim й tutorial de qualidade , ganho meu REP
Re: Usando y_commands e sscanf -
Juninho_Oakley - 26.08.2013
Otimo pelo tutorial, Parabens!
Re: Usando y_commands e sscanf -
PT - 26.08.2013
Quote:
Originally Posted by darkxdll
Уtimo tutorial , apesar de ter umas horas ali que vocк se enrolou kkk mais ficou legal.
Parabйns , isto sim й tutorial de qualidade , ganho meu REP 
|
olha a hora da ultima vez que editei, fiquei noite toda nisso rsrsrs eram quase 6 da manha, mas acho que da pra entender bem
Quote:
Originally Posted by Juninho_Oakley
Otimo pelo tutorial, Parabens!
|
Muito Obrigado
Re: Usando y_commands e sscanf -
smiiir - 26.08.2013
niCE
Reput
Re: Usando y_commands e sscanf -
WLSF - 26.08.2013
Very good, visualmente o tуpico ficou atй parecido com os do ******, haja paciкncia pra mexer com esse tipo de organizaзгo, mas o resultado й уtimo.
Nгo cheguei a ler tudo, mas mesmo assim parabйns ! +2 rep
Re: Usando y_commands e sscanf -
PT - 26.08.2013
Quote:
Originally Posted by iSmirnoff
niCE
Reput
|
muito obrigado
Quote:
Originally Posted by Willian_Luigi
Very good, visualmente o tуpico ficou atй parecido com os do Y_Less, haja paciкncia pra mexer com esse tipo de organizaзгo, mas o resultado й уtimo.
Nгo cheguei a ler tudo, mas mesmo assim parabйns ! +2 rep
|
sim da muito trabalho mas o resultado e agradavel de se ler, ja agora muito obrigado
Quote:
Originally Posted by JesterAnkes
Bom tutorial, uso ele e realmente й muito bom!
|
muito obrigado
Quote:
Originally Posted by StrondA_
Bom tutorial, mais ainda prefiro ZCMD.
|
existe muita parecencia entre zcmd e y_commands ja pra n falar que a biblioteca YSI tem o master que le os comandos zcmd na mesma
Re: Usando y_commands e sscanf -
Juniiro3 - 26.08.2013
Gostei bastante do tutorial, mas ainda prefiro zcmd kk
+Rep
Re: Usando y_commands e sscanf -
PT - 26.08.2013
Quote:
Originally Posted by Juniiro3
Gostei bastante do tutorial, mas ainda prefiro zcmd kk
+Rep
|
muito obrigado, sim muitos preferem, mas a YSI tem 1 vasta gama de recursos disponнveis e isso e algo incrнvel desde seguranзa ate diversгo basta ter imaginaзao
Re: Usando y_commands e sscanf -
Juniiro3 - 26.08.2013
@OFF: Com esse post, vocк atingiu 666 posts '-'
Re: Usando y_commands e sscanf -
PT - 27.08.2013
Quote:
Originally Posted by Juniiro3
@OFF: Com esse post, vocк atingiu 666 posts '-'
|
o que tem? nao tendi xD
Re: Usando y_commands e sscanf -
Juniiro3 - 27.08.2013
666 = nъmero do kapiroto ...
Re: Usando y_commands e sscanf -
PT - 27.08.2013
Quote:
Originally Posted by Juniiro3
666 = nъmero do kapiroto ...
|
ok melhor esqueзer continuo sem perceber kkkk que isso?
Re: Usando y_commands e sscanf -
mau.tito - 27.08.2013
So uma pergunta este help da pra usar ele como um id ou uma string ??
# vo perguntar pq nao uso este estilo de cmd.
Re: Usando y_commands e sscanf -
PT - 27.08.2013
Quote:
Originally Posted by mau.tito
So uma pergunta este help da pra usar ele como um id ou uma string ??
# vo perguntar pq nao uso este estilo de cmd.
|
nao tendi a sua pergunta se explique melhor por favor..
Re: Usando y_commands e sscanf -
Renancito10 - 01.09.2013
Bom fiz tudo certinho dei o f5 mas quando vai dar spawn no server fica tudo branco porque?
Re: Usando y_commands e sscanf -
PT - 01.09.2013
como assim?
Re: Usando y_commands e sscanf -
Schocc - 01.09.2013
Quote:
Strtok, ambos foram criados por Y_Less.
|
strtok nгo foi feito por DracoBlue?
Gostei do tutorial, quando puder expandir mais sobre o assunto.