Как создать плагин 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)
- Реализуете анти-чит или бота
Что понадобится
- Компилятор C++ с поддержкой 32-бит (плагины Metamod компилируются как
.soдля Linux i386 или.dllдля Windows). На Linux:g++-multilibилиgcc -m32. - HL SDK — исходники движка Half-Life (на GitHub:
ValveSoftware/halflife). - Metamod SDK — заголовочники
meta_api.h,mutil.h,plinfo.h(на GitHub:psychonic/metamod-pилиrehlds/Metamod-R). - Понимание 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?
| Задача | AMXX | Metamod |
|---|---|---|
| Команды чата, меню, HUD | ✓ Идеально | Избыточно |
| Магазин, экономика, ранги | ✓ | — |
| Анти-чит, перехват функций движка | Возможно, но ограничено | ✓ Лучше |
| Боты, AI | — | ✓ (YaPB — пример) |
| Полная замена движка | — | ✓ (ReHLDS, ReGameDLL) |