Просмотр полной версии : [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
А предусмотрен вызов команды из мода?
К примеру у DC
// без параметров
cmd::help(playerid, "");
// с параметрами
new param_str[11]; // размер строки зависит от параметров
format(param_str, sizeof(param_str), "%d", targetid);
cmd::invite(playerid, param_str);
А предусмотрен вызов команды из мода?
Просто вызывай так: cmd_help(playerid, "");
плагин не совместим со sscanf и streamer ?
http://i.imgur.com/hMVkfr0.png
п.с поставил "Pawn.CMD.dll" после "sscanf streamer" - Работает
- - - Добавлено - - -
Просто вызывай так: cmd_help(playerid, "");
точно, это же обычный паблик ;c
Как такое вообще возможно? Что DC_CMD в виде плагина уступает по скорости обычному ZCMD?
Nexius_Tailer
03.06.2016, 16:04
Как такое вообще возможно? Что DC_CMD в виде плагина уступает по скорости обычному ZCMD?
И да, тем более странно, что izcmd проигрывает zcmd, в то время как делался он в первую очередь как более быстрый его аналог..
Мне кажется, тест нужно провести с большим количеством команд и их вызовов.
И да, тем более странно, что 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
Спасибо!Всё заработало.Довольно таки хороший процессор.
Почему не переименуешь проект допустим в u_cmd ?
urShadow
11.06.2016, 21:04
Почему не переименуешь проект допустим в u_cmd ?
А какая разница вообще? Задумано так.
У некоторых бывают проблемы после перевода на дк кмд, и нубы понять не могут в чем проблема, как и в инклуде дк кмд добавь к себе:
#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, чтобы не было запарок по этому поводу что ле...
Дык это, а как же с линуксом быть? .so не пишем же на конце или как там?
имхо, я бы назвал уже плагин примерно так хотя бы Pawn_CMD, чтобы не было запарок по этому поводу что ле...
Элементарно же, если не приписывать .so или .dll расширение , то за то самое расширение будет приниматься .CMD, а значит плагин работать не будет.
На хостинге прописываем .so, на винде .dll
Иван Бубнов
12.06.2016, 18:35
Человек много о себе думает. А плагин (если верить его тестам) вроде неплохой. Однако я бы не взял его) Удачи
urShadow
12.06.2016, 18:42
Человек много о себе думает.
Аргументируй хотя бы.
Человек много о себе думает. А плагин (если верить его тестам) вроде неплохой. Однако я бы не взял его) Удачи
Вы хотя-бы для начала разработайте FULLSTACK ROLE PLAY GAMEMODE PE}|{uM DEBEJLOTTeP. Ваш комментарий - не рентабелен, попрошу ознакомится с данным продуктом сопотаясь с муськой на более близком расстоянии.
http://gorod48.ru/upload/iblock/a0c/a0c112f9186b92d0a975775eb42bec71.jpg
Nexius_Tailer
12.06.2016, 22:34
Такое чувство, что человек выше обкурился
Такое чувство, что человек выше обкурился
Прошу прощения, я не знало что в радиусе 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
Благо мне переслали весь диалог, и ввели Вы там себя достаточно высокомерно. С ЧСВ проблемы?
Речь шла о последней версии с открытым исходным кодом и от своих слов я не отказываюсь.
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 засрали. Он сам, где то об этом говорил (на п-п)
Благо мне переслали весь диалог, и ввели Вы там себя достаточно высокомерно. С ЧСВ проблемы?
Спасибо за запрос.
Данный ученик получает оценку "2" за поведение.
С уважением, директор школы, Строусрипов Семен Евгеньевич.
как насчет такого же плагина для диалогов =)
ну я в этом не шарю, поэтому и пишу
я про способ 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.
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 - думаю, что по названию понятно, что они делают.
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, "");
Нельзя вызывать по алиасу из кода. Используй callcmd::test(playerid, "");
Нельзя ли такое сделать в новых обновах ?
Нельзя ли такое сделать в новых обновах ?
Можно же использовать функцию PC_EmulateCommand
urShadow
25.06.2016, 10:11
Нельзя ли такое сделать в новых обновах ?
Нельзя, и смысла я в этом никакого не вижу. Могу добавить натив PC_CallCommand, но это будет медленнее, чем макрос callcmd::.
Нельзя, и смысла я в этом никакого не вижу. Могу добавить натив 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
Может дело в хостинге?
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.
Ай-яй-яй...
http://i.imgur.com/n9fNOzs.png
Антивирус против методов, которые ты используешь
Ай-яй-яй...
http://i.imgur.com/n9fNOzs.png
Антивирус против методов, которые ты используешь
Не удивительно, оно же с памятью другого процесса работает. Если боязно, то исходники открыты, можно скомпилировать самостоятельно.
Не удивительно, оно же с памятью другого процесса работает. Если боязно, то исходники открыты, можно скомпилировать самостоятельно.
Там под картинкой белым написано "Антивирус против методов, которые ты используешь". Адресовано тем, кто побоится подобного предупреждения антивируса.
Я-то понимаю на что антивирус ругается.
$continue$
01.08.2016, 01:25
Жду обновления плагина! В следующих версиях обещает быть ещё быстрей!
KostyaNL
06.02.2017, 00:26
Возможно ли изменение флага для команды прямо из игры?
Возможно ли изменение флага для команды прямо из игры?
В описании же написано
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 отправляете учить... высокомерие.
Спасибо, конечно. Но Высказывание несуразное. Я спросил по поводу одной функции, а Вы меня 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);
зачем расставлять проверку на админку если можно проверить через flags? И вообще, название говорит само за себя, flags, то есть флаги (метки), а не метка. То есть туда по сути нужно было сделать чтобы указывали много флагов, или переименовать в flag:achat(1);
И вместо проверки на мут в каждой нужной команде тебе придётся прописывать новый флаг. Шило на мыло меняешь, не?
И вместо проверки на мут в каждой нужной команде тебе придётся прописывать новый флаг. Шило на мыло меняешь, не?
То есть проверка на мут в каждой команде лучше, чем добавление флага и проверка на мут в одном месте? Можно всем чат командам добавить флаг CMD_CHAT и проверить в OnPlayerCommandReceived.
И вместо проверки на мут в каждой нужной команде тебе придётся прописывать новый флаг. Шило на мыло меняешь, не?
А если захочешь изменить проверку на мут, ну там вдруг другие переменные или другие значение у тебя появились, ты во всех командах должен изменять проверку?
То есть проверка на мут в каждой команде лучше, чем добавление флага и проверка на мут в одном месте? Можно всем чат командам добавить флаг CMD_CHAT и проверить в OnPlayerCommandReceived.
А если захочешь изменить проверку на мут, ну там вдруг другие переменные или другие значение у тебя появились, ты во всех командах должен изменять проверку?
Пишем обычный stock, а-ля
stock IsPlayerMuted(playerid)
{
//И тут проверка
}
После прописываем вызов этого stock в нужных командах и всё: получится та же самая проверка в одном месте.
Я не говорю, что флаги не нужны. Просто это не так критично и если с ними заиграться, они наоборот начнут лишь путать (будет у каждой команды по 10 флагов и будет каша). Если же код прописывать прямиком в команде, принцип работы команды будет предельно нагляден.
Хотя тут уже чистая вкусовщина, так что нет смысла продолжать эту тему
Пишем обычный stock, а-ля
stock IsPlayerMuted(playerid)
{
//И тут проверка
}
После прописываем вызов этого stock в нужных командах и всё: получится та же самая проверка в одном месте.
Не в одном месте, а в каждой команде, когда как с флагами будет реально в одном месте.
Я не говорю, что флаги не нужны. Просто это не так критично и если с ними заиграться, они наоборот начнут лишь путать (будет у каждой команды по 10 флагов и будет каша). Если же код прописывать прямиком в команде, принцип работы команды будет предельно нагляден.
Хотя тут уже чистая вкусовщина, так что нет смысла продолжать эту тему
Есть свои плюсы и минусы, лично я тоже предпочитаю вариант без флагов.
vovandolg
21.02.2017, 12:49
То есть проверка на мут в каждой команде лучше, чем добавление флага и проверка на мут в одном месте? Можно всем чат командам добавить флаг CMD_CHAT и проверить в OnPlayerCommandReceived.
Ну такие дела на микросекунды затормозят выполнение кмд, много новых условий если)
Лучше в самой команде уже все проверки.
Ну такие дела на микросекунды затормозят выполнение кмд, много новых условий если)
Лучше в самой команде уже все проверки.
Использование высокоуровневых языков программирования тормозит выполнение всего, лучше уж всё на ассемблере писать.
Лично я готов пожертвовать производительностью и памятью ради красивого и чистого кода.
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 вообще не выполняется. Есть у кого, какие идей?
...Есть у кого, какие идей?
Сменить командный процессор :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
Ребзя, как так.
Использую 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)
Обновлен до 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
Лол обновил плагин, команды вообще не пашет, в логах все чисто
Лол обновил плагин, команды вообще не пашет, в логах все чисто
Я обновил и все нормально...
vasyok28
19.09.2017, 22:14
Я обновил и все нормально...
На какой машине работает сервер ?
Competent
26.09.2017, 19:07
На какой машине работает сервер ?
Использую PCMD, на Debian 8.6 полёт нормальный.
От системы машины это точно никак зависить не может на самом деле. Ищите проблему в моде.
Может это у меня лыжи не едут, но разве возврат нуля в OnPlayerCommandReceived не должен обрывать выполнение команд во всех скриптах?
Пытаюсь оборвать выполнение команд со стороны FS, но команды в моде всё равно выполняются, хоть условие и срабатывает. Не даёт выполнить лишь те, что находятся в самом FS.
Макрос FILTERSCRIPT указан до подключения инклуда.
vasyok28
30.09.2017, 20:40
Использую PCMD, на Debian 8.6 полёт нормальный.
От системы машины это точно никак зависить не может на самом деле. Ищите проблему в моде.
Локалка, чистый мод, команды не пашут, че дальше?
Круто, надо бы на нем сервер заделать:awesome:
Outsider
03.10.2017, 12:51
Так разве нативка
PC_DeleteCommand(const cmd[]); не для этого?
- - - Добавлено - - -
Алсо, тоже отказывается работать ласт апдейт. Ошибок никаких нет.
У меня ошибки: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.
Помогите кто чем может
У меня ошибки: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
Не понимаю как использовать флаги. Из примера не ясно как игра поймет, что игрок имеет конкретную группу. Может кто-нибудь дать пример немного подробнее?
Не понимаю как использовать флаги. Из примера не ясно как игра поймет, что игрок имеет конкретную группу. Может кто-нибудь дать пример немного подробнее?
Флаги никак не связаны с игроками напрямую. Они лишь помогают группировать команды в группы (тавтология получилась немножк). Точнее, просто устанавливают своеобразные метки для команд. Это можно и в ручную всё провернуть вот так (самая наипростая реализация):
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 больше.
То бишь, считай, что это просто присвоение переменной определённого значения и потом сверка этого значения там, где тебе требуется.
А уже то, какие значения переменной к каким группам относятся (админ/игрок и т.п.) ты сам решаешь в момент проверки, подставляя нужные переменные
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: и убедись установил ли ты плагин.
Компилятору во время компиляции пофиг на твои плагины, ага.
Есть ещё те, у кого новая версия плагина не работает? Отпишитесь, попробуем разобраться в чём дело.
Есть ещё те, у кого новая версия плагина не работает? Отпишитесь, попробуем разобраться в чём дело.
тоже не работает
тоже не работает
Подключены ли какие-либо FS? Есть OnPlayerCommandText?
Fallen A.
14.10.2017, 21:35
Пользуюсь одной из старых версий. Все устраивает.
Спрашивается, зачем им эти все навороты?
Пользуюсь одной из старых версий. Все устраивает.
Спрашивается, зачем им эти все навороты?
Ну так тогда купи себе Pentium 1 и пользуйся им. Зачем все эти навороты?
Подключены ли какие-либо FS? Есть OnPlayerCommandText?
нет, ничего такого нет
FS - 0
использование команд:
https://pastebin.com/cN1R7Mrv
public OnPlayerCommandText(playerid, cmdtext[])
{
return 1;
}
Замени на
public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
return 1;
}
Замени на
public OnPlayerCommandText(playerid, cmdtext[])
{
return 0;
}
работает.
Ну вот. Это инфа для всех, у кого появились проблемы с командами после обновления:
В новой версии плагина появилась поддержка OnPlayerCommandText. Сам коллбэк работает по такому принципу:
https://i.imgur.com/sUSOj31.png
То бишь, если в нём вернуть единицу, сервер останавливает все итерации по поиску команды, считая, что команда найдена. А если вернуть 0, то продолжает поиск, обрабатывая сначала FS, а потом мод и если не находит - выдаёт сообщение.
Собственно, плагин учитывает этот принцип работы и если OnPlayerCommandText возвращает единицу, то и плагин останавливает поиск команды.
Fallen A.
14.10.2017, 23:06
Ну так тогда купи себе Pentium 1 и пользуйся им. Зачем все эти навороты?
Сравнимое с не сравнимым. Ок.
Сравнимое с не сравнимым. Ок.
Почему это? Что в первом случае, что во втором - продукт подвергался улучшению и оптимизации.
В любом случае, это твой выбор и не будем оффтопить)
Но написать об этом в шапке темы стоило, а то разработчик покрылся и информации никакой не дал. Хотя поддержка OnPlayerCommandText я не представляю для чего нужна, поэтому на предпоследней версии чувствую себя прекрасно
Недавно же был такой способ:
SetSVarInt("ban", CMD_GROUP_ADMIN);
Что он не подошел чтоли?
Outsider
25.10.2017, 13:09
Глобалка там собственно и не нужна, как оказалось.
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), держи.
Ну покажи команды
Дело в твоих командах, а не в плагине.
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;
}
Хотя и это далеко не идеал.
Остальное сам переписывай
Я в курсе что дело в командах, иначе я бы сидел и грешил на плагин. Я не могу понять, что конкретно в командах надо изменить, воот.
Спасибо кстати за пример, буду пытаться делать на его основе.
Я в курсе что дело в командах, иначе я бы сидел и грешил на плагин. Я не могу понять, что конкретно в командах надо изменить, воот.
Спасибо кстати за пример, буду пытаться делать на его основе.
Почитай как использовать sscanf и разберись с этим, а не делай по примерам. Там ничего сложного.
Kovshevoy
05.11.2017, 18:05
Почитай как использовать sscanf и разберись с этим, а не делай по примерам. Там ничего сложного.
Хорошо, благодарю за совет и направление на сторону правильного кодинга. Пойду читать про плагин.
ShapeGaz
03.01.2018, 01:36
Как скорость-то измерить?
Тут версия 3.2.0 выкатилась. Улучшили стабильность, вроде как:
https://github.com/urShadow/Pawn.CMD/releases
По идеи, если переводить с DC_CMD в командах же ничего не нужно изменять? Только подключить include и plugins?
По идеи, если переводить с DC_CMD в командах же ничего не нужно изменять? Только подключить include и plugins?
А так же изменить параметры функций OnPlayerCommandReceived и OnPlayerCommandPerformed.
if(newkeys & 8192)
{
cmd_engine(playerid,"");
}
При переводе, ошибка в этой строке:
error 017: undefined symbol "cmd_engine"
Как тут использовать?
if(newkeys & 8192)
{
cmd_engine(playerid,"");
}
При переводе, ошибка в этой строке:
error 017: undefined symbol "cmd_engine"
Как тут использовать?
cmd:engine(playerid, "");
Тут вопрос возник, можно ли это сократить до одной строки?
flags:s(CMD_CHAT);
flags:me(CMD_CHAT);
flags:do(CMD_CHAT);
flags:try(CMD_CHAT);
Тут вопрос возник, можно ли это сократить до одной строки?
flags:s(CMD_CHAT);
flags:me(CMD_CHAT);
flags:do(CMD_CHAT);
flags:try(CMD_CHAT);
С текущим функционалом - нет. Да и плохо это на читаемости скажется.
Перенёс вопрос про ошибки в отдельную тему (http://pro-pawn.ru/showthread.php?16677-%28Pawn-CMD-inc%29-error-025-function-heading-differs-from-prototype).
Здравствуйте, как с помощью данного плагина можно получить кэш мод пака, в 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;
}
Ну так залогируй содержимое cmdtext и посмотри, приходит ли вообще хоть что-то. То же самое и с остальными пабликами.
И да, убедись, что в fs/перехватах нигде не возвращается единица в конце OnPlayerCommandText.
То бишь, все OnPlayerCommandText должны возвращать 0, если нужная команда не найдена.
Ну если уверен, что правильно логировал (и стандартный коллбэк, и коллбэк плагина) и если без плагина проверка работает, то значит не совместим плагин с твоей системой.
Хотя вообще это странно.
Наверное, даже с плагинов dc_cmd все отлично, а этот не хочет.
Возможно обновление этого плагина на изменение символа с которого начинается команда?
Например, не /help, а .help — /помощь vs .помощь
Просто хотелось бы добавить себе поддержку через точку, а через OnPlayerText такое себе.
20th century
02.12.2020, 14:06
Возможно обновление этого плагина на изменение символа с которого начинается команда?
Например, не /help, а .help — /помощь vs .помощь
Просто хотелось бы добавить себе поддержку через точку, а через OnPlayerText такое себе.
Да, возможно, в исходниках в plugin.h глянь.
Да, возможно, в исходниках в plugin.h глянь.
:hi:
Хотелось бы официального авторского релиза...
Или чтобы какой-то разбирающийся человек вмешался на гите.
Я просто, «мягко» говоря, зелёный в этом деле.
20th century
27.01.2021, 07:27
:hi:
Хотелось бы официального авторского релиза...
Или чтобы какой-то разбирающийся человек вмешался на гите.
Я просто, «мягко» говоря, зелёный в этом деле.
Официальный авторский релиз - это вряд ли. Если нужно всего лишь добавить точку как альтернативу слэшу, могу сделать форк и поправить это, залить в релиз там же.
Возможно обновление этого плагина на изменение символа с которого начинается команда?
Например, не /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;
}
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 и он как-то неверно связывает версию плагина и инклуда?
Не вижу жалоб на последнюю версию плагина, неужели только у меня не хочет грузиться ни одна до версии 3.3.5? Или дело в sampctl и он как-то неверно связывает версию плагина и инклуда?
Где-то в феврале, когда последний раз собирал мод на сампктл у меня все работало. Посмотри, возможно ты подтягиваешь версию плагина под опен-мп...
Outsider
17.07.2022, 02:01
Где-то в феврале, когда последний раз собирал мод на сампктл у меня все работало. Посмотри, возможно ты подтягиваешь версию плагина под опен-мп...
А, ну видать да. Не задумывался даже, что там есть разница.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot