За последнее время в паблик выкладывалось много разных командных процессоров. Один самый быстрый командный процессор сменялся другим, шли споры, какой из них быстрее и т.д. и т.п. Пришло время положить конец этим спорам. Представляю вашему вниманию новый командный движок DC_CMD, реализованный в виде плагина. Все команды обрабатываются в плагине, что ускоряет их выполнение, однако принцип работы схож с ZCMD.
Установка:
1. Файл dc_cmd.dll (или dc_cmd.so, если на хостинге) закинуть в папку "plugins", dc_cmd.inc - в папку "pawno/include".
2. В server.cfg в поле plugins добавить dc_cmd (на хостинге - dc_cmd.so)
3. После строки #include <a_samp> добавить подключение инклуда
Внимание: Если вы используете команды на DC_CMD в фильтрскрипте, не забудьте в самом верху кода указать #define FILTERSCRIPT. Выглядеть это должно примерно так:
Код
#define FILTERSCRIPT // сама строка
#include <a_samp> // дальше - инклуды
#include <dc_cmd>
В моде создавать команды, как для ZCMD:
Код
// тестовая команда
CMD:info(playerid, params[])
{
return SendClientMessage(playerid, -1, "Плагин dc_cmd успешно установлен.");
}
Функционал плагина:
Можно создавать команды с альтернативными именами 3 разными способами:
1. Макрос ALTX
Данным способом можно создавать любые альт. имена для команд (в т.ч. и русские). Использование:
Код
ALTX:<команда>(<альт. имена>); // Здесь <альт. имена> - одно или несколько альт. названий для команды.
Пример:
Код
CMD:help(playerid, params[])
{
// ...
}
ALTX:help("/info", "/помощь", "/инфо");
CMD:menu(playerid, params[])
{
return ShowPlayerDialog(playerid, ...);
}
ALTX:menu("/меню");
2. Функция RegisterAlt
Код
RegisterAlt(оригинальная команда, команда на русском языке)
RegisterAlt(оригинальная команда, команда на русском языке (1), команда на русском языке (2), команда на русском языке (3), ...)
Пример:
Код
public OnGameModeInit()
{
RegisterAlt("/family", "/f");
RegisterAlt("/help", "/info", "/hlp", "/помощь", "/h"); // теперь, если в игре набрать "/h" или "/помощь", будет вызвана команда /help
//...
}
3. Макрос ALT
Использование:
Код
ALT:<имя команды>:<имя альт. команды>;
Пример: допустим, мы создали команду "/info" и нужно сделать сокращённый вариант "/i". Пример использования ALT:
Код
CMD:info(playerid, params[]) // тестовая команда
{
return SendClientMessage(playerid, -1, "Плагин dc_cmd успешно установлен.");
}
ALT:info:i; // "/i" - альтернативный вариант для "/info"
На данный момент рекоментуется использовать 1-й способ. Остальные 2 оставлены лишь для совместимости с предыдущими версиями DC_CMD.
Коллбэки OnPlayerCommandReceived и OnPlayerCommandPerformed:
OnPlayerCommandReceived:
Код
OnPlayerCommandReceived(playerid, cmdtext[])
Вызывается перед обработкой команды. В ней можно указать условия выполнения команды. При этом с помощью return 1/0 можно разрешить/запретить выполнение команды. Пример:
Код
public OnPlayerCommandReceived(playerid, cmdtext[])
{
if(PlayerInfo[playerid][pMute] == 1) // если у игрока затычка (/mute)
{
SendClientMessage(playerid, -1, "Дождитесь окончания действия заглушки!");
return 0; // передать плагину, чтобы он не выполнял команду
}
return 1; // разрешить выполнение команды
}
OnPlayerCommandPerformed:
Код
OnPlayerCommandPerformed(playerid, cmdtext[], success);
Вызывается после выполнения команды. При этом если success = 1 - команда выполнилась успешно, success = 0 - с ошибкой, success = -1 - команда не найдена. Таким образом можно самостоятельно сделать поддержку стандартных команд:
Код
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if(success == -1) // если команда не найдена
{
return OnPlayerCommandText(playerid, cmdtext);
}
return 1; // разрешить выполнение команды
}
Либо можно сделать сообщение о несуществующей команде:
Код
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if(success == -1) // если команда не найдена
{
return SendClientMessage(playerid, -1, "Несуществующая команда. Используйте /help, чтобы узнать список команд сервера.");
}
return 1;
}
Вызов команд напрямую из мода:
В версии 2.02 был добавлен макрос "cmd::", благодаря которому можно удобно вызывать команды из любого места в моде.
Пример использования:
Код
cmd::help(playerid, ""); // без параметров
// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);
Динамическое переименование и удаление команд:
В версии 2.8 были добавлены функции RenameCmd и RemoveCmd для переименования и удаления команд соответственно.
Примеры использования:
Код
RenameCmd("/help", "/menu"); // команда /help будет переименована в /menu
Код
RemoveCmd("/makeadmin"); // команда /makeadmin будет удалена и больше не будет работать
Сравнение с другими командными процессорами (2 разные версии):
Тест скорости приложен к сообщению.
Скачать (*.dll, *.so, *.inc): http://gta-news.org/files/plugins/dc_cmd_v2.8_daniel_cortez.zip
Автор: Daniel_Cortez.