Reapi

Reapi.jpg
Reapi
376КБ
Metamod-r
Metamod-r основан на оригинальном метамоде от Will Day для Half-Life 1 с некоторыми улучшениями Jussi Kivilinna. Он содержит огромное количество оптимизаций производительности и намного более чистый к
AMX Mod X 1.9.0
Первые разработчики
Custom Player Models
Требования:
CS-Bans
Требования PHP версии 5.3 и выше Расширения PHP: PDO, PDO-mysql, mbstring и gd Функции PHP: chmod, mkdir, copy Включенный mod_rewrite MySQL версии 5.0 и выше CS:Bans - веб часть для плагина AmxBans и
RestMenu RBS
Замена стандартного плагина restmenu.amxx
  • ДобавилHost-v • 15 дек 2024, 18:40
  • АвторAsmodai, s1lent
  • Версия5.24.0.300
  • Статистика 2549 просмотров • 0 комментариев • 4 скачивания
Требования
  • ReHLDS, ReGameDLL_CS,
    Reunion или VTC
    Внимание: (Можно использовать не все перечисленные, но тогда будут доступна меньшая часть функционала)
  • MetaMod 1.20(p) или новее
Описание

Это AMX Mod X модуль, который умеет работать с API ReHLDS, ReGameDLL_CS, Reunion и VTC.
Это предоставляет разработчикам AMXX-plugins больше возможностей для реализации своих целей.

Возможности форвардов:
  • Управление вызовом оригинальной функции и других хуков. Делается путем возврата из форварда одного из 4 значений:
    HC_CONTINUE - продолжить вызывать хуки и оригинал
    HC_SUPERCEDE - продолжить вызывать хуки, но прервать выполнение оригинала
    (Если функция не void, перед блокировкой её вызова необходимо установить свое возвращаемое значение)

    HC_BREAK - прервать выполнение хуков и оригинала
  • Установка возвращаемого значения. Выполняется нативом SetHookChainReturn с двумя аргументами, в первом требуется указать тип возвращаемого значения, а во втором значение.
  • Получение возвращаемого значения. Делается нативом GetHookChainReturn, может быть вызвано только в post.
  • Замена аргументов в функции. Делается нативом SetHookChainArg, в первом аргументе указывается номер последовательности аргументов всегда начинается с 1, во втором тип аргумента и в третьем - значение.
Практические примеры:
SetHookChainReturn
Для начала подключим include reapi.

Код: Выделить всё

#include <reapi>

В plugin_init, зарегистрируем хук на DeadPlayerWeapons и повесим обработчик на CSGameRules_DeadPlayerWeapons

Код: Выделить всё

public plugin_init()
{
RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons")
}

Далее создадим тело обработчик-функции

Код: Выделить всё

public CSGameRules_DeadPlayerWeapons(const index)
{

}

Следующим шагом для общего представления желательно заглянуть в исходник ReGameDLL_CS player.cpp#L1473,
понимая что функция должна возвращать некое значение в котором не ожидает 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;
}
GetHookChainReturn
Поскольку CBasePlayer::TakeDamage возвращает значение 0/1, в виде
  • 0 - не получил урон
  • 1 - получил урон
Если на сервере будет включен mp_friendlyfire 0, стреляя по союзникам CBasePlayer::TakeDamage все равно будет вызываться, но возвращать уже будет 0.
В некоторых ситуациях, нужно точно знать получила ли жертва урон, на примере этого будет оповещение атакующему о том,
сколько урона нанёс (аля 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 будет точный урон), чего не скажешь о такой возможности в Hamsandwich-е.
SetHookChainArg
Используя хук 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[], bool:bForceOldMenu)
{
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 primer.jpg
Reapi primer.jpg (16.25 КБ) 2546 просмотров
Примечания:
  • ReAPI по большей части предназначен для Counter-Strike 1.6 / Condition Zero, но может использоваться и на других модах с меньшим доступным функционалом.
  • С каждой новой версией рекомендуется перекомпилировать свои плагины использующие ReAPI с обновленными инклюдами.

Кто сейчас на конференции

Зарегистрированные пользователи: Ahrefs [Bot], Bing [Bot]