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

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
78
Реакции
7
Всем привет, решил переписать один оружейный плагин terke под снайперскую винтовку. По итогу все готово, но есть всего лишь пара нюансов, мозолящих глаза.

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


Код:
public Ham_CBasePlayerWeapon__SecondaryAttack_Post(const pItem)
{
    if(!IsCustomWeapon(pItem, WeaponUnicalIndex))
        return HAM_IGNORED;

    static pPlayer; pPlayer = get_member(pItem, m_pPlayer);

    if(get_member(pPlayer, m_iFOV) == 40)//90 40 10
    {
        set_entvar(pPlayer, var_viewmodel, "");
    }
    else if(get_member(pPlayer, m_iFOV) == 90)
    {
        set_entvar(pPlayer, var_viewmodel, WeaponModelView);
    }

    return HAM_SUPERCEDE;
}
И при нажатиях на ПКМ все работает чудесно, в перезарядке тоже выставил проверку, чтобы не было проблем с пустой моделью.

Однако, я не знаю как быть с primary attack. Прописал:


Код:
    if(get_member(pPlayer, m_iFOV) != 90)
    {
        set_member(pPlayer, m_bResumeZoom, 1);
        set_entvar(pPlayer, var_viewmodel, WeaponModelView);
        set_member(pPlayer, m_iLastZoom, get_member(pPlayer, m_iFOV));

        set_member(pPlayer, m_iFOV, 90);
        set_entvar(pPlayer, var_fov, 90);
        if(iClip != 1)
        {
            set_task(flNextAttack + 0.23, "LateralModelHide", pPlayer + 7);
        }
    }
    else
    {
        flSpread += 0.0816;//0.08
    }
После выстрела в зуме, зум отключается, фов становится стандартным и после передергивания затвора зум включается снова, я без понятия как точно отловить момент возвращения зума, чтобы вовремя убрать модель. Поэтому попробовал использовать костыль в виде set_task с о сменой модели на нулевую. И он срабатывает криво, время возвращения зума может отличаться на доли секунд, из-за чего может либо пропасть модель и не включится зум(если модель сменилась на пустую до возвращения зума), либо ствол в зуме будет убираться с запозданием. Я без понятия как быть, есть уже мысль вместо смены модели на нулевую, либо как-то запустить анимацию draw и заморозить на нулевом кадре (если такое вообще возможно), либо вообще добавить пустую анимацию к v модели снайперки, и переключаться на нее. Может есть возможность отлова возращения зума или хотя бы костыль понадежнее?

И второй вопрос : Существует ли возможность прописать докупку кастомных патронов прописанных через ItemInfo_pszAmmo1? Ham_GiveAmmo точно не сработает, при докупе патронов, покупается 338 magnum на AWP без отображаемого худа, что мимо кассы.
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Сообщения
678
Реакции
579
Предупреждения
8
Помог
9 раз(а)
Сообщения
78
Реакции
7
Vaqtincha, имеется в виду итоговое имя V модели или оригинальное имя в qc файле?

Типа:
Код:
==============================================================================

QC script generated by Half-Life MDL Decompiler 1.2
2003, Kratisto. Based on code from Valve's HL SDK.

v_bpgm.mdl

Original internal name:
"v_pgm.mdl"

==============================================================================
Не совсем понял что значит "деф модель"
16 Июл 2024
Vaqtincha, А, дефолт модель, скорее всего, и как я понимаю, нужно именовать модель по типу "v_awp_pgm" и тд?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
set_task(flNextAttack + 0.23, "LateralModelHide", pPlayer + 7);
не делай так
если уж сильно надо, то хук WeaponIdle юзай и там проверяй

вот это идеальный для тебя вариант
будет без проблем отлавливать временный выход из прицеливания у авп
офк проверки правильно поставить не забудь

Если название начинается как деф модель оружие.
а это точно будет работать для кастома?
 
Сообщения
78
Реакции
7
Nordic Warrior, благодарю, все работает как часы!
Оформил так:


Код:
public message_SetFOV(iMsgID, iMsgDest, pPlayer)
{
    static const iMsgArg_FOV = 1;

    if(!is_entity(get_member(pPlayer, m_pActiveItem)) || !IsCustomWeapon(get_member(pPlayer, m_pActiveItem), WeaponUnicalIndex) || !is_user_connected(pPlayer) || !is_user_alive(pPlayer))
        return;

    new iPlayerFOV = get_msg_arg_int(iMsgArg_FOV);

    switch(iPlayerFOV)
    {
        case 10, 40: set_entvar(pPlayer, var_viewmodel, "");
        case 90: set_entvar(pPlayer, var_viewmodel, WeaponModelView);
    }
}
17 Июл 2024
BalbuR, уже применил метод Нордика, отлично работает!
 
Сообщения
678
Реакции
579
Предупреждения
8
Помог
9 раз(а)
Сообщения
78
Реакции
7
Vaqtincha, спасибо за пояснение, я не знал про такой нюанс
17 Июл 2024
Еще вопрос. А существует ли возможность указать угол поворота модели temp entity внутри message?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
Если название начинается как деф модель оружие.
занятный хак, заберём :smile3:
17 Июл 2024
в общем как сказал Vaqtincha просто переименовываем модель, неважно в какой папке она лежит
C++:
new m200_V_MODEL[64] = "models/weapons/m200/m200m1_v_awp.mdl"

 
Последнее редактирование:
Сообщения
78
Реакции
7
BalbuR, да, я так и понял, в будущем это может пригодится)
 
Последнее редактирование:
Сообщения
78
Реакции
7
BalbuR, а как тогда лучше оформлять поздний вылет гильзы? Он должен происходить через секунду после primary attack, тут тоже кроме костыля с set_task я альтернатив не вижу, вылет происходит до начала idle.
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
BalbuR, а как тогда лучше оформлять поздний вылет гильзы? Он должен происходить через секунду после primary attack, тут тоже кроме костыля с set_task я альтернатив не вижу, вылет происходит до начала idle.
Если это дефолтная гильза, то через оффсет 1721206528356.png

иначе TE_MODEL в постфрейме проверяй с меткой
SetThink есть еще, но я бы тебе не советовал использовать его лишь для гильзы 🥴
 
Сообщения
78
Реакции
7
BalbuR, а, про дефолтный оффсет с gametime + нужное время я знаю, но я юзаю отдельную функцию с отправкой сообщения со всеми нужными мне настройками, сейчас ознакомлюсь с вариантом постфрейме, а существует возможность повернуть TE_Model в нужную мне сторону?
17 Июл 2024
Интересует именно поворот самой модели гильзы в определенную сторону, а не вектор полета
 
Сообщения
78
Реакции
7
BalbuR, я глянул, постфрейм же вызывается каждый фрейм, когда оружие не перезаряжается, стреляет или не достается. Это действительно лучше одного set_task'а?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
Интересует именно поворот самой модели гильзы в определенную сторону, а не вектор полета
даже не знаю, надо тестить
сам вот этим пользуюсь, попробуй
C++:
stock bool:EjectWeaponBrass(pPlayer, Weapon, iModelIndex, iSoundType) {
    
    if (!iModelIndex) {
        return false;
    }
    
    static Float:vecViewOfs[3];
    pev(pPlayer, pev_view_ofs, vecViewOfs);

    static Float:vecAngles[3];
    pev(pPlayer, pev_angles, vecAngles);

    static Float:vecUp[3];
    angle_vector(vecAngles, ANGLEVECTOR_UP, vecUp);

    static Float:vecForward[3];
    angle_vector(vecAngles, ANGLEVECTOR_FORWARD, vecForward);
    
    static Float:vecRight[3];
    angle_vector(vecAngles, ANGLEVECTOR_RIGHT, vecRight);
    
    static Float:vecOrigin[3];
    pev(pPlayer, pev_origin, vecOrigin);

    for (new i = 0; i < 3; ++i) {
        vecOrigin[i] = vecOrigin[i] + vecViewOfs[i] + (vecUp[i] * -9.0) + (vecForward[i] * 16.0);
    }

    static Float:vecVelocity[3];
    pev(pPlayer, pev_velocity, vecVelocity);

    for (new i = 0; i < 3; ++i) {
        vecVelocity[i] = vecVelocity[i] + (vecRight[i] * random_float(50.0, 70.0)) + (vecUp[i] * random_float(100.0, 150.0)) + (vecForward[i] * 25.0);
    }

    engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, vecOrigin, pPlayer);
    write_byte(TE_MODEL);
    engfunc(EngFunc_WriteCoord, vecOrigin[0]);
    engfunc(EngFunc_WriteCoord, vecOrigin[1]);
    engfunc(EngFunc_WriteCoord, vecOrigin[2]);
    engfunc(EngFunc_WriteCoord, vecVelocity[0]);
    engfunc(EngFunc_WriteCoord, vecVelocity[1]);
    engfunc(EngFunc_WriteCoord, vecVelocity[2]);
    write_angle(floatround(vecAngles[1]));
    write_short(iModelIndex);
    write_byte(iSoundType);
    write_byte(25);
    message_end();

    return true;
}

PHP:
EjectWeaponBrass(id, iWeapon, szData[eWeaponsData_pModelIndexWorld], TE_BOUNCE_SHELL);
17 Июл 2024
Это действительно лучше одного set_task'а?
юзать сет.таски = плохой тон
такие вещи должны быть привязаны к тому пушке
конечно если делаешь для себя - каждый хочет как он хочет
а то что ты в постфрейме проверяешь тайминги = вообще пофиг, не настолько критичная нагрузка
 
Сообщения
78
Реакции
7
BalbuR, сейчас ты мне нереально облегчил задачу, вычисления у меня примерно те же, но я все время юзал мессагу Brass, твоя обобщенная мессага на temp entity мне нереально облегчила жизнь, премного благодарен! Кстати, я потестил различия, советую использовать вместо:
Код:
    angle_vector(vecAngles, ANGLEVECTOR_UP, vecUp);
    angle_vector(vecAngles, ANGLEVECTOR_FORWARD, vecForward);
    angle_vector(vecAngles, ANGLEVECTOR_RIGHT, vecRight);
вот это:
Код:
    global_get(glb_v_up, vecUp);
    global_get(glb_v_right, vecRight);
    global_get(glb_v_forward, vecForward);
При стрельбе в 45 или 135 градусов по вертикали траектория полета гильзы будет намного лучше и естественней, под этими углами их будет тянуть к земле.
 
Сообщения
78
Реакции
7
Я оформил набросок отлова, но так и не могу понять, через что конкретно отлавливать нужный тайминг вызова гильзы? Мне теперь очевидно, что это не через получение времени следующей атаки делается. Есть ли нарекания в оформлении отлова в функции? Опасаюсь к таким грузящим функциям на милю приближаться.


Код:
public Ham_CBasePlayerWeapon__ItemPostFrame_Post(const pItem)
{
    if(get_entvar(pItem, var_impulse) != WeaponUnicalIndex || LateralBrassDrop != 1 || get_member(pItem, m_Weapon_flNextPrimaryAttack) != 1.05)
    {
        return HAM_IGNORED;
    }
    else
    {
        static pPlayer; pPlayer = get_member(pItem, m_pPlayer);
        if(gl_bitUserLeftHanded)
        {
            UTIL_EjectBrass(pPlayer, WeaponModelShell, 1, 17.0, -12.0, -10.0, 25.0, random_float(65.0, 70.0), random_float(85.0, 90.0));
        }
        else
        {
            UTIL_EjectBrass(pPlayer, WeaponModelShell, 1, 17.0, 12.0, -10.0, 25.0, random_float(-65.0, -70.0), random_float(85.0, 90.0));
        }
        return HAM_SUPERCEDE;
    }
}
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
если это автомат, то сразу в атаке кидай
иначе тебе нужно самому метки с задержкой делать
можешь оффсет с ножа взять (как бэ с него не падают гильзы, верно же?)
в этот оффсет записывай время, когда должна упасть гильза
PHP:
#define m_Custom_flNextShellFallTime m_Knife_flStabBaseDamage 

new Float:flNextShellFall = get_member(iItem, m_Custom_flNextShellFallTime);

if (flNextShellFall && flNextShellFall < get_gametime()) {
set_member(iItem, m_Custom_flNextShellFallTime, 0.0);
UTIL_EjectBrass(pPlayer, WeaponModelShell, 1, 17.0, -12.0, -10.0, 25.0, random_float(65.0, 70.0), random_float(85.0, 90.0));
}
1721363111688.png
 
Сообщения
678
Реакции
579
Предупреждения
8
Помог
9 раз(а)
можешь оффсет с ножа взять
C:
private:
    TraceResult m_trHit;
    unsigned short m_usKnife;

#ifdef REGAMEDLL_API
    float m_flStabBaseDamage;
    float m_flSwingBaseDamage;
    float m_flSwingBaseDamage_Fast;

    float m_flStabDistance;
    float m_flSwingDistance;

    float m_flBackStabMultiplier;
#endif
Это приватные мемберы и недоступны для других оружей.
 
Сообщения
78
Реакции
7
BalbuR, само собой это не автоматическое оружие, а болтовка. Иначе бы я и голову не ломал с постфреймом и метками.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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