[INC] DRCMD 1.2
Новый, быстрый командный препроцессор.
Пример команды:
Code
200?’200px’:»+(this.scrollHeight+5)+’px’);»>DRCMD:givemoney(playerid, params[])
{
new money, player;
if(sscanf(params, «dd», player, money)) return SendClientMessage(playerid, 0xFFFFFF, «USAGE: /givemoney [playerid] [money]»);
else if(money <= 0) return SendClientMessage(playerid, 0xFFFFFF, «ERROR: The money ammount is incorrect!»);
else if(!IsPlayerConnected(player)) return SendClientMessage(playerid, 0xFFFFFF, «The player isn’t online!»);
else
{
format(string, sizeof(string), «You successfully gove %d$ to the following player: %dID», money, player);
SendClientMessage(playerid, 0xFFFFFF, string);
format(string, sizeof(string), «You get %d$!», money);
SendClientMessage(player, 0xFFFFFF, string);
}
return 1;
}
Code
200?’200px’:»+(this.scrollHeight+5)+’px’);»>DRCMD:gm(playerid, params[])
{
return drcmd_givemoney(playerid, params[]);
}
Синонимы:
Code
200?’200px’:»+(this.scrollHeight+5)+’px’);»>DRCMD:command(playerid, params[])
DRCMD_command(playerid, params[])
drcmd(command, playerid, params[])
CMD:command(playerid, params[])
COMMAND:command(playerid, params[])
Тесты, показывающие что данный препроцессор обходит по скорости zCMD:
Code
200?’200px’:»+(this.scrollHeight+5)+’px’);»>#include <a_samp>
#define DRCMD:%1(%2,%3) \
forward drcmd_%1(%2,%3); \
public drcmd_%1(%2,%3)
#define DRCMD_%1(%2,%3) \
DRCMD:%1(%2,%3)
#define drcmd(%1,%2,%3) \
DRCMD:%1(%2,%3)
#define CMD:%1(%2,%3) \
DRCMD:%1(%2,%3)
#define COMMAND:%1(%2,%3) \
DRCMD:%1(%2,%3)
/*public OnFilterScriptInit()
{
new
returned;
returned = OnPlayerCommandText(0, «/tesztparancs»); // Itt hнvod meg a parancs feldolgozуt
printf(«returned: %d», returned);
return 1;
}*/
main() { }
public OnGameModeInit()
{
#define MAX_TEST (990000)
for(new d; d < 10; ++d) print(» «);
new dcmdtest = GetTickCount();
for(new a; a < MAX_TEST; ++a)
OnPlayerDraCommandText(0, «/drcmd teszt»);
printf(«# DRCMD in %d»,GetTickCount() — dcmdtest);
new zcmdtest = GetTickCount();
for(new a; a < MAX_TEST; ++a)
OnPlayerCommandText(0, «/drcmd teszt»);
printf(«# ZCMD in %d»,GetTickCount() — zcmdtest);
return true;
}
forward OnPlayerDraCommandText(playerid, cmdtext[]);
public OnPlayerDraCommandText(playerid, cmdtext[])
{
new
function[32],
szokozmeddig = -1;
while(++szokozmeddig < strlen(cmdtext)) if((cmdtext[szokozmeddig] == ‘ ‘)) break;
strmid(function, cmdtext, 1, szokozmeddig);
format(function, sizeof(function), «drcmd_%s», function);
while(cmdtext[szokozmeddig] == ‘ ‘) szokozmeddig++;
if(funcidx(function) != -1)
{
if(szokozmeddig == strlen(cmdtext))
{
return CallLocalFunction(function, «is», playerid, «\1»);
}
return CallLocalFunction(function, «is», playerid, cmdtext[szokozmeddig]);
}
return 0;
}
static
bool:zcmd_g_HasOPCS = false,
bool:zcmd_g_HasOPCE = false;
#define MAX_FUNC_NAME (32)
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]);
}
http://pastebin.com/iArUXrsY
Автор: Drake1994