Главная Новости Услуги Форум | База знаний

Вверх

Меню
Пользователей онлайн
Онлайн игроков: 60

Как создать плагин Metamod для CS 1.6 на C++ (SDK)

Как создать плагин Metamod для CS 1.6 на C++ (SDK)

Metamod — это слой под AMX Mod X, который позволяет писать плагины прямо на C/C++ и взаимодействовать с движком Half-Life на низком уровне. Плагины Metamod получают вызовы Meta_Attach, Meta_Detach, Meta_Query и хукают функции движка через GameDLL API.

Зачем писать плагин Metamod?

  • Нужна максимальная производительность (нативный код вместо Pawn)
  • Нужно перехватывать функции движка, которые AMXX не exposeит
  • Создаёте полноценную систему модов (например, ReHLDS, ReGameDLL, YaPB)
  • Реализуете анти-чит или бота

Что понадобится

  1. Компилятор C++ с поддержкой 32-бит (плагины Metamod компилируются как .so для Linux i386 или .dll для Windows). На Linux: g++-multilib или gcc -m32.
  2. HL SDK — исходники движка Half-Life (на GitHub: ValveSoftware/halflife).
  3. Metamod SDK — заголовочники meta_api.h, mutil.h, plinfo.h (на GitHub: psychonic/metamod-p или rehlds/Metamod-R).
  4. Понимание C++, виртуальных функций и таблиц указателей (vtable).

Структура плагина Metamod

Каждый плагин должен экспортировать функции Meta_Query, Meta_Attach, Meta_Detach. Пример минимального плагина:

#include <stdio.h>
#include "meta_api.h"

// Метаданные плагина
plugin_info_t Plugin_info = {
    "My First Meta Plugin",   // name
    "1.0.0",                  // version
    "YourName",               // author
    "http://example.com",     // url
    "MYMM_LOG_TAG",           // logtag
    PT_ANY,                   // when to load
    PT_ANY,                   // when to unload
};

// Вызывается при загрузке плагина
C_DLLEXPORT void META_DLLAPI Meta_Query(char *ifvers, plugin_info_t **pPluginfo, mutil_funcs_t *pMultitab)
{
    *pPluginfo = &Plugin_info;
    gpMetaUtilFuncs = pMultitab;
}

// Вызывается когда Metamod подключает плагин
C_DLLEXPORT int META_DLLAPI Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, global_msgs_t *pGlob_functions)
{
    memset(pFunctionTable, 0, sizeof(META_FUNCTIONS));
    // Здесь можно зарегистрировать хуки на GameDLL функции
    return TRUE;
}

// Вызывается когда плагин выгружается
C_DLLEXPORT int META_DLLAPI Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
{
    return TRUE;
}

Сборка (Linux, 32-бит)

g++ -m32 -shared -fPIC -o myplugin_mm_i386.so \
    myplugin.cpp \
    -I./hlsdk/common -I./hlsdk/dlls \
    -I./hlsdk/engine -I./hlsdk/pm_shared \
    -I./metamod/sdk -I./metamod

На выходе получите myplugin_mm_i386.so. Переместите в cstrike/addons/myplugin/myplugin_mm_i386.so и добавьте строку в cstrike/addons/metamod/plugins.ini:

linux addons/myplugin/myplugin_mm_i386.so

Перезапустите сервер и введите meta list — ваш плагин должен появиться со статусом "RUN".

Версии ABI

Обратите внимание: разные сборки Metamod (Metamod-P для steam-сборок и Metamod-r для rehlds) совместимы по ABI, но плагин должен экспортировать символы Meta_Attach, Meta_Query, Meta_Init, Meta_Detach, GiveFnptrsToDll. Если используете version-script линкера — не забудьте, что Metamod-r вызывает dlsym(handle, "Meta_Attach") без ABI-тега, поэтому символ должен быть доступен через plain dlsym.

Когда использовать AMXX, а когда Metamod?

ЗадачаAMXXMetamod
Команды чата, меню, HUD✓ ИдеальноИзбыточно
Магазин, экономика, ранги
Анти-чит, перехват функций движкаВозможно, но ограничено✓ Лучше
Боты, AI✓ (YaPB — пример)
Полная замена движка✓ (ReHLDS, ReGameDLL)
Подробные инструкции и обсуждения ждём вас на нашем форуме — в разделе CS 1.6. Разработка на C++ для Half-Life — глубокая тема, не стесняйтесь задавать вопросы и делиться своими наработками.
Назад