Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,788
    Репутация:
    2277 ±

    Шаблон плагина для SA-MP

    Привет всем.

    Если вы интересовались созданием плагинов для SA-MP, то могли заметить, что на оффе есть тема, в которой рассказывается, как можно написать плагин для SA-MP, однако там приводится пример только для Visual Studio под Windows. Информация о компиляции под Linux в той теме практически отсутствует. Я решил пойти немного в другом направлении и разработать легко конфигурируемый шаблон плагина для SA-MP, который можно настроить под свои задачи.

    Описание:

    Что реализовано на данный момент:
    • Возможность указания в одном файле базовых настроек проекта:
      • название плагина;
      • версия (semver);
      • поддержка ProcessTick (по умолчанию отключена, чтобы не тратить лишние ресурсы на вызов неиспользуемой функции);
      • список исходных файлов плагина (по умолчанию в нём только main.cpp).

    • Автоматическая генерация проектов под Windows (Visual Studio) и Linux (Code::Blocks, CodeLite, GNU Make).

    • Проверка соответствия версий инклуда и плагина при загрузке последнего.

    • Удобная организация обработки аргументов функции.

    • Набор вспомогательных функций (файлы pluginutils.h и pluginutils.cpp):
        Открыть/закрыть

      • GetPublicVariable - позволяет получить значение из скриптовой переменной с атрибутом public. Возвращает true, если переменная существует, иначе возвращает false. Само значение переменной возвращается по ссылке в параметре value.
        PHP код:
        bool GetPublicVariable(AMX *amx, const char *namecell &value); 
      • SplitVersion - разделяет код версии плагина/инклуда из одного числа на 3 составляющих: мажорная версия, минорная версия и патч. Пример использования можно найти в main.cpp.
        PHP код:
        void SplitVersion(cell versionint &majorint &minorint &build); 
      • CheckIncludeVersion - проверяет соответствие версий инклуда и плагина. Возвращает true, если версии соответствуют, иначе возвращает false и выводит в лог сообщение об ошибке.
        PHP код:
        bool CheckIncludeVersion(AMX *amx); 
      • AlignCell, AlignCellArray - переставляет местами байты в ячейке и массиве ячеек соответственно. Полезно, если нужно передать/получить из виртуальной машины массив байтов (т.н. "упакованный массив"), т.к. на системах с порядком байт Little Endian порядок байтов массива в виртуальной машине отличается от оного на физической (например, элементы массива с порядком 0, 1, 2, 3, 4, 5, 6, 7 в виртуальной машине хранятся в порядке 3, 2, 1, 0, 7, 6, 5, 4). К сведению, порядок Little Endian распространён на большинстве процессоров, в т.ч. семейства x86.
        PHP код:
        cell AlignCell(cell value); 
        PHP код:
        void AlignCellArray(cell a[], size_t num_elements); 
      • CopyAndAlignCellArray - копирует массив ячеек с перестановкой байтов "на лету".
        PHP код:
        void CopyAndAlignCellArray(cell *destcell *srcsize_t num_cells); 
      • GetPackedArrayCharAddr - вычисляет адрес элемента упакованного массива.
        PHP код:
        unsigned char *GetPackedArrayCharAddr(cell arr[], cell index); 
      • GetCurrentNativeFunctionName - возвращает имя нативной функции, из которой вызвана данная функция. Может пригодиться при выводе сообщений в консоль/лог. Пример использования можно найти в main.cpp.
        PHP код:
        const char *GetCurrentNativeFunctionName(AMX *amx
      • CheckNumberOfArguments - проверяет количество параметров, переданных нативной функции. Возвращает true, если есть минимально требуемое число параметров, иначе возвращает false и выводит в консоль/лог сообщение о недостаточном количестве параметров в следующем формате. Пример использования можно найти в main.cpp.
        PHP код:
        bool CheckNumberOfArguments(AMX *amx, const cell *paramsint num_expected
      • ReplaceNative - заменяет нативную функцию с указанным именем. Возаращает true, если функция с указанным именем используется в скрипте и успешно подменена, иначе возаращает false. Если параметр orig не равен NULL, в него записывается адрес оригинальной нативной функции. Пример использования - в main.cpp.
        PHP код:
        bool ReplaceNative(AMX *amx, const char *nameAMX_NATIVE ntvAMX_NATIVE *orig



    Использование:
    • Установить CMake.
    • Установить компилятор и среду разработки (под Windows рекомендуется Visual Studio, под Linux - Code::Blocks или CodeLite)
    • Клонировать репозиторий samp-plugin-template или скачать и распаковать архив с исходниками (см. ссылки в конце статьи).
    • В файле CMakeLists.txt отредактировать настройки проекта (секция в начале файла, помеченная комментарием "Settings").
    • Запустить программу cmake-gui. В поле "Where is the source code" указать папку, в которую вы клонировали репозиторий или распаковали архив, а в "Where to build the binaries" - тот же самый путь, но в конце добавить "/build" (пример "C:/samp-plugin-template" и "C:/samp-plugin-template/build").
    • Нажать кнопку "Configure". Откроется окно, в котором следует указать среду разработки, в которой вы будете разрабатывать плагин, и нажать "Finish".
    • Когда конфигурирование закончится, нажать "Generate".
    • Зайти в папку "build", открыть с помощью выбранной среды разработки файл проекта и скомпилировать плагин. После компиляции инклуд будет автоматически скопирован в одну папку с плагином.


    Примечание: если вызвать из скрипта функцию HelloWorld_CheckArgsTest, будет выведено сообщение об ошибке (неправильное число аргументов), т.к. в инклуде для этой функции указано неправильное число аргументов (функции требуется хотя бы 1 аргумент, но в инклуде их нет вообще). Это сделано специально, чтобы проверить работу функции pluginutils::CheckNumberOfArguments.

    Лицензирование:
    • Сборочный скрипт CMakeLists.txt доступен под условиями лицензии ISC.
    • Файл pluginutils.h - под лицензией zlib.
    • Остальные файлы (за исключением SA-MP plugin SDK, естественно) выпущены под лицензией Creative Commons Zero (CC0) (отказ от авторских прав). Можете не бояться поставить свой копирайт в plugin.inc.in и main.cpp - это всего лишь "каркас" для плагина, для меня нет смысла резервировать свои авторские права за такими мелочами. Тем не менее, было бы здорово взамен увидеть свой ник в списке благодарностей в документации к вашему плагину.


    Репозиторий: https://github.com/Daniel-Cortez/samp-plugin-template
    Автор: Daniel_Cortez
    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 10.01.2018 в 21:30. Причина: v1.1
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  2. 9 пользователя(ей) сказали cпасибо:
    Desulaid (06.12.2017)Edwin (10.01.2018)f55555 (01.06.2017)L0ndl3m (01.06.2017)Salik_Davince (15.06.2017)SooBad (23.10.2017)vovandolg (01.06.2017)VVWVV (01.06.2017)Web (01.06.2017)
  3. #2
    Аватар для f55555
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    08.01.2017
    Сообщений
    67
    Репутация:
    2 ±
    Как всегда постарался, молодец!
    p.s не планируешь обновить учебник Pro-Pawn?

  4. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,114
    Репутация:
    745 ±
    Удобно, такое бы пораньше)

  5. Пользователь сказал cпасибо:
    vovandolg (01.06.2017)
  6. #4
    Аватар для $continue$
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,466
    Репутация:
    265 ±
    Так понимаю поддержки MinGW нет?

  7. #5
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,788
    Репутация:
    2277 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Так понимаю поддержки MinGW нет?
    Нет, для этого либо придётся вносить изменения в SA-MP Plugin SDK, либо делать какие-то костыли с параметрами компилятора/линковщика. Пытался осуществить последнее, но так ничего и не получилось сделать с именами экспортируемых функций (в итоге вместо "Load" получалось "[email protected]", с остальными функциями то же самое). Если есть идеи, как это исправить, буду рад принять PR.

    Для тех, кто хочет реализовать поддержку MinGW:
    PHP код:
    if(MINGW)
        
    add_definitions("/DHAVE_STDINT_H /D__need_size_t")
    endif() 
    Эти два макроса помогут устранить ошибки при определении типов cell и size_t.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  8. #6
    Аватар для $continue$
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,466
    Репутация:
    265 ±
    Сейчас устанавливаю Cygwin. Попробую сделать под него поддержку. Отпишу, если что.

    P.S:
    А как CodeBlock тогда работает? Там же MinGW на борту. Или ты только в Linux с ним пробовал с настройкой компилера?
    Или в окнах использовал MSVC?

    P.S.S: в идеале бы добавить поддержку шланга (CLang), MinGW, Cygwin.
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Если есть идеи, как это исправить, буду рад принять PR
    Последний раз редактировалось $continue$; 24.07.2017 в 14:56.

  9. #7
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,788
    Репутация:
    2277 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Сейчас устанавливаю Cygwin. Попробую сделать под него поддержку. Отпишу, если что.
    Ок. Как я уже говорил, там, скорее всего, всё сводится к добавлению параметров для компилятора или линковщика, которые и для MinGW, и для Cygwin должны быть одинаковыми. Проблема лишь в том, что если для решения проблемы нужны параметры для линковщика, то они всё равно из свойства LINK_FLAGS будут передаваться через gcc/g++, который не факт что распознает их. Либо так, либо делать делать сборку вручную, через add_custom_command.


    Цитата Сообщение от $continue$ Посмотреть сообщение
    P.S:
    А как CodeBlock тогда работает? Там же MinGW на борту. Или ты только в Linux с ним пробовал с настройкой компилера?
    Или в окнах использовал MSVC?
    Именно так. SDK с самого начала делали только под MSVC


    Цитата Сообщение от $continue$ Посмотреть сообщение
    P.S.S: в идеале бы добавить поддержку шланга (CLang), MinGW, Cygwin.
    Первый уже справляется под Linux.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  10. #8
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,788
    Репутация:
    2277 ±
    Обновление от 26.07.17:
    • Добавлена поддержка MinGW.
    • Исправлен баг в функции pluginutils::GetCurrentNativeFunctionName.
    • Плагин больше не выдаёт сообщения вида "Include file version does not match with the plugin version" при загрузке фильтрскриптов, скомпилированных без включения инклуда от плагина.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  11. Пользователь сказал cпасибо:
    Nurick (26.07.2017)
  12. #9
    Аватар для Bib
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2017
    Адрес
    Челябинск
    Сообщений
    56
    Репутация:
    6 ±
    Можно какой-нибудь пример с указанием исходников? Что только не пробовал, всё равно ошибки

  13. #10
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,788
    Репутация:
    2277 ±
    Цитата Сообщение от Bib Посмотреть сообщение
    Можно какой-нибудь пример с указанием исходников? Что только не пробовал, всё равно ошибки
    Это шаблон, а не библиотека, тут никакого самостоятельного примера не сделаешь - это будет просто форк шаблона. Можно разве что сделать урок по использованию, но в 1-м посте и так уже есть инструкция.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

 

 
Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •