Іконка ресурсу

addons Reapi 5.22.0.254

Автор
Asmodai, s1lent
Вимоги
ReHLDS, ReGameDLL_CS,
Reunion або VTC
Увага: (Можна використовувати не всі перераховані, але тоді буде доступна менша частина функціоналу)
MetaMod 1.20(p) або новіший
Це AMX Mod X модуль, який вміє працювати з API ReHLDS, ReGameDLL_CS, Reunion та VTC.
Це надає розробникам AMXX-plugins більше можливостей реалізації своїх цілей.

s1lentq/reapi
Скомпільовані dev-білди

  • Керування викликом оригінальної функції та інших хуків. Робиться шляхом повернення з форварда одного із 4 значень:
    • HC_CONTINUE - продовжити викликати хуки та оригінал
    • HC_SUPERCEDE - продовжити викликати хуки, але перервати виконання оригіналу
      (Якщо функція не void, перед блокуванням її виклику необхідно встановити своє значення, що повертається)
    • HC_BREAK - перервати виконання хуків та оригіналу
  • Встановлення значення, що повертається. Виконується нативом SetHookChainReturn з двома аргументами, в першому потрібно вказати тип значення, що повертається, а в другому значення.
  • Отримання значення, що повертається. Робиться нативом GetHookChainReturn, може бути викликано лише у post.
  • Заміна аргументів на функції. Робиться нативом SetHookChainArg, у першому аргументі вказується номер послідовності аргументів завжди починається з 1, у другому тип аргументу та у третьому - значення.
Практичні приклади:
Для початку підключимо include reapi.
C++:
 #include <reapi>

У plugin_init, зареєструємо хук на DeadPlayerWeapons та повісимо обробник на CSGameRules_DeadPlayerWeapons
C++:
 public plugin_init()
{
    RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons")
}

Далі створимо тіло оброблювач-функції
C++:
 public CSGameRules_DeadPlayerWeapons(const index)
{

}

Наступним кроком для загального представлення бажано заглянути у вихідний запис ReGameDLL_CS player.cpp#L1473,
розуміючи, що функція повинна повертати якесь значення в якому не очікує GR_PLR_DROP_GUN_NO
і від цього буде залежати код, що виконується далі, суть цієї PackDeadPlayerItems функції полягає в тому,
що викидає зброю на землю після смерті гравця, спробуємо це запобігти,
для цього повернемо значення GR_PLR_DROP_GUN_NO, який не очікує отримати.
C++:
 public CSGameRules_DeadPlayerWeapons(const index)
{
    SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
}
Так як, в оригінальній функциії, практично нічого немає, то немає потреби її вкотре викликати, тому використовуємо HC_SUPERCEDE
C++:
 public CSGameRules_DeadPlayerWeapons(const index)
{
    SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
    return HC_SUPERCEDE;
}
Таким нехитрим способом, що запобігли будь-якій появі зброї після смерті гравця, цілком собі зійде для CSDM або GunGame модів.
C++:
 #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 у вигляді
  • 0 - не отримав шкоди
  • 1 - отримав шкоду
Якщо на сервері буде включено mp_friendlyfire 0, стріляючи по союзниках CBasePlayer::TakeDamage все одно буде викликатись, але повертатиме вже 0.
У деяких ситуаціях, потрібно точно знати, чи отримала жертва збитки, на прикладі цього буде оповіщення атакуючому про те,
скільки шкоди завдав (аля Damager).
GetHookChainReturn має використовуватися лише в post, коли оригінальна функція вже була викликана.
C++:
#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-і.
Використовуючи хук ShowVGUIMenu, ми цілком зможемо змінювати/українізувати меню вибору для всіх, за винятком меню VGUI,
так як функція ShowVGUIMenu, викликається як VGUI так і для old меню.
C++:
#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), "\ySelect a team?^n^n\w1. Terrorist Force^n2. Counter-Terrorist Force^n^n5. Auto-select");

        if (bitsSlots & MENU_KEY_6) {
            add(szMenu, charsmax(szMenu), "^n6. Spectator");
        }

        SetHookChainArg(4, ATYPE_STRING, szMenu);
    }

    return HC_CONTINUE;
}
pubmasters_mini_dust-karta-cs1.6.jpg
Примітки:
  • ReAPI здебільшого призначений для Counter-Strike 1.6/Condition Zero, але може використовуватись і на інших модах з меншим доступним функціоналом.
  • З кожною новою версією рекомендується перекомпілювати свої плагіни, які використовують ReAPI з оновленими інклюдами.
Автор
Cyxarik
Завантаження
2
Перегляди
29
Додано
Останнє оновлення
Оцінка
0.00 зірок 0 оцінок

Більше ресурсів від Cyxarik

Угорі