[INC] DRCMD 1.2

29 января 2012 | Рубрика: Pawn libraries

[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