Вопрос: [ZP] Addon Knifes | Задержка ATTACK2 перед уроном

Сообщения
418
Реакции
-7
C++:
if(WEAPON_ANIM_STAB)
{
emit_sound(iPlayer, CHAN_ITEM, hammer_fire_sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
else if(WEAPON_ANIM_STAB_MISS)
{
emit_sound(iPlayer, CHAN_ITEM, hammer_fire_sounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
C++:
const WEAPON_ANIM_STAB = 4
const WEAPON_ANIM_STAB_MISS = 5

const Float: WEAPON_ANIM_STAB_TIME = 0.826
const Float: WEAPON_ANIM_STAB_MISS_TIME = 0.755

Как сделать проверку на то, что игрок нажимает ПКМ по воздуху, воспроизводится звук удара по воздуху?
20 Апр 2023
Если описать данную проблему, которая у меня, то это которая с звуками удара + дабл анимация, если зажать ПКМ
20 Апр 2023
C++:
public fw_WeaponSecondaryAttack(knife)
{
        static iPlayer
        iPlayer = get_pdata_cbase(knife, m_pPlayer, 4)

        if(zp_get_user_zombie(iPlayer) || !g_has_hammer_fire[iPlayer])
        return HAM_IGNORED

        UTIL_SendWeaponAnim(MSG_ONE, iPlayer, WEAPON_ANIM_STAB)
        UTIL_SendWeaponAnim(MSG_ONE, iPlayer, WEAPON_ANIM_STAB_MISS)

        set_pdata_float(iPlayer, m_flNextAttack, 0.5)
        set_pdata_int(knife, m_iWeaponState, true, 4)

        return HAM_SUPERCEDE
}
public fw_ItemPostFrame(knife)
{
        static iPlayer
        iPlayer = get_pdata_cbase(knife, m_pPlayer, 4)

        static Float:flTime
        flTime = WEAPON_ANIM_STAB_TIME

        if(zp_get_user_zombie(iPlayer) || !g_has_hammer_fire[iPlayer])
        return HAM_IGNORED

        if(!get_pdata_int(knife, m_iWeaponState, 4))
        return HAM_IGNORED

        if(is_user_connected(iPlayer))
        {
                new FmHook_EmitSound_Pre = register_forward(FM_EmitSound, "CEntity__EmitSound", false);

                EnableHamForward(g_HamHook_SendWeaponAnim_Pre)
                ExecuteHam(Ham_Weapon_SecondaryAttack, knife)
                DisableHamForward(g_HamHook_SendWeaponAnim_Pre)
                unregister_forward(FM_EmitSound, FmHook_EmitSound_Pre, false)

                if(WEAPON_ANIM_STAB)
                emit_sound(iPlayer, CHAN_ITEM, hammer_fire_sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
                else if(WEAPON_ANIM_STAB_MISS)
                emit_sound(iPlayer, CHAN_ITEM, hammer_fire_sounds[4], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

                set_pdata_int(knife, m_iWeaponState, false, 4)
                set_pdata_float(iPlayer, m_flNextSecondaryAttack, 1.0)
                set_pdata_float(knife, m_flTimeWeaponIdle, flTime, 4)
        }
        return HAM_IGNORED
}
20 Апр 2023
Мне кажется отрывок с FmHook_EmitSound_Pre до unregister_forward(FM_EmitSound, FmHook_EmitSound_Pre, false) отстой полный, можно его как-то оптимизировать что-ли?
20 Апр 2023
Ruby можно было и не ставить "Не нравится" :(
 
Последнее редактирование:
  • Не нравится
Реакции: Ruby
Сообщения
855
Реакции
532
Помог
13 раз(а)
@steelzzz,вопрос к тебе, при нажатии ПКМ дабл анимация проходит, что это может быть?
нужно блочить атаку , когда в первый раз происходит нажатие, потом перед вызовом из постфрейма снимать блокировку
 
Сообщения
418
Реакции
-7
@BalbuR,подскажи пожалуйста как? Я часа 4 уже пытаюсь, всё никак, только приблизительный вариант - этот, который выше был
 
Сообщения
418
Реакции
-7
Тот момент с 1) после блокируешь атаку в PrimaryAttack проверкой на бит/статус ?
20 Апр 2023
C++:
public fw_WeaponSecondaryAttack(knife)
{
        static iPlayer
        iPlayer = get_pdata_cbase(knife, m_pPlayer, 4)

        if(zp_get_user_zombie(iPlayer) || !g_has_hammer_fire[iPlayer])
        return HAM_IGNORED

        UTIL_SendWeaponAnim(MSG_ONE, iPlayer, WEAPON_ANIM_STAB)

        set_pdata_float(iPlayer, m_flNextAttack, 0.5)
        set_pdata_int(knife, m_iWeaponState, true, 4)

        return HAM_SUPERCEDE
}

public fw_ItemPostFrame(knife)
{
        static iPlayer
        iPlayer = get_pdata_cbase(knife, m_pPlayer, 4)

        static Float:flTime
        flTime = WEAPON_ANIM_STAB_TIME

        if(zp_get_user_zombie(iPlayer) || !g_has_hammer_fire[iPlayer])
        return HAM_IGNORED

    if(!get_pdata_int(knife, m_iWeaponState, 4))
    return HAM_IGNORED

        if(is_user_connected(iPlayer))
        {
                new FmHook_EmitSound_Pre = register_forward(FM_EmitSound, "CEntity__EmitSound", false);

                EnableHamForward(g_HamHook_SendWeaponAnim_Pre)
                ExecuteHam(Ham_Weapon_SecondaryAttack, knife)
                DisableHamForward(g_HamHook_SendWeaponAnim_Pre)
                unregister_forward(FM_EmitSound, FmHook_EmitSound_Pre, false)

                emit_sound(iPlayer, CHAN_ITEM, hammer_fire_sounds[5], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

                set_pdata_int(knife, m_iWeaponState, false, 4)
                set_pdata_float(iPlayer, m_flNextSecondaryAttack, 1.0)
                set_pdata_float(knife, m_flTimeWeaponIdle, flTime, 4)
        }

        return HAM_IGNORED
}
так всё же прописано, что указано..... не понимаю..
20 Апр 2023
Логика следующая
1) Записываешь статус что атака была начата (в какой-нибудь пев или iWeaponState мембер, если знаешь что такое биты) в PrimaryAttack, записываешь время начала атаки, после блокируешь атаку в PrimaryAttack проверкой на бит/статус
2) в PostFrame оружия проверяешь бит и время начала атаки, сравниваешь время атаки + время задержки против текущего времени и если оно подошло к концу вызываешь атаку вручную (или же пишешь свой тип атаки) ExecuteHamB(Ham_Weapon_PrimaryAttack, iWeapon); Снимаешь бит/статус атаки и время ее начала. Можешь еще добавить время эффекта пост атаки (будет говорить о том, что след.атаку нельзя провести пока не закончится анимация)
3) Желательно не использовать flNextAttack оффсет на игроке, т.к. он блокирует работу PostFrame оружия (только там где это действительно необходимо)
4) Снимаешь статус/бит атаки и время на deploy/holster
deploy/holster отсутствуют:)
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
тебе не требуется хукать звук
тебе нужен только secondaryattack и постфрейм хуки
накидал набросок, последовательность пронумеровал
***upd , обновил
PHP:
#define bitsDelayedAttack (1<<6) // флаг что запущена атака с задержкой
#define var_flDelayedAttack var_button // тут храним таймер
public fw_SecondaryAttack(iWeapon)
{

    static Float:flDelayedAttack; flDelayedAttack = Float:get_entvar(iWeapon, var_flDelayedAttack);
    // только начали атаковать (бит не стоит, значит не начали)
    if (~get_member(iWeapon, m_Weapon_iWeaponState) & bitsDelayedAttack) { // Шаг 1
        //задаем бит(что мы начали атаку и время до момента нужного для атаки)
        set_member(iWeapon, m_Weapon_iWeaponState, get_member(iWeapon, m_Weapon_iWeaponState) | bitsDelayedAttack);
        set_entvar(iWeapon, var_flDelayedAttack, get_gametime() + 0.5); // 0.5 - время задержки
        return HAM_SUPERCEDE;// блокируем оригинальную атаку, чтобы нанести уже с задержкой
    }
    else { // Шаг 4
        if (flDelayedAttack) {
      
            if(flDelayedAttack < get_gametime()) {
                // Момент начала атаки из постфрейма
                // вызовется оригинальная функция
               
                // upd***
                set_member(iWeapon, m_Weapon_iWeaponState, get_member(iWeapon, m_Weapon_iWeaponState) & ~bitsDelayedAttack);
                set_entvar(iWeapon, var_flDelayedAttack, 0.0); // тут же снимаем все флаги и таймеры
                // upd end**
                 return HAM_IGNORED;
            }
        }
    }
    return HAM_SUPERCEDE;
}


public fw_PostFrame(iWeapon)
{
    if (get_member(iWeapon, m_Weapon_iWeaponState) & bitsDelayedAttack) {// Шаг 2
        static Float:flDelayedAttack; flDelayedAttack = Float:get_entvar(iWeapon, var_flDelayedAttack);
       // Проверка что наше время пришло
        if (flDelayedAttack && flDelayedAttack < get_gametime()) { // Шаг 3
            //ExecuteHamB(Ham_Weapon_SecondaryAttack, iWeapon);
            ExecuteHam(Ham_Weapon_SecondaryAttack, iWeapon); // Вызываем без буковки B , так как нам не нужен вызов хука
            //set_member(iWeapon, m_Weapon_iWeaponState, get_member(iWeapon, m_Weapon_iWeaponState) & ~bitsDelayedAttack);
            //set_entvar(iWeapon, var_flDelayedAttack, 0.0); // тут же снимаем все флаги и таймеры
        }
    }
}
 
Последнее редактирование:
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
BalbuR, анимации сломаются при вызове хука.
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
BalbuR, анимации сломаются при вызове хука.
наверное заслать айдл анимацию?
20 Апр 2023
не понял почему он должен сломаться
ты блочишь секондари совсем, анима не засылается
затем в пострейме коллишь секондари и после он уже оригинальную должен вызвать
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
наверное заслать айдл анимацию?
20 Апр 2023
не понял почему он должен сломаться
ты блочишь секондари совсем, анима не засылается
затем в пострейме коллишь секондари и после он уже оригинальную должен вызвать
анимация в оригинальной.
 
Сообщения
855
Реакции
532
Помог
13 раз(а)
твой ответ инфы никакой не дает
на каком моменте он сломается?
на секондари он все равно зашлет аниму хочешь сказать?


upd** нашел где, спасибо
 
Последнее редактирование:
Сообщения
91
Реакции
141
Помог
1 раз(а)
Тот самый вариант (https://dev-cs.ru/resources/1309/), который ты пытаешься уже неделю перенести в свой плагин, только без реапи. Тебе сюда добавить только проверку на твой нож и все, я даже подписал где
 

Вложения

Сообщения
418
Реакции
-7
Тот самый вариант (https://dev-cs.ru/resources/1309/), который ты пытаешься уже неделю перенести в свой плагин, только без реапи. Тебе сюда добавить только проверку на твой нож и все, я даже подписал где
UTIL_SendWeaponAnim( pPlayer, WeaponAnim_Stab );

error 088: number of arguments does not match definition
20 Апр 2023
@RedGamer,понял
 
Сообщения
418
Реакции
-7
Тот самый вариант (https://dev-cs.ru/resources/1309/), который ты пытаешься уже неделю перенести в свой плагин, только без реапи. Тебе сюда добавить только проверку на твой нож и все, я даже подписал где
БЛ.. от души реально, я посмотрел, сделал, РАБОТАЕТ!!! Но, как другие ножи на другую задержку сделать? Напиши мне в вк реквизиты, отправлю тебе 500р за помощь (Очень выручил!)
20 Апр 2023
Остальным тоже огромнейшее спасибо за подсказки)
 
Сообщения
418
Реакции
-7
C++:
const Float: WeaponAnim_Stab_Time = 0.826
const Float: WeaponSecondaryAttackDelay = 0.5

const Float: Weapon_AnimSword_Stab_Time = 1.63
const Float: WeaponSwordSecondaryAttackDelay = 0.63
C++:
public FM_Hook_UpdateClientData_Post( const pPlayer, const iSendWeapons, const CD_Handle )
{
if ( !is_user_alive( pPlayer ) )
  return;

static pActiveItem; pActiveItem = get_pdata_cbase( pPlayer, m_pActiveItem, linux_diff_player );

if ( pev_valid( pActiveItem ) != PDATA_SAFE || get_pdata_int( pActiveItem, m_iId, linux_diff_weapon ) != CSW_KNIFE )
  return;

// свой нож чекай
if(!g_has_hammer_fire[pPlayer] || !g_has_hammer_ice[pPlayer] || !g_has_hammer_poison[pPlayer] || !g_has_demonsword[pPlayer])
return;

set_cd( CD_Handle, CD_flNextAttack, 2.0 );
}

public Ham_CKnife__Deploy_Post( const pItem )
{
if ( pev_valid( pItem ) != PDATA_SAFE )
  return;

new pPlayer = get_pdata_cbase( pItem, m_pPlayer, linux_diff_weapon );
if ( !is_user_alive( pPlayer ) )
  return;

// check player on zombie, if has zombie => return HAM_IGNORED;
if(zp_get_user_zombie(pPlayer))
  return;

// check knife, if not valid => return HAM_IGNORED;
if(!g_has_hammer_fire[pPlayer] || !g_has_hammer_ice[pPlayer] || !g_has_hammer_poison[pPlayer] || !g_has_demonsword[pPlayer])
  return;

set_pdata_int( pItem, m_Weapon_iWeaponState, false, linux_diff_weapon );

return;
}

public Ham_CKnife__PostFrame_Pre( const pItem )
{
if ( pev_valid( pItem ) != PDATA_SAFE )
  return HAM_IGNORED;

static pPlayer; pPlayer = get_pdata_cbase( pItem, m_pPlayer, linux_diff_weapon );
// check player on zombie, if has zombie => return HAM_IGNORED;
if(zp_get_user_zombie(pPlayer))
return HAM_IGNORED

// check knife, if not valid => return HAM_IGNORED;
if(!g_has_hammer_fire[pPlayer] || !g_has_hammer_ice[pPlayer] || !g_has_hammer_poison[pPlayer] || !g_has_demonsword[pPlayer])
return HAM_IGNORED

if ( get_pdata_int( pItem, m_Weapon_iWeaponState, linux_diff_weapon ) && get_pdata_float( pItem, m_Weapon_flNextSecondaryAttack, linux_diff_weapon ) <= 0.0 )
{
  // Call EmitSound forward only for block or change sound to custom

  EnableHamForward( gl_HamHook_SendWeaponAnim_Pre );
  ExecuteHam( Ham_Weapon_SecondaryAttack, pItem );
  DisableHamForward( gl_HamHook_SendWeaponAnim_Pre );

  if(g_has_hammer_fire[pPlayer] || g_has_hammer_ice[pPlayer] || g_has_hammer_poison[pPlayer])
  {
  // set_pdata_int( pItem, m_Weapon_iWeaponState, false, linux_diff_weapon );
  set_pdata_float( pItem, m_Weapon_flNextSecondaryAttack, WeaponAnim_Stab_Time - WeaponSecondaryAttackDelay, linux_diff_weapon );
  }
  else if(g_has_demonsword[pPlayer])
  {
  // set_pdata_int( pItem, m_Weapon_iWeaponState, false, linux_diff_weapon );
  set_pdata_float( pItem, m_Weapon_flNextSecondaryAttack, Weapon_AnimSword_Stab_Time - WeaponSwordSecondaryAttackDelay, linux_diff_weapon );
  }

  set_pdata_int( pItem, m_Weapon_iWeaponState, false, linux_diff_weapon );
}

return HAM_IGNORED;
}

public Ham_CKnife__SecondaryAttack_Pre( const pItem )
{
if ( pev_valid( pItem ) != PDATA_SAFE )
  return HAM_IGNORED;

new pPlayer = get_pdata_cbase( pItem, m_pPlayer, linux_diff_weapon );
if ( !is_user_alive( pPlayer ) )
  return HAM_IGNORED;

// check player on zombie, if has zombie => return HAM_IGNORED;
if(zp_get_user_zombie(pPlayer))
return HAM_IGNORED

// check knife, if not valid => return HAM_IGNORED;
if(!g_has_hammer_fire[pPlayer] || !g_has_hammer_ice[pPlayer] || !g_has_hammer_poison[pPlayer] || !g_has_demonsword[pPlayer])
return HAM_IGNORED

// We already in secondary attack delay
if ( get_pdata_int( pItem, m_Weapon_iWeaponState, linux_diff_weapon ) )
  return HAM_SUPERCEDE;


if(g_has_hammer_fire[pPlayer] || g_has_hammer_ice[pPlayer] || g_has_hammer_poison[pPlayer])
{
// set_pdata_int( pItem, m_Weapon_iWeaponState, true, linux_diff_weapon );
set_pdata_float( pItem, m_Weapon_flTimeWeaponIdle, WeaponAnim_Stab_Time, linux_diff_weapon );
set_pdata_float( pItem, m_Weapon_flNextSecondaryAttack, WeaponSecondaryAttackDelay, linux_diff_weapon );
}
else if(g_has_demonsword[pPlayer])
{
// set_pdata_int( pItem, m_Weapon_iWeaponState, true, linux_diff_weapon );
set_pdata_float( pItem, m_Weapon_flTimeWeaponIdle, Weapon_AnimSword_Stab_Time, linux_diff_weapon );
set_pdata_float( pItem, m_Weapon_flNextSecondaryAttack, WeaponSwordSecondaryAttackDelay, linux_diff_weapon );
}

UTIL_SendWeaponAnim( pPlayer, WeaponAnim_Stab );
set_pdata_int( pItem, m_Weapon_iWeaponState, true, linux_diff_weapon );

return HAM_SUPERCEDE;
}
Проблема, слетела задержка, что здесь не так? | Helper Code t3rkecorejz |
 
Сообщения
418
Реакции
-7
Ап темы (topic up) - поднятие своей темы для привлечения внимания (разрешается 1 раз в 3 дня)
UP
 
Сообщения
418
Реакции
-7
Ап темы (topic up) - поднятие своей темы для привлечения внимания (разрешается 1 раз в 3 дня)
@RedGamer,чё 3 дня не прошло ещё? блин
 
Сообщения
75
Реакции
82
Помог
6 раз(а)
Не верно проверка составлена
Код:
// check knife, if not valid => return HAM_IGNORED;
if(!g_has_hammer_fire[pPlayer] || !g_has_hammer_ice[pPlayer] || !g_has_hammer_poison[pPlayer] || !g_has_demonsword[pPlayer])
    return HAM_IGNORED
 
Сообщения
418
Реакции
-7
Не верно проверка составлена
Код:
// check knife, if not valid => return HAM_IGNORED;
if(!g_has_hammer_fire[pPlayer] || !g_has_hammer_ice[pPlayer] || !g_has_hammer_poison[pPlayer] || !g_has_demonsword[pPlayer])
    return HAM_IGNORED
Воот да, это я определил методом пробы.. подскажи мне пожалуйста, как нужно проверку сделать? Очень сильно прошу
 
Сообщения
75
Реакции
82
Помог
6 раз(а)
Код:
// check knife, if not valid => return HAM_IGNORED;
if(!g_has_hammer_fire[pPlayer] && !g_has_hammer_ice[pPlayer] && !g_has_hammer_poison[pPlayer] && !g_has_demonsword[pPlayer])
    return HAM_IGNORED;
 
Сообщения
418
Реакции
-7
Код:
// check knife, if not valid => return HAM_IGNORED;
if(!g_has_hammer_fire[pPlayer] && !g_has_hammer_ice[pPlayer] && !g_has_hammer_poison[pPlayer] && !g_has_demonsword[pPlayer])
    return HAM_IGNORED;
Серьезно?? Я так и думал сделать так!! Но был не уверен
22 Апр 2023
Серьезно?? Я так и думал сделать так!! Но был не уверен
Но почему через || нельзя?
 

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

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