Первые шаги

Сообщения
169
Реакции
462
Помог
2 раз(а)
Если коротко: СДК с багфиксами. Подходит для написание модулей для HLDS\ReHLDS. Готовый, настроенный проект (включая параметры компилятора). Удобные скрипты для компилирования под линукс (GCC, Clang, Intel C++). Поддержка статических анализаторов кода (clang tidy, pvs studio, cppcheck (особенно актуально для новичков)), STL, С++17 и т.д.
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
the_hunter, установил шаблон, открыл новый проект, я пытаюсь сейчас просто разобраться вообще, что есть что и как с этим работать.
Так вот немного уточнить надо:
1620623372683.png
- это, я так понимаю, как раз то что входит в папку include и SDK и есть функции, которые необходимо использовать для взаимодействия и получения тех или иных данных от игры?

1620623490833.png
- также вижу Metamod SDK, это то что необходимо изучить первым, чтобы понять, как через MetaMod подключать плагин?

P.S. если есть возможность созвониться по Скайпу или по другому ПО, готов кинуть 300 руб за объяснение :))) Просто быстрее будет, сразу разобраться поэтапно, как действовать и куда смотреть и на что ориентироваться. Потихоньку, думаю разберусь, не так уж и сложно.
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
Метамод плагины подключаются просто добавлением в список твоей .dll/.so библиотеки в файл plugins.ini.
Далее, метамод берет библиотеку из этого списка и ищет по названию необходимые функции. Если он их находит, значит с точки зрения метамода плагин корректный и его можно загрузить.
Это наподобие как у каждого приложения должна быть точка входа (функция main). Если ее нет - приложение не запустится.
Тут точно такая же история, только вместо функции main, метамод ищет следующие:
Код:
GiveFnptrsToDll
Meta_Init
Meta_Query
Meta_Attach
Meta_Detach
Минимальный код, который требуется что бы плагин заработал выглядит как-то так:
C++:
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __attribute__((visibility ("default")))
#endif

#ifndef WINAPI
#define WINAPI
#endif

enum class MetaPluginLoadTime {
    Never = 0,
    Startup,
    ChangeLevel,
    AnyTime,
    AnyPause
};

enum class MetaPluginUnloadReason {
    Null = 0,
    IniDeleted,
    FileNewer,
    Command,
    CommandForced,
    Delayed,
    Plugin,
    PluginForced,
    Reload
};

struct MetaPluginInfo {
    const char* interface_version{};
    const char* name{};
    const char* version{};
    const char* date{};
    const char* author{};
    const char* url{};
    const char* log_tag{};
    MetaPluginLoadTime loadable{};
    MetaPluginLoadTime unloadable{};
};

extern "C" void DLLEXPORT WINAPI GiveFnptrsToDll(void*, void*)
{
}

extern "C" void DLLEXPORT Meta_Init()
{
}

extern "C" int DLLEXPORT Meta_Query(const char*, MetaPluginInfo** plugin_info, void*)
{
    static MetaPluginInfo info
    {
        "5:13",
        "Minimum Metamod Plugin",
        "0.0.0",
        __DATE__,
        "",
        "",
        "",
        MetaPluginLoadTime::AnyTime,
        MetaPluginLoadTime::AnyTime
    };
    *plugin_info = &info;
    
    return 1;
}

extern "C" int DLLEXPORT Meta_Attach(void*, void*, void*, void*)
{
    return 1;
}

extern "C" int DLLEXPORT Meta_Detach(void*, void*)
{
    return 1;
}
Если этот код скомпилировать и добавить в plugins.ini - то он будет работать (хоть и ничего не делать).
Для версии под windows, так как соглашение о вызове функции GiveFnptrsToDll является __stdcall (WINAPI), ее имя будет искажено компилятором (name mangling), и метамод не сможет ее найти. Что бы метамод нашел эту функцию, потребуется так же добавить файл определения модуля:
Код:
LIBRARY "metamod_plugin_name_mm"
EXPORTS GiveFnptrsToDll @1
Для linux ничего подобного делать не нужно.

Вывести текст в консоль можно и штатными средствами. Например, функцией printf:
C++:
#include <cstdio>

extern "C" void DLLEXPORT Meta_Init()
{
    std::printf("\nHello, World!\n\n");
}
Тоже самое, можно сделать и средствами которые предоставляет API метамода. Например, функцией log_console или alert_message
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
the_hunter, в целом понятно. Вот в учебе используем, как и любая программа, тело программы = основная функция main .
А тут:
Метамод плагины подключаются просто добавлением в список твоей .dll/.so библиотеки в файл plugins.ini.
Далее, метамод берет библиотеку из этого списка и ищет по названию необходимые функции. Если он их находит, значит с точки зрения метамода плагин корректный и его можно загрузить.
Это наподобие как у каждого приложения должна быть точка входа (функция main). Если ее нет - приложение не запустится.
Тут точно такая же история, только вместо функции main, метамод ищет следующие:
Код:
GiveFnptrsToDll
Meta_Init
Meta_Query
Meta_Attach
Meta_Detach
Как я понял замена main будут:
Код:
GiveFnptrsToDll
Meta_Init
Meta_Query
Meta_Attach
Meta_Detach

Назревает другой вопрос, что каждая часть делает и где можно почитать описание? В какой последовательности и за что отвечает...
 
Сообщения
169
Реакции
462
Помог
2 раз(а)
ncux0Zz, вызываются ровно в той последовательности, как и в списке выше.
Описания особо то и нет. Более опытные могут посмотреть исходники метамода и все понять. Новички обычно начинают с консольных приложений, а не плагинов к метамоду. Ну, если не вдаваясь в подробности:

GiveFnptrsToDll - В аргументах этой функции передаются указатели на функции движка (EngineFuncPointers) и на структуру с глобальными переменными (GlobalVars). Ты можешь сохранить эти указатели в своем коде, что бы позже воспользоваться ими.

Meta_Init - была добавлена на всякий случай. Вдруг, если тебе нужно запустить какой-то код, до вызова функции Meta_Query.

Meta_Query - Цель этой функции предоставить текущую версию апи и получить информацию о твоем плагине. В аргументах передает следующие:
const char* interface_version - текущая версия API метамода. Ее нужно сравнивать с версией, под которую был написан твой плагин. В случае если например твой плагин был написан под версию апи 5:13, а текущая, установленная версия у пользователя твоего плагина 5:12 (которая передается в аргументах) - нужно вернуть FALSE (то бишь 0) тем самым сообщив метамоду что твой плагин не совместим с текущей версией апи.

MetaPluginInfo** plugin_info - информация о твоем плагине, которую получит метамод (версия, автор и т.д.). Думаю, тут все понятно.

MetaUtilFuncPointers* util_funcs - указатель на дополнительные функции, которые реализованы в самом метамоде. Как и в случае с функциями движка, ты можешь сохранить этот указатель что бы позже ими воспользоваться.
Meta_Attach - вот именно ее используют как аналог функции main. Так как к моменту вызова этой функции, уже были проинициализированные базовые переменные (в предыдущих функциях), а так же была проверка версии интерфейса. В аргументах передает следующие:
MetaPluginLoadTime now - это флаг, обозначающий в какой момент была вызвана функция Meta_Attach. Если твой плагин был загружен метамодом при включении сервера - этот флаг будет равен значению Startup. Но твой плагин могут подгрузить и другие метамод плагины (посредnвам функций из MetaUtilFuncPointers). В этом случае значение этого флага может быть другим.

MetaHookExportFuncs* export_funcs_table - таблица с хуками. Адреса твоих callback функций, которые будет вызывать метамод.

MetaGlobals* globals - указатель на структуру с глобальными переменных метамода.

MetaDllFuncsTables* dll_funcs_tables - указатель на структуру с функции из gamedll.
Meta_Detach - вызывается когда метемод выгружает плагин. Думаю, тут тоже все должно быть понятно.

И теперь, подозреваю, у тебя появились новые вопросы... Их задавать можно до бесконечности. Если уж хочешь кодить на плюсах, начни все же лучше с консольных приложений. Иначе есть риск, что тебе покажется все это сложным и непонятным, в итоге бросишь все.
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
the_hunter, я хотел банально с простого начать, например вывод сообщения в хад или чат) ну или вызвать звукв определенный момент.
А так да, в целом и понятно и есть вопросы, но пробовать надо с чего-то.
Сервер на Линукс, поэтому буду под Линукс писать.
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
the_hunter, в целом посмотрел, не скажу, что сложно, просто вначале надо разобраться со всеми этими функциями и библиотеками, как подключать и как запускать. Грубо говоря банально Шапка и тело программы пустые для любого плагина, как шаблон, далее уже что-то добавлять или убирать в зависимости от ситуации. То бишь шапка и библиотеки для Линукс сервера.

Возможно есть какой-нибудь мини плагин простой под Линукс, чтобы я мог по аналогии глянуть код и поразбираться?
 
Сообщения
271
Реакции
348
Помог
15 раз(а)
Вообще непонятно для чего тебе это, обычно начинают с элементарного — амхх павна. Ты решил сразу на плюсах кодить метамод плагины/амхх модули, не пробовав павн? Плохая идея.
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
Denzer, можно и так попробовать...
Если с pawn'ф начинать, то там брать include из компилятора? и ReAPI ?
 
Сообщения
26
Реакции
0
Офф-топик / Офф-форум
@Denzer,Здравствуй,не знал как написать тебе в лс, поэтому по теме нашел, можешь в лс как-то отписаться, ты же скриптер?
 
Сообщения
26
Реакции
0
Офф-топик / Офф-форум
@Denzer,классная шуточка, можно узнать ты делал плагин "СВАДЬБУ" под сервер книфе?
 
Сообщения
271
Реакции
348
Помог
15 раз(а)
Apollon, нет. Я уже как год никому никакие плагины не пишу.
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
Добрый день всем, решил попробовать с АМХХ плагинов.
  • есть какой-то аналог, как у Хантера, только по includ'ам АМХ + ReAPI ? Желательно на русском. Чтобы изучить и знать, какие функции что делают и т.д.
  • может быть есть ещё статьи по написанию плагинов для CS?
  • есть IDE для написания, или что использовать для написания плагинов удобнее всего?
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
может быть есть ещё статьи по написанию плагинов для CS?
Статьи по написанию плагинов? Ты сейчас серьёзно?
решил попробовать с АМХХ плагинов
Соболезную.
Желательно на русском
В таких вещах забудь о существовании русского языка.
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
Спасибо.
Статьи по написанию плагинов? Ты сейчас серьёзно?
Да не статьи по изучению языка, хотя я знаю, что от С отличается немного. Я про основные моменты, при создании проекта ) ну там я уже глянул, что основная функция нужна plugin_init
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Я про основные моменты
Открываешь сурсы различных плагинов(желательно адекватных людей, а не всяких там Домино, Эмма Джусе, и тому подобных) и изучаешь.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу