Авторежим для пистолета на <reapi>

Сообщения
67
Реакции
18
Приветствую!
Наткнулся на плагин пистолета М1911 реапишный, решил немного его модернизировать - добавить автоматический режим стрельбы на ПКМ.
Задумка получилась, но появилась проблема и вопрос, по которым прошу помощи.

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

Вопрос: У меня не получилось никак ускорить темп стрельбы шквальным огнём (пытался сделать через set_member(id, m_flNextAttack, 0.01)), но похоже он берёт это значение относительно дефолтной пушки и ниже не опускается(пробовал даже отрицательные значения ставить - без изменений) Как мне ускорить темп стрельбы?

Сделал видеодемонстрацию работы.

Код:
Код:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#include <reapi>
#include <weapons>

#define ID_M1911A1 7634198
#define STRN_M1911A1 "weapon_m1911a1"
#define CLIP_M1911A1 8
#define MAXAMMO_M1911A1 100

enum
{
    ANIM_IDLE,
    ANIM_IDLE_EMPTY,
    ANIM_SHOOT1,
    ANIM_SHOOT2,
    ANIM_SHOOT_EMPTY,
    ANIM_RELOAD,
    ANIM_RELOAD_EMPTY,
    ANIM_DRAW,
    ANIM_DRAW_EMPTY
}

new const WEAPON_REFERENCE[] =             "weapon_fiveseven";

#define VIEWMODEL "models/cso/v_m1911a1.mdl"
#define WEAPONMODEL "models/cso/p_m1911a1.mdl"
#define WORLDMODEL "models/cso/w_m1911a1.mdl"
#define SHOOTSOUND "weapons/COLTM1911/coltm1911a1-1.wav"

new pPlayer, pEntity, HookChain:TakeDamage

public plugin_precache()
{
    engfunc(EngFunc_PrecacheSound, SHOOTSOUND)
    engfunc(EngFunc_PrecacheGeneric, "sound/weapons/COLTM1911/coltm1911a1_clipin.wav")
    engfunc(EngFunc_PrecacheGeneric, "sound/weapons/COLTM1911/coltm1911a1_clipout.wav")
    engfunc(EngFunc_PrecacheGeneric, "sound/weapons/COLTM1911/coltm1911a1_slideback.wav")
    engfunc(EngFunc_PrecacheModel, VIEWMODEL)
    engfunc(EngFunc_PrecacheModel, WEAPONMODEL)
    engfunc(EngFunc_PrecacheModel, WORLDMODEL)
    engfunc(EngFunc_PrecacheGeneric, "sprites/406/640hud7.spr")
    engfunc(EngFunc_PrecacheGeneric, "sprites/406/640hud114.spr")
    engfunc(EngFunc_PrecacheGeneric, "sprites/weapon_m1911a1.txt")
}

public plugin_init()
{
    register_plugin("Weapon: M1911 A1", "16.11.2018", "406")
    RegisterHam(Ham_Item_Deploy, WEAPON_REFERENCE, "fw_ItemDeployPre")
    RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_REFERENCE, "fw_WeaponPrimaryAttackPre")
    RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_REFERENCE, "fw_Weapon_SecondaryAttack")
    RegisterHam(Ham_Weapon_Reload, WEAPON_REFERENCE, "fw_WeaponReloadPre")
    RegisterHam(Ham_Item_AddToPlayer, WEAPON_REFERENCE, "fw_ItemAddToPlayerPost", 1)
    RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_REFERENCE, "fw_WeaponWeaponIdlePost", 1)
    register_forward(FM_UpdateClientData, "fm_UpdateClientDataPost", 1)
    RegisterHookChain(RG_CWeaponBox_SetModel, "rg_CWeaponBoxSetModelPre")
    TakeDamage = RegisterHookChain(RG_CBasePlayer_TakeDamage, "rg_CBasePlayerTakeDamagePre")
    DisableHookChain(TakeDamage)
    register_clcmd("    ", "give_m1911a1")
    register_clcmd("say /m1911", "give_m1911a1")
    register_clcmd(STRN_M1911A1, "lastinv_m1911a1")
}

public give_m1911a1(player)
{
    if(!is_user_alive(player)) return
    pEntity = rg_give_custom_item(player, WEAPON_REFERENCE, GT_DROP_AND_REPLACE, ID_M1911A1)
    set_member(pEntity, m_Weapon_iClip, CLIP_M1911A1),   
    set_member(pEntity, m_Weapon_bHasSecondaryAttack, true)
    rg_set_iteminfo(pEntity, ItemInfo_iMaxClip, CLIP_M1911A1)
    if(get_member(player, m_rgAmmo, AMMOID_FIVESEVEN) < MAXAMMO_M1911A1)
    set_member(player, m_rgAmmo, MAXAMMO_M1911A1, AMMOID_FIVESEVEN)
}

public rg_CWeaponBoxSetModelPre(entity, const szModelName[])
{
    pEntity = get_member(entity, m_WeaponBox_rgpPlayerItems, PISTOL_SLOT)
    if(is_entity(pEntity) && get_entvar(pEntity, var_impulse) == ID_M1911A1)
    SetHookChainArg(2, ATYPE_STRING, WORLDMODEL)
}

public fw_WeaponWeaponIdlePost(entity)
{
    if(get_entvar(entity, var_impulse) != ID_M1911A1 || get_member(entity, m_Weapon_flTimeWeaponIdle) > 0.0) return
    set_entvar(get_member(entity, m_pPlayer), var_weaponanim, ANIM_IDLE_EMPTY)
    set_member(entity, m_Weapon_flTimeWeaponIdle, 99999.0)
}

public fw_ItemAddToPlayerPost(entity, player)
{
    new iCustom = get_entvar(entity, var_impulse)
    if(iCustom && (iCustom != ID_M1911A1)) return
    SendWeaponList(player, (iCustom != ID_M1911A1) ? WEAPON_REFERENCE : STRN_M1911A1, AMMOID_FIVESEVEN, MAXAMMO_FIVESEVEN, SLOT_SECONDARY, POSITION_FIVESEVEN, ID_FIVESEVEN)
}

public fw_ItemDeployPre(entity)
{
    pPlayer = get_member(entity, m_pPlayer)
    if(get_member(pPlayer, m_pLastItem) == entity)
    {
        set_entvar(pPlayer, var_viewmodel, VIEWMODEL)
        set_entvar(pPlayer, var_weaponmodel, WEAPONMODEL)
        return HAM_SUPERCEDE
    }
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    ExecuteHam(Ham_Item_Deploy, entity)
    set_entvar(pPlayer, var_viewmodel, VIEWMODEL)
    set_entvar(pPlayer, var_weaponmodel, WEAPONMODEL)
    SendWeaponAnim(pPlayer, get_member(entity, m_Weapon_iClip) ? ANIM_DRAW : ANIM_DRAW_EMPTY)
    // set_member(pPlayer, m_flNextAttack, 0.9)
    set_member(entity, m_Weapon_flTimeWeaponIdle, 0.9)
    return HAM_SUPERCEDE
}

public fw_WeaponReloadPre(entity)
{
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    new iClip = get_member(entity, m_Weapon_iClip)
    pPlayer = get_member(entity, m_pPlayer)
    if(iClip >= CLIP_M1911A1 || !get_member(pPlayer, m_rgAmmo, AMMOID_FIVESEVEN)) return HAM_SUPERCEDE
    ExecuteHam(Ham_Weapon_Reload, entity)
    // set_member(pPlayer, m_flNextAttack, 2.23)
    set_member(entity, m_Weapon_flTimeWeaponIdle, 2.23)
    set_entvar(pPlayer, var_weaponanim, iClip ? ANIM_RELOAD : ANIM_RELOAD_EMPTY)
    return HAM_SUPERCEDE
}

public fw_WeaponPrimaryAttackPre(entity)
{
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    if(get_member(entity, m_Weapon_iShotsFired)) return HAM_SUPERCEDE
    static iClip, iTraceLine, iPlaybackEvent
    iClip = get_member(entity, m_Weapon_iClip)
    if(iClip)
    {
        iTraceLine = register_forward(FM_TraceLine, "fm_TraceLinePost", 1)
        iPlaybackEvent = register_forward(FM_PlaybackEvent, "fm_PlaybackEventPre")
        EnableHookChain(TakeDamage)
    }
    ExecuteHam(Ham_Weapon_PrimaryAttack, entity)
    if(!iClip) return HAM_SUPERCEDE
    unregister_forward(FM_TraceLine, iTraceLine, 1)
    unregister_forward(FM_PlaybackEvent, iPlaybackEvent)
    DisableHookChain(TakeDamage)
    
    // set_member(entity, m_Weapon_flTimeWeaponIdle, 1.033),
    pPlayer = get_member(entity, m_pPlayer)
    rh_emit_sound2(pPlayer, 0, CHAN_WEAPON, SHOOTSOUND)
    set_entvar(pPlayer, var_weaponanim, iClip == 1 ? ANIM_SHOOT_EMPTY : iClip & 1 ? ANIM_SHOOT1 : ANIM_SHOOT2)
    return HAM_SUPERCEDE
}

public fw_Weapon_SecondaryAttack(entity)
{   
    new id = entity_get_edict(entity, EV_ENT_owner)
    set_pdata_int(entity,64,0,4),
    set_member(id, m_flNextAttack, 0.01)
    ExecuteHamB(Ham_Weapon_PrimaryAttack, find_ent_by_owner(-1, WEAPON_REFERENCE, id))
}

public fm_TraceLinePost(Float:vecStart[3], Float:vecEnd[3], noMonsters, pentToSkip, iTrace)
{
    if(noMonsters) return
    if(!GunshotDecalTrace(iTrace, true)) return
    get_tr2(iTrace, TR_vecEndPos, vecEnd)
    get_tr2(iTrace, TR_vecPlaneNormal, vecStart)
    CreateSmoke(SMOKE_WALLPUFF, vecEnd, vecStart, 0.5, Float:{40.0, 40.0, 40.0})
}

public fm_PlaybackEventPre() return FMRES_SUPERCEDE
public lastinv_m1911a1(player) engclient_cmd(player, WEAPON_REFERENCE)
public rg_CBasePlayerTakeDamagePre(victim, inflictor, attacker, Float:flDamage) SetHookChainArg(4, ATYPE_FLOAT, flDamage * 2.0)

public fm_UpdateClientDataPost(player, sendWeapons, cd)
{
    if(!is_user_alive(player)) return
    pEntity = get_member(player, m_pActiveItem)
    if(is_entity(pEntity) && get_entvar(pEntity, var_impulse) == ID_M1911A1)
    set_cd(cd, CD_flNextAttack, 99999.0)
}
На всякий случай прикладываю инклуды.
 

Download all Attachments

Сообщения
857
Реакции
532
Помог
13 раз(а)
для того чтобы убрать блокировку стрельбы до отжатия ЛКМ и сделать ее в режим автомата
Код:
set_member(entity, m_Weapon_iShotsFired, 0);


как минимум к
Код:
set_member(id, m_flNextAttack, 0.01)
добавить
Код:
set_member(entity, m_Weapon_flTimeWeaponIdle, 0.01);
set_member(entity, m_Weapon_flNextPrimaryAttack, 0.01);
set_member(entity, m_Weapon_flNextSecondaryAttack, 0.01);
 
Сообщения
67
Реакции
18
BalbuR,
для того чтобы убрать блокировку стрельбы до отжатия ЛКМ и сделать ее в режим автомата
Код:
set_member(entity, m_Weapon_iShotsFired, 0);
как минимум к
Код:
set_member(id, m_flNextAttack, 0.01)
добавить
Код:
set_member(entity, m_Weapon_flTimeWeaponIdle, 0.01);
set_member(entity, m_Weapon_flNextPrimaryAttack, 0.01);
set_member(entity, m_Weapon_flNextSecondaryAttack, 0.01);

Но я по сути сделал это уже 64 оффсетом в fw_Weapon_SecondaryAttack1720361219826.png
set_pdata_int(entity,64,0,4)
По итогу, функция вторичного огня, должна выглядеть так?

Код:
public fw_Weapon_SecondaryAttack(entity)
{   
    new id = entity_get_edict(entity, EV_ENT_owner)
    set_member(entity, m_Weapon_iShotsFired, 0),
    set_member(id, m_flNextAttack, 0.01),
    set_member(entity, m_Weapon_flTimeWeaponIdle, 0.01),
    set_member(entity, m_Weapon_flNextPrimaryAttack, 0.01),
    set_member(entity, m_Weapon_flNextSecondaryAttack, 0.01)
    ExecuteHamB(Ham_Weapon_PrimaryAttack, find_ent_by_owner(-1, WEAPON_REFERENCE, id))
}
Если так, то тестанул - ничего не поменялось.
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
я бы так попробовал для начала

C++:
public fw_Weapon_SecondaryAttack(entity)
{   
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    
    set_member(entity, m_Weapon_iShotsFired, 0);
    fw_WeaponPrimaryAttackPre(entity);
    set_member(entity, m_Weapon_flTimeWeaponIdle, 0.01);
    set_member(entity, m_Weapon_flNextPrimaryAttack, 0.01);
    set_member(entity, m_Weapon_flNextSecondaryAttack, 0.01);
    return HAM_SUPERCEDE;
}
 
Сообщения
67
Реакции
18
BalbuR, благодарю, работает. Теперь уже темп стрельбы я подкорректирую к реальным параметрам.
Но проблема с перезарядкой пока ещё есть, какую проверку мне из fw_WeaponPrimaryAttackPre необходимо добавить, подскажи пожалуйста?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
хука PostFrame'а в исходнике не было?
 
Сообщения
67
Реакции
18
хука PostFrame'а в исходнике не было?
Я бы не стал удалять Ham_Item_PostFrame, если ты о нём)

Исходник:

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

#define ID_M1911A1 7634198
#define STRN_M1911A1 "weapon_m1911a1"
#define CLIP_M1911A1 8
#define MAXAMMO_M1911A1 100

enum
{
    ANIM_IDLE,
    ANIM_IDLE_EMPTY,
    ANIM_SHOOT1,
    ANIM_SHOOT2,
    ANIM_SHOOT_EMPTY,
    ANIM_RELOAD,
    ANIM_RELOAD_EMPTY,
    ANIM_DRAW,
    ANIM_DRAW_EMPTY
}

#define VIEWMODEL "models/406/v_m1911a1.mdl"
#define WEAPONMODEL "models/406/p_m1911a1.mdl"
#define WORLDMODEL "models/406/w_m1911a1.mdl"
#define SHOOTSOUND "weapons/406/coltm1911a1-1.wav"

new pPlayer, pEntity, HookChain:TakeDamage

public plugin_precache()
{
    engfunc(EngFunc_PrecacheSound, SHOOTSOUND)
    engfunc(EngFunc_PrecacheGeneric, "sound/weapons/406/coltm1911a1_clipin.wav")
    engfunc(EngFunc_PrecacheGeneric, "sound/weapons/406/coltm1911a1_clipout.wav")
    engfunc(EngFunc_PrecacheGeneric, "sound/weapons/406/coltm1911a1_slideback.wav")
    engfunc(EngFunc_PrecacheModel, VIEWMODEL)
    engfunc(EngFunc_PrecacheModel, WEAPONMODEL)
    engfunc(EngFunc_PrecacheModel, WORLDMODEL)
    engfunc(EngFunc_PrecacheGeneric, "sprites/406/640hud7.spr")
    engfunc(EngFunc_PrecacheGeneric, "sprites/406/640hud114.spr")
    engfunc(EngFunc_PrecacheGeneric, "sprites/weapon_m1911a1.txt")
}

public plugin_init()
{
    register_plugin("Weapon: M1911 A1", "16.11.2018", "406")
    RegisterHam(Ham_Item_Deploy, STRN_FIVESEVEN, "fw_ItemDeployPre")
    RegisterHam(Ham_Weapon_PrimaryAttack, STRN_FIVESEVEN, "fw_WeaponPrimaryAttackPre")
    RegisterHam(Ham_Weapon_Reload, STRN_FIVESEVEN, "fw_WeaponReloadPre")
    RegisterHam(Ham_Item_AddToPlayer, STRN_FIVESEVEN, "fw_ItemAddToPlayerPost", 1)
    RegisterHam(Ham_Weapon_WeaponIdle, STRN_FIVESEVEN, "fw_WeaponWeaponIdlePost", 1)
    register_forward(FM_UpdateClientData, "fm_UpdateClientDataPost", 1)
    RegisterHookChain(RG_CWeaponBox_SetModel, "rg_CWeaponBoxSetModelPre")
    TakeDamage = RegisterHookChain(RG_CBasePlayer_TakeDamage, "rg_CBasePlayerTakeDamagePre")
    DisableHookChain(TakeDamage)
    register_clcmd("give_m1911a1", "give_m1911a1")
    register_clcmd(STRN_M1911A1, "lastinv_m1911a1")
}

public give_m1911a1(player)
{
    if(!is_user_alive(player)) return
    pEntity = rg_give_custom_item(player, STRN_FIVESEVEN, GT_DROP_AND_REPLACE, ID_M1911A1)
    set_member(pEntity, m_Weapon_iClip, CLIP_M1911A1)
    rg_set_iteminfo(pEntity, ItemInfo_iMaxClip, CLIP_M1911A1)
    if(get_member(player, m_rgAmmo, AMMOID_FIVESEVEN) < MAXAMMO_M1911A1)
    set_member(player, m_rgAmmo, MAXAMMO_M1911A1, AMMOID_FIVESEVEN)
}

public rg_CWeaponBoxSetModelPre(entity, const szModelName[])
{
    pEntity = get_member(entity, m_WeaponBox_rgpPlayerItems, PISTOL_SLOT)
    if(is_entity(pEntity) && get_entvar(pEntity, var_impulse) == ID_M1911A1)
    SetHookChainArg(2, ATYPE_STRING, WORLDMODEL)
}

public fw_WeaponWeaponIdlePost(entity)
{
    if(get_entvar(entity, var_impulse) != ID_M1911A1 || get_member(entity, m_Weapon_flTimeWeaponIdle) > 0.0) return
    set_entvar(get_member(entity, m_pPlayer), var_weaponanim, ANIM_IDLE_EMPTY)
    set_member(entity, m_Weapon_flTimeWeaponIdle, 99999.0)
}

public fw_ItemAddToPlayerPost(entity, player)
{
    new iCustom = get_entvar(entity, var_impulse)
    if(iCustom && (iCustom != ID_M1911A1)) return
    SendWeaponList(player, (iCustom != ID_M1911A1) ? STRN_FIVESEVEN : STRN_M1911A1, AMMOID_FIVESEVEN, MAXAMMO_FIVESEVEN, SLOT_SECONDARY, POSITION_FIVESEVEN, ID_FIVESEVEN)
}

public fw_ItemDeployPre(entity)
{
    pPlayer = get_member(entity, m_pPlayer)
    if(get_member(pPlayer, m_pLastItem) == entity)
    {
        set_entvar(pPlayer, var_viewmodel, VIEWMODEL)
        set_entvar(pPlayer, var_weaponmodel, WEAPONMODEL)
        return HAM_SUPERCEDE
    }
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    ExecuteHam(Ham_Item_Deploy, entity)
    set_entvar(pPlayer, var_viewmodel, VIEWMODEL)
    set_entvar(pPlayer, var_weaponmodel, WEAPONMODEL)
    SendWeaponAnim(pPlayer, get_member(entity, m_Weapon_iClip) ? ANIM_DRAW : ANIM_DRAW_EMPTY)
    set_member(pPlayer, m_flNextAttack, 0.9)
    set_member(entity, m_Weapon_flTimeWeaponIdle, 0.9)
    return HAM_SUPERCEDE
}

public fw_WeaponReloadPre(entity)
{
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    new iClip = get_member(entity, m_Weapon_iClip)
    pPlayer = get_member(entity, m_pPlayer)
    if(iClip >= CLIP_M1911A1 || !get_member(pPlayer, m_rgAmmo, AMMOID_FIVESEVEN)) return HAM_SUPERCEDE
    ExecuteHam(Ham_Weapon_Reload, entity)
    set_member(pPlayer, m_flNextAttack, 2.23)
    set_member(entity, m_Weapon_flTimeWeaponIdle, 2.23)
    set_entvar(pPlayer, var_weaponanim, iClip ? ANIM_RELOAD : ANIM_RELOAD_EMPTY)
    return HAM_SUPERCEDE
}

public fw_WeaponPrimaryAttackPre(entity)
{
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    if(get_member(entity, m_Weapon_iShotsFired)) return HAM_SUPERCEDE
    static iClip, iTraceLine, iPlaybackEvent
    iClip = get_member(entity, m_Weapon_iClip)
    if(iClip)
    {
        iTraceLine = register_forward(FM_TraceLine, "fm_TraceLinePost", 1)
        iPlaybackEvent = register_forward(FM_PlaybackEvent, "fm_PlaybackEventPre")
        EnableHookChain(TakeDamage)
    }
    ExecuteHam(Ham_Weapon_PrimaryAttack, entity)
    if(!iClip) return HAM_SUPERCEDE
    unregister_forward(FM_TraceLine, iTraceLine, 1)
    unregister_forward(FM_PlaybackEvent, iPlaybackEvent)
    DisableHookChain(TakeDamage)
    
    set_member(entity, m_Weapon_flTimeWeaponIdle, 1.033)
    set_member(entity, m_Weapon_flNextSecondaryAttack, 99999.0)
    pPlayer = get_member(entity, m_pPlayer)
    rh_emit_sound2(pPlayer, 0, CHAN_WEAPON, SHOOTSOUND)
    set_entvar(pPlayer, var_weaponanim, iClip == 1 ? ANIM_SHOOT_EMPTY : iClip & 1 ? ANIM_SHOOT1 : ANIM_SHOOT2)
    return HAM_SUPERCEDE
}

public fm_TraceLinePost(Float:vecStart[3], Float:vecEnd[3], noMonsters, pentToSkip, iTrace)
{
    if(noMonsters) return
    if(!GunshotDecalTrace(iTrace, true)) return
    get_tr2(iTrace, TR_vecEndPos, vecEnd)
    get_tr2(iTrace, TR_vecPlaneNormal, vecStart)
    CreateSmoke(SMOKE_WALLPUFF, vecEnd, vecStart, 0.5, Float:{40.0, 40.0, 40.0})
}

public fm_PlaybackEventPre() return FMRES_SUPERCEDE
public lastinv_m1911a1(player) engclient_cmd(player, STRN_FIVESEVEN)
public rg_CBasePlayerTakeDamagePre(victim, inflictor, attacker, Float:flDamage) SetHookChainArg(4, ATYPE_FLOAT, flDamage * 2.0)

public fm_UpdateClientDataPost(player, sendWeapons, cd)
{
    if(!is_user_alive(player)) return
    pEntity = get_member(player, m_pActiveItem)
    if(is_entity(pEntity) && get_entvar(pEntity, var_impulse) == ID_M1911A1)
    set_cd(cd, CD_flNextAttack, 99999.0)
}
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
это че такое
set_member(entity, m_Weapon_flNextSecondaryAttack, 99999.0) 🤔

я бы проверил чему равен m_Weapon_fInReload
 
Сообщения
67
Реакции
18
BalbuR, да, я тоже на это вчера обратил внимание и не понял, зачем он там без объявления Ham_Weapon_SecondaryAttack :crazy:
Но учитывая что в fw_WeaponWeaponIdlePost стоит
Код:
set_member(entity, m_Weapon_flTimeWeaponIdle, 99999.0)
Мне кажется что это тоже просто заглушка.

Под релоад там же выставлено в fw_WeaponReloadPre
Код:
set_member(pPlayer, m_flNextAttack, 2.23)
set_member(entity, m_Weapon_flTimeWeaponIdle, 2.23)
m_Weapon_fInReload по сути не используется вообще, нет?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
наверное get_member(entity, m_Weapon_fInReload) ?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
Код:
server_print("Result = %d",  get_member(entity, m_Weapon_fInReload))
 
Сообщения
67
Реакции
18
BalbuR, пардон, только учусь)

Код:
public fw_Weapon_SecondaryAttack(entity)
{   
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED

    server_print("Result = %d",  get_member(entity, m_Weapon_fInReload))

    set_member(entity, m_Weapon_iShotsFired, 0);
    fw_WeaponPrimaryAttackPre(entity);
    set_member(entity, m_Weapon_flTimeWeaponIdle, 0.01);
    set_member(entity, m_Weapon_flNextPrimaryAttack, 0.01);
    set_member(entity, m_Weapon_flNextSecondaryAttack, 0.01);
    return HAM_SUPERCEDE;
}
показания консоли после высадки обоймы в ноль:
1720367734918.png
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
попробуй в fw_WeaponPrimaryAttackPre (138 строка)

PHP:
-if(!iClip) return HAM_SUPERCEDE
+if(!iClip) {
+set_member(entity, m_Weapon_fInReload, 1);
+return HAM_SUPERCEDE
+}
 
Сообщения
67
Реакции
18
BalbuR,))
7 Июл 2024
Ну так то тоже прикольная штука, надо будет придумать применение :crazy:
 
  • Нравится
Реакции: devl
Сообщения
857
Реакции
532
Помог
13 раз(а)
C++:
public fw_WeaponPrimaryAttackPre(entity)
{
    if(get_entvar(entity, var_impulse) != ID_M1911A1) return HAM_IGNORED
    if(get_member(entity, m_Weapon_iShotsFired)) return HAM_SUPERCEDE
    static iClip, iTraceLine, iPlaybackEvent
    iClip = get_member(entity, m_Weapon_iClip)
    if(!iClip)
    {
        ExecuteHam(Ham_Weapon_PlayEmptySound, entity);
        set_member(entity, m_Weapon_flNextPrimaryAttack, 0.45);
        set_member(entity, m_Weapon_fInReload, 1);
        return HAM_SUPERCEDE;
    }

    iTraceLine = register_forward(FM_TraceLine, "fm_TraceLinePost", 1)
    iPlaybackEvent = register_forward(FM_PlaybackEvent, "fm_PlaybackEventPre")
    EnableHookChain(TakeDamage)
    ExecuteHam(Ham_Weapon_PrimaryAttack, entity)
    
    unregister_forward(FM_TraceLine, iTraceLine, 1)
    unregister_forward(FM_PlaybackEvent, iPlaybackEvent)
    DisableHookChain(TakeDamage)
    
    set_member(entity, m_Weapon_flTimeWeaponIdle, 1.033)
    set_member(entity, m_Weapon_flNextSecondaryAttack, 99999.0)
    pPlayer = get_member(entity, m_pPlayer)
    rh_emit_sound2(pPlayer, 0, CHAN_WEAPON, SHOOTSOUND)
    set_entvar(pPlayer, var_weaponanim, iClip == 1 ? ANIM_SHOOT_EMPTY : iClip & 1 ? ANIM_SHOOT1 : ANIM_SHOOT2)
    return HAM_SUPERCEDE
}
 
Сообщения
67
Реакции
18
BalbuR, спрошу на всякий случай, это ведь не на основе исходника из Сообщения исправление, а на основе кода в моём первом сообщении?
А то опять смотрю на это)
Код:
set_member(entity, m_Weapon_flNextSecondaryAttack, 99999.0)
Итс окей? Шлёпаю его в свою переделку?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
BalbuR, спрошу на всякий случай, это ведь не на основе исходника из Сообщения исправление, а на основе кода в моём первом сообщении?
А то опять смотрю на это)
Код:
set_member(entity, m_Weapon_flNextSecondaryAttack, 99999.0)
Итс окей? Шлёпаю его в свою переделку?
не помню откуда взял
могу сказать что автора плохим словом вспоминать буду
7 Июл 2024
Итс окей? Шлёпаю его в свою переделку?
и нет, не надо
это он так пытался заблочить второстепенную атаку (?)
 

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

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