[Tutorial] Как создать плагин [часть I]
#1

Как создать плагин

часть 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)(charformat, ...);
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}
};
PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
{
    return 
SUPPORTS_VERSION SUPPORTS_AMX_NATIVES;
}
PLUGIN_EXPORT int PLUGIN_CALL AmxLoad(AMX *amx)
{
    return 
amx_Register(amxNATIVES_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)(charformat, ...);
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).
Reply
#2

Quote:
Originally Posted by Diman777
View Post
2-ая часть будет посвящена созданию простеньких функций и вывод их в мод в native
Стоит учесть, что ещё есть экспортная функция ProcessTick (которая так же объявляется в def файле), и вообще лучше описать, при каких обстоятельствах вызывается каждая функция:
  1. Supports - вызывается при загрузке плагина (перед Load), возвращает права, которые необходимы плагину.
  2. Load - вызывается при загрузке плагина.
  3. Unload - очевидно при отгрузке плагина.
  4. AmxLoad - вызывается при загрузке любой AMX машины (игровой режим или фильтрскрипт).
  5. AmxUnload - при отгрузке AMX машины.
  6. ProcessTick - вызывается при каждом тике (требуется указать права в Supports).
Reply
#3

Не плохо, стоило бы ещё добавить как создать тот же плагин но под линь т.е. .so расширение)
Reply
#4

Во 2-ой части как раз и постараюсь рассказать о функциях. А на счёт туториала 'Как сделать под Linux' - может быть. Вообще по большей части это всё будет полезно новичкам, знающие в принципе не найдут ничего нового.
Reply
#5

Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
Reply
#6

Quote:
Originally Posted by OKStyle
View Post
Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
Нет, при компиляции в Debug режиме в бинарник записывается различная отладочная информация. Аналогично ключу -d3 в Pawn.
Reply
#7

Меня кстати интересует такой момент - почему в Debug режиме плагин весит больше, чем в Release? Не я один замечал такое.
Reply
#8

Quote:
Originally Posted by Diman777
View Post
почему в Debug режиме плагин весит больше, чем в Release?
эмм:
Quote:
Originally Posted by ZiGGi
View Post
при компиляции в Debug режиме в бинарник записывается различная отладочная информация.
Reply
#9

Аахха, теперь ясно)
Reply
#10

Quote:
Originally Posted by OKStyle
View Post
Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
Debug/Release - это всего лишь выбор заготовки опций сборки проекта, наплодить всякое можно, VS с этим не ограничивает. Чтобы создать статическую библиотеку, нужно выбрать опцию Многопоточная(/MT) - Свойства конфигурации -> С/С++ -> Создание кода -> Библиотека времени выполнения.
Что бы проект был кроссплатформенным, можно использовать CMAKE, тут есть пример как что и куда... ССЫЛКА

Так же в дебаг режим можно настроить отладку.
Для этого переходим Свойства конфигурации -> Отладка.
В строке команда пишем название вашего сервера, допустим sa-mp_server.exe.
В строке Рабочий каталог указать каталог с вашим сервером где размещён sa-mp_server.exe.
Примечание: скомпилированная dll уже должна лежать в папке plugins а также отладочная информация pdb. Можно настроить в проекте куда копировать выходные файлы.
Reply
#11

voce fez esse tutorial ai mas eu nao entendi nada (nao sei falar ingles)
Reply
#12

BLacksKrillex tire vantagem de ****** tradutor - https://translate.******.ru/. Não é difícil.
Reply
#13

Voce poderia posta essse tutorial na board BR?
Reply
#14

Sorry, no.
Reply
#15

Скажите пожалуйста, какие компоненты и инструменты необходимо до установить для Community VS 2017?
Reply
#16

Для 2017 не знаю. Не стоит забывать, что тема о плагинах в 2015 студии. Погугли как говорится)
Reply
#17

Quote:
Originally Posted by Diman777
View Post
Для 2017 не знаю. Не стоит забывать, что тема о плагинах в 2015 студии. Погугли как говорится)
У меня просто в шаблонах нету Win32



Выбранные компоненты



UPD:
Почитал на форумах MS
Пишут что все компоненты C++ ставить нужно.
Завтра переустановлю, проверю.
Reply
#18

Quote:
Originally Posted by pawnoholic
View Post
У меня просто в шаблонах нету Win32



Выбранные компоненты



UPD:
Почитал на форумах MS
Пишут что все компоненты C++ ставить нужно.
Завтра переустановлю, проверю.
Выбираешь динамическую библиотеку DLL. Далее в проекте настраиваешь компилятор.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)