SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 13 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] Usando y_commands e sscanf

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11643
    Moedas : 1032950
    Data de inscrição : 06/10/2011
    Idade : 29
    Localização : Brasil

    [Tutorial] Usando y_commands e sscanf Empty [Tutorial] Usando y_commands e sscanf

    Mensagem por Weslley_Script Sex 7 Abr 2023 - 9:42

    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:

    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
    • 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 Код:

    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
    • 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;

    peão Код:

    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 Код:

    Código:
    YCMD : teste ( playerid, o [ ] , ajuda )
    {
        return  1 ;
    }


    Sistema help do y_commands

    Analise o comando abaixo:
    peão Код:

    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 Код:

    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 Код:

    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
    • 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
    Код:

    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




    [Tutorial] Usando y_commands e sscanf D07Xwqb
    [Tutorial] Usando y_commands e sscanf Yjab9HN

      Data/hora atual: Seg 25 Nov 2024 - 19:44