Pawn. Создание команд разными способами

На данный момент существует множество способов создания команд в SA-MP’е. Самые известные из них: простое добавление команд в OnPlayerCommandText, zcmd и dcmd.

Как работает zcmd?

Каждая созданная команда создаёт паблик функцию.

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

Всё, что написано в вашем OnPlayerCommandText игнорируется.

#define OnPlayerCommandText zcmd_OnPlayerCommandText
forward zcmd_OnPlayerCommandText(playerid, cmdtext[]);

В самом инклуде создаётся OnPlayerCommandText в котором написан обработчик команд.

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]);

Очень много лишнего, что несомненно сказывается на скорости работы при небольшом количестве команд.

Тест скорости(с одной командой)

Исходник теста на Pastebin.com
В тесте участвовали обычные проверки(old), zcmd, dcmd и ncmd(new).

zcmd: 739
old: 399
new: 415
dcmd: 507
 
zcmd: 788
old: 413
new: 392
dcmd: 432
 
zcmd: 777
old: 422
new: 379
dcmd: 457

Вывод

Если в вашем моде большое количество команд, то команды следует перевести на систему zcmd. При небольшом количестве команд(< 10) следует использовать старый добрый метод с проверками или ncmd.

Перейти к верхней панели