[FilterScript] a_cmd, procesador de comandos muy rapido
#1

Include
Procesador de comandos
"a_cmd.inc" para Pawn
- Contenidos
  • El "include" en sн.
    • Una pequeсa definiciуn.
    • Comparaciуn de velocidades.
  • Su uso
    • Sus "callbacks".
    • Forma de uso.
  • Cуdigo
    • El cуdigo fuente en PAWN del "include"

-- Una pequeсa definiciуn --
Basicamente, un procesador de comandos es un "script" que sirve para hacer que la tarea de reconocimiento de un comando basado en PAWN sea mбs rбpido que la forma convencional. Los mбs conocidos son "y_commands" por su creador ser uno de los mas activos en publicaciones del foro. Tambiйn esta "zcmd" que es mas rбpido que el primero segъn los "tests" de velocidad que he hecho. Este no se queda atrбs con velocidades muy similares a el ъltimo mencionado e incluso mejores.
-- Comparaciуn de velocidades --
El "test" comparativo se hizo con 3 procesadores de comandos. Estos fueron "y_commands", "zcmd" y "a_cmd", resultando en "zcmd" como el mбs rбpido con un dнgito mнnimo sobre "a_cmd" mientras que "y_commands" se quedу atras por mucho. Los tiempos en procesar 10.000 comandos fueron los siguientes:
  1. A_CMD v0.1
    1. 318
    2. 289
    3. 303
    4. 272
    5. 273
  2. ZCMD v0.3.1
    1. 297
    2. 318
    3. 310
    4. 319
    5. 304
  3. Y_COMMANDS v0.1.4
    1. 385
    2. 362
    3. 373
    4. 358
    5. 395
Se hicieron 5 "tests" con cada uno de los "includes". Como aprecian, "a_cmd" fuй el con mayor rendimiento seguido de "zcmd", mientras que "y_commands" se queda a una distancia exagerada.
-- Sus "callbacks" --
Usa 3 "callbacks" mientras que crea 2 de estos.
OnPlayerCommandUse(playerid, cmdtext[], bool:existe)Callback
  • playerid
    • jugador que usa el comando
  • cmdtext[]
    • comando usado
  • bool:existe
    • true = el comando existe
    • false = el comando no existe
Callback
  • playerid
    • jugador que usa el comando
  • cmdtext[]
    • comando usado
-- Forma de uso --
Su uso es bastante simple, parecido a los 2 anteriormente mencionados.
pawn Код:
new bool:var, c;

CMD:comando2(playerid)
{
    //Comando sin parбmetros
   
    if(var != false) return SendClientMessage(playerid, -1, "Usa /comando");
   
    //Resto del cуdigo
    print("Usado correctamente");
    var = true;
    c++;
   
    return 1;
}

CMD:comando(playerid, parametros[])
{
    //Comando con parбmetros
   
    //Si no ingresa parбmetros
    if(isnull(parametros)) return SendClientMessage(playerid, -1, "Ingrese parбmetros");
   
    if(var != true) return SendClientMessage(playerid, -1, "Usa /comando2");
   
    //Resto del cуdigo
    print("Usado correctamente");
    var = false;
    c++;
   
    return 1;
}

public OnPlayerCommandB(playerid, cmdtext[])
{
    if(c > 10) return SendClientMessage(playerid, -1, "Esos comandos solo puedes usarlo un mбximo de 10 veces");
   
    return 1;
}
public OnPlayerCommandUse(playerid, cmdtext[], bool:existe)
{
    //Existencia de un comando
    if(existe != true) return SendClientMessage(playerid, -1, "Ese comando no exise");
   
    return 1;
}
-- El cуdigo fuente en PAWN del "include" --
Si te preguntas que estarб dentro de este funcionamiento tan уptimo, aquн esta el cуdigo fuente.
pawn Код:
/*******************************************************************************

    DesingMyCry
    Shyny
                A_CMD
                    PROCESADOR DE COMANDOS
                   
                v0.1 - 25 04 2013

*******************************************************************************/


#include <a_samp>

#if defined _acmd_included
    #endinput
#endif
#define _acmd_included

#define COMMAND:%1(%2)          \
            forward c_%1(%2); \
            public c_%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] == '#')
#endif

#define MAX_CMD_LEN 32

forward OnPlayerCommandB(playerid, cmdtext[]);
forward OnPlayerCommandUse(playerid, cmdtext[], bool:existe);

public OnPlayerCommandText(playerid, cmdtext[])
{
    CallLocalFunction("OnPlayerCommandB", "is", playerid, cmdtext);
    new e, bool:ex=false, exi, cmdtext_[MAX_CMD_LEN], tcmd[MAX_CMD_LEN];
    strcat(cmdtext_, cmdtext[1], sizeof cmdtext_);
    for(new l = 0; l < strlen(cmdtext_); l++)
    {
        if(cmdtext_[l] == ' '){ e = l; ex=true; strdel(cmdtext_, l, MAX_CMD_LEN+1); break;}
    }
    format(tcmd, sizeof tcmd, "c_%s", cmdtext_);
    if(ex != false){ exi = CallLocalFunction(tcmd, "is", playerid, cmdtext[e+2]); }
    else{ exi = CallLocalFunction(tcmd, "is", playerid, "#"); }

    switch(exi)
    {
        case 0: CallLocalFunction("OnPlayerCommandUse", "isb", playerid, cmdtext, false);
        default: CallLocalFunction("OnPlayerCommandUse", "isb", playerid, cmdtext, true);
    }
   
    return 1;
}

#if defined _ALS_OnPlayerCommandText
    #undef OnPlayerCommandText
#else
    #define _ALS_OnPlayerCommandText
#endif
#define OnPlayerCommandText acmd_OnPlayerCommandText
forward acmd_OnPlayerCommandText(playerid, cmdtext[]);
Velocidades (test comparado con zcmd)
zcmd:

Quote:

- 22944 milisegundos en la prueba: 0
- 21712 milisegundos en la prueba: 1
- 21645 milisegundos en la prueba: 2
- 21691 milisegundos en la prueba: 3
- 21734 milisegundos en la prueba: 4
- 21746 milisegundos en la prueba: 5
- 21601 milisegundos en la prueba: 6
- 21786 milisegundos en la prueba: 7
- 21777 milisegundos en la prueba: 8
- 21877 milisegundos en la prueba: 9

a_cmd:

Quote:

- 22601 milisegundos en la prueba: 0
- 21059 milisegundos en la prueba: 1
- 21083 milisegundos en la prueba: 2
- 21279 milisegundos en la prueba: 3
- 21043 milisegundos en la prueba: 4
- 21126 milisegundos en la prueba: 5
- 21136 milisegundos en la prueba: 6
- 21147 milisegundos en la prueba: 7
- 21194 milisegundos en la prueba: 8
- 21123 milisegundos en la prueba: 9

El Test fue hecho a 1,000,000 de iteraciones por diez repeticiones.

Script de prueba para hacer test
pawn Код:
#include <a_samp>
#include <a_cmd>

// Script para test de velocidad de ShinyDavid.

#define ITERACIONES  1000000
#define REPETICIONES 10
new Tiempos[REPETICIONES];

public OnGameModeInit()
{
    for(new z=0;z<REPETICIONES;z++)
    {
        Tiempos[z] = GetTickCount();
        for(new y=0;y<ITERACIONES;y++)
        {
            CallRemoteFunction("OnPlayerCommandText","is",0,"/comando1 0 param1");
        }
        printf("- %d milisegundos en la prueba: %d",GetTickCount()-Tiempos[z],z);
    }
    return 1;
}

public OnPlayerCommandText(playerid,cmdtext[])
{
    return 0;
}

//================================= Comando ====================================
CMD:comando1(playerid,params[])
{
    return 1;
}
// =============================================================================
-- Crйditos --
  • DesingMyCry 100% codificacion, creacion del post, test.
  • ShinyDavid 100% codigo del test y hacer nada.
  • SA-MP Team funciones nativas
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 4 Guest(s)