Рекомендации по оформлению zp_crosshair

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
78
Реакции
7
Приветствую всех. Я сегодня попробовал написать свой первый небольшой плагин (ну почти, не считая мелких поделок 5-летней давности), хотел бы его показать и задать несколько вопросов. Изначально писал с использованием fakemeta и древнего способа ловли и дополнения сообщения, пока в поисках примеров и описаний на форумах не наткнулся на аналоги из reapi, решил все переписать, а пару строк почти что скопировать и вставить. Смыслю пока в этом немного, поэтому вопросы будут тупые.
Задача: Убрать прицел, если игрок достал нож. Если нож убран - прицел должен появиться.

Код:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>

#define PLUGIN "ZP Crosshair"
#define VERSION "0.1"
#define AUTHOR "Ash Fever"

public plugin_init() 
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    RegisterHam(Ham_Item_Deploy, "weapon_knife", "Knife_Deploy_Post", 1);
    RegisterHam(Ham_Item_Holster, "weapon_knife", "Knife_Holster_Post", 1);
}

public Knife_Deploy_Post(weapon_ent)
{
    new id; 
    id = get_member(weapon_ent, m_pPlayer);
    
    if(!is_entity(weapon_ent))

        return HAM_IGNORED;

    if(!is_entity(id))

        return HAM_IGNORED;
     
    set_member(id, m_iHideHUD, get_member(id, m_iHideHUD) | HIDEHUD_CROSSHAIR);
       
    return HAM_IGNORED;
}

public Knife_Holster_Post(weapon_ent)
{
    new id; 
    id = get_member(weapon_ent, m_pPlayer);
    
    if(!is_entity(weapon_ent))

        return HAM_IGNORED;

    if(!is_entity(id))

        return HAM_IGNORED;
     
    set_member(id, m_iHideHUD, get_member(id, m_iHideHUD) & ~HIDEHUD_CROSSHAIR);
    
    return HAM_IGNORED;
}

Вопросы у меня такие:
1) В аргументах двух set_member применяются символы "&" и "|", что они означают в данных местах?
2) Изначально я планировал отключить прицел не только на ножах, но и на гранатах, однако, с моими знаниями это будет еще три вызова деплоя и три вызова холстера с последующей кучей повторяющегося кода. Есть ли возможность зарегистрировать один деплой и холстер сразу на четыре weapon_ent? Или, может, есть более подходящие аналоги?
3) Хотелось бы узнать, возможно ли как-либо еще оптимизировать или дополнить код? Что-либо поменять на аналоги из reapi?

Если кто-нибудь ответит на что-либо, буду рад.
 
Сообщения
1,560
Реакции
1,573
Помог
2 раз(а)
Есть ли возможность зарегистрировать один деплой и холстер сразу на четыре weapon_ent?
Делал я так с тачем - работало.
Вот пример
Писал ночью,возможно буковками ошибся
С холстером уже поймешь
Код:
new const classes_weapons[][] = { "weapon_knife", "weapon_hegrenade", "weapon_smokegrenade", "weapon_flashbang" }

public plugin_init()
{
    for (new x; x < sizeof classes_weapons; x++)
    {
         RegisterHam(Ham_Item_Deploy, classes_weapons[x], "Deploy_Post", 1);
    }
}
 
Последнее редактирование:
Сообщения
494
Реакции
341
Помог
11 раз(а)
1) В аргументах двух set_member применяются символы "&" и "|", что они означают в данных местах?
Логическое умножение/сумма. Читай про операции с битами ("|", "&", "!", "^", "<<", ">>"), станет более понятно.

2) Изначально я планировал отключить прицел не только на ножах, но и на гранатах, однако, с моими знаниями это будет еще три вызова деплоя и три вызова холстера с последующей кучей повторяющегося кода. Есть ли возможность зарегистрировать один деплой и холстер сразу на четыре weapon_ent? Или, может, есть более подходящие аналоги?
3) Хотелось бы узнать, возможно ли как-либо еще оптимизировать или дополнить код? Что-либо поменять на аналоги из reapi?
Код:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>

public plugin_init()
{
    new const g_sHookClassNameList[][] =
    {
        "weapon_knife",
        "weapon_hegrenade",
        "weapon_flashbang",
        "weapon_smokegrenade"
    };

    for(new i; i < sizeof(g_sHookClassNameList); i++)
    {
        RegisterHam(Ham_Item_Deploy, g_sHookClassNameList[i], "@Ham_Item_Deploy_Post", true);
        RegisterHam(Ham_Item_Holster, g_sHookClassNameList[i], "@Ham_Item_Holster_Post", true);
    }
}

@Ham_Item_Deploy_Post(iItem)
{
    new pPlayer = get_member(iItem, m_pPlayer);

    rg_user_crosshair_switch(pPlayer, true);
}

@Ham_Item_Holster_Post(iItem)
{
    new pPlayer = get_member(iItem, m_pPlayer);

    rg_user_crosshair_switch(pPlayer, false);
}

stock rg_user_crosshair_switch(pPlayer, bool: bIsShowCrosshair)
{
    if(bIsShowCrosshair)
        set_member(pPlayer, m_iHideHUD, get_member(pPlayer, m_iHideHUD) | HIDEHUD_CROSSHAIR);
    else
        set_member(pPlayer, m_iHideHUD, get_member(pPlayer, m_iHideHUD) & ~HIDEHUD_CROSSHAIR);
}
 
Последнее редактирование:
Сообщения
78
Реакции
7
MayroN, благодарю за вариант! Скажи, пожалуйста, получается, что можно проводить несколько однотипных регистраций (на каждое оружие) сразу на один форвард?

bizon, спасибо за такой объемный ответ! Про операции с битами обязательно прочту. Хотелось бы спросить, форвард зарегистрированный через @ мне непонятен, он вдобавок прописывается без public. Объясни, пожалуйста, в чем его особенность? И, получается, для регистрации одинаковых хуков для нескольких энтити можно пользоваться одним форвардом?
Проверки на валидность индекса игрока и оружия были лишними?
И я не понял сути использования здесь stock, он, вроде, используется при вероятности того, что функция может быть ненужной, или я что-то упустил? А остальное все понятно, и код выглядит лаконично.
 
Сообщения
1,560
Реакции
1,573
Помог
2 раз(а)
Ash Fever,получается так
Хотелось бы спросить, форвард зарегистрированный через @ мне непонятен, он вдобавок прописывается без public. Объясни, пожалуйста, в чем его особенность?
Там разницы нету абсолютно никакой
Кому как удобно - кто публик пишет ,а кто собаку ))
И публик и собака работают одинаково
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Хотелось бы спросить, форвард зарегистрированный через @ мне непонятен, он вдобавок прописывается без public
Нотка современности. Разницы с public практически нет, работает как обычная функция без префикса (только компилятор пропустит её как предупреждение, если она не используется нигде в исходнике, в этом плане она как public).

И, получается, для регистрации одинаковых хуков для нескольких энтити можно пользоваться одним форвардом?
Регистрировать можно различные классы с вызовом одной функции. Верно.

Проверки на валидность индекса игрока и оружия были лишними?
Смотря как на это посмотреть. При любой стандартной ситуации (где работает только движок, без учета сторонних модулей и плагинов) эти проверки лишние. Если ты делаешь для себя и уверен, что не будет какой-нибудь эмуляции этих функций с неверными параметрами (через тот же ExecuteHamB, например), то можно обойтись без таких проверок. А если выкладываешь такой плагин в публичный доступ, где нельзя контролировать описанную ситуацию, то проверки добавить возможно стоит.

И я не понял сути использования здесь stock, он, вроде, используется при вероятности того, что функция может быть ненужной, или я что-то упустил? А остальное все понятно, и код выглядит лаконично.
Функции типа stock компилятор игнорирует, если они в плагине нигде не вызываются. То есть при неиспользовании в плагине они "не вшиваются" в скомпилированный вариант.
А использую я её здесь как раз ввиду лаконичности и присущего фэн-шуя вокруг коддинга на павне. Это просто некая условность (а-ля так принято). Можешь заменить на другой тип функции. На конечный результат не повлияет.
 
Сообщения
78
Реакции
7
MayroN, bizon, ля, ну спасибо, парни. Запомню эти все тонкости. По понятным причинам плюсануть вас пока не могу. А тебя, Бизон, я еще с zombie-mod помню, рад, что ты продолжаешь тем же заниматься.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу