SSGamers - Fique atualizado
Chegou o novo tema 6.1.3 / SSGames - Servidores online de qualidade - Inscreva-se Ja! é entre para nossa comunidade! - Ouça nossa web radio -Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

[INC] zcmd 0.3.1 | Fast & simples processador de comandos (atualizado 30/10/2009)

Weslley_Script
SS - Fundador
SS - Fundador
Weslley_Script
Steam Steam : WeslleySSGames
Zello : WeslleySSGames
Mensagens : 9109
Moedas : 1024576
Data de inscrição : 06/10/2011
Idade : 24
Localização : Brasil

Mensagem por Weslley_Script em Ter 20 Set 2016 - 7:32

Descrição Este é apenas um pouco de incluir que usa OnPlayerCommandText () para processar comandos dos jogadores. Cada comando tem uma função separada como em dcmd, mas zcmd chama-los diretamente via CallLocalFunction () . Esse método é muito mais rápido do que quando você sucessivamente comparar o jogador texto inserido a cada comando que você tem em seu script (especialmente se ele enviar um cmd inexistente, você passa embora todos então) e sua superioridade sobre a maneira antiga é proporcional ao número de comandos. Eu fiz um teste de velocidade quando eu acabei de statrted pensar sobre esta abordagem, você pode encontrar seus resultados aqui . 

Usage Tudo que você precisa para adicionar um comando é apenas fazer uma função pública usando macro pré-definido especial, como este:
Código:
COMMAND:mycommand(playerid, params[]) // or CMD:mycommand(playerid, params[])
{
  // Do something
  return 1;
}

ou (estilo antigo):
Código:
command(mycommand, playerid, params[]) // or cmd(mycommand, playerid, params[])
{
  // Do something
  return 1;
}


Este é um chamado quando alguém envia um comando. Se você retornar 0 aqui, o comando não será executado.
Código:
OnPlayerCommandPerformed(playerid, cmdtext[], success)

E este é chamado após a execução do comando, aqui se "retornar 0", o jogador verá a mensagem padrão "Comando desconhecido". O parâmetro "sucesso" é igual ao valor retornado pela função de comando de retorno (se não existir o sucesso vai ser 0). Note-se que não é necessário para adicionar esses retornos de chamada para o seu script, se você não usá-los. Como fazer dois comandos diferentes fazendo a mesma coisa Por exemplo, você tem / algo cmd:
Código:
COMMAND:something(playerid, params[])
{
  // some stuff here
  return 1;
}
}

e você quiser criar um outro como o / outra que faz o / algo faz. A maneira mais simples de fazer isso é:
Código:
COMMAND:something(playerid, params[])
{
  // some stuff here
  return 1;
}

Nota # 1: Se você quiser usar zcmd em um filterscript, colocar isso definir antes de incluir:
Código:
#define FILTERSCRIPT

Nota # 2: Se você quiser verificar se cadeia de parâmetros está vazia, não deve fazê-lo gosto:
Código:
if (!strlen(params))
{
  // no parameters
}

ou:
Código:

if (!params[0])

porque o seu comprimento nunca é nula (leia mais aqui ), basta usar isnull () incluído na zcmd:
Código:
if (isnull(params)

Na verdade, se você usar sscanf você não precisa fazer isso, pois foi construído com verificação isnull. Aqui está um exemplo de como você pode fazer de comando / givemoney usando zcmd com sscanf:
Código:
COMMAND:givemoney(playerid, params[])
{
   if (IsPlayerAdmin(playerid))
   {
      new
        toplayerid, // the player we want to give money to
        amount;
      // extracting player's ID and amount from params
      if (!sscanf(params, "ii", toplayerid, amount))
      {
        if (toplayerid != INVALID_PLAYER_ID)
        {
          new
            message[40];
          GivePlayerMoney(toplayerid, amount);
          format(message, sizeof(message), "You got $%d from admin!", amount);
          SendClientMessage(toplayerid, 0x00FF00FF, message);
        }
        else SendClientMessage(playerid, 0xFF0000FF, "That player is not connected");
      }
      else SendClientMessage(playerid, 0xFFFFFFFF, "Usage: /givemoney <playerid> <amount>");
   }
   else SendClientMessage(playerid, 0xFF0000FF, "Only admins can use this command!");
   return 1;
}

Codigo logo abaixo:

Código:
/**********************************
 *                                *
 *   @Author:      ZeeX           *
 *   @Version:     0.3.1          *
 *   @Released:    31/10/2009     *
 *                                *
 **********************************/

#if defined _zcmd_included
   #endinput
#endif   
#define _zcmd_included

#define MAX_FUNC_NAME (32)

#define COMMAND:%1(%2)          \
         forward cmd_%1(%2); \
         public cmd_%1(%2)      
         
#define CMD:%1(%2) \
         COMMAND:%1(%2)

#define command(%1,%2,%3) \
         COMMAND:%1(%2, %3)      
      
#define cmd(%1,%2,%3) \
         COMMAND:%1(%2, %3)

#if !defined isnull
   #define isnull(%1) \
            ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif


forward OnPlayerCommandReceived(playerid, cmdtext[]); 
forward OnPlayerCommandPerformed(playerid, cmdtext[], success); 


static
   bool:zcmd_g_HasOPCS = false,
   bool:zcmd_g_HasOPCE = false;

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
   zcmd_g_HasOPCS = funcidx("OnPlayerCommandReceived") != -1;
   zcmd_g_HasOPCE = funcidx("OnPlayerCommandPerformed") != -1;
    return CallLocalFunction("zcmd_OnFilterScriptInit", "");
}

#if defined _ALS_OnFilterScriptInit
    #undef OnFilterScriptInit
#else
    #define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit zcmd_OnFilterScriptInit
forward zcmd_OnFilterScriptInit();

#else /*not a filterscript*/

public OnGameModeInit()
{
   zcmd_g_HasOPCS = funcidx("OnPlayerCommandReceived") != -1;
   zcmd_g_HasOPCE = funcidx("OnPlayerCommandPerformed") != -1;
   if (funcidx("zcmd_OnGameModeInit") != -1)
   {
      return CallLocalFunction("zcmd_OnGameModeInit", "");
   }   
   return 1;
}

#if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
#else
    #define _ALS_OnGameModeInit
#endif
#define OnGameModeInit zcmd_OnGameModeInit
forward zcmd_OnGameModeInit();

#endif /*if defined FILTERSCRIPT*/

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (zcmd_g_HasOPCS && !CallLocalFunction("OnPlayerCommandReceived", "is", playerid, cmdtext))
    {
        return 1;
    }
    new
        pos,
        funcname[MAX_FUNC_NAME];
    while (cmdtext[++pos] > ' ') 
   {
      funcname[pos-1] = tolower(cmdtext[pos]); 
   }
   format(funcname, sizeof(funcname), "cmd_%s", funcname);
    while (cmdtext[pos] == ' ') pos++;
   if (!cmdtext[pos])
   {
      if (zcmd_g_HasOPCE)
      {
         return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, "\1"));
      }
      return CallLocalFunction(funcname, "is", playerid, "\1");   
   }
   if (zcmd_g_HasOPCE)
   {
      return CallLocalFunction("OnPlayerCommandPerformed", "isi", playerid, cmdtext, CallLocalFunction(funcname, "is", playerid, cmdtext[pos]));
   }
   return CallLocalFunction(funcname, "is", playerid, cmdtext[pos]);
}

#if defined _ALS_OnPlayerCommandText
    #undef OnPlayerCommandText
#else
    #define _ALS_OnPlayerCommandText
#endif
#define OnPlayerCommandText zcmd_OnPlayerCommandText
forward zcmd_OnPlayerCommandText(playerid, cmdtext[]);

Agradecimentos especiais a:
- Y_Less



[INC] zcmd 0.3.1 | Fast & simples processador de comandos (atualizado 30/10/2009) D07Xwqb
[INC] zcmd 0.3.1 | Fast & simples processador de comandos (atualizado 30/10/2009) Yjab9HN

^
subir