Русское сообщество по скриптингу

[AMXX Module] Reapi

Файлы и модули, которые пригодятся при скриптинге для AMX Mod X или SourceMod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено выкладывать файлы или модули для AMXX/SM, которые пригодятся при программировании.

[AMXX Module] Reapi

Сообщение Subb98 » 04 июн 2016, 16:14

Команда разработки:
Ссылки:
Описание:
Это AMX Mod X модуль, который умеет работать с API Вы должны зарегистрироваться, чтобы видеть ссылки., Вы должны зарегистрироваться, чтобы видеть ссылки., Вы должны зарегистрироваться, чтобы видеть ссылки. и Вы должны зарегистрироваться, чтобы видеть ссылки..
Это предоставляет разработчикам AMXX плагинов больше возможностей для реализации своих целей.

Требования:
  • 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 завершена

Возможности форвардов:
  1. Управление вызовом оригинальной функции и других хуков. Делается путем возврата из форварда одного из 4 значений:
    • HC_CONTINUE - продолжить вызывать хуки и оригинал
    • HC_OVERRIDE - продолжить вызывать оригинал, но возвращать своё значение
    • HC_SUPERCEDE - продолжить вызывать хуки, но прервать выполнение оригинала (если функция не void, перед блокировкой её вызова необходимо установить своё возвращаемое значение)
    • HC_BREAK - прервать выполнение хуков и оригинала
  2. Установка возвращаемого значения. Выполняется нативой SetHookChainReturn с двумя аргументами, в первом требуется указать тип возвращаемого значения, а во втором значение.
  3. Получение возвращаемого значения. Выполняется нативой GetHookChainReturn, может быть вызвано только в post.
  4. Замена аргументов в функции. Выполняется нативой SetHookChainArg, в первом аргументе указывается номер последовательности аргументов (всегда начинается с 1), во втором - тип аргумента, в третьем - значение.

Практические примеры:
Для начала подключим include reapi:

Код: Выделить всё
#include <reapi>               

В plugin_init зарегистрируем хук на DeadPlayerWeapons и повесим обработчик на CSGameRules_DeadPlayerWeapons:

Код: Выделить всё
public plugin_init()
{
    RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons")

Далее создадим тело обработчик-функции:

Код: Выделить всё
public CSGameRules_DeadPlayerWeapons(const index)
{


Следующим шагом для общего представления желательно заглянуть в исходник ReGameDLL_CS Вы должны зарегистрироваться, чтобы видеть ссылки., понимая что функция должна возвращать некое значение в котором не ожидает GR_PLR_DROP_GUN_NO и от этого будет зависеть далее выполняемый код, суть этой PackDeadPlayerItems функции заключается в том, чтобы выбрасывать оружия на землю после смерти игрока, попробуем это предотвратить. Для этого вернём значение GR_PLR_DROP_GUN_NO, которое не ожидаем получить:

Код: Выделить всё
public CSGameRules_DeadPlayerWeapons(const index)
{
    SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);

Так как, в оригинальной Вы должны зарегистрироваться, чтобы видеть ссылки., практически ничего нет, то нет надобности её лишний раз вызывать, поэтому используем HC_SUPERCEDE:

Код: Выделить всё
public CSGameRules_DeadPlayerWeapons(const index)
{
    SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
    return HC_SUPERCEDE;

Таким нехитрым способом, предотвратили любое появление оружия после смерти игрока, вполне себе сойдет для CSDM или GunGame модов.

Код: Выделить всё
#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, когда оригинальная функция уже была вызвана:

Код: Выделить всё
#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 будет точный урон), чего не скажешь о такой возможности в Ham Sandwich.
Используя хук ShowVGUIMenu, мы вполне cможем видоизменять/русифицировать меню выбора для всех, за исключением VGUI меню, так как функция ShowVGUIMenu, вызывается как для VGUI так и для old меню:

Код: Выделить всё
#include <amxmodx>
#include <reapi>

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

public ShowVGUIMenu(const index, VGUIMenu:menuType, const bitsSlots, szOldMenu[])
{
    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;


Примечания:
  • Reapi по большей части предназначен для Counter-Strike 1.6 / Condition Zero, но может использоваться и на других модах с меньшим доступным функционалом.
  • С каждой новой версией желательно перекомпилировать плагины, использующие Reapi с обновлёнными инклюдами.
Источник: Вы должны зарегистрироваться, чтобы видеть ссылки.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [AMXX Module] Reapi

Сообщение ZUBR » 11 июн 2016, 11:54

Вышла версия 0.1.50
Аватара пользователя
ZUBR
 
Сообщения: 73
Зарегистрирован: 28 ноя 2013, 17:33
Благодарил (а): 128 раз.
Поблагодарили: 15 раз.
Языки программирования: Counter-Strike 1.6

Re: [AMXX Module] Reapi

Сообщение Subb98 » 11 июн 2016, 14:32

ZUBR, благодарю за информацию, обновлено. Кстати, также доношу до сведения тех скриптеров, кто будет или уже активно использует Reapi:

Skype писал(а):[0:48:37] Subb98: L 06/11/2016 - 00:47:26: [AMXX] Plugin "test.amxx" failed to load: Plugin uses an unknown function (name "get_member") - check your modules.ini.
[0:48:44] Subb98: Не знаешь, в чём дело может быть?
[0:49:37] PRoSToTeM@: regamedll установлен?
[0:49:40] PRoSToTeM@: версии совпадают?
[0:49:53] Subb98: Сейчас проверю.
[0:51:57] Subb98: Уточни, пожалуйста, версии чего должны совпадать? ReHLDS и Regamedll ?
[0:54:21] PRoSToTeM@: reapi и regamedll
[0:54:27] PRoSToTeM@: ща проверю погоди
[0:56:19] PRoSToTeM@: if (api_cfg.hasReGameDLL())
g_amxxapi.AddNatives(ReGameVars_Natives);
[0:56:20] PRoSToTeM@: да
[0:57:15] PRoSToTeM@: скачай последний reapi и последний regamedll
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [AMXX Module] Reapi

Сообщение s1lent » 12 июн 2016, 18:29

Subb98, вероятнее всего, надо вывести предупреждение в консоль о том, что если версии major/minor API не совпадают.
Поскольку в данном случае get_member сильно зависим от regamedll.
Аватара пользователя
s1lent
Скриптер
 
Сообщения: 123
Зарегистрирован: 11 июл 2011, 20:02
Откуда: Северск
Благодарил (а): 32 раз.
Поблагодарили: 110 раз.

Re: [AMXX Module] Reapi

Сообщение Subb98 » 13 июн 2016, 00:54

s1lent, ещё не подскажете принципиальное отличие этих двух хуков (за исключением разницы в аругментах, конечно же):

Код: Выделить всё
RG_CBasePlayer_Killed
RG_CSGameRules_PlayerKilled

Я пока не улавливаю разницы между CBase и GameRules, и, следовательно, не понимаю, что правильней будет использовать.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [AMXX Module] Reapi

Сообщение s1lent » 13 июн 2016, 01:34

Subb98, это смотря какую цель преследовать.

Вы должны зарегистрироваться, чтобы видеть ссылки. #L1934
Вы должны зарегистрироваться, чтобы видеть ссылки. #L3642

PlayerKilled вызывается из Killed, есть разница в порядке вызова.
Аватара пользователя
s1lent
Скриптер
 
Сообщения: 123
Зарегистрирован: 11 июл 2011, 20:02
Откуда: Северск
Благодарил (а): 32 раз.
Поблагодарили: 110 раз.

Re: [AMXX Module] Reapi

Сообщение Subb98 » 13 июн 2016, 02:37

s1lent, понял, нашёл, кажись:

Код: Выделить всё
if (!m_bKilledByBomb)
{
    
g_pGameRules->PlayerKilled(thispevAttackerg_pevLastInflictor);
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [AMXX Module] Reapi

Сообщение Subb98 » 15 июн 2016, 03:08

s1lent писал(а):Обновлено 0.1.51 - 0.1.53
- Добавлены новые нативы:

ReHLDS
  • rh_emit_sound2
ReGameDLL
  • rg_set_account_rules
  • rg_get_account_rules
  • rg_is_bomb_planted
  • rg_join_team
  • rg_balance_teams
  • rg_swap_all_players
  • rg_switch_team
  • rg_switch_weapon
- Добавлены новые мемберы:

ReGameDLL
  • CCSPlayer
  • CBasePlayerItem
  • CBasePlayerWeapon

Вы должны зарегистрироваться, чтобы видеть ссылки.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: [AMXX Module] Reapi

Сообщение RevCrew » 19 июн 2016, 19:45

Возможно не по теме, но как теперь хукать функции, если orpheu не будет работать?
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: [AMXX Module] Reapi

Сообщение Mistrick » 19 июн 2016, 20:00

RevCrew, Пишешь разработчику, при необходимости вам проведут нужные хуки в API.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

След.

Вернуться в Файлы и модули

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6