[Tutorial] Usando y_commands e sscanf
#1

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:
Код:
plugins sscanf.dll
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:
Код:
plugins sscanf.so
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:

Код:
(RCON) PT: testando
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
Reply
#2

Cara seu tuto e 100% incrнvel meu deus eu li ele por inteiro ;p isso vai ajudar muitas pessoas cara parabйns
Reply
#3

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
Reply
#4

У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
Reply
#5

Otimo pelo tutorial, Parabens!
Reply
#6

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
Reply
#7

niCE


Reput
Reply
#8

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
Reply
#9

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
Reply
#10

Gostei bastante do tutorial, mas ainda prefiro zcmd kk

+Rep
Reply
#11

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
Reply
#12

@OFF: Com esse post, vocк atingiu 666 posts '-'
Reply
#13

Quote:
Originally Posted by Juniiro3
Посмотреть сообщение
@OFF: Com esse post, vocк atingiu 666 posts '-'
o que tem? nao tendi xD
Reply
#14

666 = nъmero do kapiroto ...
Reply
#15

Quote:
Originally Posted by Juniiro3
Посмотреть сообщение
666 = nъmero do kapiroto ...
ok melhor esqueзer continuo sem perceber kkkk que isso?
Reply
#16

So uma pergunta este help da pra usar ele como um id ou uma string ??
# vo perguntar pq nao uso este estilo de cmd.
Reply
#17

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..
Reply
#18

Bom fiz tudo certinho dei o f5 mas quando vai dar spawn no server fica tudo branco porque?
Reply
#19

como assim?
Reply
#20

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.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)