- Contenidos"a_cmd.inc" para Pawn
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:
- A_CMD v0.1
- 318
- 289
- 303
- 272
- 273
- ZCMD v0.3.1
- 297
- 318
- 310
- 319
- 304
- Y_COMMANDS v0.1.4
- 385
- 362
- 373
- 358
- 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
| Callback
|
Su uso es bastante simple, parecido a los 2 anteriormente mencionados.
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;
}
Si te preguntas que estarб dentro de este funcionamiento tan уptimo, aquн esta el cуdigo fuente.
/*******************************************************************************
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[]);
- 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 |
- 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 |
#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;
}
// =============================================================================
Muy buйn procesador de comandos, no creo que ese test de velocidad sea correcto ya que YCMD es mбs rбpido que ZCMD, recuerde que YCMD depende de varias librerias YSI lo cuбl ayuda en su optimizaciуn.
Un saludo. |
Por ahн usу el YCMD viejo, ya que hace unos pocos dнas fue actualizado, hasta йsta actualizaciуn, ZCMD seguнa siendo mejor, pero en йsta ъltima actualizaciуn, YCMD lo superу.
|