SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian > Релизы/Releases

Reply
 
Thread Tools Display Modes
Old 11/03/2017, 02:33 AM   #1
Diman777
Huge Clucker
 
Diman777's Avatar
 
Join Date: Aug 2011
Location: Ростов-на-Дону
Posts: 427
Reputation: 22
Default Как создать плагин [часть I]

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

часть 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).
Attached Files
File Type: zip MyPlugin.zip (4.6 KB, 0 views)
File Type: zip MyPluginSrc.zip (613.5 KB, 0 views)
Diman777 is online now   Reply With Quote
Old 11/03/2017, 07:11 AM   #2
joker2020pro
Big Clucker
 
Join Date: Jan 2015
Posts: 61
Reputation: 12
Default Re: Как создать плагин [часть I]

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).
joker2020pro is offline   Reply With Quote
Old 11/03/2017, 09:35 AM   #3
Gettopro
Big Clucker
 
Join Date: Oct 2011
Posts: 152
Reputation: 4
Default Re: Как создать плагин [часть I]

Не плохо, стоило бы ещё добавить как создать тот же плагин но под линь т.е. .so расширение)
__________________
Code:
 Опускать там ->
Gettopro is online now   Reply With Quote
Old 12/03/2017, 06:40 PM   #4
Diman777
Huge Clucker
 
Diman777's Avatar
 
Join Date: Aug 2011
Location: Ростов-на-Дону
Posts: 427
Reputation: 22
Default Re: Как создать плагин [часть I]

Во 2-ой части как раз и постараюсь рассказать о функциях. А на счёт туториала 'Как сделать под Linux' - может быть. Вообще по большей части это всё будет полезно новичкам, знающие в принципе не найдут ничего нового.
Diman777 is online now   Reply With Quote
Old 13/03/2017, 03:18 AM   #5
OKStyle
High-roller
 
OKStyle's Avatar
 
Join Date: May 2008
Location: Russia
Posts: 2,972
Reputation: 105
Default Re: Как создать плагин [часть I]

Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
__________________
O.K.Style™ Laboratory
Kalcor: "... it's makes the game look like it's not GTA. This mod is called San Andreas Multiplayer. It's not a custom game engine which you can script..."
OKStyle is offline   Reply With Quote
Old 13/03/2017, 05:07 AM   #6
ZiGGi
High-roller
 
ZiGGi's Avatar
 
Join Date: Sep 2008
Location: Russia
Posts: 1,414
Reputation: 206
Default Re: Как создать плагин [часть I]

Quote:
Originally Posted by OKStyle View Post
Debug/Release - тут выбирается нужна ли поддержка внешних библиотек? Ненавижу плагины, которым требуются всякие VC++ для работы. Гораздо удобнее воткнуть во внутрь.
Нет, при компиляции в Debug режиме в бинарник записывается различная отладочная информация. Аналогично ключу -d3 в Pawn.
ZiGGi is offline   Reply With Quote
Old 13/03/2017, 03:33 PM   #7
Diman777
Huge Clucker
 
Diman777's Avatar
 
Join Date: Aug 2011
Location: Ростов-на-Дону
Posts: 427
Reputation: 22
Default Re: Как создать плагин [часть I]

Меня кстати интересует такой момент - почему в Debug режиме плагин весит больше, чем в Release? Не я один замечал такое.
Diman777 is online now   Reply With Quote
Old 13/03/2017, 03:34 PM   #8
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,401
Reputation: 104
Default Re: Как создать плагин [часть I]

Quote:
Originally Posted by Diman777 View Post
почему в Debug режиме плагин весит больше, чем в Release?
эмм:
Quote:
Originally Posted by ZiGGi View Post
при компиляции в Debug режиме в бинарник записывается различная отладочная информация.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is online now   Reply With Quote
Old 13/03/2017, 03:39 PM   #9
Diman777
Huge Clucker
 
Diman777's Avatar
 
Join Date: Aug 2011
Location: Ростов-на-Дону
Posts: 427
Reputation: 22
Default Re: Как создать плагин [часть I]

Аахха, теперь ясно)
Diman777 is online now   Reply With Quote
Old 13/03/2017, 04:31 PM   #10
White_116
High-roller
 
Join Date: Sep 2010
Location: Russia/116
Posts: 1,405
Reputation: 65
Default Re: Как создать плагин [часть I]

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. Можно настроить в проекте куда копировать выходные файлы.
__________________
White_116 is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Дробная часть числа max_colombo Русский/Russian 12 20/04/2012 11:02 AM
Матчасть White_116 Русский/Russian 4 13/01/2012 05:38 PM
Как создать графический таймер. YellowCloud Русский/Russian 4 30/01/2011 10:04 AM


All times are GMT. The time now is 06:24 PM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.