Dedicated-Server.RU  


Ответ
 
Опции темы Опции просмотра
Старый 04.06.2016, 00:04   #1
с доступом к форуму безопасности
 
Регистрация: 23.02.2014
Адрес: Томск-7
Сообщений: 302
Сказал спасибо: 99
Поблагодарили 962 раз(а) в 168 сообщениях
По умолчанию [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 с обновленными инклюдами.
Вложения
Тип файла: zip reapi_5.1.0.110-dev.zip (228.9 Кб, 119 просмотров)

Последний раз редактировалось s1lent; 29.05.2017 в 16:45. Причина: Add artifacts temporarily (5.1.0.110)
s1lent вне форума   Ответить с цитированием
26 пользователей сказали cпасибо:
Показать/Скрыть список поблагодаривших
Старый 04.06.2016, 01:18   #2
Не проверенный
 
Регистрация: 11.11.2013
Адрес: Иваново
Сообщений: 521
Сказал спасибо: 12
Поблагодарили 196 раз(а) в 134 сообщениях
По умолчанию

Почему бы не сделать unsafe версии (без указания типа, автоопределение) SetHookChainReturn и SetHookChainArg для удобства?
PRoSToTeM@ вне форума   Ответить с цитированием
Старый 04.06.2016, 01:39   #3
с доступом к форуму безопасности
 
Регистрация: 14.02.2012
Адрес: Актобе
Сообщений: 107
Сказал спасибо: 126
Поблагодарили 10 раз(а) в 9 сообщениях
По умолчанию

Наконец-то выложили сюда =) Еще бы создать раздел Плагины для ReAPI было бы неплохо.
nurzhan вне форума   Ответить с цитированием
2 пользователей сказали cпасибо:
Старый 04.06.2016, 01:46   #4
Не проверенный
 
Регистрация: 11.11.2013
Адрес: Иваново
Сообщений: 521
Сказал спасибо: 12
Поблагодарили 196 раз(а) в 134 сообщениях
По умолчанию

Цитата:
Сообщение от nurzhan Посмотреть сообщение
Плагины для ReAPI
Точнее 'на', а не 'для')
PRoSToTeM@ вне форума   Ответить с цитированием
Старый 04.06.2016, 02:04   #5
с доступом к форуму безопасности
 
Регистрация: 23.02.2014
Адрес: Томск-7
Сообщений: 302
Сказал спасибо: 99
Поблагодарили 962 раз(а) в 168 сообщениях
По умолчанию

Цитата:
Сообщение от PRoSToTeM@ Посмотреть сообщение
Почему бы не сделать unsafe версии (без указания типа, автоопределение) SetHookChainReturn и SetHookChainArg для удобства?
имеешь ввиду убрать безопасные проверки из текущих нативах?
s1lent вне форума   Ответить с цитированием
Старый 04.06.2016, 09:30   #6
Не проверенный
 
Регистрация: 11.11.2013
Адрес: Иваново
Сообщений: 521
Сказал спасибо: 12
Поблагодарили 196 раз(а) в 134 сообщениях
По умолчанию

s1lent, в SetHookChainReturn и SetHookChainArg убрать 1 и 2 аргумент соответственно.
PRoSToTeM@ вне форума   Ответить с цитированием
Старый 04.06.2016, 14:45   #7
с доступом к форуму безопасности
 
Регистрация: 01.07.2012
Адрес: г. Пермь, Ленинский р-н
Сообщений: 997
Сказал спасибо: 343
Поблагодарили 390 раз(а) в 210 сообщениях
По умолчанию

Новые плюшки для AMXX-скритперов. =) Будем юзать теперь.
Subb98 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 05.06.2016, 12:55   #8
Не проверенный
 
Регистрация: 30.04.2015
Адрес: Тамбов
Сообщений: 230
Сказал спасибо: 139
Поблагодарили 30 раз(а) в 23 сообщениях
По умолчанию

Всем доброго, я так понял, этот плагин юзать будут только те, кто шарит скриптинге или как? Я что-то не пойму, может кто-то доходчиво объяснить для чего данный плагин предназначен?
abbat_tmb вне форума   Ответить с цитированием
Старый 05.06.2016, 13:10   #9
с доступом к форуму безопасности
 
Регистрация: 23.02.2014
Адрес: Томск-7
Сообщений: 302
Сказал спасибо: 99
Поблагодарили 962 раз(а) в 168 сообщениях
По умолчанию

Цитата:
Сообщение от abbat_tmb Посмотреть сообщение
.... этот плагин юзать будут только те, кто шарит скриптинге
не обязательно, плагины написанные на reapi потребуют наличия этого модуля.
s1lent вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 05.06.2016, 16:15   #10
Не проверенный
 
Регистрация: 27.05.2016
Адрес: SPb
Сообщений: 388
Сказал спасибо: 81
Поблагодарили 47 раз(а) в 40 сообщениях
По умолчанию

А можно ли как-то вызвать замечательную функцию SwapAllPlayers()?
У меня игра по 8 раундов, далее свап счёта и свап команд и так до 16 побед, а тут по коду вижу, что тиму вместе со счётом свапает, а у меня всё на костылях, которые, кстати, не работают по части смены счёта.
yododo вне форума   Ответить с цитированием
Старый 05.06.2016, 22:10   #11
Не проверенный
 
Регистрация: 07.11.2013
Адрес: Москва
Сообщений: 233
Сказал спасибо: 77
Поблагодарили 49 раз(а) в 31 сообщениях
По умолчанию

Здорово, столько полезных функций, отпадают костыли и хуки дополнительные. Вы хотите сделать один модуль в будущем для амхх?
__________________
NULL
Andrei вне форума   Ответить с цитированием
Старый 05.06.2016, 22:11   #12
Проверенный
 
Регистрация: 19.01.2014
Адрес: Томск
Сообщений: 79
Сказал спасибо: 7
Поблагодарили 81 раз(а) в 30 сообщениях
По умолчанию

Andrei, скорее всего заменит только cstrike и ham.
Mistrick вне форума   Ответить с цитированием
Старый 05.06.2016, 22:13   #13
Эксперт
 
Регистрация: 20.08.2005
Адрес: Moscow
Сообщений: 3,638
Сказал спасибо: 192
Поблагодарили 236 раз(а) в 164 сообщениях
По умолчанию

а orphey не заменит? где-то же рядом с ham ... думаю многим было бы полезно
__________________
HLDS protocol 48 (CS 1.1.2.6 build 4883 on FreeBSD 9.0)
AMXX v1.8.1.3746 | METAMOD v1.19p32 | DProto 0.9.87
Web: Nginx 1.0.10 (build 1.1), Apache 2.2.21, PHP 5.3.8, MySQL 5.5.17
----------------------------
интересно для временного общения: chat 1 chat 2 chat 3
----------------------------
Client 1.6 v43 (4554) от Western'a
Обсуждение тут
Клиент на DS.ru(по 3 файла)
----------------------------
HLTV
----------------------------
Metamod & Metamod-P
Metamod-p && amxmodx builds
----------------------------
My Plugs
No Reconnect
CS: GO List
Message Logging
----------------------------
Steam API:XML,JSON (поменять IP:PORT на свои)
или сайт
Z@C вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 05.06.2016, 22:45   #14
с доступом к форуму безопасности
 
Регистрация: 23.02.2014
Адрес: Томск-7
Сообщений: 302
Сказал спасибо: 99
Поблагодарили 962 раз(а) в 168 сообщениях
По умолчанию

Цитата:
Сообщение от yododo Посмотреть сообщение
А можно ли как-то вызвать замечательную функцию SwapAllPlayers()?
У меня игра по 8 раундов, далее свап счёта и свап команд и так до 16 побед, а тут по коду вижу, что тиму вместе со счётом свапает, а у меня всё на костылях, которые, кстати, не работают по части смены счёта.
добавим, без проблем

Цитата:
Сообщение от Z@C Посмотреть сообщение
а orphey не заменит? где-то же рядом с ham ... думаю многим было бы полезно
вероятно нет, поскольку цель ставилась работа с API
s1lent вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Старый 06.06.2016, 06:41   #15
Не проверенный
 
Регистрация: 30.04.2015
Адрес: Тамбов
Сообщений: 230
Сказал спасибо: 139
Поблагодарили 30 раз(а) в 23 сообщениях
По умолчанию

Цитата:
Сообщение от Z@C Посмотреть сообщение
а orphey не заменит? где-то же рядом с ham ... думаю многим было бы полезно
Не особо то и полезен орфей, Вам он нужен что бы поглубже залезть?
abbat_tmb вне форума   Ответить с цитированием
Ответ

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


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

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

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

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


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


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