- Вы должны зарегистрироваться, чтобы видеть ссылки.
- Вы должны зарегистрироваться, чтобы видеть ссылки.
- Вы должны зарегистрироваться, чтобы видеть ссылки.
- Вы должны зарегистрироваться, чтобы видеть ссылки.
- Вы должны зарегистрироваться, чтобы видеть ссылки.
Это AMX Mod X модуль, который умеет работать с API Вы должны зарегистрироваться, чтобы видеть ссылки., Вы должны зарегистрироваться, чтобы видеть ссылки., Вы должны зарегистрироваться, чтобы видеть ссылки. и Вы должны зарегистрироваться, чтобы видеть ссылки..
Это предоставляет разработчикам AMXX плагинов больше возможностей для реализации своих целей.
Требования:
- ReHLDS, ReGameDLL_CS, Reunion и VTC (Внимание: можно использовать не все перечисленные, но тогда будет доступна меньшая часть функционала)
- Metamod 1.20(p) или новее
- Копируем из архива reapi_X_X_X.zip файл reapi_amxx_i386.so или reapi_amxx.dll (в зависимости от используемой ОС) в каталог <gamedir>/addons/amxmodx/modules
- Установка Reapi завершена
Возможности форвардов:
- Управление вызовом оригинальной функции и других хуков. Делается путем возврата из форварда одного из 4 значений:
- HC_CONTINUE - продолжить вызывать хуки и оригинал
- HC_OVERRIDE - продолжить вызывать оригинал, но возвращать своё значение
- HC_SUPERCEDE - продолжить вызывать хуки, но прервать выполнение оригинала (если функция не void, перед блокировкой её вызова необходимо установить своё возвращаемое значение)
- HC_BREAK - прервать выполнение хуков и оригинала
- Установка возвращаемого значения. Выполняется нативой SetHookChainReturn с двумя аргументами, в первом требуется указать тип возвращаемого значения, а во втором значение.
- Получение возвращаемого значения. Выполняется нативой GetHookChainReturn, может быть вызвано только в post.
- Замена аргументов в функции. Выполняется нативой SetHookChainArg, в первом аргументе указывается номер последовательности аргументов (всегда начинается с 1), во втором - тип аргумента, в третьем - значение.
Практические примеры:
Для начала подключим include reapi:
В plugin_init зарегистрируем хук на DeadPlayerWeapons и повесим обработчик на CSGameRules_DeadPlayerWeapons:
Далее создадим тело обработчик-функции:
Следующим шагом для общего представления желательно заглянуть в исходник ReGameDLL_CS Вы должны зарегистрироваться, чтобы видеть ссылки., понимая что функция должна возвращать некое значение в котором не ожидает GR_PLR_DROP_GUN_NO и от этого будет зависеть далее выполняемый код, суть этой PackDeadPlayerItems функции заключается в том, чтобы выбрасывать оружия на землю после смерти игрока, попробуем это предотвратить. Для этого вернём значение GR_PLR_DROP_GUN_NO, которое не ожидаем получить:
Так как, в оригинальной Вы должны зарегистрироваться, чтобы видеть ссылки., практически ничего нет, то нет надобности её лишний раз вызывать, поэтому используем HC_SUPERCEDE:
Таким нехитрым способом, предотвратили любое появление оружия после смерти игрока, вполне себе сойдет для CSDM или GunGame модов.
- Код: Выделить всё
#include <reapi>
В plugin_init зарегистрируем хук на DeadPlayerWeapons и повесим обработчик на CSGameRules_DeadPlayerWeapons:
- Код: Выделить всё
public plugin_init()
{
RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons")
}
Далее создадим тело обработчик-функции:
- Код: Выделить всё
public CSGameRules_DeadPlayerWeapons(const index)
{
}
Следующим шагом для общего представления желательно заглянуть в исходник ReGameDLL_CS Вы должны зарегистрироваться, чтобы видеть ссылки., понимая что функция должна возвращать некое значение в котором не ожидает GR_PLR_DROP_GUN_NO и от этого будет зависеть далее выполняемый код, суть этой PackDeadPlayerItems функции заключается в том, чтобы выбрасывать оружия на землю после смерти игрока, попробуем это предотвратить. Для этого вернём значение GR_PLR_DROP_GUN_NO, которое не ожидаем получить:
- Код: Выделить всё
public CSGameRules_DeadPlayerWeapons(const index)
{
SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
}
Так как, в оригинальной Вы должны зарегистрироваться, чтобы видеть ссылки., практически ничего нет, то нет надобности её лишний раз вызывать, поэтому используем HC_SUPERCEDE:
- Код: Выделить всё
public CSGameRules_DeadPlayerWeapons(const index)
{
SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
return HC_SUPERCEDE;
}
Таким нехитрым способом, предотвратили любое появление оружия после смерти игрока, вполне себе сойдет для CSDM или GunGame модов.
- Код: Выделить всё
#include <amxmodx>
#include <reapi>
public plugin_init()
{
RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons")
}
public CSGameRules_DeadPlayerWeapons(const index)
{
SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
return HC_SUPERCEDE;
}
Поскольку CBasePlayer::TakeDamage возвращает значение 0/1, в виде
В некоторых ситуациях, нужно точно знать получила ли жертва урон, на примере этого будет оповещение атакующему о том, сколько урона нанёс (а ля Damager).
GetHookChainReturn должен использоваться только в post, когда оригинальная функция уже была вызвана:
Полезная информация: CBasePlayer::TakeDamage в post, аргумент flDamage уже приходит с расчетом брони и уменьшенным уроном по союзникам на 35% (иными словами в flDamage будет точный урон), чего не скажешь о такой возможности в Ham Sandwich.
- 0 - не получил урон
- 1 - получил урон
В некоторых ситуациях, нужно точно знать получила ли жертва урон, на примере этого будет оповещение атакующему о том, сколько урона нанёс (а ля Damager).
GetHookChainReturn должен использоваться только в post, когда оригинальная функция уже была вызвана:
- Код: Выделить всё
#include <amxmodx>
#include <reapi>
public plugin_init()
{
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", 1);
}
public CBasePlayer_TakeDamage(const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType)
{
if (GetHookChainReturn() == 1) {
client_print(0, print_chat, "Жертва получила урон: %f", flDamage);
} else {
client_print(0, print_chat, "Жертва не получила урон: %f", flDamage);
}
return HC_CONTINUE;
}
Полезная информация: CBasePlayer::TakeDamage в post, аргумент flDamage уже приходит с расчетом брони и уменьшенным уроном по союзникам на 35% (иными словами в flDamage будет точный урон), чего не скажешь о такой возможности в Ham Sandwich.
Используя хук ShowVGUIMenu, мы вполне cможем видоизменять/русифицировать меню выбора для всех, за исключением VGUI меню, так как функция ShowVGUIMenu, вызывается как для VGUI так и для old меню:
- Код: Выделить всё
#include <amxmodx>
#include <reapi>
public plugin_init()
{
RegisterHookChain(RG_ShowVGUIMenu, "ShowVGUIMenu");
}
public ShowVGUIMenu(const index, VGUIMenu:menuType, const bitsSlots, szOldMenu[])
{
if (menuType == VGUI_Menu_Team) {
new szMenu[256];
formatex(szMenu, charsmax(szMenu), "\yЗа кого будем играть?^n^n\w1. Террористы^n2. Контр-Террористы^n^n5. Не знаю");
if (bitsSlots & MENU_KEY_6) {
add(szMenu, charsmax(szMenu), "^n6. Зритель");
}
SetHookChainArg(4, ATYPE_STRING, szMenu);
}
return HC_CONTINUE;
}
Примечания:
- Reapi по большей части предназначен для Counter-Strike 1.6 / Condition Zero, но может использоваться и на других модах с меньшим доступным функционалом.
- С каждой новой версией желательно перекомпилировать плагины, использующие Reapi с обновлёнными инклюдами.