Как использовать ?- Дпрото должен быть первее этого плагина
- В списке подключаемых модулей - ваш должен быть ниже чем текущий
- Копировать в директорию с вашим проектом: I)все инклуды имеющие маску "bl_extern_*" II)bl_interface.h + bl_interface.cpp III)подключить к проекту - "bl_interface.cpp"
- АПИ активируется на "server_activated_POST", по этому, подгрузка не должна быть раньше
- Перед использованием АПИ нужно вызвать функцию инициализации указателей - "init_baseLib()" (т.е. на сервер активайтед пост - вызываем эту функцию и радуемся)
Модуль содержит:- Админские флаги (+ инфо о клиентах)
Пути"../addons/baselib"
// главный каталог"../baselib/dlls"
// каталог модулей БЛ (win & linux)"../baselib/configs"
// каталог конфигов БЛ"../configs/internal"
// конфиги непосредственно БЛ. На данный момент должно содержаться 2 конфига: 1)конфиг админов 2)hamdata.ini (соответствующая билду сервера - просто копируем с амхх)"../configs/maps"
// каталог под конфиги для мап, чтобы не засорять оригинальную папку"../configs/other"
// для конфигов не вошедших в первые 2 категорииФормат конфига -
bl_admins.ini (комментарий == ';')
У конфига 3 префиксных ключа:
- '*' - пароль
- '$' - имя
- '&' - флаги (см константы)
За ключиком следует соответствующая строка. Строка может содержать пробелы и иные символы
(не запрещенные игрой). Важная особенность - строка должна быть заключена в
любые дублирующиеся символы
(не должны быть символами алфавита), которые
отсутствуют в строке, причем заключающие символы могут соответствовать ключевым и даже текущему ключевому. Пробелы и табуляции от начала строки игнорятся, так же они игнорятся после ключевых и заключающих символов. Порядок ключей со значениями -
не регламентирован
Цитата:
**kiss me*&*abcdefgi*$$Privet$
// из текущего выражения следует
"kiss me" - пароль
"abcdefgi" - флаги
"Privet" - имя
Формат конфига -
blload.ini (комментарий == ';')
Цитата:
// каталог бл ..
bl_path +addons/baselib+
Конфиг должен находиться в корневой папке
игры (а не сервера). Правила заключающих символов соответствуют конфигу - "bl_admins.ini"
Раздел новостей[15.05.2014] Хуки стали много проще
Код:
#ifdef __linux__
#define _VIRT_CALLING_CONVENTION_
#define _VIRT_GARBAGE_ARG_
#define _VIRT_VIRGULE_
#define _VIRT_GARBAGE_VAL_
#else
#define _VIRT_CALLING_CONVENTION_ __fastcall
#define _VIRT_GARBAGE_ARG_ int
#define _VIRT_VIRGULE_ ,
#define _VIRT_GARBAGE_VAL_ 1
#endif
#define _VIRT_DONTUSEME_(funcname,arg_1,garbage_inf) funcname (arg_1 _VIRT_VIRGULE_ garbage_inf
// use this 3 defs
#define VIRTPROT_BEGIN(funcname,arg_1) _VIRT_CALLING_CONVENTION_ _VIRT_DONTUSEME_(funcname,arg_1,_VIRT_GARBAGE_ARG_)
#define VIRT_END )
#define VIRTCHAIN_BEGIN(phook,tdtype,ihamconst,pthis) \
_VIRT_DONTUSEME_(reinterpret_cast<tdtype> \
(::nsExtern::nsHamSandwich::get_origin(phook,ihamconst)),pthis,_VIRT_GARBAGE_VAL_)
// end
Всего, по сути, 3 макроса
(находящиеся под комментом - '// use this 3 defs')Рассмотрим каждый из них
1)
VIRT_END - конец секции
(дальше идет рассмотрение)2)
VIRTPROT_BEGIN - начало обьявления или определения функции. До начала блока
(в случае определения) или до ';'
(в случае обьявления) - должен стоять
VIRT_ENDПринимает: I - имя функции, II - тип и имя аргумента this
Код:
void VIRTPROT_BEGIN(vh_player_spawn, void *) VIRT_END; // функция имеет void в аргументах, но мы то не забываем про this
void VIRTPROT_BEGIN(vh_player_killed, void *), entvars_t *, int VIRT_END; // функция имеет 2 аргумента помимо this, их указываем после закрывающейся круглой скобки и до VIRT_END [size=85](не забываем про запятые)[/size]
3)
VIRTCHAIN_BEGIN - исключительно для BaseLib, инициирует вызовы виртуалок. Должен завершаться тем же макросом
VIRT_END (до ';').
Принимает: I - указатель на хук, II - прототип функции
(который вас поправит при не правильном вводе аргументов),
III - константу хама [size=85](соответствующую типу функции), IV - this. А так же аргументы по прежним правилам - после закрывающей круглой скобки и до
VIRT_END (через запятую)Код:
static void call_spawnchain(void * phook, void * pthis) {
VIRTCHAIN_BEGIN (
phook,
::nsHamSandwich::hlsdk_td_virtual_spawn,
::nsHamSandwich::VQuark_Spawn,
pthis
) VIRT_END;
}
void VIRTPROT_BEGIN(vh_grenade_spawn, void * pthis) VIRT_END; // обьявление
void VIRTPROT_BEGIN(vh_grenade_spawn, void * pthis) VIRT_END {
enum {WIDTH = 3, LTIME = 6}; // можно игнорить, к делу отношения не имеет
call_spawnchain(::nsGlobals::s_pgrenade_hook, pthis); // вынес отдельно т.к. в коде было много вызовов
make_effects(pthis, LTIME, nsGlobals::s_grenadetrail_spr); // можно игнорить, к делу отношения не имеет
}