PDA

Просмотр полной версии : [Plugin] DC_CMD v2.8 (23/03/14)



Daniel_Cortez
22.04.2013, 07:08
Всем привет.

За последнее время в паблик выкладывалось много разных командных процессоров.
Один самый быстрый командный процессор сменялся другим, шли споры, какой из них быстрее и т.д. и т.п.
Пришло время положить конец этим спорам.
Представляю вашему вниманию новый командный движок DC_CMD, реализованный в виде плагина.

Все команды обрабатываются в плагине, что ускоряет их выполнение, однако принцип работы схож с ZCMD.

Установка:
Файл dc_cmd.dll (или dc_cmd.so, если на хостинге) закинуть в папку "plugins", dc_cmd.inc - в папку "pawno/include".
В server.cfg в поле plugins добавить dc_cmd (на хостинге - dc_cmd.so)
После строки #include <a_samp> добавить подключение инклуда

#include <dc_cmd>
Внимание: Если вы используете команды на DC_CMD в фильтрскрипте, не забудьте в самом верху кода указать #define FILTERSCRIPT.
Выглядеть это должно примерно так:

#define FILTERSCRIPT // сама строка

#include <a_samp> // дальше - инклуды
#include <dc_cmd>
В моде создавать команды, как для ZCMD:

// тестовая команда
CMD:info(playerid, params[])
{
return SendClientMessage(playerid, -1, "Плагин dc_cmd успешно установлен.");
}

Функционал плагина:
Можно создавать команды с альтернативными именами 3 разными способами:
Макрос ALTX

Данным способом можно создавать любые альт. имена для команд (в т.ч. и русские).
Использование:

ALTX:<команда>(<альт. имена>);
Здесь <альт. имена> - одно или несколько альт. названий для команды.
Пример:

CMD:help(playerid, params[])
{
// ...
}
ALTX:help("/info", "/помощь", "/инфо");

CMD:menu(playerid, params[])
{
return ShowPlayerDialog(playerid, ...);
}
ALTX:menu("/меню");
Функция RegisterAlt

RegisterAlt(оригинальная команда, команда на русском языке)
RegisterAlt(оригинальная команда, команда на русском языке (1), команда на русском языке (2), команда на русском языке (3), ...)
Пример:

public OnGameModeInit()
{
RegisterAlt("/family", "/f");
RegisterAlt("/help", "/info", "/hlp", "/помощь", "/h"); // теперь, если в игре набрать "/h" или "/помощь", будет вызвана команда /help
//...
}

Макрос 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 будет удалена и больше не будет работать



Тест скорости: http://rghost.ru/56431688

http://s3.hostingkartinok.com/uploads/images/2014/03/2ff0f4a62b6024ca39fcc73fff275460.png


Скачать:
Плагин (.dll, .so, .inc): https://www.dropbox.com/s/5bfm5tfgliui9k2/DC_CMD_2.8.zip?dl=1

Автор: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)


Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!

Mark_Twein
22.04.2013, 14:46
DC - Daniel_Cortez. А так посмотрю, + поставлю.

Nixson_West
22.04.2013, 16:44
как раз искал,большое спасибо.

Daniel_Cortez
12.05.2013, 22:26
Плагин обновлён до версии 2.0.
Добавлена поддержка команд на русском языке и колбэки OnPlayerCommandPerformed и OnPlayerCommandReceived.
Подробности в 1 посте.

ZabreDun
12.05.2013, 22:34
Судя по тестам, процессор довольно шустрый.

JDeax
15.05.2013, 02:33
Вот как раз искал!

Mike
19.05.2013, 20:04
То что нужно!

Daniel_Cortez
13.07.2013, 11:19
И плагин снова обновлён.

Исправлена критическая ошибка, возникавшая после рестарта сервера.
Добавлен макрос "cmd::" для удобства вызова команд из мода.

Всем, кто использует плагин, просьба обновить его до самой последней версии (новые ссылки, как всегда, в 1 посте).

OKStyle
17.09.2013, 11:14
Тему в важные) В последнем примере разве не надо strval() добавить в параметр? Или там строка сама по себе входной аргумент?

Можно, в принципе, убрать ALT, т.к. есть RegisterAlt. И не мешало бы пример использования с параметрами (с и без sscanf) привести. Например, на этой команде:

if(strcmp(cmd, "/setadmin", true) == 0)
{
new tmp[32];
tmp = strtok(cmdtext, idx);
new targetid = strval(tmp);
tmp = strtok(cmdtext, idx);
new level = strval(tmp);
SetPVarInt(targetid, "Admin", level);
new string[128];
format(string, sizeof(string), "Администратор %s назначил игроку %s админ-уровень %d", PlayerInfo[playerid][pName], PlayerInfo[targetid][pName], level);
SendAdminMessage(string);
format(string, sizeof(string), "Администратор %s назначил Вам админ-уровень %d", PlayerInfo[playerid][pName], level);
SendClientMessage(targetid, COLOR_RED_WARNING, string);
return 1;
}

Salvacore
30.10.2013, 20:16
Спасибо

Nazarik
08.11.2013, 19:35
[18:30:30] Loading plugin: dc_cmd.so
[18:30:30] Failed (plugins/dc_cmd.so: undefined symbol: _ZN5boost9unordered6detail19prime_list_templateIjE5valueE)

пришлось временно отказаться от dc_cmd :(

(хост: ice-host)

Salvacore
08.11.2013, 20:47
[18:30:30] Loading plugin: dc_cmd.so
[18:30:30] Failed (plugins/dc_cmd.so: undefined symbol: _ZN5boost9unordered6detail19prime_list_templateIjE5valueE)

пришлось временно отказаться от dc_cmd :(

(хост: ice-host)

Напишите в вопросы,Daniel Ответит...

Lutark
10.11.2013, 01:16
Давно уже пользуюсь им, я думал все перешли на него? Или это ещё для многих Америка...

Mr_David
13.11.2013, 20:29
Вообще няшный ;3

Daniel_Cortez
28.01.2014, 22:57
Плагин обновлён до версии 2.5

Переписан алгоритм обработки команд. Результат - повышение быстродействия в 2 раза (по сравнению с предыдущей версией 2.02).
http://s2.hostingkartinok.com/uploads/images/2014/01/9aa889a8c54577a0934030196a8c8f4b.jpg

Имена public-функций теперь начинаются с префикса "cmd_" (префикс "_" в версиях 1.0-2.02 был слишком опасен, т.к. такой префикс мог быть не только у команд).

Чтобы использовать на сервере новую версию плагина, вам потребуется перекомпилировать мод с инклудом dc_cmd.inc новой версии.

Скачать: http://rghost.ru/52031541

Первый пост обновлён.

P.S.: Скомпилирована новая экспериментальная версия для Linux. Всем тем, кто использует плагин на хостинге, просьба отписаться о работоспособности.
P.P.S.:
Можно, в принципе, убрать ALT, т.к. есть RegisterAlt.
Многим будет удобнее регистрировать альт прямо рядом с командой с помощью макроса ALT, нежели перешаривать весь мод, чтобы найти OnGameModeInit и запихнуть туда RegisterAlt. То же самое будет, если понадобится удалить команду, а вместе с ней и альт.

И не мешало бы пример использования с параметрами (с и без sscanf) привести. Например, на этой команде:

if(strcmp(cmd, "/setadmin", true) == 0)
{
new tmp[32];
tmp = strtok(cmdtext, idx);
new targetid = strval(tmp);
tmp = strtok(cmdtext, idx);
new level = strval(tmp);
SetPVarInt(targetid, "Admin", level);
new string[128];
format(string, sizeof(string), "Администратор %s назначил игроку %s админ-уровень %d", PlayerInfo[playerid][pName], PlayerInfo[targetid][pName], level);
SendAdminMessage(string);
format(string, sizeof(string), "Администратор %s назначил Вам админ-уровень %d", PlayerInfo[playerid][pName], level);
SendClientMessage(targetid, COLOR_RED_WARNING, string);
return 1;
}
Кроме макроса ALT у команд точно такой же синтаксис, как и у команд на ZCMD, поэтому нет никакой необходимости что-то подробно объяснять.

Seregamil
29.01.2014, 15:37
Давно уже пользуюсь им, я думал все перешли на него? Или это ещё для многих Америка...

Стандарт only.

Hidden
30.01.2014, 01:27
OnPlayerCommandPerformed(playerid, cmdtext[], success) не работает, если не существует команды.


public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
print("Паблик задействован.");
if(success == -1)
{
new string[50];
format(string, sizeof(string), "[ERROR]: Команды %s не существует!", cmdtext);
return SendClientMessage(playerid, COLOR_GREY, string);
}
return true;
}

Если команды не существует, то в консоли ничего не пишет. Если существует команда, то появляется надпись "Паблик задействован".

Daniel_Cortez
30.01.2014, 11:26
OnPlayerCommandPerformed(playerid, cmdtext[], success) не работает, если не существует команды.


public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
print("Паблик задействован.");
if(success == -1)
{
new string[50];
format(string, sizeof(string), "[ERROR]: Команды %s не существует!", cmdtext);
return SendClientMessage(playerid, COLOR_GREY, string);
}
return true;
}

Если команды не существует, то в консоли ничего не пишет. Если существует команда, то появляется надпись "Паблик задействован".

Пробовал воспроизвести этот баг на своём моде, не получилось. Боюсь, одного паблика OnPlayerCommandPerformed вряд ли будет достаточно, чтобы найти источник проблемы.
Попробуйте создать минимальный скрипт, в котором есть подобная проблема, и выложите его сюда.

Hidden
30.01.2014, 19:19
#include <a_samp>
#include <dc_cmd>

main()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
}

public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}

public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
print("Паблик задействован");
if(success == -1)
{
new string[50];
format(string, sizeof(string), "[ERROR]: Команды %s не существует!", cmdtext);
return SendClientMessage(playerid, -1, string);
}
return true;
}

CMD:test(playerid)
{
SendClientMessage(playerid, -1, "тестовая команда");
return true;
}

Вот.

Ради интереса, поставил версию плагина 2.01. Всё работает.

Daniel_Cortez
30.01.2014, 19:55
#include <a_samp>
#include <dc_cmd>

main()
{
print("\n----------------------------------");
print(" Blank Gamemode by your name here");
print("----------------------------------\n");
}

public OnGameModeInit()
{
// Don't use these lines if it's a filterscript
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}

public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
print("Паблик задействован");
if(success == -1)
{
new string[50];
format(string, sizeof(string), "[ERROR]: Команды %s не существует!", cmdtext);
return SendClientMessage(playerid, -1, string);
}
return true;
}

CMD:test(playerid)
{
SendClientMessage(playerid, -1, "тестовая команда");
return true;
}

Вот.

Ради интереса, поставил версию плагина 2.01. Всё работает.
Интерсно... У меня всё работает.
Убедитесь, что версия инклуда соответствует версии плагина. На всякий случай попробуйте перекачать плагин заново, я его вчера перезаливал.

Hidden
31.01.2014, 00:21
Да, смог запустить в стандартном моде с сайта sa-mp.com
Раз и с простейшим кодом не работало в папке с моим модом, получается, дело в плагинах/инклудах.
Извиняюсь за беспокойство :) Спасибо за помощь.

Hidden
31.01.2014, 00:28
Нашёл проблему. У меня из подключенных FS был только gl_realtime. Когда его в конфиге убираю, плагин прекрасно работает.
Может эта информация как-то Вам поможет.

semen7907
05.02.2014, 20:44
У меня есть скрипт (в filterscripts система домов) команды в скрипте перевел на DC_CMD плагин v2.5 и когда я подключаю скрипт
то почему то перестает работать паблик OnPlayerCommandPerformed отключаю скрипт и паблик работает..




public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if(success == -1)
{
return SendClientMessage(playerid, red, "[Info]:>> Такой команды нет. Введите /команды чтобы посмотреть список команд!");
}
return 1;
}

-DubStep-
07.02.2014, 00:49
Красавчик.
Отлично, обнова отличная.

- - - Добавлено - - -

А то что копирайт поставил просто молодец.

[04:47:45] Loading plugin: dc_cmd
[04:47:45] Daniel's CMD plugin v2.5
[04:47:45] (c) 2014 Daniel_Cortez
[04:47:45] www.pro-pawn.ru
[04:47:45] Loaded.
[04:47:45] Loaded 6 plugins.
Запретил бы копирование для портала, ты понял для какого.

KShaddix
07.02.2014, 16:12
Возникла проблема с использованием RegisterAlt: если альтернативная команда меньше четырёх символов (считая слэш), то процесс тупо останавливается.

Daniel_Cortez
08.02.2014, 19:08
Возникла проблема с использованием RegisterAlt: если альтернативная команда меньше четырёх символов (считая слэш), то процесс тупо останавливается.
Это происходит на локальном сервере или на хостинге? И можете привести пример такой команды, приводящей к крашу?

KShaddix
08.02.2014, 22:46
Это происходит на локальном сервере или на хостинге?
И там, и там.


И можете привести пример такой команды, приводящей к крашу?

RegisterAlt("/do", "/до");

CMD:do(playerid, params[])
{
new string[128];
if(PlayerInfo[playerid][pMute] > 0) return format(string, sizeof(string), " Ваш доступ к чату ограничен. До конца мута осталось %02d:%02d:%02d.", PlayerInfo[playerid][pMute]/3600, (PlayerInfo[playerid][pMute]-PlayerInfo[playerid][pMute]/3600*3600)/60, PlayerInfo[playerid][pMute]-PlayerInfo[playerid][pMute]/60*60), SendClientMessage(playerid, COLOR_GREY, string);
if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, COLOR_BLUE, "» Использование: {FFFFFF}/do [действие]");
format(string, sizeof(string), "* %s (( %s )).", params[0], GetPlayerNameEx(playerid)), ProxDetector(30.0, playerid, string, COLOR_RP, COLOR_RP, COLOR_RP, COLOR_RP, COLOR_RP);
Log("chat", string);
return 1;
}

Daniel_Cortez
09.02.2014, 10:26
И там, и там.



RegisterAlt("/do", "/до");

CMD:do(playerid, params[])
{
new string[128];
if(PlayerInfo[playerid][pMute] > 0) return format(string, sizeof(string), " Ваш доступ к чату ограничен. До конца мута осталось %02d:%02d:%02d.", PlayerInfo[playerid][pMute]/3600, (PlayerInfo[playerid][pMute]-PlayerInfo[playerid][pMute]/3600*3600)/60, PlayerInfo[playerid][pMute]-PlayerInfo[playerid][pMute]/60*60), SendClientMessage(playerid, COLOR_GREY, string);
if(sscanf(params, "s[128]", params[0])) return SendClientMessage(playerid, COLOR_BLUE, "» Использование: {FFFFFF}/do [действие]");
format(string, sizeof(string), "* %s (( %s )).", params[0], GetPlayerNameEx(playerid)), ProxDetector(30.0, playerid, string, COLOR_RP, COLOR_RP, COLOR_RP, COLOR_RP, COLOR_RP);
Log("chat", string);
return 1;
}

Пробовал воспроизвести краш, не получилось.
Проверьте свой код. Попробуйте закомментировать всё содержимое команды /do и введите её в игре.
Вообще краш происходит при запуске сервера или только после ввода команды?

И да, на будущее, если выкладываете код, помещайте его в тег [php].

KShaddix
10.02.2014, 00:53
Пробовал воспроизвести краш, не получилось.
Проверьте свой код. Попробуйте закомментировать всё содержимое команды /do и введите её в игре.
Вообще краш происходит при запуске сервера или только после ввода команды?
Насчёт краша ты, наверное, неправильно меня понял. Я имел в виду, что команда не работает, сервер не падает.
Действия по команде /do воспроизводятся, а русифицированный аналог (/до) - нет. При этом даже OnPlayerCommandReceived не вызывается.


И да, на будущее, если выкладываете код, помещайте его в тег [php].
Оу, нет проблем. Я впервые проявляю активность на форумах с подобной тематикой, не знаю что да как.

Daniel_Cortez
12.02.2014, 07:06
Запретил бы копирование для портала, ты понял для какого.
Как будто этих говноедов что-то остановит.


Насчёт краша ты, наверное, неправильно меня понял. Я имел в виду, что команда не работает, сервер не падает.
Действия по команде /do воспроизводятся, а русифицированный аналог (/до) - нет. При этом даже OnPlayerCommandReceived не вызывается.
Уже воспроизвёл подобную проблему на своём тестовом сервере и исправил. Спасибо, что сообщили.
Сегодня выложу новую версию плагина, как только освобожусь с пар.

Daniel_Cortez
15.02.2014, 11:48
Исправлен баг с альт. командами короче 3 символов.
Добавлен макрос ALTX для регистрации русских (и не только) альт. команд без необходимости лезть в OnGameModeInit/OnFilterScriptInit.
Использование:

ALTX:<команда>(<альт. имена>);
Здесь <альт. имена> - одно или несколько альт. названий для команды.
Пример:

CMD:help(playerid, params[])
{
// ...
}
ALTX:help("/info", "/помощь", "/инфо");

CMD:menu(playerid, params[])
{
return ShowPlayerDialog(playerid, ...);
}
ALTX:menu("/меню");
На данный момент для создания альт. команд рекомендуется использовать ALTX, предыдущие 2 способа (функция RegisterAlt и макрос ALT) оставлены лишь для совместимости с командами для предыдущих версий.


Внимание: Если вы используете команды на DC_CMD в фильтрскрипте, не забудьте в самом верху кода указать #define FILTERSCRIPT.
Выглядеть это должно примерно так:

#define FILTERSCRIPT // сама строка

#include <a_samp> // дальше - инклуды
#include <dc_cmd>

Первый пост обновлён.

UPD: Начиная с версии 2.7, строка #define FILTERSCRIPT в фильтрскриптах не обязательна.

MR_BEN
15.02.2014, 12:31
Оперативно:)

Salvacore
15.02.2014, 17:11
Спасибо :)

Snoowker
15.02.2014, 19:42
Ты хоть первый пост обновляй :D,по теме +1

Salvacore
15.02.2014, 19:46
Ты хоть первый пост обновляй :D,по теме +1
Невнимательный вы,он обновлен.

KShaddix
15.02.2014, 22:15
Благодарю за решение проблемы.

В названии архива указана версия 1.6 =D

semen7907
18.02.2014, 16:20
Не подскажите из за чего это?


[17:13:02] [debug] Run time error 4: "Array index out of bounds"
[17:13:02] [debug] Accessing element at index 65535 past array upper bound 60
[17:13:02] [debug] AMX backtrace:
[17:13:02] [debug] #0 00122248 in public cmd_burn (0x0000000f, 0x0006cb1c) from dmproject.amx
[17:13:02] [debug] #1 native DC_CMD () [f7419f90] from dc_cmd.so
[17:13:02] [debug] #2 00000008 in public OnPlayerCommandText () from dmproject.amx

Salvacore
19.02.2014, 19:38
Не подскажите из за чего это?


[17:13:02] [debug] Run time error 4: "Array index out of bounds"
[17:13:02] [debug] Accessing element at index 65535 past array upper bound 60
[17:13:02] [debug] AMX backtrace:
[17:13:02] [debug] #0 00122248 in public cmd_burn (0x0000000f, 0x0006cb1c) from dmproject.amx
[17:13:02] [debug] #1 native DC_CMD () [f7419f90] from dc_cmd.so
[17:13:02] [debug] #2 00000008 in public OnPlayerCommandText () from dmproject.amx


Array index out of bounds
Выход за пределлы массива

DeimoS
19.02.2014, 20:52
Не подскажите из за чего это?


[17:13:02] [debug] Run time error 4: "Array index out of bounds"
[17:13:02] [debug] Accessing element at index 65535 past array upper bound 60
[17:13:02] [debug] AMX backtrace:
[17:13:02] [debug] #0 00122248 in public cmd_burn (0x0000000f, 0x0006cb1c) from dmproject.amx
[17:13:02] [debug] #1 native DC_CMD () [f7419f90] from dc_cmd.so
[17:13:02] [debug] #2 00000008 in public OnPlayerCommandText () from dmproject.amx

Команду burn покажи

Daniel_Cortez
05.03.2014, 19:23
Обновил тест скорости.
http://s3.hostingkartinok.com/uploads/images/2014/03/2ff0f4a62b6024ca39fcc73fff275460.png
Скачать его можно здесь:
http://rghost.ru/56431688

В тест добавлены 2 новых вида команд: стандартные (обозначены, как STD) и на командном процессоре FCMD.
Как видно, стандартные команды (при количестве в 10 штук) работают медленнее остальных. Отрыв особенно заметен в случае, когда у команд есть параметры.



Недавно до меня дошёл миф о том, что если в моде мало команд, то лучше не использовать никаких командных процессоров, якобы стандартные команды будут работать быстрее.
Сейчас мы попробуем доказать или опровергнуть его.

Итак, возьмём тест скорости, который выложен вместе с плагином в 1-м посте. В скрипте cmdtest.pwn есть макрос PROFILE_ITERS_MINOR, он позволяет указать количество команд в тесте.
Изменив его значение на 1 (вместо 10 по умолчанию), можно смоделировать ситуацию, когда в моде всего 1 команда, и при этой 1 команде измерить быстродействие каждого процессора.

Приступим. Ищем в самом начале скрипта строку

#define PROFILE_ITERS_MINOR 10
и заменяем её на

#define PROFILE_ITERS_MINOR 1
Затем компилируем скрипт, запускаем сервер и смотрим на результат.
Для ленивых, выложу то, что получилось у меня:
http://s3.hostingkartinok.com/uploads/images/2014/03/65500e2b3eb6536924cbefe339e88157.png
На данном скриншоте я включил JIT, дабы отсеять лишние вопросы о быстродействии стандартных команд с этим плагином.
Как видно, некоторые командные процессоры действительно начинают работать медленнее, чем стандартные команды. Впрочем, DC_CMD обгоняет по быстродействию стандартные команды в 7 раз, даже всего при 1 команде и с JIT.

Nazarik
06.03.2014, 18:29
Если ввести команду и 1 пробел, то команда не сработает.
Можна ли как нибудь это исправить ?

(тестировал на шиндовс)

^_^
06.03.2014, 19:25
Если ввести команду и 1 пробел, то команда не сработает.
Можна ли как нибудь это исправить ?

(тестировал на шиндовс)
Это не баг, а твой косяк в коде, ибо это и есть суть команды - она определяет конец команды там где и стоит пробел. Насчёт твоего кода:

CMD:cerez(playerid, params[])
{
if(!strcmp("probel", params, true))
{
//Тело команды /cerez probel
}
}
Если после probel у тебя есть ещё параметры, придётся использовать sscanf либо примитивный strtok.

Daniel_Cortez
06.03.2014, 19:48
Это баг. Только что попробовал у себя ввести "/help " (с пробелом в конце) - не сработало. По идее ненужные пробелы в конце должны отбрасываться автоматически.
Спасибо, что сообщили, попробую исправить.

DOS-Protection
09.03.2014, 02:52
Когда исправишь? :)

Daniel_Cortez
14.03.2014, 15:24
Плагин обновлён до версии 2.7
Скачать его можно здесь: http://rghost.ru/53035948

Что нового:
Исправлен баг, возникавший при загрузке/выгрузке фильтрскриптов.
Исправлена обработка пробелов в конце команд.
Добавлена проверка соответствия версии плагина и инклуда. Теперь не получится использовать новую версию плагина со старой версией инклуда и наоборот.
Убрана необходимость использования #define FILTERSCRIPT в каждом фильтрскрипте.

Fun fact: Файл dc_cmd.inc может быть использован как в Pawn, так и в C++ для компиляции плагина (в него были вынесены некоторые общие константы).

1-й пост обновлён.

OKStyle
21.03.2014, 18:27
А в инклюде 2013 на 2014 не исправлен))

Daniel_Cortez
23.03.2014, 20:53
DC_CMD v2.8 (20th anniversary edition): http://rghost.ru/53289178

В инклуде (.inc) исправлен копирайт с 2013 на 2014 год (imma slowpoke -_-).
Добавлены функции RenameCmd и RemoveCmd для диманического переименования и удаления команд.
Примеры использования:

RenameCmd("/help", "/menu"); // команда /help будет переименована в /menu

RemoveCmd("/makeadmin"); // команда /makeadmin будет удалена и больше не будет работать

^_^
23.03.2014, 21:01
DC_CMD v2.8 (20th anniversary edition): http://rghost.ru/53289178

В инклуде (.inc) исправлен копирайт с 2013 на 2014 год (imma slowpoke -_-).
Добавлены функции RenameCmd и RemoveCmd для диманического переименования и удаления команд.
Примеры использования:

RenameCmd("/help", "/menu"); // команда /help будет переименована в /menu

RemoveCmd("/makeadmin"); // команда /makeadmin будет удалена и больше не будет работать

Было бы здорово добавить и функцию ReaddCommand(cmd[]), в остальном - супер, спасибо! ;)

Avertus
23.03.2014, 21:28
Было бы здорово добавить и функцию ReaddCommand(cmd[]), в остальном - супер, спасибо! ;)

Да. Не плохо бы создать динамическое создание альтернативных команд к уже существующим командам. А вот для динамического переименовывания и удаления команд мне трудно придумать применение.

Camelot
07.04.2014, 23:00
Процессор хороший. Всё работает стабильно, но поможете ли вы мне решить пару проблем?
1)
Если я сокращаю строки у команды, то мод при компиляции начинает виснуть.
Пример:

CMD:stats(playerid, params[]) return ShowStats(playerid); - ВИСНЕТ

CMD:stats(playerid, params[]) - СТАБИЛЬНО
{
return ShowStats(playerid);
}

2)
Если написать к примеру /dance 3, то он всё равно воспроизводит /dance 1.

CMD:dance(playerid, params[])
{
if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"/dance [1-3]");
else if(strcmp(params[0],"1",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
else if(strcmp(params[0],"2",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2);
else if(strcmp(params[0],"3",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3);
return true;
}

Kenny_Dalglish
08.04.2014, 16:43
Странно не качает плагин(

DeimoS
08.04.2014, 17:01
2)
Если написать к примеру /dance 3, то он всё равно воспроизводит /dance 1.

CMD:dance(playerid, params[])
{
if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"/dance [1-3]");
else if(strcmp(params[0],"1",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
else if(strcmp(params[0],"2",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2);
else if(strcmp(params[0],"3",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3);
return true;
}

Потому что у вас лишний "else if". После "if(sscanf" должен стоять просто "if", ибо иначе сработает только первое условие (sscanf), а остальные будут пропущены. Да и strcmp тут неуместен, ибо в "params[0]" хранится число, а не строка
Ну вот так, по моему, удобнее будет

CMD:dance(playerid, params[])
{
if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"/dance [1-3]");
switch(strval(params[0]))
{
case 1: SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
case 2: SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2);
case 3: SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3);
default: return Message(playerid, COLOR_GREEN,"/dance [1-3]");
}
return true;
}

DOS-Protection
08.04.2014, 18:09
Процессор хороший. Всё работает стабильно, но поможете ли вы мне решить пару проблем?
1)
Если я сокращаю строки у команды, то мод при компиляции начинает виснуть.
Пример:

CMD:stats(playerid, params[]) return ShowStats(playerid); - ВИСНЕТ

CMD:stats(playerid, params[]) - СТАБИЛЬНО
{
return ShowStats(playerid);
}

2)
Если написать к примеру /dance 3, то он всё равно воспроизводит /dance 1.

CMD:dance(playerid, params[])
{
if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"/dance [1-3]");
else if(strcmp(params[0],"1",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
else if(strcmp(params[0],"2",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2);
else if(strcmp(params[0],"3",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3);
return true;
}


CMD:stats(playerid) return ShowStats(playerid);

Daniel_Cortez
09.04.2014, 13:03
2)
Если написать к примеру /dance 3, то он всё равно воспроизводит /dance 1.

CMD:dance(playerid, params[])
{
if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"/dance [1-3]");
else if(strcmp(params[0],"1",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
else if(strcmp(params[0],"2",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2);
else if(strcmp(params[0],"3",true)) SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3);
return true;
}

Потому что у вас лишний "else if". После "if(sscanf" должен стоять просто "if", ибо иначе сработает только первое условие (sscanf), а остальные будут пропущены. Да и strcmp тут неуместен, ибо в "params[0]" храниться число, а не строка
Ну вот так, по моему, удобнее будет

CMD:dance(playerid, params[])
{
if(sscanf(params, "i", params[0])) return Message(playerid, COLOR_GREEN,"/dance [1-3]");
switch(strval(params[0]))
{
case 1: SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE1);
case 2: SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE2);
case 3: SetPlayerSpecialAction(playerid,SPECIAL_ACTION_DANCE3);
default: return Message(playerid, COLOR_GREEN,"/dance [1-3]");
}
return true;
}
Из params извлекаете целое число, а обращаетесь с ним, как со строкой - от того и не работают Ваши команды.

Kenny_Dalglish
09.04.2014, 19:43
Из params извлекаете целое число, а обращаетесь с ним, как со строкой.
Даинель, очень хороший команды процесс. Вот только Avast dll расширение читает как вирус, что делать?

Camelot
10.04.2014, 00:11
Спасибо за помощь.

Kenny_Dalglish
01.05.2014, 00:17
Из params извлекаете целое число, а обращаетесь с ним, как со строкой.
Даниель, исправьте с анти вирусом с dll файл, ибо он определяет как вирус dcmd.dll (Анти вирус Avast)

Salvacore
01.05.2014, 01:50
Даниель, исправьте с анти вирусом с dll файл, ибо он определяет как вирус dcmd.dll (Анти вирус Avast)
В исключения внеси, да и всё.

Kenny_Dalglish
01.05.2014, 17:48
В исключения внеси, да и всё.
Да и не все. Все равно удаляет файл

Daniel_Cortez
02.05.2014, 18:26
Уважаемый, установите нормальный антивирус и не оставляйте здесь глупых постов.

Kenny_Dalglish
02.05.2014, 20:02
Уважаемый, установите нормальный антивирус и не оставляйте здесь глупых постов.

Лучшее из Avast из бесплатных нету на мой взгляд

DeimoS
02.05.2014, 20:10
Да и не все. Все равно удаляет файл
Раз удаляет, значит не туда внесли, лол. Ну или у вас антивирус живёт своей жизнью и ему плевать на ваши желания.

Gressie
09.06.2014, 05:36
Что лучше? DC_CMD или LIFE:CMD? Мне говорит Kazon что лучше его процессор.

Daniel_Cortez
09.06.2014, 06:45
Что лучше? DC_CMD или LIFE:CMD?
В плане скорости - в 1-м посте есть тест, DC_CMD обгоняет LIFE:CMD в 3 раза при командах без параметов и в 5 с лишним раз при командах с параметрами. По возможностям DC_CMD тоже в выигрыше: функции OnPlayerCommandReceived и OnPlayerCommandPerformed, упрощённое создание альт. команд, команды с русскими именами, изменение уже существующих команд во время работы сервера - у многих командных процессоров нет ни одного из этих преимуществ и LIFE:CMD тому не исключение.


Мне говорит Kazon что лучше его процессор.
Исправил бы он лучше свои баги -_-
Я сначала вообще не хотел добавлять в тест скорости его командный процессор, т.к. он даже не умеет адекватно обрабатывать ни команды, ни параметры. "/help" и "/HELP" для него - совершенно разные команды. Да и отсеивания лишних пробелов в начале и в конце параметров тоже нет.
А что самое интересное, если использовать команды на этом процессоре в фильтрскипте, в моде команды работать не будут.
Если же Kazon исправит все эти баги, его плагин будет работать, как минимум, ещё в 1,5-2 раза медленнее.

Касаемо инклуда с тем же названием, он работает всего в 1,2 раза быстрее, чем ZCMD.
Скриншот тестов Kazon'а:
http://higgs.rghost.ru/43820924/image.png
Для сравнения: DC_CMD обгоняет ZCMD почти в 10 раз. Если же к командам в тесте добавить параметры, приблизив тест к реальным условиям, разрыв во времени только увеличится.
http://s3.hostingkartinok.com/uploads/images/2014/03/2ff0f4a62b6024ca39fcc73fff275460.png

Конечно же, LIFE:CMD лучше! Как инклуд, так и плагин.

Jacob1997
29.06.2014, 01:51
Подскажите пожалуйста почему при подключении этого плагина не работают команды такого типа как
else if(strcmp(cmd,"/members",true)==0)

Nazarik
29.06.2014, 02:18
Подскажите пожалуйста почему при подключении этого плагина не работают команды такого типа как
else if(strcmp(cmd,"/members",true)==0)






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;
}




Внимательно прочитайте 1 пост, там Вы всё узнаете о DC_CMD.

Vetalll
27.08.2014, 16:37
Перевёл. Вот такие warning'и появились:
C:\DOCUME~1\86C2~1\LOCALS~1\Temp\Rar$EXa0.605\SAMP-R~1\pawno\include\YSI\y_commands.inc(219) : warning 201: redefinition of constant/macro (symbol "CMD:%0(%1)")
C:\DOCUME~1\86C2~1\LOCALS~1\Temp\Rar$EXa0.605\SAMP-R~1\pawno\include\YSI\y_commands.inc(220) : warning 201: redefinition of constant/macro (symbol "COMMAND")

Строки warning'ов в файле y_commands.inc:

219 #define CMD:%0(%1) RC:%0(%1,__help)if(__help)return 0;else
220 #define COMMAND CMD

Daniel_Cortez
27.08.2014, 16:54
Перевёл. Вот такие warning'и появились:
C:\DOCUME~1\86C2~1\LOCALS~1\Temp\Rar$EXa0.605\SAMP-R~1\pawno\include\YSI\y_commands.inc(219) : warning 201: redefinition of constant/macro (symbol "CMD:%0(%1)")
C:\DOCUME~1\86C2~1\LOCALS~1\Temp\Rar$EXa0.605\SAMP-R~1\pawno\include\YSI\y_commands.inc(220) : warning 201: redefinition of constant/macro (symbol "COMMAND")

Строки warning'ов в файле y_commands.inc:

219 #define CMD:%0(%1) RC:%0(%1,__help)if(__help)return 0;else
220 #define COMMAND CMD

Встречный вопрос: Вы думаете, использовать сразу 2 командных процессора - это нормально?

Vetalll
27.08.2014, 16:59
Встречный вопрос: Вы думаете, использовать сразу 2 командных процессора - это нормально?
Я знаю, что сейчас у меня их два стоит, но как правильно удалить первый, подскажите!?

Daniel_Cortez
27.08.2014, 17:08
Просто убрать из инклудов y_commands...

dimozz
31.08.2014, 15:22
Извиняюсь, если подобная проблема была решена, но у меня не работает public OnPlayerCommandReceived
Не думаю, что дело в моём коде.
Сторонние плагины: mysql r39-2
Фильтрскрипты: отсутствуют



Не выводит в чат ни надпись "das", ни надпись о том, что необходима авторизация.


public OnPlayerCommandReceived(playerid, cmdtext[])
{
SendClientMessage(playerid,-1,"das");
if(p[playerid][logined] == false)
{
SendClientMessage(playerid,grey,"Для использования команд необходимо войти в игру.");
return 0;
}
return 1;
}

Daniel_Cortez
31.08.2014, 15:42
Извиняюсь, если подобная проблема была решена, но у меня не работает public OnPlayerCommandReceived
Не думаю, что дело в моём коде.
Сторонние плагины: mysql r39-2
Фильтрскрипты: отсутствуют

Не выводит в чат ни надпись "das", ни надпись о том, что необходима авторизация.


public OnPlayerCommandReceived(playerid, cmdtext[])
{
SendClientMessage(playerid,-1,"das");
if(p[playerid][logined] == false)
{
SendClientMessage(playerid,grey,"Для использования команд необходимо войти в игру.");
return 0;
}
return 1;
}



Проблема проявляется с последней версией плагина (2.8)?

dimozz
31.08.2014, 18:00
Проблема проявляется с последней версией плагина (2.8)?
Да.

OKStyle
05.09.2014, 14:21
у команд точно такой же синтаксис, как и у команд на ZCMD, поэтому нет никакой необходимости что-то подробно объяснять.
Никогда не пользовался zcmd. Покажи синтаксис для нескольких параметров разного рода в команде. Например бан по id с причиной и указанием срока.

Elaid
20.09.2014, 17:48
Не подскажите как сделать так, чтобы команда вызывалась на клавишу.
К примеру на команде:

CMD:menu(playerid, params[])
{
return SendClientMessage(playerid, 0xFFFFFFAA, "Вы вызвали меню.");
}

Nurick
20.09.2014, 18:20
В версии 2.02 был добавлен макрос "cmd::", благодаря которому можно удобно вызывать команды из любого места в моде.
Пример использования:



// без параметров
cmd::help(playerid, "");

// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);

Hidden
22.12.2014, 00:00
Если создать переменную new bool:player_is_logged[MAX_PLAYERS char]; и сделать так:

public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if(player_is_logged{playerid} == false) return MSG_NOLOGIN(playerid);
return true;
}
То в логе выдаёт:

[22:37:11] [debug] Run time error 6: "Invalid instruction"
[22:37:11] [debug] Unknown opcode 0x0 at address 0x00000108
[22:37:11] [debug] AMX backtrace:
[22:37:11] [debug] #0 ???????? in public cmd_saveall ()
[22:37:11] [debug] #1 native DC_CMD () [021a1310] from dc_cmd.DLL
[22:37:11] [debug] #2 ???????? in public OnPlayerCommandText ()
[22:37:11] [debug] Run time error 4: "Array index out of bounds"
[22:37:11] [debug] Accessing element at index 134217729 past array upper bound 99
[22:37:11] [debug] AMX backtrace:
[22:37:11] [debug] #0 0007e140 in public OnPlayerCommandPerformed (playerid=134217729, cmdtext[]=@0x000fdeb4 "/saveall", success=296) at C:\MyFiles\ProjectPAWN\my mod\gamemodes\StateLS.pwn:4642
[22:37:11] [debug] #1 native DC_CMD () [021a1310] from dc_cmd.DLL
[22:37:11] [debug] #2 00000108 in public OnPlayerCommandText () at C:\MyFiles\ProjectPAWN\my mod\pawno\include\float.inc:121

4642 - строка if(player_is_logged{playerid} == false) return MSG_NOLOGIN(playerid); в паблике.
Если же создавать переменную так - new player_is_logged[MAX_PLAYERS char]; - и использовать в паблике if(player_is_logged{playerid} == 0) return MSG_NOLOGIN(playerid);, то ошибки не выдаёт.

Команда /saveall:

CMD:saveall(playerid)
{
if(PlayerInfo[playerid][pAdmin] < 5) return MSG_NOADMIN(playerid);
foreach(new i: Player)
{
if(IsPlayerNPC(i) || player_is_logged{i} == 0) continue;
SavePlayer(i);
}
for(new biz = 1; biz <= TOTALBIZ; biz++)
{
SaveBiz(biz);
}
return true;
}

Profyan
07.02.2015, 04:48
[06:46:27] [debug] Run time error 19: "File or function is not found"
[06:46:27] [debug] DC_CMD
[06:46:27] [debug] DC_CMD_Init
[06:46:27] [debug] Run time error 19: "File or function is not found"
[06:46:27] [debug] DC_CMD
[06:46:27] [debug] DC_CMD_Init
[06:46:27] Script[gamemodes/SCRP.amx]: Run time error 19: "File or function is not found"
На 8.1 винде не хочет запускаться.Установил весь софт, который сказан в теме, все равно.(это последняя версия 2.8)

Hidden
08.02.2015, 19:45
У меня работает на 8.1.

Profyan
11.02.2015, 18:59
У меня работает на 8.1.

скажи , что у тебя из программного обеспечения установлено? Ото я что только не качал, он не запускается - Failed.

Figish
05.03.2015, 01:20
Вопрос:
Допустим у меня params[2]. Как мне через cmd:: заполнить 2 параметра?

Mazzilla
05.03.2015, 07:17
Вопрос:
Допустим у меня params[2]. Как мне через cmd:: заполнить 2 параметра?

// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);

Figish
05.03.2015, 11:33
// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);

У меня 2 параметра. А тут указан 1. В том то и проблема.

Mazzilla
05.03.2015, 15:26
// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d %d %d %d", targetid1, targetid2, targetid3, targetid4);
cmd::invite(playerid, param_str);

Figish
05.03.2015, 15:48
// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d %d %d %d", targetid1, targetid2, targetid3, targetid4);
cmd::invite(playerid, param_str);
Вот теперь спасибо.

Zaur_Lumanov
07.05.2015, 22:06
Идеальный процессор. Пользуюсь только им)

Daniel_Cortez
24.07.2015, 22:48
В связи с жалобами на то, что плагин требует библиотеки MSVC++, от тех, кто эти библиотеки не умеет устанавливать, публикую версию 2.8 со статическим рантаймом.

http://rghost.ru/76HbSlLGj

Ссылка добавлена в 1-й пост, теперь там 2 ссылки. Со следующим релизом я оставлю только одну версию со статическим рантаймом, а пока что пусть лучше будет так: всё равно больше никаких значимых изменений пока нет.

RANKA
22.08.2015, 16:00
[06:46:27] [debug] Run time error 19: "File or function is not found"
[06:46:27] [debug] DC_CMD
[06:46:27] [debug] DC_CMD_Init
[06:46:27] [debug] Run time error 19: "File or function is not found"
[06:46:27] [debug] DC_CMD
[06:46:27] [debug] DC_CMD_Init
[06:46:27] Script[gamemodes/SCRP.amx]: Run time error 19: "File or function is not found"
На 8.1 винде не хочет запускаться.Установил весь софт, который сказан в теме, все равно.(это последняя версия 2.8)
Аналогичная проблема, понятия не имею, как ещё её можно решить, ибо у меня абсолютно все пакеты MSVC++ установлены, а статиком пользоваться не вариант, ибо mysql так же, как и dc_cmd, не может запустить плагины. Может знает кто, в чём может быть ещё проблема?

Daniel_Cortez
22.08.2015, 16:14
Аналогичная проблема, понятия не имею, как ещё её можно решить, ибо у меня абсолютно все пакеты MSVC++ установлены, а статиком пользоваться не вариант, ибо mysql так же, как и dc_cmd, не может запустить плагины. Может знает кто, в чём может быть ещё проблема?
У вас уже есть своя тема (http://pro-pawn.ru/showthread.php?12605), зачем ещё раз постить здесь? Тем более, что эта проблема относится к MySQL, а не к DC_CMD.

kreft16
05.09.2015, 20:01
Как реализовать вызов команд через "."?
На просторах и-нета нашёл такое решение:

public OnPlayerText(playerid, text[])
{
if (text[0] == '.')
{
strdel(text, 0, 1);
new callback[32], params[128];
for(new i; (text[i] > 32) && (i != 32); i++)
{
sscanf(text, "s[32]s[256]", callback, params);
strins(callback, "cmd_", 0);
if(funcidx(callback) == -1) return 0;
CallLocalFunction(callback, "is", playerid, params);
return 0;
}
}
...
}

Но при использовании команд без параметров сервер выключается (localhost)
Помогите поправить решение или подскажите, как можно реализовать иначе:sad:

L0ndl3m
05.09.2015, 20:39
...
У меня так:


if(text[0] == '.')
{
text[0] = '/';
return CallLocalFunction("OnPlayerCommandText", "is", playerid, text), 0;
}

A N D R E Y
08.10.2015, 09:40
Хром скотина статик не дает скачать, говорит что вирусы.
http://i66.fastpic.ru/big/2015/1008/48/31317df584c122b4f548fedf04b9a748.jpg (http://fastpic.ru/)

Daniel_Cortez
08.10.2015, 10:22
Хром скотина статик не дает скачать, говорит что вирусы.
http://i66.fastpic.ru/big/2015/1008/48/31317df584c122b4f548fedf04b9a748.jpg (http://fastpic.ru/)
Хром вечно визжит на всё подряд. Если у вас уже есть антивирус, то используйте нормальный браузер, в чём проблема?
https://www.mozilla.org/ru/firefox/

Unreal
08.10.2015, 16:14
Хром вечно визжит на всё подряд. Если у вас уже есть антивирус, то используйте нормальный браузер, в чём проблема?
https://www.mozilla.org/ru/firefox/

а будут ли обновление ?

A N D R E Y
08.10.2015, 17:56
Хром вечно визжит на всё подряд. Если у вас уже есть антивирус, то используйте нормальный браузер, в чём проблема?
https://www.mozilla.org/ru/firefox/
Антивирусов нет, но в мазиле та-же байда:
http://i66.fastpic.ru/big/2015/1008/6c/c16193f95cb0f9d2daad9625a3e7986c.jpg (http://fastpic.ru/)

$continue$
08.10.2015, 18:21
Пользуюсь лисой (Firefox) уже 2 года (а то и больше). У меня возникает ощущение, что Вы с браузерами на "Вы".

http://i.imgur.com/YYtRcZZ.png
Религия не позволяет сделать?

[ForD]
08.10.2015, 18:45
Файл скорее всего непричем(точнее совсем непричем),все этот rghost...

vasyok28
27.10.2015, 11:50
В чем может быть причина коллбэки OnPlayerCommandReceived и OnPlayerCommandPerformed не работают.
error 021: symbol already defined: "OnPlayerCommandPerformed"

Snoopdy
27.10.2015, 17:21
В чем может быть причина коллбэки OnPlayerCommandReceived и OnPlayerCommandPerformed не работают.
error 021: symbol already defined: "OnPlayerCommandPerformed"
У вас уже есть такой паблик, и наверно пустой объявлен первее, чем который вы редактировали, найдите 2 паблик "OnPlayerCommandPerformed" и удалите.

Mopok
20.12.2015, 20:51
По какой причине не работают OnPlayerCommandReceived и OnPlayerCommandPerformed? Как ни крутил, эти коллбеки никак не вызываются, а перед их провозглашением, требует провозглосить forward... Как заставить плагин работать полноценно? обычные команды при этом работают. Версия плагина последняя. Проблема в ней? Есть ли рабочая версия?
Спасибо! :scratch_one-s_head:

И да, нигде в другом месте они у меня не вписаны, не работают и с fs, и без них. надеюсь на помощь, т.к. обещанная скорость процессора внушает желание чтобы всё это заработало. надеюсь на помощь...

$continue$
20.12.2015, 22:00
По какой причине не работают OnPlayerCommandReceived и OnPlayerCommandPerformed? Как ни крутил, эти коллбеки никак не вызываются, а перед их провозглашением, требует провозглосить forward... Как заставить плагин работать полноценно? обычные команды при этом работают. Версия плагина последняя. Проблема в ней? Есть ли рабочая версия?
Спасибо! :scratch_one-s_head:

И да, нигде в другом месте они у меня не вписаны, не работают и с fs, и без них. надеюсь на помощь, т.к. обещанная скорость процессора внушает желание чтобы всё это заработало. надеюсь на помощь...

include то хоть подключен?

Mopok
20.12.2015, 22:22
Тут походу всех вопрошающих принимают за имбецилов... Но конечно же я инклуд подключил. Обычные команды в виде CMD:komanda(playerid,params[]) - работают, а эти колбеки не вызываются. Сервер виндоус 0.3.7. Плагин в сервер конфигах прописан, сохранён. Проблема не решается. На чистом сервере аналогично не вызываются. У вас последняя версия работает? Скиньте рабочую. Сяппки!

Mopok
23.12.2015, 10:05
Так что, ни один про-павновец не может ничего ответить? Автор, ответь же пжлста, выложенная 2.8 ведь не рабочая? Можешь выложить рабочую? Буду сильно благодарен. :pardon:
Скачал на другом ресурсе вроде тоже 2.8, но как я понял написанная на асм- всё было в порядке. Большая ли в них разница? :dntknw:

$continue$
23.12.2015, 11:33
Так что, ни один про-павновец не может ничего ответить? Автор, ответь же пжлста, выложенная 2.8 ведь не рабочая? Можешь выложить рабочую? Буду сильно благодарен. :pardon:
Скачал на другом ресурсе вроде тоже 2.8, но как я понял написанная на асм- всё было в порядке. Большая ли в них разница? :dntknw:
Она рабочая. Просто у кого то руки не из того места растут.

Mopok
23.12.2015, 13:35
Да. Только дело не в руках, а в скачанным архиве было, то ли я его перепутал, то ли он другой был. Но да кого это волнует. Всё работает как должно работать. :bye:

Desulaid
23.12.2015, 21:01
Да. Только дело не в руках, а в скачанным архиве было, то ли я его перепутал, то ли он другой был. Но да кого это волнует. Всё работает как должно работать. :bye:

Можете показать пример команды, как вы используете dc_cmd ?

Mopok
23.12.2015, 21:04
CMD:komanda(playerid,params[]){
SendClientMessage(playerid,-1,"Эта же каманда");
return 1;
}
Зачёт мне поставите?

Desulaid
23.12.2015, 22:03
CMD:komanda(playerid,params[]){
SendClientMessage(playerid,-1,"Эта же каманда");
return 1;
}
Зачёт мне поставите?

Тогда не знаю, по идее работать должно, но, на всякий случай спрошу, у вас команды вызываются из мода или фильтрскрипта?

Mopok
23.12.2015, 22:36
Я знал что не все такие злыдни, которые ток умничать умеют, а есть и те кто хочет помочь :good2:
Но с данным плагином я уже разобрался. Я то ли архив перепутал, скачав еще с каких-то форумов его, то ли самп мозг действительно сушит. Я подключал плагин скорей всего каких-то первых версий где еще эти коллбеки не были. А работали только введение команд, по размеру файлов там тож видно что не то. Всё ок. Скачал заново. Плагин шуршит, всем советую. :ok:

Daniel_Cortez
24.12.2015, 08:18
Я подключал плагин скорей всего каких-то первых версий где еще эти коллбеки не были.

Тут походу всех вопрошающих принимают за имбецилов...
Нет, просто 95% багрепортов в этой теме - это глупые ошибки самих пользователей. Собственно, как и в этот раз.

Антон01
27.01.2016, 20:02
А как такое сделать?

format(string, sizeof(string), "/sethp %d %d %d", GetPVarInt(playerid, "id"), lvl, sd);
OnPlayerCommandText(playerid, string);

на


cmd::sethp(playerid, string);

DeimoS
27.01.2016, 20:41
А как такое сделать?

format(string, sizeof(string), "/sethp %d %d %d", GetPVarInt(playerid, "id"), lvl, sd);
OnPlayerCommandText(playerid, string);

на


cmd::sethp(playerid, string);

Сударь, вы долбитесь в очи:

http://i.imgur.com/p3BnSgf.png

Антон01
27.01.2016, 20:51
Сударь, вы долбитесь в очи:

http://i.imgur.com/p3BnSgf.png


Да все не надо сам разобрался, функция полностью не срабатывала, я подумал не так сделал команду, по логам краш из за моего косяка

Иван Бубнов
04.02.2016, 19:53
Как можно вызвать команду через диалоговое окно? Попробовал так:
cmd::inputtext(playerid, params[]);
OnPlayerCommandReceived(playerid, "/"#inputtext"");
OnPlayerCommandReceived(playerid, inputtext);

wea
04.02.2016, 22:51
Как можно вызвать команду через диалоговое окно? Попробовал так:
cmd::inputtext(playerid, params[]);
OnPlayerCommandReceived(playerid, "/"#inputtext"");
OnPlayerCommandReceived(playerid, inputtext);

по пробуй так
cmd_Команда(playerid, inputtext);

Иван Бубнов
04.02.2016, 22:58
по пробуй так
cmd_Команда(playerid, inputtext);

Ты не правильно понял. Надо вызывать cmd_inputtext(playerid, "");

ziggi
04.02.2016, 23:13
Ты не правильно понял. Надо вызывать cmd_inputtext(playerid, "");



new string[31];
format(string, sizeof(string), "cmd_%s", inputtext);
CallLocalFunction(string, "i", playerid);

Daniel_Cortez
04.02.2016, 23:36
new string[31];
format(string, sizeof(string), "cmd_%s", inputtext);
CallLocalFunction(string, "i", playerid);

Там же должно быть 32 ячейки (31 под название функции и 1 под символ конца строки). Да и название команды, по-хорошему, следовало бы проверять на наличие некорректных символов.

ziggi
05.02.2016, 01:47
Там же должно быть 32 ячейки (31 под название функции и 1 под символ конца строки). Да и название команды, по-хорошему, следовало бы проверять на наличие некорректных символов.

И правда, запамятовал. А про проверку написал в теме этого вопроса: http://pro-pawn.ru/showthread.php?13361-DC_CMD-CMD-%D0%BD%D0%B0%D0%B7%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%28playerid-params-%29&p=68888&viewfull=1#post68888

Володя
05.02.2016, 08:57
Щас решил протестировать zcmd и dc_cmd на серьёзных тестах

DC_CMD
[07:22:47] Результат 47347 ms

ZCMD
[07:25:48] Результат 46991 ms

И на сервере недели две всё так же без всякого ускорения.Несколько тестов сделал всегда zcmd выигрывает.Бред короче на core i5 :hi:

Daniel_Cortez
10.02.2016, 11:30
Щас решил протестировать zcmd и dc_cmd на серьёзных тестах
Этот пост сделал мой день.

Alexey_Nikiforov
15.02.2016, 09:34
Приветствую.
Хотел бы проконсультироваться.
По поводу DC_CMD.
Я пишу мод с нуля.
С pawn познакомился первый раз в 2010
И спустя 6 лет я снова тут.
Все забыл напрочь, сейчас еще очень много новых методов которые появились не так давно.
В общем тяжело все дается по новой.
Хотел узнать стоит ли мне как новичку использовать ваш плагин.
И где почитать материал актуальный как пользоваться в каком виде писать команды.
Заранее благодарю.

Daniel_Cortez
15.02.2016, 11:15
Приветствую.
Хотел бы проконсультироваться.
По поводу DC_CMD.
Я пишу мод с нуля.
С pawn познакомился первый раз в 2010
И спустя 6 лет я снова тут.
Все забыл напрочь, сейчас еще очень много новых методов которые появились не так давно.
В общем тяжело все дается по новой.
Хотел узнать стоит ли мне как новичку использовать ваш плагин.
И где почитать материал актуальный как пользоваться в каком виде писать команды.
Заранее благодарю.
... первый пост?

Alexey_Nikiforov
17.02.2016, 17:34
... первый пост?
Маленько не так поставил вопрос.

Хотел узнать стоит ли мне как новичку использовать ваш плагин.

Profyan
17.02.2016, 18:19
Маленько не так поставил вопрос.

Конечно.Им пользоваться намного удобнее,чем стандартным командным процессором.Он быстрее и функциональнее других к.п., а стандартного и подавно.

Alexey_Nikiforov
19.02.2016, 17:53
Стандартные команды отключить так?

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}
Или каким то другим способом?

И еще вопрос.
Как записать команду без параметров так:

CMD:kill(playerid, params[])
или так:

CMD:kill(playerid)

Profyan
19.02.2016, 18:41
Стандартные команды отключить так?

public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}
Или каким то другим способом?

И еще вопрос.
Как записать команду без параметров так:

CMD:kill(playerid, params[])
или так:

CMD:kill(playerid)

playerid и params[] - необязательные параметры.И вообще,ты можешь не обрабатывать переданный параметр.

Alexey_Nikiforov
20.02.2016, 12:38
Как это реализовать?


public OnPlayerCommandReceived(playerid, cmdtext[])
{
if(!IsPlayerAuthorized(playerid))
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы");
return 0;
}
return 1;
}
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if((success == -1) && (!IsPlayerAuthorized(playerid)))
{
return SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы");
}
if(!IsPlayerAuthorized(playerid))
{
return SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы1");
}
if(success == -1)
{
return SendClientMessage(playerid, COLOR_WHITE, "Неверная команда.");
}
return 1;
}


Работает не совсем корректно.

CheSToRiA
20.02.2016, 14:37
Как это реализовать?


public OnPlayerCommandReceived(playerid, cmdtext[])
{
if(!IsPlayerAuthorized(playerid))
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы");
return 0;
}
return 1;
}
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if((success == -1) && (!IsPlayerAuthorized(playerid)))
{
return SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы");
}
if(!IsPlayerAuthorized(playerid))
{
return SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы1");
}
if(success == -1)
{
return SendClientMessage(playerid, COLOR_WHITE, "Неверная команда.");
}
return 1;
}


Работает не совсем корректно.

Такого говна я давно не видел. Зачем пихать в каждый паблик с каждой проверкой? Достаточно в OnPlayerCommandReceived вставить проверку.

Kurbanoff
20.02.2016, 14:56
playerid и params[] - необязательные параметры.И вообще,ты можешь не обрабатывать переданный параметр.

Что я сейчас читал? :mda:


Уважаемый , Для того чтобы кому-то что-то объяснит , нужно показать полный пример , а не "оптимизированный" как вы думаете .
Новичок увидев что тут нету params[] , будет думать что ненужно вообще это использовать.

Alexey_Nikiforov
20.02.2016, 15:08
Такого говна я давно не видел. Зачем пихать в каждый паблик с каждой проверкой? Достаточно в OnPlayerCommandReceived вставить проверку.
Если бы вы прочитали тему полностью вот тут:
http://pro-pawn.ru/showthread.php?1028-DC_CMD-v2-8-%2823-03-14%29
И узнали про коллбэки OnPlayerCommandReceived и OnPlayerCommandPerformed:

Возможно в вашей голове стало бы меньше как вы говорите г...а

Salik_Davince
21.02.2016, 09:40
Как это реализовать?


public OnPlayerCommandReceived(playerid, cmdtext[])
{
if(!IsPlayerAuthorized(playerid))
{
SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы");
return 0;
}
return 1;
}
public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
if((success == -1) && (!IsPlayerAuthorized(playerid)))
{
return SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы");
}
if(!IsPlayerAuthorized(playerid))
{
return SendClientMessage(playerid, COLOR_WHITE, "Вы не авторизированы1");
}
if(success == -1)
{
return SendClientMessage(playerid, COLOR_WHITE, "Неверная команда.");
}
return 1;
}


Работает не совсем корректно.

в OnPlayerCommandReceived -

if(Logged{playerid} == false)//ставите свою проверку, тут я поставил рандомно что пришло в голову
{
SendClientMessage(playerid, -1, "Нужно авторизоватся!");
return false;//Вернем false, команда не будет выполнена.
}

mister-x
22.02.2016, 10:26
Внимание ошибки с плагином!



[21:11:21] Игрок [65535] ввёл команду: /jail 18
[21:11:21] ID 65535 //на принт поставил
[21:16:39] [debug] Run time error 4: "Array index out of bounds"
[21:16:39] [debug] Accessing element at index 65535 past array upper bound 99 //вышло за массив короче
[21:16:39] [debug] AMX backtrace:
[21:16:39] [debug] #0 0036b1a8 in public OnPlayerCommandReceived (playerid=65535, cmdtext[]=@0043c73c "/mkld 18 1") at C:\server\gamemodes\mod.pwn:56834 //последняя строка в моде


И так несколько раз у разных людей. пришлось перевести всё на zcmd больше таких ошибок нету.Исправляйте баги:diablo:

Daniel_Cortez
22.02.2016, 11:05
Вот чёрд, опять наплыв беженцев...

$continue$
22.02.2016, 13:04
Внимание ошибки с плагином!



[21:11:21] Игрок [65535] ввёл команду: /jail 18
[21:11:21] ID 65535 //на принт поставил
[21:16:39] [debug] Run time error 4: "Array index out of bounds"
[21:16:39] [debug] Accessing element at index 65535 past array upper bound 99 //вышло за массив короче
[21:16:39] [debug] AMX backtrace:
[21:16:39] [debug] #0 0036b1a8 in public OnPlayerCommandReceived (playerid=65535, cmdtext[]=@0043c73c "/mkld 18 1") at C:\server\gamemodes\mod.pwn:56834 //последняя строка в моде


И так несколько раз у разных людей. пришлось перевести всё на zcmd больше таких ошибок нету.Исправляйте баги:diablo:

Причем тут плагин?
Сидите на Г-И? Ну так и сидите, если вы не можете разрабраться, что тут дело не в плагине (а если ещё и поискать, то можно и целый плагин для решения данной проблемы найти (http://pro-pawn.ru/showthread.php?12957)).
В гугле забанили или что, я понять то не могу? Или у Вас на том самом портале - "мой код не виновен - вините программистов, которые пишут плагины"?

stimorol
28.02.2016, 12:56
rghost не работает:shout: Плагин срочно нужен.

m1n1vv
16.03.2016, 18:21
А как это будет на DC_CMD?

OnPlayerCommandText(playerid,"/cmd");

L0ndl3m
16.03.2016, 18:25
А как это будет на DC_CMD?

OnPlayerCommandText(playerid,"/cmd");

cmd::cmd_name(playerid, ""); // где cmd_name - название команды

m1n1vv
16.03.2016, 18:31
cmd::cmd_name(playerid, ""); // где cmd_name - название команды

Почти все идеально. А есть /audiomsg на этом движке?:grin:

TheMallard
17.03.2016, 13:58
Клиентские команды невозможно выполнять со стороны сервера.
Когда игрок вводит /audiomsg, команду перехватывает клиент и она к серверу не идет.

Daniel_Cortez
17.03.2016, 14:07
Клиентские команды невозможно выполнять со стороны сервера.
Когда игрок вводит /audiomsg, команду перехватывает клиент и она к серверу не идет.
Спасибо, что разъяснили всем присутствующим здесь принцип работы клиентских команд в SA:MP.

Salik_Davince
21.03.2016, 08:58
плагин как то не любит работать с "strlen" (параметры) передаваемые кмд процессором.

VVWVV
21.03.2016, 09:15
плагин как то не любит работать с "strlen" (параметры) передаваемые кмд процессором.

У плагина совсем другая задача. Это связано с языком pawn.

Salik_Davince
21.03.2016, 23:13
так по мне было написано что принцип работы этого процессора схож с ZCMD, вот сним можно работать с strlen, а с dc_cmd никак.

DeimoS
22.03.2016, 06:53
так по мне было написано что принцип работы этого процессора схож с ZCMD, вот сним можно работать с strlen, а с dc_cmd никак.

Схож, но не идентичен.
В каких ситуациях он не работает? Предоставь пример

Salik_Davince
22.03.2016, 10:14
Простой пример -

CMD:test(playerid,params[])
{
if(sscanf(params, "s[64]", params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "/test [Text]");
if(strlen(params[0]) >= 64)
return SendClientMessage(playerid, COLOR_GREY,"TEST: sokratite text.");
static const
test_msg[] = " %s %s";
new
test_string[ sizeof(test_msg) - (2*2) + MAX_PLAYER_NAME + 64 ]
;
format(test_string,sizeof(test_string), test_msg, Player[playerid][pName], params[0]);
SetPlayerChatBubble(playerid,params[0],0xDD90FFFF,30.0,10000);
return true;
}

DeimoS
22.03.2016, 10:55
Простой пример -

CMD:test(playerid,params[])
{
if(sscanf(params, "s[64]", params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "/test [Text]");
if(strlen(params[0]) >= 64)
return SendClientMessage(playerid, COLOR_GREY,"TEST: sokratite text.");
static const
test_msg[] = " %s %s";
new
test_string[ sizeof(test_msg) - (2*2) + MAX_PLAYER_NAME + 64 ]
;
format(test_string,sizeof(test_string), test_msg, Player[playerid][pName], params[0]);
SetPlayerChatBubble(playerid,params[0],0xDD90FFFF,30.0,10000);
return true;
}

Начнём с того, что для чего ты обрабатываешь всего лишь 1 параметр через sscanf, если он в массиве params и так есть? Ты данные из строки в эту же строку и записываешь
И закончим тем, что так проверка естественно не будет срабатывать, ибо ты в самом sscanf указал размер строки в 64 символа и sscanf будет записывать в массив именно 64 символа, а остальной текст отбрасывать, выплёвывая в консоль предупреждение об этом.

Вот как твоя команда должна выглядеть

CMD:test(playerid,params[])
{
if(isnull(params))
//if(!strlen(params))//Либо так, но первый вариант быстрее
return SendClientMessage(playerid, COLOR_WHITE, "/test [Text]");
if(strlen(params) >= 64)
return SendClientMessage(playerid, COLOR_GREY,"TEST: sokratite text.");
static const
test_msg[] = " %s %s";
new
test_string[ sizeof(test_msg) - (2*2) + MAX_PLAYER_NAME + 64 ]
;
format(test_string,sizeof(test_string), test_msg, Player[playerid][pName], params);
SetPlayerChatBubble(playerid,params,0xDD90FFFF,30.0,10000);
return true;
}

А вот как твой вариант будет работать, хоть это и неправильная реализация

CMD:test(playerid,params[])
{
if(sscanf(params, "s[65]", params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "/test [Text]");
if(strlen(params[0]) >= 64)
return SendClientMessage(playerid, COLOR_GREY,"TEST: sokratite text.");
static const
test_msg[] = " %s %s";
new
test_string[ sizeof(test_msg) - (2*2) + MAX_PLAYER_NAME + 64 ]
;
format(test_string,sizeof(test_string), test_msg, Player[playerid][pName], params[0]);
SetPlayerChatBubble(playerid,params[0],0xDD90FFFF,30.0,10000);
return true;
}

Salik_Davince
22.03.2016, 11:56
я привел простой пример с работой с sscanf, ну дело не в этом, спасибо.

DeimoS
22.03.2016, 12:42
я привел простой пример с работой с sscanf, ну дело не в этом, спасибо.

Эмм, так вставь мою команду в мод и посмотри. strlen прекрасно дружит с DC_CMD. Как она вообще может контачить с плагином, если плагин занимается лишь поиском нужной команды, а уже какой в команде код - плагин вообще не в курсе и ему, собственно, плевать

Unreal
25.04.2016, 15:45
Обновление (оптимизация/добавление новых фишек) будет?

Desulaid
25.04.2016, 15:51
Обновление (оптимизация/добавление новых фишек) будет?

Вроде ж все что душе угодно, все есть.

Unreal
26.04.2016, 15:44
Вроде ж все что душе угодно, все есть.

это да, все хорошо.. просто уже больше года прошло :) вдруг его можно ускорить или сделать лучше :scratch_one-s_head:

MaximP
06.05.2016, 21:28
Не знал что плагин сделал русский.

TheMallard
09.05.2016, 10:24
А ты знал что Zeex тоже русский?

vasyok28
05.08.2016, 15:00
// без параметров
cmd::help(playerid, "");

// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);

А что если 2 аргумента ?
cmd::help(playerid, 1, 1);
Как тогда? Выдает error 035: argument type mismatch (argument 2)

HarrWe
05.08.2016, 15:05
// без параметров
cmd::help(playerid, "");

// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);

А что если 2 аргумента ?
cmd::help(playerid, 1, 1);
Как тогда? Выдает error 035: argument type mismatch (argument 2)


new nazvanieperemennoy[11];
format(nazvanieperemennoy, sizeof(nazvanieperemennoy), "%d %d", То что у тебя отвечает за первый параметр, То что у тебя отвечает за 2 параметр);
cmd::help(playerid, nazvanieperemennoy);

Помог ставь +)

Desulaid
05.08.2016, 15:29
// без параметров
cmd::help(playerid, "");

// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);

А что если 2 аргумента ?
cmd::help(playerid, 1, 1);
Как тогда? Выдает error 035: argument type mismatch (argument 2)

Смотри. Создание команды - создание функции (потому что это и есть функция :В). В функции всего два аргумента - playerid и params[]. Так вот. Ты пытаешь команде добавить еще один аргумент, которого просто не существует! Работай с аргументом params[].

DoN_SancheS
30.11.2016, 21:01
Daniel, обновил версию вашего cmd c v1.0 на v2.8 и теперь такие ошибки


http://pixs.ru/showimage/pawnbagpng_8120392_24240746.png


http://pixs.ru/showimage/pawnbag2pn_9890173_24240759.png

Как их исправить?

vovandolg
01.12.2016, 01:54
Daniel, обновил версию вашего cmd c v1.0 на v2.8 и теперь такие ошибки


http://pixs.ru/showimage/pawnbagpng_8120392_24240746.png


http://pixs.ru/showimage/pawnbag2pn_9890173_24240759.png

Как их исправить?

Покажите строки на которых ошибки.

Daniel_Cortez
01.12.2016, 08:53
Daniel, обновил версию вашего cmd c v1.0 на v2.8 и теперь такие ошибки


http://pixs.ru/showimage/pawnbagpng_8120392_24240746.png


http://pixs.ru/showimage/pawnbag2pn_9890173_24240759.png

Как их исправить?
Для вызова команд из кода следует использовать макрос "cmd::". Пример в 1-м посте.

DoN_SancheS
01.12.2016, 17:01
Покажите строки на которых ошибки.

тут ''_zm" - undefined symbol (на предпоследнем строке)


{
if(!strlen(inputtext)) return SPD(playerid,341,DSI,"{00baff}Êîë-âî èãðîêîâ","Ââåäè êîë-âî èãðîêîâ:","Âûáîð","Îòìåíà");
new players = strval(inputtext);
if(players < 2 || players > 20) return SPD(playerid,341,DSI,"{00baff}Êîë-âî èãðîêîâ","Íåëüçÿ ìåíüøå 2 è áîëüøå 20","Âûáîð","Îòìåíà");
ZonePlayers = players;
format(string, sizeof(string), "Êîë-âî èãðîêîâ óñòàíîâëåíî íà %d.", players);
SCM(playerid, 0xf7f78cFF, string);
_zm(playerid);
}

id228fanta
07.02.2017, 16:40
Почему-то плагин не подключается (статик тоже пробовал, тоже не идёт). Я на шindoшs

Alpano
07.02.2017, 17:52
Почему-то плагин не подключается (статик тоже пробовал, тоже не идёт). Я на шindoшs
Ну так попробуй pawn.cmd (кликабельно) (http://pro-pawn.ru/showthread.php?13892-Pawn-CMD-%D1%81%D0%B0%D0%BC%D1%8B%D0%B9-%D0%B1%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D0%B8-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D1%8B%D0%B9-%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80). по скорости и функционалу не уступает

vovandolg
07.02.2017, 19:15
Почему-то плагин не подключается (статик тоже пробовал, тоже не идёт). Я на шindoшs

MV C++ 2005 - 2015, установи все версии на оба разряда и не парься по таким ошибкам))

Seviel
18.02.2017, 18:34
У меня есть предложение по улучшению плагина, не оригинальное, но удобное. Сделай группы команд.

Guldan
22.03.2017, 02:29
Привет, не знаюл куда написать чтоб не получилась реклама

Что использовать вместо OnPlayerCommandText то есть в OnPlayerCommandText приходит ответ хеш мод пака

И при использование твоего плагина хеш не получается получить

Подробней ознакомиться тут http://pawno.su/showthread.php?t=93241 Не реклама как прочитаешь можешь удалить
ибо в лс не смог написать ЛС переполнено

DeimoS
22.03.2017, 07:03
Я не автор плагина, но вот, по-моему, ответ на твой вопрос:



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; // разрешить выполнение команды
}

Хотя можно и этот коллбэк попробовать использовать


OnPlayerCommandReceived:

OnPlayerCommandReceived(playerid, cmdtext[])
Вызывается перед обработкой команды. В ней можно указать условия выполнения команды.
При этом с помощью return 1/0 можно разрешить/запретить выполнение команды.
Пример:

public OnPlayerCommandReceived(playerid, cmdtext[])
{
if(PlayerInfo[playerid][pMute] == 1) // если у игрока затычка (/mute)
{
SendClientMessage(playerid, -1, "Дождитесь окончания действия заглушки!");
return 0; // передать плагину, чтобы он не выполнял команду
}
return 1; // разрешить выполнение команды
}

Guldan
22.03.2017, 20:02
Что то не выходит, запрос идет в OnPlayerCommandText по идеи, но перехватывает его OnPlayerCommandPerformed и выдает if(success == -1) // если команда не найдена

DeimoS
22.03.2017, 20:36
Эмм, что?
Покажи код

Guldan
22.03.2017, 21:19
В OnPlayerCommandReceived и в OnPlayerCommandPerformed ничего не помогает, попробовал сделать как FS работает как часики то есть OnPlayerCommandText



public OnPlayerConnect(playerid) {
SendClientMessage(playerid,0x01010101, "$cmd get_custom_hash");
return 1;
}

public OnPlayerCommandReceived(playerid, cmdtext[]) {
if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
new packhash[64]; //Создадим массив, в котором будет находится этот хэш
strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
SendClientMessage (playerid, 0xFFFFFFFF, packhash); //И, к примеру, выведем текущий хэш в чат игроку.
return 1;
}
return 1;
}
public OnPlayerCommandPerformed(playerid, cmdtext[], success) {
/*if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
new packhash[64]; //Создадим массив, в котором будет находится этот хэш
strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
SendClientMessage (playerid, 0xFFFFFFFF, packhash); //И, к примеру, выведем текущий хэш в чат игроку.
return 1;
}*/
if(success == -1) SendClientMessage(playerid,C_White,!"Такой команды не существует");
return 1;
}

DeimoS
22.03.2017, 22:15
Ты это, надеюсь, не в оригинальном SA-MP проворачиваешь?

Guldan
22.03.2017, 22:21
Нет в cr-mp

DeimoS
22.03.2017, 22:47
А модпак установлен?

Залогируй значение cmdtext

Guldan
22.03.2017, 23:05
Дело в самих пабликах, почитай документацию установки мод пака, при том что ответ в OnPlayerCommandText отправляется сервером(при коннекте) а не игроком

Вот рабочий вариант, как видешь тут без dc_cmd


#include <a_samp>
public OnPlayerConnect(playerid)
{
SendClientMessage(playerid,0x01010101, "$cmd get_custom_hash");
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strfind(cmdtext, "$response get_custom_hash", true) != -1) //Если ответ получен и искомая строка найдена
{
new packhash[64]; //Создадим массив, в котором будет находится этот хэш
strmid(packhash, cmdtext, 26, strlen(cmdtext)); //Разделяем строку cmdtext и результат разделения - искомый хэш - запишем в массив packhash
SendClientMessage (playerid, 0xFFFFFFFF, packhash); //И, к примеру, выведем текущий хэш в чат игроку.
return 1;
}
return 0;
}

DeimoS
23.03.2017, 00:53
Так плагин и перехватывает коллбэк OnPlayerCommandText, вызывая свои 2 вместо него.


Залогируй значение cmdtext

Guldan
23.03.2017, 01:04
А это как ? что то не пойму

DeimoS
23.03.2017, 02:00
Эмм

public OnPlayerCommandReceived(playerid, cmdtext[]) {
printf("OnPlayerCommandReceived: %s", cmdtext);
return 1;
}
public OnPlayerCommandPerformed(playerid, cmdtext[], success) {
printf("OnPlayerCommandPerformed: %s", cmdtext);
return 1;
}

Guldan
23.03.2017, 03:20
Спасибо

Вот результат:


OnPlayerCommandPerformed: /response get_custom_hash 874233c431801d05
OnPlayerCommandText: $response get_custom_hash 874233c431801d05

DeimoS
23.03.2017, 11:27
Ну так и в чём проблема?

public OnPlayerConnect(playerid)
{
SendClientMessage(playerid,0x01010101, "$cmd get_custom_hash");
SetPVarInt(playerid, "get_custom_hash", 1);
return 1;
}

public OnPlayerCommandReceived(playerid, cmdtext[])
{
if(GetPVarInt(playerid, "get_custom_hash"))
{
if(strfind(cmdtext, "response get_custom_hash", true) != -1)
{
DeletePVar(playerid, "get_custom_hash");
new packhash[64];
strmid(packhash, cmdtext, 26, strlen(cmdtext));
SendClientMessage (playerid, 0xFFFFFFFF, packhash);
return 0;
}
}
return 1;
}

Guldan
23.03.2017, 17:42
Я решил сразу же, только не так как ты
а вот так if(strfind(cmdtext, "/response get_custom_hash", true) != -1) то есть вместо $ поставил / и работает отлично

Nexius_Tailer
23.03.2017, 18:08
А не смущает, что игрок может просто ввести команду "/response get_custom_hash [hash]" и отправить тем самым на сервер ложную информацию? Конечно делать это он сможет только единожды, если завести некий флаг как в варианте выше, но всё-же

DeimoS
23.03.2017, 18:33
А не смущает, что игрок может просто ввести команду "/response get_custom_hash [hash]" и отправить тем самым на сервер ложную информацию? Конечно делать это он сможет только единожды, если завести некий флаг как в варианте выше, но всё-же

Довольно тяжко же подловить момент отправки команды. Да и что это изменит? Сия проверка, как я понимаю, подразумевает чисто проверку того, установлен ли модпак у игрока или нет

Nexius_Tailer
23.03.2017, 21:19
Довольно тяжко же подловить момент отправки команды. Да и что это изменит? Сия проверка, как я понимаю, подразумевает чисто проверку того, установлен ли модпак у игрока или нет
Подловить как раз таки легко. Прямо после коннекта, если реальных модов стоять не будет и если ничего не будет по умолчанию возвращать это первее, чем сам игрок. Если после этой проверки игроку даются какие-то поблажки (например, под модпаком подразумевался клиенсткий античит), то это проблема.

DeimoS
23.03.2017, 22:10
Подловить как раз таки легко. Прямо после коннекта, если реальных модов стоять не будет и если ничего не будет по умолчанию возвращать это первее, чем сам игрок. Если после этой проверки игроку даются какие-то поблажки (например, под модпаком подразумевался клиенсткий античит), то это проблема.

Не, там же под модпаком подразумеваются текстурки изменённые и не более. custom.img правится и хэш именно его вычисляется.
А проверку можно делать и не прямо после коннекта, а в любой другой момент же

Иван Бубнов
16.04.2017, 18:08
А она cовмеcтима c OnPlayerCommandText?

VVWVV
16.04.2017, 20:01
А она cовмеcтима c OnPlayerCommandText?

Вы можете перехватить паблик OnPlayerCommandText до включения библиотеки в файл. Можно ещё изменить что-то в файле, но, как мне кажется, это самый худший вариант.

Daniel_Cortez
16.04.2017, 21:02
А она cовмеcтима c OnPlayerCommandText?
http://pro-pawn.ru/showthread.php?1028#func_opcr_opcp