- Автор
-
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-білди
Примітки:
Це надає розробникам AMXX-plugins більше можливостей реалізації своїх цілей.
s1lentq/reapi
Скомпільовані dev-білди
- Керування викликом оригінальної функції та інших хуків. Робиться шляхом повернення з форварда одного із 4 значень:
- HC_CONTINUE - продовжити викликати хуки та оригінал
- HC_SUPERCEDE - продовжити викликати хуки, але перервати виконання оригіналу
(Якщо функція не void, перед блокуванням її виклику необхідно встановити своє значення, що повертається) - HC_BREAK - перервати виконання хуків та оригіналу
- Встановлення значення, що повертається. Виконується нативом SetHookChainReturn з двома аргументами, в першому потрібно вказати тип значення, що повертається, а в другому значення.
- Отримання значення, що повертається. Робиться нативом GetHookChainReturn, може бути викликано лише у post.
- Заміна аргументів на функції. Робиться нативом SetHookChainArg, у першому аргументі вказується номер послідовності аргументів завжди починається з 1, у другому тип аргументу та у третьому - значення.
Для початку підключимо include reapi.
У plugin_init, зареєструємо хук на DeadPlayerWeapons та повісимо обробник на CSGameRules_DeadPlayerWeapons
Далі створимо тіло оброблювач-функції
Наступним кроком для загального представлення бажано заглянути у вихідний запис ReGameDLL_CS player.cpp#L1473,
розуміючи, що функція повинна повертати якесь значення в якому не очікує GR_PLR_DROP_GUN_NO
і від цього буде залежати код, що виконується далі, суть цієї PackDeadPlayerItems функції полягає в тому,
що викидає зброю на землю після смерті гравця, спробуємо це запобігти,
для цього повернемо значення GR_PLR_DROP_GUN_NO, який не очікує отримати.
Так як, в оригінальній функциії, практично нічого немає, то немає потреби її вкотре викликати, тому використовуємо HC_SUPERCEDE
Таким нехитрим способом, що запобігли будь-якій появі зброї після смерті гравця, цілком собі зійде для CSDM або GunGame модів.
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);
}
C++:
public CSGameRules_DeadPlayerWeapons(const index)
{
SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
return HC_SUPERCEDE;
}
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 у вигляді
У деяких ситуаціях, потрібно точно знати, чи отримала жертва збитки, на прикладі цього буде оповіщення атакуючому про те,
скільки шкоди завдав (аля Damager).
GetHookChainReturn має використовуватися лише в post, коли оригінальна функція вже була викликана.
Корисна інформація: CBasePlayer::TakeDamage в post, аргумент flDamage вже приходить з розрахунком броні та заниженим втратою
по союзникам на 35% (іншими словами у flDamage буде точна шкода), чого не скажеш про таку можливість у Hamsandwich-і.
- 0 - не отримав шкоди
- 1 - отримав шкоду
У деяких ситуаціях, потрібно точно знати, чи отримала жертва збитки, на прикладі цього буде оповіщення атакуючому про те,
скільки шкоди завдав (аля 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;
}
по союзникам на 35% (іншими словами у flDamage буде точна шкода), чого не скажеш про таку можливість у Hamsandwich-і.
Використовуючи хук ShowVGUIMenu, ми цілком зможемо змінювати/українізувати меню вибору для всіх, за винятком меню VGUI,
так як функція ShowVGUIMenu, викликається як VGUI так і для old меню.
так як функція 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;
}
- ReAPI здебільшого призначений для Counter-Strike 1.6/Condition Zero, але може використовуватись і на інших модах з меншим доступним функціоналом.
- З кожною новою версією рекомендується перекомпілювати свої плагіни, які використовують ReAPI з оновленими інклюдами.