11.03.2017, 02:33
(
Last edited by Diman777; 13/10/2017 at 06:20 PM.
Reason: Перезалиты скрины туториала, т.к. по старому адресу они уже не работали. Дополнительно прикрепил их во вложения.
)
Как создать плагин
часть I
Введение
Многим скриптерам интересно - Как же создаётся плагины для серверов?

Туториал расчитан на тех, кто знает язык Pawn, C++ (как минимум на начальном этапе) и хотя бы немного слышал что такое Среда Разработки.
Если у Вас есть проблемы свыше перечисленным, то это тема будет бесполезна. Я сам по себе далеко не профессионал, поэтому буду рассказывать как получается. В 1-ой часте туториала мы разберём 'Как с самого начала создать плагин, и запустить его в моде'.
Начало
Плагин (англ. plug-in, от plug in «подключать») - это независимо компилируемый программный модуль, динамически подключаемый к основной программе. Основное предназначение в нашем случае - это расширение возможностей игрового мода. Благодаря этому можно сделать функционал, который невозможно сделать скриптово в моде на языке Pawn. Например можно сделать функцию, которая разрешит заходить на сервер с ником на кириллице. Или сделать так, чтобы сообщения в консоли были разными цветами.
Перейдём к делу. Для создания плагина буду использовать среду разработки Microsoft Visual Studio 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[] = {...};
перед началом отладки на панели инструментов найдите список выбора 'конфигурации решения' и выберите 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).