Pop Grenades

Pop Grenades 2.4

Нет прав для скачивания
Код:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>

// Порядковый номер анимации броска
#define ANIM_NUM         2

enum {
    normal,
    slower,
    medium
};

new const g_GrenadeClassNames[][] = {
    "weapon_flashbang",
    "weapon_hegrenade",
    "weapon_smokegrenade"
};

new const Float:g_VelocityMultiplier[] = {
    1.0,
    0.5,
    0.75
};

new g_HandleThrowType[MAX_CLIENTS + 1];
new Float:g_flLastAttack[MAX_CLIENTS + 1];

public plugin_init() {
    register_plugin("[ReAPI] Pop Grenades", "2.4", "EFFx & HamletEagle & Minni Mouse");

    for(new i; i < sizeof(g_GrenadeClassNames); i++) {
        RegisterHam(Ham_Weapon_SecondaryAttack, g_GrenadeClassNames[i], "Weapon_SecAttack_Pre", .Post = false);
        RegisterHam(Ham_Item_Deploy, g_GrenadeClassNames[i], "Item_Deploy_Pre", .Post = false);
    }

    RegisterHookChain(RG_CBasePlayer_ThrowGrenade, "Player_ThrowGrenade_Pre", .post = false);
}

public Item_Deploy_Pre(pItem) {
    if(!is_nullent(pItem)) {
        g_HandleThrowType[ get_member(pItem, m_pPlayer) ] = normal;
    }

    return HAM_IGNORED;
}

public Weapon_SecAttack_Pre(pWeapon) {
    if(get_member_game(m_bFreezePeriod)) {
        return HAM_IGNORED;
    }

    if(is_nullent(pWeapon)) {
        return HAM_IGNORED;
    }

    static pPlayer, Float:flCurTime;
    pPlayer = get_member(pWeapon, m_pPlayer);
    flCurTime = get_gametime();

    if(g_flLastAttack[pPlayer] > flCurTime) {
        return HAM_IGNORED;
    }

    g_HandleThrowType[pPlayer] = (get_entvar(pPlayer, var_button) & IN_ATTACK) ? medium : slower;

    ExecuteHamB(Ham_Weapon_PrimaryAttack, pWeapon);

    g_flLastAttack[pPlayer] = flCurTime + 1.5;

    return HAM_IGNORED;
}

public Player_ThrowGrenade_Pre(pPlayer, grenade, Float:vecSrc[3], Float:vecThrow[3], Float:time, usEvent) {
    if(is_nullent(grenade)) {
        return HC_CONTINUE;
    }

    new Float:flMultiplier = g_VelocityMultiplier[g_HandleThrowType[pPlayer]];

    vecThrow[0] *= flMultiplier;
    vecThrow[1] *= flMultiplier;
    vecThrow[2] *= flMultiplier;

    set_entvar(grenade, var_velocity, vecThrow);

    if(g_HandleThrowType[pPlayer] == slower) {
        rg_send_grenade_anim(pPlayer, ANIM_NUM);
    }

    g_HandleThrowType[pPlayer] = normal;

    return HC_CONTINUE;
}

stock rg_send_grenade_anim(const pPlayer, const iAnimation) {
    set_entvar(pPlayer, var_weaponanim, iAnimation);

    message_begin(MSG_ONE, SVC_WEAPONANIM, .player = pPlayer);
    write_byte(iAnimation);
    write_byte(0);
    message_end();
}
Назад
Верх