PDA

Просмотр полной версии : [Plugin] Pawn.CMD - самый быстрый и функциональный командный процессор



urShadow
01.06.2016, 23:19
Pawn.CMD 3.1.4

Описание:
Pawn.CMD - новый командный процессор, который работает через плагин.
Плагин совместим с любой версией SA:MP, несмотря на работу с памятью.


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

Natives:


native PC_RegAlias(const cmd[], const alias[], ...);
native PC_SetFlags(const cmd[], flags);
native PC_GetFlags(const cmd[]);
native PC_EmulateCommand(playerid, const cmdtext[]);
native PC_RenameCommand(const cmd[], const newname[]);
native PC_CommandExists(const cmd[]);
native PC_DeleteCommand(const cmd[]);

native CmdArray:PC_GetCommandArray();
native CmdArray:PC_GetAliasArray(const cmd[]);
native PC_GetArraySize(CmdArray:arr);
native PC_FreeArray(&CmdArray:arr);
native PC_GetCommandName(CmdArray:arr, index, dest[], size = sizeof dest);


Callbacks:


forward PC_OnInit(); // calls after Pawn.CMD initialization
forward OnPlayerCommandReceived(playerid, cmd[], params[], flags); // calls before a command
forward OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags); // calls after a command


Установка:
Распакуйте архив в папку вашего сервера. Отредактируйте"server.cfg":

- Windows

plugins pawncmd.dll
- Linux

plugins pawncmd.so

Пример команды:

#include <Pawn.CMD>

cmd:help(playerid, params[]) // к тому же возможно использовать CMD и COMMAND
{
// код
return 1;
}


Регистрация альтернативных названий (псевдонимов):


#include <Pawn.CMD>

cmd:help(playerid, params[])
{
// код
return 1;
}
alias:help("commands", "cmds", "menu"); // нечувствительно к регистру


Использование флагов:


#include <Pawn.CMD>

enum(<<=1)
{
CMD_ADMIN = 1,
CMD_MODER,
CMD_USER
};

flags:ban(CMD_ADMIN);
cmd:ban(playerid, params[])
{
// code here
return 1;
}

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
if ((flags & CMD_ADMIN) && !pAdmin[playerid])
return 0;

return 1;
}


Полный пример:


#include <Pawn.CMD>

enum(<<=1)
{
CMD_ADMIN = 1,
CMD_MODER,
CMD_USER
};

flags:ban(CMD_ADMIN);
cmd:ban(playerid, params[])
{
// code here
return 1;
}
alias:ban("block");

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
if ((flags & CMD_ADMIN) && !pAdmin[playerid])
return 0;

return 1;
}

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
if(result == -1)
{
SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: Unknown command.");
return 0;
}

return 1;
}


Если вы хотите использовать Pawn.CMD в filterscript, вставьте этот define перед include:

#define FILTERSCRIPT

Changelog:
1.0:
- Первый релиз.
2.0:
- Теперь плагин полностью совместим с синтаксисом zcmd.
2.1:
- Были исправлены баги.
3.0:
- Добавлен макрос "callcmd" для вызова команды. Пример: callcmd::ban(playerid, "42");
- Добавлены нативы: PC_SetFlags, PC_GetFlags, PC_EmulateCommand, PC_RenameCommand, PC_DeleteCommand.
- Добавлен макрос "isnull" для проверки параметров команды.
- Удалена запись в консоль о регистрации команды.
- "cmdtext" был разделен на "cmd" и "params".
- Потеряна совместимость с синтаксисом zcmd.
3.1:
- Добавлены нативы: PC_CommandExists, PC_GetCommandArray, PC_GetAliasArray, PC_GetArraySize, PC_FreeArray, PC_GetCommandName.
- Добавлен макрос "PC_HasFlag".
- Добавлен паблик "PC_OnInit".
- Изменен натив "PC_GetFlags".
- Совместимость с YSI.
3.1.1:
- Исправлена ошибка в функции "PC_RenameCommand".
3.1.2:
- Исправлена ошибка в очереди скриптов.
3.1.3:
- Исправлена ошибка "File or function is not found"
3.1.4:
- Добавлена поддержка OPCT

Download binaries:
https://github.com/urShadow/Pawn.CMD/releases

Source code:
https://github.com/urShadow/Pawn.CMD

Source code of the benchmark:
https://gist.github.com/urShadow/14da06af69232657e017088cf2f23cbe

Внимание:
При использовании версии 3.1.4 убедитесь, что в Вашем моде и скриптах отсутствует возврат единицы в коллбэке OnPlayerCommandText (иначе команды через "CMD:" работать не будут).
Для правильной работы плагина Вы должны убедиться, что в конце каждого OnPlayerCommandText (не в командах) возвращается нуль.
То есть, если у Вас так:

public OnPlayerCommandText(playerid, cmdtext[])
{
//Тут могут быть команды
return 1;
}

То нужно сделать так:

public OnPlayerCommandText(playerid, cmdtext[])
{
//Тут могут быть команды
return 0;
}
В самих командах же нужно возвращать единицу.

Nexius_Tailer
01.06.2016, 23:34
По-подробнее можно?)
Насколько известно, mcmd хакает память для того, чтобы отключить вызов OnPlayerCommandText. А какие особенности у этого плагина?

Иван Бубнов
01.06.2016, 23:41
Подозрительный персонаж

Fallen A.
02.06.2016, 00:05
Подозрительный персонаж

Ты про чела в очках на аватарке?

urShadow
02.06.2016, 00:06
По-подробнее можно?)
Насколько известно, mcmd хакает память для того, чтобы отключить вызов OnPlayerCommandText. А какие особенности у этого плагина?
Этот плагин тоже напрямую работает с памятью и отключает вызов OnPlayerCommandText, но работает быстрее благодаря продуманной реализации.

vasyok28
02.06.2016, 00:11
Ты про чела в очках на аватарке?

ахахах

Daniel_Cortez
02.06.2016, 05:15
Идея с перехватом вызова OPCT прямиком в коде сервера хороша, но не нова (такое было ещё в mcmd 2 года назад). К тому же, могут возникнуть проблемы, если Куй скомпилирует новую версию сервера с помощью другой версии MSVC++/GCC - плагин просто не найдёт нужный фрагмент кода и не будет работать (того же эффекта можно добиться, если заставить MSVC++ и GCC по возможности компилировать функции без пролога/эпилога).

Кто планирует пользоваться этим плагином - хорошо обдумайте свой выбор, т.к. есть вероятность, что при апгрейде до новой версии сервера придётся ждать обновления плагина, что таки может быть критично, если для SA-MP сделают новый эксплоит, которым можно положить любой сервер (такое уже было 2 года назад).

P.S.: Я не сомневаюсь в правдивости графика сравнения Pawn.CMD с DC_CMD и mcmd (замена вызовов OPCT в памяти сервера на свой код должна быть куда быстрее, чем вызов public-функции и нативки из неё, хоть это и не самый надёжный способ), но всё же не помешало бы выложить исходники теста производительности.

urShadow
02.06.2016, 09:49
Идея с перехватом вызова OPCT прямиком в коде сервера хороша, но не нова (такое было ещё в mcmd 2 года назад)
Оригинальным мой плагин назван не был. Я не отрицаю, что взял лучшее из известных мне плагинов и сделал как надо. Свежей идеей можно считать разве что отсутствие вызова amx_FindPublic при каждом новом сообщении, что значительно экономит время.


К тому же, могут возникнуть проблемы, если Куй скомпилирует новую версию сервера с помощью другой версии MSVC++/GCC - плагин просто не найдёт нужный фрагмент кода и не будет работать (того же эффекта можно добиться, если заставить MSVC++ и GCC по возможности компилировать функции без пролога/эпилога).

Плагин совместим со всей веткой 0.3 за последние 6 лет. Не думаю, что внезапно Kalcor сделает что-то, что изменит сигнатуру нужной функции, но даже если это произойдет, то мне не составит труда обновить ее.

Днем выложу исходный код плагина, которым я измерял скорость работы.

urShadow
02.06.2016, 22:29
Обновил до версии 2.0.
Как и обещал, ссылка на исходник плагина, которым я замерял среднюю задержку между приходом RPC_ServerCommand и вызовом cmd_test. Во время теста было зарегистрировано 100 команд.
https://gist.github.com/urShadow/14da06af69232657e017088cf2f23cbe

seriu
02.06.2016, 23:05
А предусмотрен вызов команды из мода?
К примеру у DC


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

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

ziggi
02.06.2016, 23:08
А предусмотрен вызов команды из мода?

Просто вызывай так: cmd_help(playerid, "");

seriu
02.06.2016, 23:13
плагин не совместим со sscanf и streamer ?
http://i.imgur.com/hMVkfr0.png

п.с поставил "Pawn.CMD.dll" после "sscanf streamer" - Работает
- - - Добавлено - - -


Просто вызывай так: cmd_help(playerid, "");

точно, это же обычный паблик ;c

Rodrigo
03.06.2016, 14:58
Как такое вообще возможно? Что DC_CMD в виде плагина уступает по скорости обычному ZCMD?

Nexius_Tailer
03.06.2016, 16:04
Как такое вообще возможно? Что DC_CMD в виде плагина уступает по скорости обычному ZCMD?
И да, тем более странно, что izcmd проигрывает zcmd, в то время как делался он в первую очередь как более быстрый его аналог..

Мне кажется, тест нужно провести с большим количеством команд и их вызовов.

seriu
03.06.2016, 16:09
И да, тем более странно, что izcmd проигрывает zcmd, в то время как делался он в первую очередь как более быстрый его аналог..

Мне кажется, тест нужно провести с большим количеством команд и их вызовов.

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

urShadow
03.06.2016, 16:16
Для теста было зарегистрировано 100 команд. 50 раз с клиента отправлял одну из команд на сервер и сохранял время, которое прошло с момента прихода RPC_ServerCommand до вызова тестируемой команды. При выгрузке бенчмарка вычислял среднее значение, которое я как раз и использовал в графике.

Все командные процессоры были протестированы в одинаковых условиях.

urShadow
10.06.2016, 15:53
Обновил до версии 2.1.

Igor_Stalker
10.06.2016, 21:47
как в вашем процессоре сделать как у DC_CMD вызов команды?

cmd::mm(playerid);
а у вас как сделать?

urShadow
10.06.2016, 23:08
cmd_mm(playerid, params);

Igor_Stalker
10.06.2016, 23:21
Подключил,при запуске samp-server.exe. Выдаёт лог с debug

[debug] Run time error 19: "File or function is not found"
[debug] PC_RegAlias
[debug] Run time error 19: "File or function is not found"
[debug] PC_RegAlias
Как исправить?

Daniel_Cortez
11.06.2016, 11:19
как в вашем процессоре сделать как у DC_CMD вызов команды?

cmd::mm(playerid);
а у вас как сделать?
На этот вопрос уже ответили всего несколькими постами выше.

Помню, в теме с DC_CMD одни и те же вопросы задавались по несколько раз - так и хотелось спросить: "неужели это так сложно найти ответ в 1-м посте или пролистать тему? Откройте глаза, а если это не помогает - включите монитор."
Одно радует: теперь это уже не моя проблема.

urShadow, советую добавить в плагин проверку соответствия версии инклуда с версией плагина.
Реализацию можешь взять из DC_CMD - там версия объявляется в файле dc_cmd.inc, а сам файл можно использовать и как инклуд на Pawn, и как заголовочный файл на C/C++ в процессе компиляции плагина.
С такой реализацией исключаются ситуации, когда обновил версию инклуда, но забыл изменить её в коде плагина или наоборот.

urShadow
11.06.2016, 11:56
Подключил,при запуске samp-server.exe. Выдаёт лог с debug

[debug] Run time error 19: "File or function is not found"
[debug] PC_RegAlias
[debug] Run time error 19: "File or function is not found"
[debug] PC_RegAlias
Как исправить?
Покажи строчку plugins из файла server.cfg.

urShadow, советую добавить в плагин проверку соответствия версии инклуда с версией плагина.
Реализацию можешь взять из DC_CMD - там версия объявляется в файле dc_cmd.inc, а сам файл можно использовать и как инклуд на Pawn, и как заголовочный файл на C/C++ в процессе компиляции плагина.
С такой реализацией исключаются ситуации, когда обновил версию инклуда, но забыл изменить её в коде плагина или наоборот.
Благодарю за совет.

Igor_Stalker
11.06.2016, 13:31
plugins crashdetect dc_cmd FileManager streamer sscanf mysql CRP Pawn.CMD

urShadow
11.06.2016, 14:28
plugins crashdetect dc_cmd FileManager streamer sscanf mysql CRP Pawn.CMD
Pawn.CMD замени на Pawn.CMD.dll, иначе функция загрузки плагина будет считать, что '.CMD' это расширение файла.

Igor_Stalker
11.06.2016, 15:00
Спасибо!Всё заработало.Довольно таки хороший процессор.

Rodrigo
11.06.2016, 20:57
Почему не переименуешь проект допустим в u_cmd ?

urShadow
11.06.2016, 21:04
Почему не переименуешь проект допустим в u_cmd ?
А какая разница вообще? Задумано так.

Rodrigo
11.06.2016, 21:22
У некоторых бывают проблемы после перевода на дк кмд, и нубы понять не могут в чем проблема, как и в инклуде дк кмд добавь к себе:


#if !defined isnull
#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))
#endif

urShadow
11.06.2016, 21:35
У некоторых бывают проблемы после перевода на дк кмд, и нубы понять не могут в чем проблема, как и в инклуде дк кмд добавь к себе:


#if !defined isnull
#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))
#endif
Уже знаю об этом недочете. В следующем обновлении будет исправлено.

vovandolg
12.06.2016, 00:21
Pawn.CMD замени на Pawn.CMD.dll, иначе функция загрузки плагина будет считать, что '.CMD' это расширение файла.

Дык это, а как же с линуксом быть? .so не пишем же на конце или как там?
имхо, я бы назвал уже плагин примерно так хотя бы Pawn_CMD, чтобы не было запарок по этому поводу что ле...

Sp1ke
12.06.2016, 04:04
Дык это, а как же с линуксом быть? .so не пишем же на конце или как там?
имхо, я бы назвал уже плагин примерно так хотя бы Pawn_CMD, чтобы не было запарок по этому поводу что ле...

Элементарно же, если не приписывать .so или .dll расширение , то за то самое расширение будет приниматься .CMD, а значит плагин работать не будет.
На хостинге прописываем .so, на винде .dll

Иван Бубнов
12.06.2016, 18:35
Человек много о себе думает. А плагин (если верить его тестам) вроде неплохой. Однако я бы не взял его) Удачи

urShadow
12.06.2016, 18:42
Человек много о себе думает.
Аргументируй хотя бы.

Daya
12.06.2016, 19:44
Человек много о себе думает. А плагин (если верить его тестам) вроде неплохой. Однако я бы не взял его) Удачи

Вы хотя-бы для начала разработайте FULLSTACK ROLE PLAY GAMEMODE PE}|{uM DEBEJLOTTeP. Ваш комментарий - не рентабелен, попрошу ознакомится с данным продуктом сопотаясь с муськой на более близком расстоянии.

http://gorod48.ru/upload/iblock/a0c/a0c112f9186b92d0a975775eb42bec71.jpg

Nexius_Tailer
12.06.2016, 22:34
Такое чувство, что человек выше обкурился

Daya
12.06.2016, 23:20
Такое чувство, что человек выше обкурился

Прошу прощения, я не знало что в радиусе 300 метров нет крокодилов и мраморных анаконд, и что так же в данном контексте они отсутствуют.

vovandolg
13.06.2016, 16:18
Элементарно же, если не приписывать .so или .dll расширение , то за то самое расширение будет приниматься .CMD, а значит плагин работать не будет.
На хостинге прописываем .so, на винде .dll
ах надрываЦо писать там ещё .so:sarcastic: не царское это дело(шучу канеш)
______________

Человек много о себе думает. А плагин (если верить его тестам) вроде неплохой. Однако я бы не взял его) Удачи
Если в 0.4 не чего толкового не будет и в этом движке не найдут чего критического, то вполне нормальная разработка,
ноете тут не знаю как:girl_cry:

newbie01
13.06.2016, 16:46
0.4 не будет насколько дал понять сам Kalcor или я что-то путаю?

Igor_Stalker
13.06.2016, 23:09
0.4 не будет насколько дал понять сам Kalcor или я что-то путаю?

может и будет,но Kalcor боится,что всем скриптерам придётся переписывать мод полностью с нуля,потому что 0.4 может быть очень глобальным обновление для Samp ,поэтому с нуля.Да ,я думаю ,что и Администраторы крупных проектов этого не хотят!

Daniel_Cortez
13.06.2016, 23:23
0.4 не будет насколько дал понять сам Kalcor или я что-то путаю?
Почти. (http://forum.sa-mp.com/showpost.php?p=3695458&postcount=159) Если верить его словам, то, скорее всего, ветка 0.3 будет самой последней в истории развития SA-MP. Ещё он объясняет отсутствие крупных обновлений тем, что якобы решения о развитии SA-MP принимает не он сам, а владельцы крупных серверов.
Интересно, если бы его спросили про отсутствие багфиксов (даже самых элементарных, которые можно сделать буквально за пару минут) и он не мог удалить или проигнорировать пост с вопросом, то он тоже свалил бы всё на владельцев серверов? Ведь держатели крупных серверов - очень нежные создания, они не то, чтобы апгрейда, даже багфикса не перенесут!

vovandolg
14.06.2016, 01:22
может и будет,но Kalcor боится,что всем скриптерам придётся переписывать мод полностью с нуля,потому что 0.4 может быть очень глобальным обновление для Samp ,поэтому с нуля.Да ,я думаю ,что и Администраторы крупных проектов этого не хотят!

Переписывать не переписывать, это проблемы самих админов, как с 0.3е который до сей поры юзают и покупают Hosted на них:read:
Самое главное чтобы была стабильность и грамотные нововведения..

Иван Бубнов
15.06.2016, 21:35
http://ihost.pro-pawn.ru/image.php?di=L18A

urShadow, сказал как пернул.

urShadow
15.06.2016, 22:24
Речь шла о последней версии с открытым исходным кодом и от своих слов я не отказываюсь.
https://github.com/Daniel-Cortez/DC_CMD

Иван Бубнов
15.06.2016, 23:25
Благо мне переслали весь диалог, и ввели Вы там себя достаточно высокомерно. С ЧСВ проблемы?

ziggi
15.06.2016, 23:30
Речь шла о последней версии с открытым исходным кодом и от своих слов я не отказываюсь.
https://github.com/Daniel-Cortez/DC_CMD

Последняя версия, на сколько мне известно, написана на FASM (или C++ версия скомпилирована в FASM и оптимизирована, не уверен). Вот тут есть ссылка на исходники: http://forum.sa-mp.com/showthread.php?t=432330

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

urShadow
15.06.2016, 23:31
Благо мне переслали весь диалог, и ввели Вы там себя достаточно высокомерно. С ЧСВ проблемы?
Я должен перед тобой отчитываться о том, как я вел себя в своей же конференции?

$continue$
16.06.2016, 02:11
Неа, вроде не на fasm. Стас, переписывал на С++, т.к его идею с fasm засрали. Он сам, где то об этом говорил (на п-п)

Daya
16.06.2016, 11:32
Благо мне переслали весь диалог, и ввели Вы там себя достаточно высокомерно. С ЧСВ проблемы?

Спасибо за запрос.

Данный ученик получает оценку "2" за поведение.

С уважением, директор школы, Строусрипов Семен Евгеньевич.

Unreal
19.06.2016, 22:42
как насчет такого же плагина для диалогов =)
ну я в этом не шарю, поэтому и пишу

я про способ Londlem'а, сделать так же но и плагин что-бы наверняка

Иван Бубнов
20.06.2016, 08:02
Спасибо за запрос.

Данный ученик получает оценку "2" за поведение.

С уважением, директор школы, Строусрипов Семен Евгеньевич.

О мой мозг, что ты несешь

$continue$
20.06.2016, 16:42
Читай. (http://pro-pawn.ru/showthread.php?13493)

как насчет такого же плагина для диалогов =)
ну я в этом не шарю, поэтому и пишу

я про способ Londlem'а, сделать так же но и плагин что-бы наверняка

urShadow
24.06.2016, 00:20
Pawn.CMD обновлен до версии 3.0.

123
24.06.2016, 11:05
native PC_Init(bool:is_gamemode);
native PC_RegAlias(const cmd[], const alias[], ...);
native PC_SetFlags(const cmd[], flags);
native PC_GetFlags(const cmd[], &flags);
native PC_EmulateCommand(playerid, const cmdtext[]);
native PC_RenameCommand(const name[], const newname[]);
native PC_DeleteCommand(const name[]);

Поясните использование этих адовых штуковин, ибо так не понятно. И что флаги делают? Смысл их использования?

urShadow
24.06.2016, 11:30
native PC_Init(bool:is_gamemode);
native PC_RegAlias(const cmd[], const alias[], ...);
native PC_SetFlags(const cmd[], flags);
native PC_GetFlags(const cmd[], &flags);
native PC_EmulateCommand(playerid, const cmdtext[]);
native PC_RenameCommand(const name[], const newname[]);
native PC_DeleteCommand(const name[]);

Поясните использование этих адовых штуковин, ибо так не понятно. И что флаги делают? Смысл их использования?
PC_RegAlias регистрирует альтернативные названия команды. Через этот натив работает макрос alias.
PC_SetFlags/PC_GetFlags нужны для работы с флагами. Пример такой работы есть в первом сообщении.
PC_EmulateCommand эмулирует ввод команды игроком.
PC_RenameCommand/PC_DeleteCommand - думаю, что по названию понятно, что они делают.

Blood
24.06.2016, 21:36
CMD:test(playerid, params[])
{
/////
return 1;
}
alias:test("t");

///где-то в паблике
callcmd::t(playerid, "");

Ошибка

error 017: undefined symbol "pc_cmd_t"
Маленький недочет , можно исправит ?

urShadow
24.06.2016, 22:10
Нельзя вызывать по алиасу из кода. Используй callcmd::test(playerid, "");

Blood
24.06.2016, 22:20
Нельзя вызывать по алиасу из кода. Используй callcmd::test(playerid, "");

Нельзя ли такое сделать в новых обновах ?

VVWVV
24.06.2016, 22:52
Нельзя ли такое сделать в новых обновах ?

Можно же использовать функцию PC_EmulateCommand

urShadow
25.06.2016, 10:11
Нельзя ли такое сделать в новых обновах ?
Нельзя, и смысла я в этом никакого не вижу. Могу добавить натив PC_CallCommand, но это будет медленнее, чем макрос callcmd::.

seriu
29.06.2016, 13:58
Нельзя, и смысла я в этом никакого не вижу. Могу добавить натив PC_CallCommand, но это будет медленнее, чем макрос callcmd::.

А что на счёт совместимости с JIT ? пробовал на хостинге запустить сервер не включается. Убрал JIT — запустился. Кроме pawncmd.so у меня еще были установлены плагины mysql_static.so streamer.so sscanf.so, но с ними JIT запускается.

newbie01
29.06.2016, 14:05
А что на счёт совместимости с JIT ? пробовал на хостинге запустить сервер не включается. Убрал JIT — запустился. Кроме pawncmd.so у меня еще были установлены плагины mysql_static.so streamer.so sscanf.so, но с ними JIT запускается.

Может дело в хостинге?

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

seriu
29.06.2016, 14:33
Может дело в хостинге?

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

На компьютере я тоже запускал с JIT нормально, на myaren не запускает и на advens хостинге.

urShadow
29.06.2016, 23:39
Обновлен до версии 3.1:
- Добавлены нативы: PC_CommandExists, PC_GetCommandArray, PC_GetAliasArray, PC_GetArraySize, PC_FreeArray, PC_GetCommandName.
- Добавлен макрос "PC_HasFlag".
- Добавлен паблик "PC_OnInit".
- Изменен натив "PC_GetFlags".
- Совместимость с YSI.

urShadow
02.07.2016, 11:07
Обновил график.

Nexius_Tailer
02.07.2016, 14:33
Заметил забавную штуку: у меня стоит велосипед (http://pro-pawn.ru/showthread.php?13716), который делает возможным использование команд как с cmd процессором, так и без. Если подключить к скрипту инклуд pawn.cmd, то всё по прежнему работает, но если подключить плагин, но не подключать инклуд - команды не видит (и при этом никаких "SERVER: Unknown command" не выдаёт).

UPD: А, он ведь отключает вызов OnPlayerCommandText http://dungeonkeepers.ucoz.com/smile/slowpoke.gif

devStyle
03.07.2016, 02:32
Странноватый Туповатый вопрос. А нельзя ли включить исходник плагина в проект и использовать совместно с sampgdk?
Ну типа мод для сервера SAMP написанный на С++ с использованием sampgdk и mysql connector`a, да еще и с самым быстрым командным процессором.
(Нет, я не извращенец!) :lol:

urShadow
05.07.2016, 12:27
Обновлен до версии 3.1.1

- Исправлена ошибка в функции "PC_RenameCommand".

urShadow
09.07.2016, 16:30
Обновен до версии 3.1.2.

DeimoS
11.07.2016, 14:31
Ай-яй-яй...

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

Антивирус против методов, которые ты используешь

ziggi
11.07.2016, 14:59
Ай-яй-яй...

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

Антивирус против методов, которые ты используешь

Не удивительно, оно же с памятью другого процесса работает. Если боязно, то исходники открыты, можно скомпилировать самостоятельно.

DeimoS
11.07.2016, 15:28
Не удивительно, оно же с памятью другого процесса работает. Если боязно, то исходники открыты, можно скомпилировать самостоятельно.

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

$continue$
01.08.2016, 01:25
Жду обновления плагина! В следующих версиях обещает быть ещё быстрей!

KostyaNL
06.02.2017, 00:26
Возможно ли изменение флага для команды прямо из игры?

DeimoS
06.02.2017, 15:57
Возможно ли изменение флага для команды прямо из игры?

В описании же написано

native PC_SetFlags(const cmd[], flags);
native PC_GetFlags(const cmd[]);

KostyaNL
07.02.2017, 20:47
В описании же написано

native PC_SetFlags(const cmd[], flags);
native PC_GetFlags(const cmd[]);

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

?


PC_SetFlags("menu", "2");

vovandolg
07.02.2017, 23:36
Название функций есть. Но принцип работы с ними не указан. Например, я хочу написать команду для редактирования флагов. Как указывать команду в функции ?

?


PC_SetFlags("menu", "2");


ну так ты подучи Pawn и поймешь)

здесь был код, но он обиделся и ушёл ...

KostyaNL
08.02.2017, 23:20
ну так ты подучи Pawn и поймешь)



#include <Pawn.CMD>

enum(<<=1)
{
CMD_ADMIN = 1,
CMD_MODER,
CMD_USER
};


public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
if (flags & CMD_ADMIN && !pAdmin[playerid])
return SendClientMessage(playerid, -1 "Тыыы нее проойдёёёшь!");
return 1;
}

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
if(result == -1)
{
SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: Unknown command.");
return 0;
}
return 1;
}

CMD:lock(playerid, params[])
{
PC_SetFlags("lock", CMD_ADMIN);
SendClientMessage(playerid, 0xFFFFFFFF, "Ты запер команду изнутри!");
return 1;
}


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

DeimoS
09.02.2017, 14:36
Спасибо, конечно. Но Высказывание несуразное. Я спросил по поводу одной функции, а Вы меня pawn отправляете учить... высокомерие.

Флаги есть не только в этой функции и не только в этом плагине. И если ты знаешь как с ними работать в остальном ЯП, то и в этом плагине тебе бы не составило труда правильно всё оформить. Он про это говорит.

vovandolg
09.02.2017, 21:21
Спасибо, конечно. Но Высказывание несуразное. Я спросил по поводу одной функции, а Вы меня pawn отправляете учить... высокомерие.

Хорошо ты замечаешь как люди высказываются, а пример под спойлером типо я для себя делал:rofl:
ну ок

Иван Бубнов
20.02.2017, 02:24
Неплохо было бы если в flags можно было указывать несколько.

Допустим есть команда /achat.



flags:achat(1, 2);
public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
if((flags & 1) && !PlayerInfo[playerid][pAdmin])
{
SendClientMessage(playerid, -1, !"Данная команда доступна только для админов.");
return 0;
}
if((flags & 2) && PlayerInfo[playerid][pMuted])
{
SendClientMessage(playerid, -1, !"У Вас бан чат.");
return 0;
}
return 1;
}

vovandolg
20.02.2017, 02:35
Это уже лень поедает тебя))
После каждой команды или внутри её всё равно придется расставлять метки о том что она для админов или у тебя мут и т.п.

Иван Бубнов
20.02.2017, 10:26
Это уже лень поедает тебя))
После каждой команды или внутри её всё равно придется расставлять метки о том что она для админов или у тебя мут и т.п.

зачем расставлять проверку на админку если можно проверить через flags? И вообще, название говорит само за себя, flags, то есть флаги (метки), а не метка. То есть туда по сути нужно было сделать чтобы указывали много флагов, или переименовать в flag:achat(1);

DeimoS
20.02.2017, 12:13
зачем расставлять проверку на админку если можно проверить через flags? И вообще, название говорит само за себя, flags, то есть флаги (метки), а не метка. То есть туда по сути нужно было сделать чтобы указывали много флагов, или переименовать в flag:achat(1);

И вместо проверки на мут в каждой нужной команде тебе придётся прописывать новый флаг. Шило на мыло меняешь, не?

ziggi
20.02.2017, 23:02
И вместо проверки на мут в каждой нужной команде тебе придётся прописывать новый флаг. Шило на мыло меняешь, не?

То есть проверка на мут в каждой команде лучше, чем добавление флага и проверка на мут в одном месте? Можно всем чат командам добавить флаг CMD_CHAT и проверить в OnPlayerCommandReceived.

Geebrox
21.02.2017, 01:02
И вместо проверки на мут в каждой нужной команде тебе придётся прописывать новый флаг. Шило на мыло меняешь, не?

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

DeimoS
21.02.2017, 01:28
То есть проверка на мут в каждой команде лучше, чем добавление флага и проверка на мут в одном месте? Можно всем чат командам добавить флаг CMD_CHAT и проверить в OnPlayerCommandReceived.

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

Пишем обычный stock, а-ля

stock IsPlayerMuted(playerid)
{
//И тут проверка
}
После прописываем вызов этого stock в нужных командах и всё: получится та же самая проверка в одном месте.

Я не говорю, что флаги не нужны. Просто это не так критично и если с ними заиграться, они наоборот начнут лишь путать (будет у каждой команды по 10 флагов и будет каша). Если же код прописывать прямиком в команде, принцип работы команды будет предельно нагляден.
Хотя тут уже чистая вкусовщина, так что нет смысла продолжать эту тему

ziggi
21.02.2017, 08:52
Пишем обычный stock, а-ля

stock IsPlayerMuted(playerid)
{
//И тут проверка
}
После прописываем вызов этого stock в нужных командах и всё: получится та же самая проверка в одном месте.


Не в одном месте, а в каждой команде, когда как с флагами будет реально в одном месте.



Я не говорю, что флаги не нужны. Просто это не так критично и если с ними заиграться, они наоборот начнут лишь путать (будет у каждой команды по 10 флагов и будет каша). Если же код прописывать прямиком в команде, принцип работы команды будет предельно нагляден.
Хотя тут уже чистая вкусовщина, так что нет смысла продолжать эту тему

Есть свои плюсы и минусы, лично я тоже предпочитаю вариант без флагов.

vovandolg
21.02.2017, 12:49
То есть проверка на мут в каждой команде лучше, чем добавление флага и проверка на мут в одном месте? Можно всем чат командам добавить флаг CMD_CHAT и проверить в OnPlayerCommandReceived.

Ну такие дела на микросекунды затормозят выполнение кмд, много новых условий если)
Лучше в самой команде уже все проверки.

ziggi
21.02.2017, 22:30
Ну такие дела на микросекунды затормозят выполнение кмд, много новых условий если)
Лучше в самой команде уже все проверки.

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

vovandolg
21.02.2017, 22:59
Использование высокоуровневых языков программирования тормозит выполнение всего, лучше уж всё на ассемблере писать.
Лично я готов пожертвовать производительностью и памятью ради красивого и чистого кода.

Ты прям как с песни Многоточие - Америка))
Красиво, но не сильно))

$continue$
11.03.2017, 13:26
Плагин отключает OnPlayerCommandText. Вопрос: как сделать обратную совместимость с OnPlayerCommandText?

Мод:


#include <a_samp>

main();

public OnPlayerCommandText(playerid, cmdtext[])
{
printf("%d | %s | strcmp: %d", playerid, cmdtext, !strcmp(cmdtext, "/help", true));
if(!strcmp(cmdtext, "/test", true))
{
SendClientMessage(playerid, -1, "it's job");
return 1;
}
return 0;
}

FS:


public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
if(result == -1)
{
new ret_value;
static cmd_text[64];
strcat(cmd_text, cmd);
strins(cmd_text, "/", 0);
printf("cmd_text: %s", cmd_text);
ret_value = CallRemoteFunction("OnPlayerCommandText", "is", playerid, cmd);
printf("ret_value: %d", ret_value);
cmd_text[0] = EOS;
return 1;
}
return 1;
}

ret_value = 0, всегда. Проверка с strcmp вообще не выполняется. Есть у кого, какие идей?

Alpano
11.03.2017, 13:56
...Есть у кого, какие идей?

Сменить командный процессор :pardon:

Nexius_Tailer
11.03.2017, 14:04
Если плагин блокирует любые вызовы паблика именно по его названию "OnPlayerCommandText", то попробуй вызывать из фс что-то вроде "my_OnPlayerCommandText", и в моде его объявить именно таким (либо если нужно именно оригинальное название, то написать хук где-нибудь в самом начале)

vovandolg
11.03.2017, 15:02
Плагин отключает OnPlayerCommandText. Вопрос: как сделать обратную совместимость с OnPlayerCommandText?

Мод:


#include <a_samp>

main();

public OnPlayerCommandText(playerid, cmdtext[])
{
printf("%d | %s | strcmp: %d", playerid, cmdtext, !strcmp(cmdtext, "/help", true));
if(!strcmp(cmdtext, "/test", true))
{
SendClientMessage(playerid, -1, "it's job");
return 1;
}
return 0;
}

FS:


public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
if(result == -1)
{
new ret_value;
static cmd_text[64];
strcat(cmd_text, cmd);
strins(cmd_text, "/", 0);
printf("cmd_text: %s", cmd_text);
ret_value = CallRemoteFunction("OnPlayerCommandText", "is", playerid, cmd);
printf("ret_value: %d", ret_value);
cmd_text[0] = EOS;
return 1;
}
return 1;
}

ret_value = 0, всегда. Проверка с strcmp вообще не выполняется. Есть у кого, какие идей?

Всё там выполняется, ты просто result не так проверяешь либо выполняешь команду в которой конечная точка return != -1

Alpano
04.04.2017, 18:59
Ребзя, как так.
Использую zcmd в консоль:

Pawn compiler 3.10.2 Copyright (c) 1997-2006, ITB CompuPhase

Header size: 11160 bytes
Code size: 1430460 bytes
Data size: 2734824 bytes
Stack/heap size: 16384 bytes; estimated max. usage=3803 cells (15212 bytes)
Total requirements: 4192828 bytes

Подключаю Pawn.CMD:

Pawn compiler 3.10.2 Copyright (c) 1997-2006, ITB CompuPhase

recursion detected: function 40000004!=40000004 indirectly calls itself:
40000004!=40000004 <- ac_OnPlayerStateChange <- 40000004!=40000004
recursion detected: function 40000004/0 directly calls itself
recursion detected: function 40000004*0 indirectly calls itself:
40000004*0 <- AntySH <- 40000004*0
recursion detected: function -40000004 indirectly calls itself:
-40000004 <- GetCoordBonnetVehicleEx <- ac_OnPlayerKeyStateChange <- -40000004
recursion detected: function Funk1 indirectly calls itself:
Funk1 <- Funk2 <- Funk1
recursion detected: function DaiEmyDeneg indirectly calls itself:
DaiEmyDeneg <- Funk2 <- DaiEmyDeneg
recursion detected: function Dialog_Create indirectly calls itself:
Dialog_Create <- Dialog_SetPage <- Dialog_Create
recursion detected: function Dialog_GetListitem indirectly calls itself:
Dialog_GetListitem <- Dialog_SetPage <- Dialog_GetListitem
recursion detected: function Dialog_Init indirectly calls itself:
Dialog_Init <- ShowPlayerPreviewModelDialog <- Dialog_Init
recursion detected: function Dialog_SetListitem indirectly calls itself:
Dialog_SetListitem <- ShowPlayerPreviewModelDialog <- Dialog_SetListitem
recursion detected: function Dialog_SetPage directly calls itself
recursion detected: function Dialog_ShowToPlayer indirectly calls itself:
Dialog_ShowToPlayer <- ShowTOP <- Dialog_ShowToPlayer
recursion detected: function FormatText indirectly calls itself:
FormatText <- pc_cmd_d <- Funk3 <- FormatText
recursion detected: function GetCarIdPoId directly calls itself
recursion detected: function GetCarOwner directly calls itself
recursion detected: function GetIsTP directly calls itself
recursion detected: function GetOchivePoints indirectly calls itself:
GetOchivePoints <- ShowOchives <- GetOchivePoints
recursion detected: function GetPlayerCash indirectly calls itself:
GetPlayerCash <- SaveAccount <- GetPlayerCash
recursion detected: function GetPlayerStateEx indirectly calls itself:
GetPlayerStateEx <- Funk3 <- ac_OnPlayerKeyStateChange <- GetPlayerStateEx
recursion detected: function GetPlayerVehicleIDEx indirectly calls itself:
GetPlayerVehicleIDEx <- Funk3 <- ac_OnPlayerKeyStateChange <- GetPlayerVehicleIDEx
recursion detected: function GetTPPos indirectly calls itself:
GetTPPos <- pc_cmd_d <- Funk3 <- GetTPPos
recursion detected: function Iter_AddInternal indirectly calls itself:
Iter_AddInternal <- Iter_CreateVehicle <- pc_cmd_v <- Iter_AddInternal
recursion detected: function Iter_CreateVehicle indirectly calls itself:
Iter_CreateVehicle <- pc_cmd_v <- Iter_CreateVehicle
recursion detected: function Iter_RemoveInternal indirectly calls itself:
Iter_RemoveInternal <- t_DestroyVehicle <- pc_cmd_v <- Iter_RemoveInternal
recursion detected: function Iter_SafeRemoveInternal indirectly calls itself:
Iter_SafeRemoveInternal <- Iter_RemoveInternal <- t_DestroyVehicle <- pc_cmd_v <- Iter_SafeRemoveInternal
recursion detected: function Funk3 indirectly calls itself:
Funk3 <- ac_OnPlayerKeyStateChange <- Funk3
recursion detected: function SavePlayerInt indirectly calls itself:
SavePlayerInt <- Funk3 <- ac_OnPlayerKeyStateChange <- SavePlayerInt
recursion detected: function StopCount indirectly calls itself:
StopCount <- t_SetPlayerPosFindZ <- StopCount
recursion detected: function UpdateVehiclePos directly calls itself
recursion detected: function ac_GivePlayerWeapon directly calls itself
recursion detected: function ac_ResetPlayerWeapons directly calls itself
recursion detected: function pc_cmd_d indirectly calls itself:
pc_cmd_d <- Funk3 <- pc_cmd_d
recursion detected: function t_CreateVehicle indirectly calls itself:
t_CreateVehicle <- Funk3 <- ac_OnPlayerKeyStateChange <- t_CreateVehicle
recursion detected: function t_DestroyVehicle indirectly calls itself:
t_DestroyVehicle <- pc_cmd_v <- t_DestroyVehicle
recursion detected: function t_LinkVehicleToInterior directly calls itself
recursion detected: function t_SendClientMessageToAll indirectly calls itself:
t_SendClientMessageToAll <- Funk2 <- t_SendClientMessageToAll
recursion detected: function t_SetPlayerInterior directly calls itself
recursion detected: function t_SetPlayerPos indirectly calls itself:
t_SetPlayerPos <- DellAllFromDBM <- Funk2 <- t_SetPlayerPos
recursion detected: function t_SetPlayerVirtualWorld indirectly calls itself:
t_SetPlayerVirtualWorld <- DellAllFromDBM <- Funk2 <- t_SetPlayerVirtualWorld
recursion detected: function t_SetVehiclePos indirectly calls itself:
t_SetVehiclePos <- ac_OnPlayerKeyStateChange <- t_SetVehiclePos
recursion detected: function t_SetVehicleVirtualWorld indirectly calls itself:
t_SetVehicleVirtualWorld <- Funk3 <- ac_OnPlayerKeyStateChange <- t_SetVehicleVirtualWorld
recursion detected: function t_TogglePlayerControllable indirectly calls itself:
t_TogglePlayerControllable <- Funk2 <- t_TogglePlayerControllable
Header size: 11424 bytes
Code size: 1430116 bytes
Data size: 2734096 bytes
Stack/heap size: 16384 bytes; estimated max. usage: unknown, due to recursion
Total requirements: 4192020 bytes

выдает рекурсию...

Salik_Davince
06.04.2017, 18:25
Не думаю что дело в плагине(хотя незнаю, в Pawn.Regex'e есть пару багов с нативами[точнее они не объявлены в плагине] из за чего сервер не загружался у меня), но думаю что то у тебя с командами или с вызовом пабликов т.e от Pawn.CMD.

urShadow
09.07.2017, 21:17
Обновлен до 3.1.3.

- Исправлена ошибка "File or function is not found"

urShadow
09.09.2017, 18:06
Обновлен до 3.1.4.

- Добавлена поддержка OPCT (OnPlayerCommandText)

123
16.09.2017, 16:03
Обновлен до 3.1.4.

- Добавлена поддержка OPCT (OnPlayerCommandText)

Релизы тесты проходят какие нибудь? На последней версии команды просто не работают, после ввода ничего не происходит, далее сервер крашится. 3.1.3 работает без сбоев.

[C]LEO_KOPROFILIN
17.09.2017, 01:29
Релизы тесты проходят какие нибудь? На последней версии команды просто не работают, после ввода ничего не происходит, далее сервер крашится. 3.1.3 работает без сбоев.

Не знаю что у тебя не роботает вот у меня все роботает, программа отличная и роботает очень быстро если бы программа не работала много людев бы писали (уже 7 днев прошло да) может наверное ты просто в компах (microsoft windows) не шариш вот и все рекомендую RTFM

vasyok28
17.09.2017, 13:34
LEO_KOPROFILIN;87466']Не знаю что у тебя не роботает вот у меня все роботает, программа отличная и роботает очень быстро если бы программа не работала много людев бы писали (уже 7 днев прошло да) может наверное ты просто в компах (microsoft windows) не шариш вот и все рекомендую RTFM
Че за программа ?

vasyok28
19.09.2017, 15:19
Лол обновил плагин, команды вообще не пашет, в логах все чисто

Rodrigo
19.09.2017, 21:49
Лол обновил плагин, команды вообще не пашет, в логах все чисто

Я обновил и все нормально...

vasyok28
19.09.2017, 22:14
Я обновил и все нормально...

На какой машине работает сервер ?

Competent
26.09.2017, 19:07
На какой машине работает сервер ?

Использую PCMD, на Debian 8.6 полёт нормальный.

От системы машины это точно никак зависить не может на самом деле. Ищите проблему в моде.

DeimoS
30.09.2017, 15:25
Может это у меня лыжи не едут, но разве возврат нуля в OnPlayerCommandReceived не должен обрывать выполнение команд во всех скриптах?

Пытаюсь оборвать выполнение команд со стороны FS, но команды в моде всё равно выполняются, хоть условие и срабатывает. Не даёт выполнить лишь те, что находятся в самом FS.
Макрос FILTERSCRIPT указан до подключения инклуда.

vasyok28
30.09.2017, 20:40
Использую PCMD, на Debian 8.6 полёт нормальный.

От системы машины это точно никак зависить не может на самом деле. Ищите проблему в моде.

Локалка, чистый мод, команды не пашут, че дальше?

Алинка
03.10.2017, 00:53
Круто, надо бы на нем сервер заделать:awesome:

Outsider
03.10.2017, 12:51
Так разве нативка
PC_DeleteCommand(const cmd[]); не для этого?

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

Алсо, тоже отказывается работать ласт апдейт. Ошибок никаких нет.

Алинка
03.10.2017, 21:48
У меня ошибки:shout:


C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(56) : error 025: function heading differs from prototype
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(60) : error 025: function heading differs from prototype
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(65) : warning 201: redefinition of constant/macro (symbol "cmd:%0(%1)")
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(77) : warning 201: redefinition of constant/macro (symbol "CMD")
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(79) : warning 201: redefinition of constant/macro (symbol "COMMAND")
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


2 Errors.

Помогите кто чем может

ziggi
03.10.2017, 22:09
У меня ошибки:shout:


C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(56) : error 025: function heading differs from prototype
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(60) : error 025: function heading differs from prototype
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(65) : warning 201: redefinition of constant/macro (symbol "cmd:%0(%1)")
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(77) : warning 201: redefinition of constant/macro (symbol "CMD")
C:\samp03e_svr_r2_win32\pawno\include\Pawn.CMD.inc(79) : warning 201: redefinition of constant/macro (symbol "COMMAND")
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


2 Errors.

Помогите кто чем может

Какой-нибудь zcmd подключен выше.

Outsider
05.10.2017, 19:25
Не понимаю как использовать флаги. Из примера не ясно как игра поймет, что игрок имеет конкретную группу. Может кто-нибудь дать пример немного подробнее?

DeimoS
05.10.2017, 19:43
Не понимаю как использовать флаги. Из примера не ясно как игра поймет, что игрок имеет конкретную группу. Может кто-нибудь дать пример немного подробнее?

Флаги никак не связаны с игроками напрямую. Они лишь помогают группировать команды в группы (тавтология получилась немножк). Точнее, просто устанавливают своеобразные метки для команд. Это можно и в ручную всё провернуть вот так (самая наипростая реализация):

enum//Для удобства объявим 3 именных константы, дабы не держать в голове просто числа
{
CMD_GROUP_ADMIN = 1,
CMD_GROUP_MODER,
CMD_GROUP_USER
};


cmd:ban(playerid, params[])
{
SetSVarInt("ban", CMD_GROUP_ADMIN); // Указываем, что бан - команда админов
// code here
return 1;
}

cmd:kick(playerid, params[])
{
SetSVarInt("kick", CMD_GROUP_MODER); // Указываем, что кик - команда модеров
// code here
return 1;
}

cmd:pm(playerid, params[])
{
SetSVarInt("pm", CMD_GROUP_USER); // Указываем, что pm - команда игроков
// code here
return 1;
}
cmd:pay(playerid, params[])
{
SetSVarInt("pay", CMD_GROUP_USER); // Указываем, что pay - команда игроков
// code here
return 1;
}


public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
/*
А вот тут уже проверяем значение нашего SVar
И если оно равно значению админа + у игрока нет админки (проверяем переменную админки)
То уже выполняем нужные действия
*/
if(GetSVarInt(cmd) == CMD_GROUP_ADMIN && !pAdmin[playerid])
return 0;

return 1;
}

То же самое можно и на обычных переменных реализовать, но кода получится раз в 30 больше.

То бишь, считай, что это просто присвоение переменной определённого значения и потом сверка этого значения там, где тебе требуется.
А уже то, какие значения переменной к каким группам относятся (админ/игрок и т.п.) ты сам решаешь в момент проверки, подставляя нужные переменные

travst
07.10.2017, 13:41
pawno\include\Pawn.CMD.inc(60) : error 025: function heading differs from prototype

Хелп

Outsider
07.10.2017, 16:45
Судя по всему ты пытаешься дать/отдать функции значение, а она даже не представляет об их существовании.
Покажи команду команду после добавления которой показывает ошибку.

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

upd: и убедись установил ли ты плагин.

Kovshevoy
12.10.2017, 16:24
Судя по всему ты пытаешься дать/отдать функции значение, а она даже не представляет об их существовании.
Покажи команду команду после добавления которой показывает ошибку.

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

upd: и убедись установил ли ты плагин.

Компилятору во время компиляции пофиг на твои плагины, ага.

DeimoS
13.10.2017, 11:07
Есть ещё те, у кого новая версия плагина не работает? Отпишитесь, попробуем разобраться в чём дело.

seriu
14.10.2017, 18:31
Есть ещё те, у кого новая версия плагина не работает? Отпишитесь, попробуем разобраться в чём дело.

тоже не работает

DeimoS
14.10.2017, 20:27
тоже не работает

Подключены ли какие-либо FS? Есть OnPlayerCommandText?

Fallen A.
14.10.2017, 21:35
Пользуюсь одной из старых версий. Все устраивает.

Спрашивается, зачем им эти все навороты?

DeimoS
14.10.2017, 21:44
Пользуюсь одной из старых версий. Все устраивает.

Спрашивается, зачем им эти все навороты?

Ну так тогда купи себе Pentium 1 и пользуйся им. Зачем все эти навороты?

seriu
14.10.2017, 21:48
Подключены ли какие-либо FS? Есть OnPlayerCommandText?

нет, ничего такого нет
FS - 0
использование команд:
https://pastebin.com/cN1R7Mrv

DeimoS
14.10.2017, 21:49
public OnPlayerCommandText(playerid, cmdtext[])
{
return 1;
}
Замени на

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

seriu
14.10.2017, 21:56
public OnPlayerCommandText(playerid, cmdtext[])
{
return 1;
}
Замени на

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

работает.

DeimoS
14.10.2017, 22:24
Ну вот. Это инфа для всех, у кого появились проблемы с командами после обновления:

В новой версии плагина появилась поддержка OnPlayerCommandText. Сам коллбэк работает по такому принципу:

https://i.imgur.com/sUSOj31.png

То бишь, если в нём вернуть единицу, сервер останавливает все итерации по поиску команды, считая, что команда найдена. А если вернуть 0, то продолжает поиск, обрабатывая сначала FS, а потом мод и если не находит - выдаёт сообщение.

Собственно, плагин учитывает этот принцип работы и если OnPlayerCommandText возвращает единицу, то и плагин останавливает поиск команды.

Fallen A.
14.10.2017, 23:06
Ну так тогда купи себе Pentium 1 и пользуйся им. Зачем все эти навороты?

Сравнимое с не сравнимым. Ок.

DeimoS
15.10.2017, 01:46
Сравнимое с не сравнимым. Ок.

Почему это? Что в первом случае, что во втором - продукт подвергался улучшению и оптимизации.
В любом случае, это твой выбор и не будем оффтопить)

123
15.10.2017, 02:50
Но написать об этом в шапке темы стоило, а то разработчик покрылся и информации никакой не дал. Хотя поддержка OnPlayerCommandText я не представляю для чего нужна, поэтому на предпоследней версии чувствую себя прекрасно

DeimoS
15.10.2017, 03:31
Добавил примечание

xaker
25.10.2017, 03:33
Недавно же был такой способ:

SetSVarInt("ban", CMD_GROUP_ADMIN);
Что он не подошел чтоли?

Outsider
25.10.2017, 13:09
Глобалка там собственно и не нужна, как оказалось.

DeimoS
25.10.2017, 17:25
Это вы про что?

Kovshevoy
05.11.2017, 15:25
Перевел со стандартного процессора на этот, некоторые команды перестали работать. К примеру команда /gps или /help без параметров или ввода текста после них работают, а вот /me действие, /pm id text, /ban id причина и похожие - перестали работать, в чем может быть проблема?

$continue$
05.11.2017, 15:32
Ну покажи команды

Перевел со стандартного процессора на этот, некоторые команды перестали работать. К примеру команда /gps или /help без параметров или ввода текста после них работают, а вот /me действие, /pm id text, /ban id причина и похожие - перестали работать, в чем может быть проблема?

Kovshevoy
05.11.2017, 17:02
Показываю (https://pastebin.com/pJZ49YdQ), держи.

Ну покажи команды

DeimoS
05.11.2017, 17:10
Дело в твоих командах, а не в плагине.

UPD: Как-то так твоя команда должна выглядеть

CMD:pm(playerid, params[])
{
if(gPlayerLogged[playerid] == 0)
return SendClientMessage(playerid, COLOR_WHITE, "Вы ещё не авторизовались.");

if(PlayerInfo[playerid][pMuted] == 1)
return SendClientMessage(playerid, COLOR_ORANGERED, "Вы временно не можете пользоваться чатом.");

if(PMT[playerid] > 0)
return SendClientMessage(playerid,COLOR_WHITE,"Нельзя отправлять сообщения так часто.");

new giveplayerid;
if(sscanf(params, "rs[128]", giveplayerid, params))
return SendClientMessage(playerid, COLOR_ORANGE, "/pm [ID] [Текст]");

if(giveplayerid == INVALID_PLAYER_ID)
return SendClientMessage(playerid,COLOR_WHITE,"Указанный игрок не найден на сервере");

GetPlayerName(playerid, ssendername, sizeof(ssendername));
GetPlayerName(giveplayerid, ggiveplayer, sizeof(ggiveplayer));
format(ssstring, sizeof(ssstring), "[PM от %s[%d]: %s]",ssendername, playerid,params);
SendClientMessage(giveplayerid, COLOR_PM, ssstring);
PlayerPlaySound(giveplayerid, 40405, 0.0, 0.0, 0.0);
PlayerPlaySound(playerid, 40405, 0.0, 0.0, 0.0);
format(ssstring, sizeof(ssstring), "[PM для %s[%d]: %s]", ggiveplayer, giveplayerid,params);
SendClientMessage(playerid, COLOR_PM, ssstring);
PMT[playerid] = 20;
return true;
}
Хотя и это далеко не идеал.
Остальное сам переписывай

Kovshevoy
05.11.2017, 17:49
Дело в твоих командах, а не в плагине.

UPD: Как-то так твоя команда должна выглядеть

CMD:pm(playerid, params[])
{
if(gPlayerLogged[playerid] == 0)
return SendClientMessage(playerid, COLOR_WHITE, "Вы ещё не авторизовались.");

if(PlayerInfo[playerid][pMuted] == 1)
return SendClientMessage(playerid, COLOR_ORANGERED, "Вы временно не можете пользоваться чатом.");

if(PMT[playerid] > 0)
return SendClientMessage(playerid,COLOR_WHITE,"Нельзя отправлять сообщения так часто.");

new giveplayerid;
if(sscanf(params, "rs[128]", giveplayerid, params))
return SendClientMessage(playerid, COLOR_ORANGE, "/pm [ID] [Текст]");

if(giveplayerid == INVALID_PLAYER_ID)
return SendClientMessage(playerid,COLOR_WHITE,"Указанный игрок не найден на сервере");

GetPlayerName(playerid, ssendername, sizeof(ssendername));
GetPlayerName(giveplayerid, ggiveplayer, sizeof(ggiveplayer));
format(ssstring, sizeof(ssstring), "[PM от %s[%d]: %s]",ssendername, playerid,params);
SendClientMessage(giveplayerid, COLOR_PM, ssstring);
PlayerPlaySound(giveplayerid, 40405, 0.0, 0.0, 0.0);
PlayerPlaySound(playerid, 40405, 0.0, 0.0, 0.0);
format(ssstring, sizeof(ssstring), "[PM для %s[%d]: %s]", ggiveplayer, giveplayerid,params);
SendClientMessage(playerid, COLOR_PM, ssstring);
PMT[playerid] = 20;
return true;
}
Хотя и это далеко не идеал.
Остальное сам переписывай

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

DeimoS
05.11.2017, 18:02
Я в курсе что дело в командах, иначе я бы сидел и грешил на плагин. Я не могу понять, что конкретно в командах надо изменить, воот.
Спасибо кстати за пример, буду пытаться делать на его основе.

Почитай как использовать sscanf и разберись с этим, а не делай по примерам. Там ничего сложного.

Kovshevoy
05.11.2017, 18:05
Почитай как использовать sscanf и разберись с этим, а не делай по примерам. Там ничего сложного.

Хорошо, благодарю за совет и направление на сторону правильного кодинга. Пойду читать про плагин.

ShapeGaz
03.01.2018, 01:36
Как скорость-то измерить?

whale
23.07.2018, 15:02
Тут версия 3.2.0 выкатилась. Улучшили стабильность, вроде как:
https://github.com/urShadow/Pawn.CMD/releases

Skyline
07.08.2018, 11:52
По идеи, если переводить с DC_CMD в командах же ничего не нужно изменять? Только подключить include и plugins?

whale
07.08.2018, 15:06
По идеи, если переводить с DC_CMD в командах же ничего не нужно изменять? Только подключить include и plugins?

А так же изменить параметры функций OnPlayerCommandReceived и OnPlayerCommandPerformed.

Skyline
07.08.2018, 22:57
if(newkeys & 8192)
{
cmd_engine(playerid,"");
}
При переводе, ошибка в этой строке:

error 017: undefined symbol "cmd_engine"
Как тут использовать?

VVWVV
07.08.2018, 23:05
if(newkeys & 8192)
{
cmd_engine(playerid,"");
}
При переводе, ошибка в этой строке:

error 017: undefined symbol "cmd_engine"
Как тут использовать?


cmd:engine(playerid, "");

Seviel
21.11.2018, 18:36
Тут вопрос возник, можно ли это сократить до одной строки?



flags:s(CMD_CHAT);
flags:me(CMD_CHAT);
flags:do(CMD_CHAT);
flags:try(CMD_CHAT);

DeimoS
22.11.2018, 08:51
Тут вопрос возник, можно ли это сократить до одной строки?



flags:s(CMD_CHAT);
flags:me(CMD_CHAT);
flags:do(CMD_CHAT);
flags:try(CMD_CHAT);


С текущим функционалом - нет. Да и плохо это на читаемости скажется.

DeimoS
25.03.2019, 04:46
Перенёс вопрос про ошибки в отдельную тему (http://pro-pawn.ru/showthread.php?16677-%28Pawn-CMD-inc%29-error-025-function-heading-differs-from-prototype).

Guldan
07.08.2019, 02:01
Здравствуйте, как с помощью данного плагина можно получить кэш мод пака, в CRMP.

Сам код рабочий, при стандартном командном процессоре, мне нужно привести пример в Pawn.CMD, либо перепробовал кучу вариантов нечего не работает, тупо не выводится кэш при конекте, и сувал в паблик OnPlayerCommandPerformed и OnPlayerCommandReceived, нечего

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));
SendClientMessage (playerid, 0xFFFFFFFF, packhash);
return 1;
}
return 0;
}

DeimoS
07.08.2019, 08:39
Ну так залогируй содержимое cmdtext и посмотри, приходит ли вообще хоть что-то. То же самое и с остальными пабликами.

И да, убедись, что в fs/перехватах нигде не возвращается единица в конце OnPlayerCommandText.
То бишь, все OnPlayerCommandText должны возвращать 0, если нужная команда не найдена.

Guldan
08.08.2019, 05:30
Логировал ничего :sad:

DeimoS
08.08.2019, 11:52
Ну если уверен, что правильно логировал (и стандартный коллбэк, и коллбэк плагина) и если без плагина проверка работает, то значит не совместим плагин с твоей системой.
Хотя вообще это странно.

Guldan
09.08.2019, 15:46
Наверное, даже с плагинов dc_cmd все отлично, а этот не хочет.

speeyx
02.12.2020, 13:00
Возможно обновление этого плагина на изменение символа с которого начинается команда?
Например, не /help, а .help — /помощь vs .помощь

Просто хотелось бы добавить себе поддержку через точку, а через OnPlayerText такое себе.

20th century
02.12.2020, 14:06
Возможно обновление этого плагина на изменение символа с которого начинается команда?
Например, не /help, а .help — /помощь vs .помощь

Просто хотелось бы добавить себе поддержку через точку, а через OnPlayerText такое себе.

Да, возможно, в исходниках в plugin.h глянь.

speeyx
02.12.2020, 15:25
Да, возможно, в исходниках в plugin.h глянь.

:hi:

Хотелось бы официального авторского релиза...
Или чтобы какой-то разбирающийся человек вмешался на гите.

Я просто, «мягко» говоря, зелёный в этом деле.

20th century
27.01.2021, 07:27
:hi:

Хотелось бы официального авторского релиза...
Или чтобы какой-то разбирающийся человек вмешался на гите.

Я просто, «мягко» говоря, зелёный в этом деле.

Официальный авторский релиз - это вряд ли. Если нужно всего лишь добавить точку как альтернативу слэшу, могу сделать форк и поправить это, залить в релиз там же.

DeimoS
28.01.2021, 08:10
Возможно обновление этого плагина на изменение символа с которого начинается команда?
Например, не /help, а .help — /помощь vs .помощь

Просто хотелось бы добавить себе поддержку через точку, а через OnPlayerText такое себе.

В любом случае всё это будет работать через OnPlayerText (только перехватывать и проверять его будет уже плагин), так что особого смысла в правках плагина нет, ибо все проверки элементарны и на стороне плагина они будут работать с идентичной скоростью. Вот тебе реализация, практически, на стороне плагина
public OnPlayerText(playerid, text[])
{
if(text[0] == '.' && text[1] != '\0' && text[1] != '.')
{
text[0] = '/';
PC_EmulateCommand(playerid, text);
return 0;
}
//...
return 1;
}

wolfnex
15.07.2022, 23:02
D:\samp037svr\gamemodes\vc.pwn(487) : error 010: invalid function or declaration

487: flags:help(CMD_ADMIN);
488: cmd:help(playerid) {
489: SendClientMessage(playerid, -1, "test");
490: return 1;
491: }

$continue$
16.07.2022, 08:28
D:\samp037svr\gamemodes\vc.pwn(487) : error 010: invalid function or declaration

487: flags:help(CMD_ADMIN);
488: cmd:help(playerid) {
489: SendClientMessage(playerid, -1, "test");
490: return 1;
491: }



flags:help(CMD_ADMIN)
cmd:help(playerid)
{
return 1;
}

Outsider
16.07.2022, 23:00
Не вижу жалоб на последнюю версию плагина, неужели только у меня не хочет грузиться ни одна до версии 3.3.5? Или дело в sampctl и он как-то неверно связывает версию плагина и инклуда?

Pa4enka
16.07.2022, 23:56
Не вижу жалоб на последнюю версию плагина, неужели только у меня не хочет грузиться ни одна до версии 3.3.5? Или дело в sampctl и он как-то неверно связывает версию плагина и инклуда?

Где-то в феврале, когда последний раз собирал мод на сампктл у меня все работало. Посмотри, возможно ты подтягиваешь версию плагина под опен-мп...

Outsider
17.07.2022, 02:01
Где-то в феврале, когда последний раз собирал мод на сампктл у меня все работало. Посмотри, возможно ты подтягиваешь версию плагина под опен-мп...

А, ну видать да. Не задумывался даже, что там есть разница.