Anubis — невероятный менеджер плагинов

Сообщения
7
Реакции
20
What's up, guys! Мне хотелось писать скрипты для сервера на чём-то кроме Pawn и подумал я: "Почему бы целиком не написать сервер на C++?".
Единственный менеджер плагинов, который даёт хоть какое-то C++ API это Metamod, а я проклинаю API Metamod из-за его ущербности.
Именно поэтому откопал интересный проект под названием Anubis и обновил его до ReGameDLL 5.21.
Anubis это менеджер плагинов предоставляющий прекраснейшее C++ API для написания собственных плагинов под него.

Как написать свой первый плагин:
  1. Устанавливаете Anubis на сервер
  2. Создаёте новый DLL проект в Visual Studio
  3. Скачиваете архив sdk.zip
  4. Закидываете в папку с проектом файлы из архива
  5. Вставляете код из примера плагина и собираете проект
  6. Перекидываете DLL'ку в cstrike/addons/your_folder_name
  7. Прописываете в cstrike/addons/metamod/configs/plugins.yaml следующее:
YAML:
your_module_name:
   os: windows
   path: addons/your_folder_name/your_file_name.dll
Пример плагина:
C++:
#include <IAnubis.hpp>
#include <ILogger.hpp>
#include <game/ILibrary.hpp>
#include <engine/ILibrary.hpp>

class Plugin : public Anubis::IPlugin
{
public:
    Anubis::InterfaceVersion getInterfaceVersion() const
    {
        return Anubis::IAnubis::VERSION;
    }

    std::string_view getName() const
    {
        return "Minimal plugin";
    }

    std::string_view getVersion() const
    {
        return "1.0";
    }

    std::string_view getDate() const
    {
        return __DATE__;
    }

    std::string_view getAuthor() const
    {
        return "Anubis Dev Team";
    }

    std::string_view getUrl() const
    {
        return "https://github.com/Amaroq7/Anubis";
    }

    Type getType() const
    {
        return Type::Extension;
    }
};

nstd::observer_ptr<Anubis::IAnubis> gApi;
nstd::observer_ptr<Anubis::Game::ILibrary> gGame;
nstd::observer_ptr<Anubis::Engine::ILibrary> gEng;
std::unique_ptr<Anubis::ILogger> gLogger;

/* The following functions are exported from the plugin */
namespace Anubis
{
    nstd::observer_ptr<IPlugin> Query()
    {
        static auto pluginInfo = std::make_unique<Plugin>();
        return pluginInfo;
    }

    bool Init(nstd::observer_ptr<IAnubis> api)
    {
        gApi = api;
        gGame = gApi->getGame(Game::ILibrary::VERSION);
        gEng = gApi->getEngine(Engine::ILibrary::VERSION);
  
        gLogger = gApi->getLogger(ILogger::VERSION);
        gLogger->setLogTag("TEST");
        gLogger->setLogLevel(LogLevel::Debug);
  
        return true;
    }

    void Shutdown()
    {
        gLogger.reset();
    }
}
Установка:
  1. Закинуть файлы из архива metamod.zip в корневую папку сервера
  2. Прописать в liblist.gam строчку: gamedll "addons\metamod\dlls\metamod.dll"
  3. Запустить сервер и проверить работоспособность командой anubis version
Исходный код (форк): https://github.com/Receiver1/Anubis
Оригинальный репозиторий: https://github.com/Amaroq7/Anubis (в Wiki есть инфа как написать плагин, как ставить хуки и прочее)

Если вам нужна сборка под Linux, то можете сбилдить её сами с моего форка.
Если вы неравнодушны к этому проекту, то ставьте звёздочки на оригинальный репозиторий, создавайте Issues и задавайте вопросы автору в Discussions.
 

Download all Attachments

Последнее редактирование:
Сообщения
403
Реакции
114
Помог
2 раз(а)
Я переписал часть своего плагина под матамод... То что у меня заняло 3 месяца под amxx, думаю, растянется на годы... Очень скудная информация по API (либо я пока не могу ее найти в достаточном количестве), нет примеров, полное отсутствие средств отладки, странная реализация обработки исключительных ситуаций в самой rehlds - тупо краш и т.п. "ништяки".

Бегло взглянув на пример плагина под Anubis, я не заметил какого-либо упрощения процесса разработки или каких-то фишек позволяющих начинающим программистам, вроде меня, быстро освоить процесс разработки. Не могли бы вы в двух словах или более развернуто описать преимущество Anubis-а, перед тем же метамодом, и зачем нужно изобретать "костыль" к уже имеющемуся костылю? Если уже изобретать велосипед, то в виде какого-то гибрида на замену metamod+reapi, чтобы было все в одном флаконе... Мне так кажется.
 
Сообщения
676
Реакции
579
Предупреждения
8
Помог
9 раз(а)
проект в Visual Studio
Ага все будут скачать визуал 10гб ради например для изменения количества хп.
Где кроссплатформенность (мультиплатформенность). Какой будет выигрыш? (0.1%). Я могу создать амхх модуль или плагин метамода если это требуется (большинство случаев это вообще не требуется)
А кто еще тут может? Пару человек. и зачем им эти танцы? Амхмод это лучшее решение для написания плагинов быстро и безопасно. После появления реапи вообще можно менять все без ущерба производительности.
 
Сообщения
7
Реакции
20
Vaqtincha, AMXX это система скриптов написанная поверх Metamod, сам же Metamod это система плагинов. Anubis тоже является системой плагинов, только API для разработчиков у него гораздо удобнее и понятнее.
 
Сообщения
403
Реакции
114
Помог
2 раз(а)
Receiver, не так. Anubis это система плагинов для системы плагинов Metamod, как я понял.

Не понимаю о каком API идет речь, если все API ограничены SDK re/HLDS. Хуки используют очередь метамода, что там может быть такого супер удобного, я просто не представляю. А куча статик кастов только для задание обычных переменных вызывает тремор левого глаза...
 
Последнее редактирование:
Сообщения
7
Реакции
20
Refresh, к сожалению я не могу редактировать свои сообщения. Поэтому пишу новым.
Эта библиотека не для рядовых amxx enjoyers, она для разработчиков плагинов.
Вот как тебе проще будет работать с SDK?
Так: gGame->serverPrint("Hello {}", "World"!);
Или же ручками доставать из виртуальной таблицы непонятно какую функцию, затем фиг пойми как её вызывать, ведь документации нигде нет. Так ещё и использовать sscanf_s для формирования.
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
"Почему бы целиком не написать сервер на C++?".
Чтобы написать плагин для метамода не нужно писать менеджер плагинов, так как он есть в метамоде.

а я проклинаю API Metamod из-за его ущербности.
Там его и нет по сути, метамод это скорее прокси хуков от движка с менеджером плагинов чтобы запускать сразу несколько плагинов и с обходом запуска игровой либы из liblist.gam.

Anubis это менеджер плагинов предоставляющий прекраснейшее C++ API для написания собственных плагинов под него.
Не предоставляющий. Тоже самое, что и в метамоде, только вместо структуры - функции, а вместо реги таблицы, более удачный вариант - хукчейны. Но зачем-то венгерская нотация, я думаю любая студия подскажет, что тебе в аргументы прилетел интерфейс, а не класс имплементации.
Не прекраснейшее потому что С++ (отдельная тема).

И ко всему этому получаем сломанную совместимость на раннее написанные плагины и плагины плагинов (амхх плагины).
Профита - 0.

По своему опыты скажу, что вижу 3 варианта развития проекта:
Легкий: написать удобное API (на С++ придется постараться), а не обертку ни над чем. Посмотреть с чем чаще всего сталкиваются в плагинах на амхх и добавить это в API.

Средний: использовать скриптовый язык для отвязки от платформы (это сильно влияет на порог вхождения и скорость разработки) и отличный от павна. Желательно производительнее, с поддержкой лямбд, многопоточки. И как в варианте выше - сделать удобное API для плагинов.
Для этого кстати, необязательно заменять метамод и всю инфраструктуру, а сделать анубис - плагином метамода, тем самым сохранив совместимость.

Сложный: переписать неудчные моменты в движке и регейме, перевести код на х64 (отвалиться всё точно так же, но перевосоздать функционал будет проще и это большой заклад на будещее), поправить всплывщие баги. А дальше - два варианта выше.

Вот как тебе проще будет работать с SDK?
Так: gGame->serverPrint("Hello {}", "World"!);
Или же ручками доставать из виртуальной таблицы непонятно какую функцию
Твой вариант не проще, потому что в метамоде есть макросы на это, где не надо указывать указатель.
И лучше это сделать "глобальными" функциями, так как это основные движковые функции, которые понятны из контекста работы и являются стандартными.
 

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

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