Как прописать плагины в самп

Обновлено: 16.05.2024

Это не форум по C++.
Хорошие сайты по изучению языка:

Если у вас возникли проблемы во время написания кода на С++, то вы можете получить поддержку здесь:


Часто задаваемые вопросы.

Вопрос: Как же делают плагины?
Ответ: Плагины делаются на C/++ с помощью SDK. Этот FAQ подразумевает, что вы знаете C/++ и лишь доводит до вашего сведения информацию по использованию SDK

Вопрос: Можно ли создать плагин не на C/++?
Ответ: Теоретически - да, практически - нет

Вопрос: Я хочу чтобы мой плагин запускался везде (На линуксе и виндоусе)?
Ответ: Linux и Windows - АБСОЛЮТНО разные операционные системы со своими структурами(далее фреймворками). Для того чтобы сделать так, чтобы ваш плагин запускался под обеими ОСями вам необходимо писать Платформо-Независимый-Код. После написания такого кода, вам всеголишь необходимо скомпилировать его на желаемых осях. В итоге вы получите .so и .dll версию плагина.

Вопрос: Можно мне подменять память серверного демона?
Ответ: Честно говоря, это уже относится к андерграунду и кодингу уровня Евгена 1137. Использовать хаки памяти для того чтобы отлавливать Коллбэки вполне нормально, но подменять память сервера, это уже что-то выходящее за рамки.

Вопрос: Возможно ли сделать плагин который будет делать ______ ?
Ответ: В 90% случаев - ДА. Возможно плагину потребуется отдельное приложение для работы, но это не меняет суть ответа. Не стоит задавать такие вопросы.

Вопрос: Какую Среду разработки(далее IDE)/компилятор я должен использовать для ______ ?
Ответ: Выбор каждого. Лично я советую VS2010 для Windows и g++ для Linux

Вопрос: Что такое файл сведений о модулях DLL (.def)?
Ответ: файл сведений о модулях DLL это специальный файл который сообщает линкеру IDE VS2010 о компилируемой программе. Когда речь идет о плагинописании, мы лишь используем "EXPORTS" которая предоставляет компилятору информацию о наших экспортируемых функциях. В статье мы обсудим это

Вопрос: Когда я выпускаю плагин, я должен выкладывать исходники?
Ответ: Если вы выпускаете хоть что-нибудь на этом форуме, вы обязаны прикладывать исходники. Плагины не исключение.

Начнем с того, что если вы знаете язык, это не значит что вы знаете как двигаться по IDE. VS2010 IDE может показаться очень неуютным местом для новеньких. Я думаю, что это нечестно - давать вам SDK без объяснения IDE.

Заметка: Если вы выбрали другую IDE для Windows, то вам НЕВЕЗЕТ! Судя по-всему, единственный способ экспортировать функции - это использование файла сведений о модулях DLL (.DEF). Другие методы, основывающиеся на использовании __declspec(dllexport), провальны, потому что вызов __stdcall просто напросто коверкает их имена (Заметка: код Kyosaur'a

Visual C++ 2010 express:

Время компиляции плагина! Если у вас все получилось, то у вас должно быть в проекте 2 пустых файла. Копируйте следующий код в соотвествующие файлы

Рассмотрим код

Теперь вас никто не держит за ручку. Дальнейшая часть будет рассматривать структуры, функции, дефайны, которые есть в SDK. Объяснение будет только касательно SDK. Подразумевается понимание С++.

Что же такое .def файл? Да, да это эксклюзивная фича Visual Studio, но. что он делает? Все просто. Он сообщает линкеру о том, какой код нужно связать. Все просто

Export это оператор, который экспортирует материал в нашу программу. Если мы не экспортируем материал, то для нашего плагина он останется в private.

Всего есть 6 функции которые необходимо экспортировать. Мы, в нашем проекте. используем всего 5. Не беспокойтесь об PLUGIN_EXPORT, и PLUGIN_CALL, в этой теме ничего не останется без внимания.

Supports() - Эта функция говорит о том, на каких возможностях будет построен наш плагин. Обычно мы используем 3 суппорт флага в плагинах: SUPPORTS_VERSION, SUPPORTS_AMX_NATIVES, и SUPPORTS_PROCESS_TICK.

Load(void**) Функция LOAD довольно проста. вызывается когда плагин получает команду загрузки от сервера и получает список адресов для работы. Два индекса для использования PLUGIN_DATA_AMX_EXPORTS, и PLUGIN_DATA_LOGPRINTF.

Unload() Вызывается когда плагин выгружается. (сервер выключается).

AmxLoad(AMX*) Вызывается когда новая абстрактная машина подгружается на сервер. Вызывается при каждой загрузке фс или гм! Поэтому не самая лучшая идея хранить 1 экземпляр АМХ на весь плагин, используйте очередь/вектор/лист. В этой функции мы также задаем НАТИВЫ, которые позже снабжают PAWN.

AmxUnload(AMX*) Вызывается когда гм или фс выгружается. Если вы храните экземпляр AMX следует, то его удалить. Иначе у вас будет экземпляр с несуществующими гмами/фсами.

ProcessTick() Функция, которая вызывается каждый раз, когда серверный цикл проходит итерацию


Дефайны и структуры

Веселье начинается ЗДЕСЬ! Вы наверное заметили что мы использовали МАССУ структур и прочих определений. Если вы раньше не писали плагины для SA-MP, то вам этот код покажется тяжелым. Самое время пролить свет на это.

cell Ячейка - это синоним для простоты использования. PAWN предлагает поддержку 16bit, 32bit, и 64bit целых чисел. Синоним "ячейка" будет всегда верным размером, в то время как целое число(int) может и не быть. Обычно, в плагинах SA-MP это синоним 32bit целых чисел


AMX Имя все объясняет - экземпляр AMX. Эта структура хранит массу информации касающейся данных и другую амх информацию. Эта структура должна быть представлена во всех нативных функциями с указателем на данные, что она передает; Без этой информации мы не сможем понять, какой скрипт вызвал нативную функцию, а темболее какие параметры передал.

PLUGIN_EXPORT читай как "PLUGIN_EXTERN_C".

PLUGIN_EXTERN_C Если вы используете С++ компилятор, то это что-то вроде "дополнительный С". Все это для совместимости с С. Когда это определение используется, С++ использует С линковку.

PLUGIN_CALL Это определение сообщает С/++ какое соглашение вызова следует использовать в экспортированной фнукции. Если вы делаете для windows, то это определяется как __stdcall, в других случаях просто как ничего или стандартное соглашение вызова.

SUPPORTS_VERSION Это определение используется в бит-маске, которую возвращает функция Supports(). Этот флаг определяет какие версии сервера поддерживаются

SUPPORTS_AMX_NATIVES Еще одно определение, которое возвращает функция "Supports()". Любой плагин, который использует функции встроенной абстрактной машины должен использовать этот флаг. Иначе будет ошибка

SUPPORTS_PROCESS_TICK Последний флаг. Если вы собираетесь использовать функцию "ProcessTick()" то вы должны указать это в бит-маске.

PLUGIN_DATA_AMX_EXPORTS Это используется как индекс в мульти-мерных массивах. Индекс передается в Load. Фактически содержит таблицу функции АМХ. Все плагины должны использовать этот индекс чтобы работать с таблицей функции pAMXFunctions.

PLUGIN_DATA_LOGPRINTF Другой индекс, который мы получаем в Load. Этот индекс содержит адресс функции logprintf, аналог printf в pawn.

AMX_NATIVE_INFO Эта структура используется в смеси с amx_Register. В ней содержится стринг - название новой натив функции и указатель на ее адресс.

АМХ функции.

Функции хорошо описаны в pawn-implementers-guide, который можно скачать тут

. Вместо того, чтобы описывать каждую функции своими словами, я просто переведу нужные для плагинописания

Заметки

Удалите стандартные скрипты сервера из конфига, они могут мешать работе мода.

Возможные ошибки при включении SAMP сервера

Означает, что в папке plugins отсутствует файл crashdetect.so

Данная версия MySQL плагина у нас не поддерживается.
У нас в панели управления есть несколько версий MySQL плагинов, достаточно нажать кнопку Установить, и не рабочий сменится на рабочий.

Общая ошибка о том, что по какой-то причине не работает Ваш мод. Либо плагины (plugins) не той версии, что требует мод, либо какой-то из них отсутствует.

Тема: Как установить (Плагины/plugins) на сервер SAMP


Часто от новичков поступают вопросы: Как установить плагин на мой совершенно новый SAMP сервер?
Ведь плагин это не мало немаловажная часть отличной работы вашего сервера SAMP.

Мы будем рассматривать и устанавливать известный командный процессор DC_CMD от хорошего парня, а так же отличного программиста Daniel_Cortez

У нас уже имеются скаченные плагины, сервер и include.


1) dc_cmd.inc - Это файл формата .inc вы должны поместить в папку ваш сервер/pawno/include
2) dc_cmd.dll и dc_cmd.so - Эти два файла вы должны поместить в папку ваш сервер/plugins( Если такой папки нет, создайте её ).
3) Откройте файл ваш сервер/server.cfg "Добавьте строку plungins dc_cmd" ( если есть строка plugins добавьте просто dc_cmd ).
( ! ) Если сервер на хостинге(Linux), добавьте к названию плагина в server.cfg .so | Пример: "plugins dc_cmd.so".

Как прописать плагины в самп

Если вы хотите обновить Ваш сервер новыми доработками - то зайдите в наш раздел. Большой выбор готовых решений от наших пользователей

Моды для сервера

Огромный выбор различных модификаций для Вашего сервера. Пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.

Модификации SA

Хотите разнообразить свою игру в San Andreas? Смелее в наш раздел. Отличный сборник готовых решений. Играйте с удовольствием

Новые темы в этом разделе публикуются автоматически при добавлении файла в менеджер ресурсов.
Ручное создание новых тем невозможно.

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
pol@nder
Изучающий
Странно, что до сих пор в интернете нету не одного нормального мануала на русском по написанию плагинов для сампа. Есть одна инструкция

, для Dev C++, но переводили видимо гугл транслитом. Подробную инструкцию написал юзер официального форума сампа Kyosaur, естественно она на английском.
Мануал расчитан на людей, которые знакомы с C, но даже если Вы новичок и хотите попробовать написать свой собственный плагин, который будет выводить в консоль "Привет, мир", получая указания от абстрактной машины (amx'a), добро пожаловать.

Инструкция написана для IDE Visual C++ 2010 express.



Шаг 2.
Запустите Visual C++ 2010 express.
Создайте новый проект (файл > Создать > Проект. ЛИБО Ctrl+Shift+N).



Шаг 3.
Когда Вы создали новый проект, Вам предложат выбрать тип для Вашего проекта. Выбирайте "Проект Win32". Введите название для Вашего проекта, выберите его расположение (в выбранной директории автоматически создастся каталог решения - группа проектов) и нажмите 'ОК', чтобы продолжить.



Шаг 4.
Отлично, проект настроен. Нажмите 'Далее' в появившемся диалоге, если все в порядке.



Шаг 5.
После того, как Вы нажали 'Далее', появится еще один диалог. Выберите тип приложения "Библиотека DLL", а в дополнительных параметрах поставьте галочку "Пустой проект". Нажмите 'Готово'.


Шаг 6.
Следующее, что Вы должны сделать - нажать правой кнопкой мыши на название своего проекта в обозревателе решений (находится слева) и выбрать 'Свойства'.

Шаг 7.
В появившемся диалоговом окне перейдите в: Свойства конфигурации > Компоновщик > Ввод. Теперь следует добавить файл определения модуля. Кликните на пустое поле справа от графы 'Файл определения модуля'. Введите название для файла определения модуля, которое должно иметь расширение .def (Например, moduledeffile.def). Нажмите 'ОК'.



Шаг 8.
Теперь следует добавить все необходимые файлы к нашему проекту (включая файл определения). Нажмите правой кнопкой мыши на название проекта в обозревателе решений, выберите раздел 'Добавить' и нажмите 'Создать элемент. '. Так как в меню добавления нельзя выбрать файл с расширением .def, выберите .cpp, но в конце названия не забудьте приписать расширение .def (В моем случае, в строке "Имя", будет написано "moduledeffile.def"). Нажмите 'Добавить'. Теперь добавьте файл исходного кода (Файл C++ с расширением .cpp), для этого нажмите в обозревателе правой кнопкой мыши на фильтр (папку) 'Файлы исходного кода', выберите раздел 'Добавить' и нажмите 'Создать элемент. ', выберите 'Файл C++ (.cpp)' и назовите его, к примеру, main (на этот раз не указывая расширения).


Шаг 9.
Добавьте файлы SDK к проекту. Для этого распакуйте заранее скачанный архив в директорию Вашего проекта. Теперь добавьте их в самой среде. Сделать это можно так:
правой кнопкой мыши по названию проекта в обозревателе решений > Добавить > Новый фильтр (тоже самое, что и папка). Назовите фильтр SDK. Нажмите правой кнопкой мыши на созданный фильтр > Добавить > Существующий элемент. выберите все элементы из папки SDK, которая расположена в каталоге Вашего проекта и нажмите 'Добавить'. Снова нажмите правой кнопкой мыши на фильтр SDK > Добавить > Новый фильтр. назовите новый фильтр amx, в фильтр amx добавьте файлы, которые находятся в папке SDK\amx.

Приблизительно так теперь должен выглядеть Ваш обозреватель решений:


Шаг 10.
Дважды кликните по .def файлу в обозревателе решений. Скопируйте туда следующий код:

Дважды кликните по .cpp файлу в обозревателе решений. Скопируйте туда следующий код:

  • Скопировать плагин (название.dll) в директорию '/plugins' Вашего сервера и указать его в конфиге сервера.
  • В начале мода/скрипта добавить следующую строчку (чтобы использовать функцию HelloWorld):

Готовое решение + скомпилированный плагин:

При доработке мануала добавлю иллюстрации, объяснение кода, функции SDK и другое.

Установка плагинов и модов на GTA San Andreas Multiplayer


3. Загружаем содержимое Вашего мода на сервер, соблюдая иерархию папок.


Внимание: server.cfg редактируется только через нашу панель управления, загрузить его через FTP невозможно!

4. Открываем Панель управления -> Конфиги -> server.cfg и заполняем его.
Нужно дописать непосредственно сам мод, требуемые плагины из папки plugins, а так же если присутствуют скрипты в папке filterscripts.

Например:


5. Сохраняем изменения и делаем рестарт сервера.
6. Проверим наличие ошибок при запуске сервера.
Заходим в раздел Управление -> Консоль


Рисунок 4. Проверка наличие ошибок в консоли сервера.

Если нет ошибок, зайдём в клиент и добавим сервер в избранное, посмотрим состояние мода на сервере, ну и для убеждения зайдём на сервер.


Читайте также: