Как создать плагин [часть I] -
Diman777 - 11.03.2017
Как создать плагин
часть I
Введение
Многим скриптерам интересно - Как же создаётся плагины для серверов?
В этот руководстве я расскажу один из простых способов как это сделать.
Туториал расчитан на тех, кто знает язык Pawn, C++ (как минимум на начальном этапе) и хотя бы немного слышал что такое
Среда Разработки.
Если у Вас есть проблемы свыше перечисленным, то это тема будет бесполезна. Я сам по себе далеко не профессионал, поэтому буду рассказывать как получается. В 1-ой часте туториала мы разберём 'Как с самого начала создать плагин, и запустить его в моде'.
Начало
Плагин (англ.
plug-in, от
plug in «подключать») - это независимо компилируемый программный модуль, динамически подключаемый к основной программе. Основное предназначение в нашем случае - это расширение возможностей игрового мода. Благодаря этому можно сделать функционал, который
невозможно сделать скриптово в моде на языке Pawn. Например можно сделать функцию, которая разрешит заходить на сервер с ником на кириллице. Или сделать так, чтобы сообщения в консоли были разными цветами.
Перейдём к делу. Для создания плагина буду использовать среду разработки
Microsoft Visual Studio 2015.
Если у Вас нет этой студии, то найдите на торрентах и скачайте (ссылку оставлю в самом низу туториала). Руководство пишется именно для версии 2015, поэтому лучше юзайте именно эту версию, чтобы не было каких-то мелочных проблем (типа а у меня другая версия студии и там нет такой штуки в Меню и т.д.).
Важно
Нужно понять такую вещь, что свой первый плагин мы будем делать в виде библиотеки с расширением
dll. Это означает, что этот самый плагин будет работать только на ОС Windows => он работает только на локальном сервере с вашего компьютера. Для того, чтобы он запустился у Вас на хостинге - его исходный код нужно будет компилировать на ОС Linux в формат
so. MVS этим не занимается. Но эта совсем другая тема. Как это делается можно глянуть в этой
теме.
Пошаговая инструкция
1. В самом начале мы должны создать проект: Файл -> Создать -> Проект
2. Выбираем шаблон: Установленные -> Шаблоны -> Visual C++ -> Win32 -> Проект Win32. Сразу после этого мы должны придумать имя нашему проекту|решению, в нашем случае пусть будет
MyPlugin. Нажимаем OK (если Вас имя не устраивает, то вписывайте любое на усмотрение. Делайте его лучше коротким, запоминающимся, и чтобы оно не совпадало с другими Вашими проектами).
3. Сразу после того как вы выполнили 2-ой шаг - автоматически откроется окно Мастера приложений Win32.
cлева в меню мы выбираем 'Параметры приложения'
далее в 'Тип приложения' ставим галочку 'Библиотека DLL', в 'Дополнительные параметры' галочку 'Пустой проект'. Нажимаем 'Готово'.
Перед нами создан пустой проект. Слева Вы можете увидеть/ознакомиться с 'Обозревателем решения' нашего проекта. Это такая область, в которой будут храниться все исходники (.h, .c, .cpp и др.) проекта. Если по какой-то причине этого обозревателя не видно, то щёлкните вкладку Вид -> Обозреватель решений.
Не обязательно: В 'Обозревателе решений' можете удалить 2 фильтра 'Заголовочные файлы' и 'Файлы ресурсов'. Они в дальнейшем не понадобятся (щёлкните правой кнопкой по фильтрам и выберите Удалить).
4. С этого момента мы переходим непосредственно к установке важных свойств для проекта MyPlugin. Создаём файл определения модуля: Щёлкаем по вкладке Отладка -> Свойства проекта -> Компоновщик -> Ввод -> Файл определения модуля. Вписываем имя, в нашем случае
MyPlugin.def (.def - не входит в часть имени, это расширение для будущего файла. По Вашему желанию имя можете указать своё, на английском языке). Сохраняемся, нажав кнопки Применить и ОК.
Теперь необходимо создать сам файл: Обозреватель решений -> Файлы исходного кода -> Добавить -> Создать Элемент -> Файл определения модуля (.def) -> Имя
MyPlugin.def -> Добавить.
Открываем созданный нами
MyPlugin.def и прописываем следующие параметры, которые необходимы для компилятора при построении проекта (этап компоновки):
Code:
// оператору LIBRARY даём понять, что имя плагина будет называться MyPlugin
// во избежание warning'ов компилятора - оставим имя как у решения
LIBRARY "MyPlugin"
// в EXPORTS указываем какие функции будут экспортироваться
EXPORTS
Supports
Load
Unload
AmxLoad
AmxUnload
5. Следующим шагом будет - добавление комплекта средств разработки
SDK (Software Development Kit). На сколько я понял он специально поставляется от самих разработчиков SAMP, поэтому мы будем использовать именно его.
В 'Обозревателе решений' щёлкните правой кнопкой по MyPlugin -> Добавить -> Новый фильтр. Переименовываем его в SDK. Далее
скачайте сам SDK, и распакуйте его в папку с вашим проектом. Например у меня он расположен по адресу: C:\Users\Diman777\Documents\Visual Studio 2015\Projects\MyPlugin\MyPlugin. И последнее - это включение в проект нашего SDK: Обозреватель решений -> SDK -> Добавить -> Существующий элемент -> amxplugin.cpp -> Добавить.
6. Теперь можно приступить к добавлению файла, который будет в себе содержать
исходный код. Это то самое место, где Вы будете писать свои функции, определять константы и т.д.
В 'Обозревателе решений' найдите фильтр Файлы исходного кода -> Добавить -> Создать элемент -> Файл C++ (.cpp) -> Называем его
main -> Добавить.
В только что созданный
main.cpp добавляем следующий код:
PHP Code:
#include "SDK/plugin.h"
typedef void(*logprintf_t)(char* format, ...);
logprintf_t logprintf;
void **ppPluginData;
extern void *pAMXFunctions;
PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
{
pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
logprintf = (logprintf_t)ppData[PLUGIN_DATA_LOGPRINTF];
return 1;
}
PLUGIN_EXPORT void PLUGIN_CALL Unload()
{
}
AMX_NATIVE_INFO NATIVES_LIST[] =
{
{ 0, 0 }
};
PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
{
return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES;
}
PLUGIN_EXPORT int PLUGIN_CALL AmxLoad(AMX *amx)
{
return amx_Register(amx, NATIVES_LIST, -1);
}
PLUGIN_EXPORT int PLUGIN_CALL AmxUnload(AMX *amx)
{
return AMX_ERR_NONE;
}
Вы спросите - 'Почему именно такой код?'. Сразу всё объяснить крайне сложно, просто будем считать, что это
основа. Практически любой плагин содержит в себе именно такой код. Но всё же вкратце могу объяснить некоторые моменты:
PHP Code:
// Подключение инклуда от SDK.
#include "SDK/plugin.h"
// Необходимые определения/объявления некоторых функций
// для дальнейшей работы с ними.
typedef void(*logprintf_t)(char* format, ...);
logprintf_t logprintf;
void **ppPluginData;
extern void *pAMXFunctions;
// Экспортируемые функции. Это те ф-ии, которые перечислены
// в файле my_plugin.def (см. 4-ый шаг)
Load(void **ppData);
Unload();
Supports();
AmxLoad(AMX *amx);
AmxUnload(AMX *amx);
// Массив, содержащий список созданных Вами функций,
// которые будут выполняться плагином.
NATIVES_LIST[] = {...};
7. Теперь осталось сделать отладку:
перед началом отладки на панели инструментов найдите список выбора 'конфигурации решения' и выберите
Release
теперь проект готов к отладке: Отладка -> Начать отладку
Если Вы все шаги сделали правильно, то в окне студии (обычно внизу) появится некий отчёт.
При успешной сборке проекта будет явно написано, что ошибок и предупреждений нет:
Code:
1>------ Сборка начата: проект: MyPlugin, Конфигурация: Release Win32 ------
1> main.cpp
1> amxplugin.cpp
1> Создается библиотека c:\users\diman777\documents\visual studio 2015\Projects\MyPlugin\Release\MyPlugin.lib и объект c:\users\diman777\documents\visual studio 2015\Projects\MyPlugin\Release\MyPlugin.exp
1> Создание кода
1> All 6 functions were compiled because no usable IPDB/IOBJ from previous compilation was found.
1> Создание кода завершено
1> MyPlugin.vcxproj -> c:\users\diman777\documents\visual studio 2015\Projects\MyPlugin\Release\MyPlugin.dll
1> MyPlugin.vcxproj -> c:\users\diman777\documents\visual studio 2015\Projects\MyPlugin\Release\MyPlugin.pdb (Full PDB)
========== Сборка: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========
Результат
Свой плагин можно будет найти в папке с проектами:
Чтобы убедиться в работоспособности - подключите его к моду и запустите samp-server.exe:
Т.к. мы не создавали своих функций, то плагин ничего не делает. Он только подгружается к серверу.
Заключение
В этой часте мы разобрали с самого начала 'Как создаются плагины для модов' в MVS. 2-ая часть будет посвящена созданию
простеньких функций и вывод их в мод в
native.
Полезные ссылки
Скачать
Внизу во вложениях прикреплены плагин (.dll) и его исходники (.c, .h, .cpp, .def).
Re: Как создать плагин [часть I] -
joker2020pro - 11.03.2017
Quote:
Originally Posted by Diman777
2-ая часть будет посвящена созданию простеньких функций и вывод их в мод в native
|
Стоит учесть, что ещё есть экспортная функция ProcessTick (которая так же объявляется в def файле), и вообще лучше описать, при каких обстоятельствах вызывается каждая функция:
- Supports - вызывается при загрузке плагина (перед Load), возвращает права, которые необходимы плагину.
- Load - вызывается при загрузке плагина.
- Unload - очевидно при отгрузке плагина.
- AmxLoad - вызывается при загрузке любой AMX машины (игровой режим или фильтрскрипт).
- AmxUnload - при отгрузке AMX машины.
- ProcessTick - вызывается при каждом тике (требуется указать права в Supports).
Re: Как создать плагин [часть I] -
Gettopro - 11.03.2017
Не плохо, стоило бы ещё добавить как создать тот же плагин но под линь
т.е. .so расширение)
Re: Как создать плагин [часть I] -
Diman777 - 12.03.2017
Во 2-ой части как раз и постараюсь рассказать о функциях. А на счёт туториала 'Как сделать под Linux' - может быть. Вообще по большей части это всё будет полезно новичкам, знающие в принципе не найдут ничего нового.
Re: Как создать плагин [часть I] -
OKStyle - 13.03.2017
Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
Re: Как создать плагин [часть I] -
ZiGGi - 13.03.2017
Quote:
Originally Posted by OKStyle
Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
|
Нет, при компиляции в Debug режиме в бинарник записывается различная отладочная информация. Аналогично ключу -d3 в Pawn.
Re: Как создать плагин [часть I] -
Diman777 - 13.03.2017
Меня кстати интересует такой момент - почему в Debug режиме плагин весит больше, чем в Release? Не я один замечал такое.
Re: Как создать плагин [часть I] -
Stepashka - 13.03.2017
Quote:
Originally Posted by Diman777
почему в Debug режиме плагин весит больше, чем в Release?
|
эмм:
Quote:
Originally Posted by ZiGGi
при компиляции в Debug режиме в бинарник записывается различная отладочная информация.
|
Re: Как создать плагин [часть I] -
Diman777 - 13.03.2017
Аахха, теперь ясно)
Re: Как создать плагин [часть I] -
White_116 - 13.03.2017
Quote:
Originally Posted by OKStyle
Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
|
Debug/Release - это всего лишь выбор заготовки опций сборки проекта, наплодить всякое можно, VS с этим не ограничивает. Чтобы создать статическую библиотеку, нужно выбрать опцию
Многопоточная(/MT) -
Свойства конфигурации -> С/С++ -> Создание кода -> Библиотека времени выполнения.
Что бы проект был кроссплатформенным, можно использовать CMAKE, тут есть пример как что и куда...
ССЫЛКА
Так же в дебаг режим можно настроить отладку.
Для этого переходим
Свойства конфигурации -> Отладка.
В строке команда пишем название вашего сервера, допустим
sa-mp_server.exe.
В строке
Рабочий каталог указать каталог с вашим сервером где размещён
sa-mp_server.exe.
Примечание: скомпилированная
dll уже должна лежать в папке
plugins а также отладочная информация
pdb. Можно настроить в проекте куда копировать выходные файлы.
Re: Как создать плагин [часть I] -
BLacksKrillex - 23.03.2017
voce fez esse tutorial ai mas eu nao entendi nada (nao sei falar ingles)
Re: Как создать плагин [часть I] -
Diman777 - 23.03.2017
BLacksKrillex tire vantagem de ****** tradutor -
https://translate.******.ru/. Não é difícil.
Re: Как создать плагин [часть I] -
BLacksKrillex - 23.03.2017
Voce poderia posta essse tutorial na board BR?
Re: Как создать плагин [часть I] -
Diman777 - 24.03.2017
Sorry, no.
Re: Как создать плагин [часть I] -
pawnoholic - 23.10.2017
Скажите пожалуйста, какие компоненты и инструменты необходимо до установить для Community VS 2017?
Re: Как создать плагин [часть I] -
Diman777 - 23.10.2017
Для 2017 не знаю. Не стоит забывать, что тема о плагинах в 2015 студии. Погугли как говорится)
Re: Как создать плагин [часть I] -
pawnoholic - 23.10.2017
Quote:
Originally Posted by Diman777
Для 2017 не знаю. Не стоит забывать, что тема о плагинах в 2015 студии. Погугли как говорится)
|
У меня просто в шаблонах нету Win32
Выбранные компоненты
UPD:
Почитал на форумах MS
Пишут что все компоненты C++ ставить нужно.
Завтра переустановлю, проверю.
Re: Как создать плагин [часть I] -
White_116 - 24.10.2017
Quote:
Originally Posted by pawnoholic
У меня просто в шаблонах нету Win32
Выбранные компоненты
UPD:
Почитал на форумах MS
Пишут что все компоненты C++ ставить нужно.
Завтра переустановлю, проверю.
|
Выбираешь динамическую библиотеку DLL. Далее в проекте настраиваешь компилятор.