Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 38
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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

    Шаблон плагина для 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
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 11 пользователя(ей) сказали cпасибо:
    Desulaid (06.12.2017) Edwin (10.01.2018) f55555 (01.06.2017) L0ndl3m (01.06.2017) oukibt (01.06.2020) punkochel (10.03.2022) 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,181
    Репутация:
    790 ±
    Удобно, такое бы пораньше)

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Так понимаю поддержки MinGW нет?
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  7. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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

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

  8. #6
    Аватар для $continue$
    Пользователь

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

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

    P.S.S: в идеале бы добавить поддержку шланга (CLang), MinGW, Cygwin.
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Если есть идеи, как это исправить, буду рад принять PR
    Последний раз редактировалось $continue$; 24.07.2017 в 14:56.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  9. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от $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.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. #8
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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

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

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

  13. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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

 

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

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

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

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

Ваши права

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