- Автор
-
Asmodai, s1lent
- Требования
- ReHLDS, ReGameDLL_CS, Reunion или VTC Внимание: (Можно использовать не все перечисленные, но тогда будут доступна меньшая часть функционала), MetaMod 1.20(p) или новее
Это AMX Mod X модуль, который умеет работать с API ReHLDS, ReGameDLL_CS, Reunion и VTC.
Это предоставляет разработчикам AMXX-plugins больше возможностей для реализации своих целей.
Примечание:
Это предоставляет разработчикам AMXX-plugins больше возможностей для реализации своих целей.
Примечание:
- ReAPI по большей части предназначен для Counter-Strike 1.6 / Condition Zero, но может использоваться и на других модах с меньшим доступным функционалом.
- С каждой новой версией рекомендуется перекомпилировать свои плагины использующие ReAPI с обновленными инклюдами.
- Дополнительная информация
-
Возможности форвардов:
Форматирование (BB-код):Управление вызовом оригинальной функции и других хуков. Делается путем возврата из форварда одного из 4 значений: HC_CONTINUE- продолжить вызывать хуки и оригинал HC_SUPERCEDE - продолжить вызывать хуки, но прервать выполнение оригинала (Если функция не void, перед блокировкой её вызова необходимо установить свое возвращаемое значение) HC_BREAK - прервать выполнение хуков и оригинала Установка возвращаемого значения. Выполняется нативом SetHookChainReturn с двумя аргументами, в первом требуется указать тип возвращаемого значения, а во втором значение. Получение возвращаемого значения. Делается нативом GetHookChainReturn, может быть вызвано только в post. Замена аргументов в функции. Делается нативом SetHookChainArg, в первом аргументе указывается номер последовательности аргументов всегда начинается с 1, во втором тип аргумента и в третьем - значение.
Для начала подключим include reapi.
PHP:#include <reapi>
PHP:public plugin_init() { RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons") }
PHP:public CSGameRules_DeadPlayerWeapons(const index) { }
понимая что функция должна возвращать некое значение в котором не ожидает GR_PLR_DROP_GUN_NO
и от этого будет зависеть далее выполняемый код, суть этой PackDeadPlayerItems функции заключается в том,
что выбрасывает оружия на землю после смерти игрока, попробуем это предотвратить,
для этого вернём значение GR_PLR_DROP_GUN_NO который не ожидает получить.
PHP:public CSGameRules_DeadPlayerWeapons(const index) { SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO); }
PHP:public CSGameRules_DeadPlayerWeapons(const index) { SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO); return HC_SUPERCEDE; }
PHP:#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 - получил урон
В некоторых ситуациях, нужно точно знать получила ли жертва урон, на примере этого будет оповещение атакующему о том,
сколько урона нанёс (аля Damager).
GetHookChainReturn должен использоваться только в post, когда оригинальная функция уже была вызвана.
PHP:#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, мы вполне cможем видоизменять/русифицировать меню выбора для всех, за исключением VGUI меню,
так как функция ShowVGUIMenu, вызывается как для VGUI так и для old меню.
PHP:#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; }