Dedicated-Server.RU  


 
 
Опции темы Опции просмотра
Старый 04.06.2016, 00:04   #1
с доступом к форуму безопасности
 
Регистрация: 23.02.2014
Адрес: Томск-7
Сообщений: 275
Сказал спасибо: 94
Поблагодарили 860 раз(а) в 152 сообщениях
По умолчанию [AMXX Module] Reapi

Команда разработки:
  • Asmodai
  • s1lent
Ссылки:
Описание:
Это AMX Mod X модуль, который умеет работать с API ReHLDS, ReGameDLL_CS, Reunion и VTC.
Это предоставляет разработчикам AMXX-plugins больше возможностей для реализации своих целей.
Требования:
  • ReHLDS, ReGameDLL_CS, Reunion или VTC Внимание: (Можно использовать не все перечисленные, но тогда будут доступна меньшая часть функционала)
  • MetaMod 1.20(p) или новее
Установка:

Подробнее...

  1. Копируем из архива reapi_X_X_X.zip файл reapi_amxx_i386.so или reapi_amxx.dll (в зависимости от используемой ОС)
    в папку <gamedir>/addons/amxmodx/modules

  2. Установка Reapi завершена
[свернуть]

Возможности форвардов:

Подробнее...


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

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

Практические примеры:

1. SetHookChainReturn


Для начала подключим include reapi.
PHP код:
#include <reapi> 
В plugin_init, зарегистрируем хук на DeadPlayerWeapons и повесим обработчик на CSGameRules_DeadPlayerWeapons
PHP код:
public plugin_init()
{
    
RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons"CSGameRules_DeadPlayerWeapons")

Далее создадим тело обработчик-функции
PHP код:
public CSGameRules_DeadPlayerWeapons(const index)
{


Следующим шагом для общего представления желательно заглянуть в исходник ReGameDLL_CS player.cpp#L1473,
понимая что функция должна возвращать некое значение в котором не ожидает GR_PLR_DROP_GUN_NO
и от этого будет зависеть далее выполняемый код, суть этой PackDeadPlayerItems функции заключается в том,
что выбрасывает оружия на землю после смерти игрока, попробуем это предотвратить,
для этого вернём значение GR_PLR_DROP_GUN_NO который не ожидает получить.
PHP код:
public CSGameRules_DeadPlayerWeapons(const index)
{
    
SetHookChainReturn(ATYPE_INTEGERGR_PLR_DROP_GUN_NO);

Так как, в оригинальной функции, практически ничего нет, то нет надобности ее лишний раз вызывать, поэтому используем HC_SUPERCEDE
PHP код:
public CSGameRules_DeadPlayerWeapons(const index)
{
    
SetHookChainReturn(ATYPE_INTEGERGR_PLR_DROP_GUN_NO);
    return 
HC_SUPERCEDE;

Таким нехитрым способом, предотвратили любое появление оружия после смерти игрока, вполне себе сойдет для CSDM или GunGame модов.
PHP код:
#include <amxmodx>
#include <reapi>

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

public 
CSGameRules_DeadPlayerWeapons(const index)
{
    
SetHookChainReturn(ATYPE_INTEGERGR_PLR_DROP_GUN_NO);
    return 
HC_SUPERCEDE;

[свернуть]

2. GetHookChainReturn


Поскольку CBasePlayer::TakeDamage возвращает значение 0/1, в виде
  • 0 - не получил урон
  • 1 - получил урон
Если на сервере будет включен mp_friendlyfire 0, стреляя по союзникам CBasePlayer::TakeDamage все равно будет вызываться, но возвращать уже будет 0.
В некоторых ситуациях, нужно точно знать получила ли жертва урон, на примере этого будет оповещение атакующему о том,
сколько урона нанёс (аля Damager).
GetHookChainReturn должен использоваться только в post, когда оригинальная функция уже была вызвана.
PHP код:
#include <amxmodx>
#include <reapi>

public plugin_init()
{
    
RegisterHookChain(RG_CBasePlayer_TakeDamage"CBasePlayer_TakeDamage"1);
}

public 
CBasePlayer_TakeDamage(const thispevInflictorpevAttackerFloat:flDamagebitsDamageType)
{
    if (
GetHookChainReturn() == 1) {
        
client_print(0print_chat"Жертва получила урон: %f"flDamage);
    } else {
        
client_print(0print_chat"Жертва не получила урон: %f"flDamage);
    }

    return 
HC_CONTINUE;

Полезная информация: CBasePlayer::TakeDamage в post, аргумент flDamage уже приходит с расчетом брони и заниженным уроном
по союзникам на 35% (иными словами в flDamage будет точный урон), чего не скажешь о такой возможности в Hamsandwich-е.

[свернуть]

3. SetHookChainArg



Используя хук ShowVGUIMenu, мы вполне cможем видоизменять/русифицировать меню выбора для всех, за исключением VGUI меню,
так как функция ShowVGUIMenu, вызывается как для VGUI так и для old меню.
PHP код:
#include <amxmodx>
#include <reapi>

public plugin_init()
{
    
RegisterHookChain(RG_ShowVGUIMenu"ShowVGUIMenu");
}

public 
ShowVGUIMenu(const indexVGUIMenu:menuType, const bitsSlotsszOldMenu[], bool:bForceOldMenu)
{
    if (
menuType == VGUI_Menu_Team) {
        new 
szMenu[256];
        
formatex(szMenucharsmax(szMenu), "\yЗа кого будем играть?^n^n\w1. Террористы^n2. Контр-Террористы^n^n5. Не знаю");

        if (
bitsSlots MENU_KEY_6) {
            
add(szMenucharsmax(szMenu), "^n6. Зритель");
        }

        
SetHookChainArg(4ATYPE_STRINGszMenu);
    }

    return 
HC_CONTINUE;


[свернуть]

Примечания:
  • ReAPI по большей части предназначен для Counter-Strike 1.6 / Condition Zero, но может использоваться и на других модах с меньшим доступным функционалом.
  • С каждой новой версией рекомендуется перекомпилировать свои плагины использующие ReAPI с обновленными инклюдами.

Последний раз редактировалось s1lent; Вчера в 22:29.
s1lent вне форума   Ответить с цитированием
23 пользователей сказали cпасибо:
Показать/Скрыть список поблагодаривших
 

Метки
amxx module, regamedll, rehlds, reunion, vtc


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 00:36. Часовой пояс GMT +3.


Лицензия принадлежит Dedicated-Server.Ru