Drop Grenades

Drop Grenades 1.0.2

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

enum {
    GRENADE_HEGRENADE,
    GRENADE_FLASHBANG,
    GRENADE_SMOKEGRENADE,
    MAX_GRENADES,
}

new const GRENADES_WORLD_MODEL[MAX_GRENADES][] = {
    "models/w_hegrenade.mdl",
    "models/w_flashbang.mdl",
    "models/w_smokegrenade.mdl",
}

new g_iCvar_CanDropGrenade[MAX_GRENADES]
new Float:mp_item_staytime

public plugin_init() {
    register_plugin("Drop Grenades", "1.0.3", "fl0wer")

    RegisterHookChain(RG_CBasePlayer_DropPlayerItem, "@CBasePlayer_DropPlayerItem_Pre", false)
    RegisterHam(Ham_Touch, "weaponbox", "@CWeaponBox_Touch_Pre", false)

    new grenades[][] = {
        "weapon_hegrenade",
        "weapon_flashbang",
        "weapon_smokegrenade",
    }

    for (new i = 0; i < sizeof(grenades); i++) {
        RegisterHam(Ham_CS_Item_CanDrop, grenades[i], "@CGrenade_Item_CanDrop_Pre", false)
    }

    bind_pcvar_num(
        create_cvar(
            "amx_candrop_hegrenade", "1", _, "Player can drop HE grenade. (Default: 1)",
            true, 0.0, true, 1.0
        ),
        g_iCvar_CanDropGrenade[GRENADE_HEGRENADE]
    )
    bind_pcvar_num(
        create_cvar(
            "amx_candrop_flasbang", "1", _, "Player can drop flashbang. (Default: 1)",
            true, 0.0, true, 1.0
        ),
        g_iCvar_CanDropGrenade[GRENADE_FLASHBANG]
    )
    bind_pcvar_num(
        create_cvar(
            "amx_candrop_smokegrenade", "1", _, "Player can drop smoke grenade. (Default: 1)",
            true, 0.0, true, 1.0
        ),
        g_iCvar_CanDropGrenade[GRENADE_SMOKEGRENADE]
    )
    bind_pcvar_float(get_cvar_pointer("mp_item_staytime"), mp_item_staytime)
}

public plugin_precache() {
    for (new i = 0; i < sizeof(GRENADES_WORLD_MODEL); i++) {
        precache_model(GRENADES_WORLD_MODEL[i])
    }
}

@CGrenade_Item_CanDrop_Pre(id) {
    new player = get_member(id, m_pPlayer)
    new primaryAmmoType = get_member(id, m_Weapon_iPrimaryAmmoType)
    if (get_member(player, m_rgAmmo, primaryAmmoType) <= 0) {
        return HAM_IGNORED
    }
    new WeaponIdType:weaponId = get_member(id, m_iId)
    new mappedWeapon = mapFromWeaponId(weaponId)
    if (mappedWeapon == -1 || !g_iCvar_CanDropGrenade[mappedWeapon]) {
        return HAM_IGNORED
    }
    SetHamReturnInteger(true)
    return HAM_OVERRIDE
}

@CBasePlayer_DropPlayerItem_Pre(id, itemName[]) {
    // check alive
    if (strlen(itemName)) {
        return HC_CONTINUE
    }
    new weapon = get_member(id, m_pActiveItem)
    if (is_nullent(weapon)) {
        return HC_CONTINUE
    }
    new WeaponIdType:weaponId = get_member(weapon, m_iId)
    new mappedWeapon = mapFromWeaponId(weaponId)
    if (mappedWeapon == -1) {
        return HC_CONTINUE
    }
    if (!g_iCvar_CanDropGrenade[mappedWeapon]) {
        return HC_CONTINUE
    }
    new primaryAmmoType = get_member(weapon, m_Weapon_iPrimaryAmmoType)
    new ammo = get_member(id, m_rgAmmo, primaryAmmoType)
    if (ammo <= 1) {
        return HC_CONTINUE
    }
    new Float:vecOrigin[3]
    new Float:vecAngles[3]
    new Float:vecVelocity[3]
    new Float:vecViewForward[3]
    get_entvar(id, var_origin, vecOrigin)
    get_entvar(id, var_angles, vecAngles)
    angle_vector(vecAngles, ANGLEVECTOR_FORWARD, vecViewForward)
    for (new i = 0; i < 3; i++) {
        vecOrigin[i] += vecViewForward[i] * 10.0
        vecVelocity[i] = vecViewForward[i] * 400.0
    }
    new weaponBox = CreateWeaponBox(
        id,
        GRENADES_WORLD_MODEL[mappedWeapon],
        vecOrigin,
        vecAngles,
        vecVelocity,
        mp_item_staytime
    )
    if (weaponBox) {
        set_entvar(weaponBox, var_iuser1, weaponId)
        set_member(id, m_rgAmmo, ammo - 1, primaryAmmoType)
    }
    SetHookChainReturn(ATYPE_INTEGER, NULLENT)
    return HC_SUPERCEDE
}

CreateWeaponBox(player, const modelName[], Float:vecOrigin[3], Float:vecAngles[3], Float:vecVelocity[3], Float:lifeTime) {
    new id = rg_create_entity("weaponbox", true)
    if (id) {
        vecAngles[0] = 0.0
        vecAngles[2] = 0.0
        set_entvar(id, var_movetype, MOVETYPE_TOSS)
        set_entvar(id, var_solid, SOLID_TRIGGER)
        set_entvar(id, var_owner, player)
        set_entvar(id, var_origin, vecOrigin)
        set_entvar(id, var_angles, vecAngles)
        set_entvar(id, var_velocity, vecVelocity)
        set_entvar(id, var_nextthink, get_gametime() + lifeTime)
        SetThink(id, "@CWeaponBox_Kill")
        engfunc(EngFunc_SetSize, id, NULL_VECTOR, NULL_VECTOR)
        engfunc(EngFunc_SetModel, id, modelName)
        set_member(id, m_WeaponBox_bIsBomb, false)
    }
    return id
}

@CWeaponBox_Kill(id) {
    set_entvar(id, var_flags, FL_KILLME)
}

@CWeaponBox_Touch_Pre(id, other) {
    if (!(get_entvar(id, var_flags) & FL_ONGROUND)) {
        return HAM_IGNORED
    }
    if (!is_user_alive(other)) {
        return HAM_IGNORED
    }
    if (get_member(other, m_bIsVIP) || get_member(other, m_bShieldDrawn)) {
        return HAM_IGNORED
    }
    new WeaponIdType:weaponId = get_entvar(id, var_iuser1)
    if (weaponId == WEAPON_NONE) {
        return HAM_IGNORED
    }
    new ammoType = rg_get_weapon_info(weaponId, WI_AMMO_TYPE)
    new maxRounds = rg_get_weapon_info(weaponId, WI_MAX_ROUNDS)
    if (get_member(other, m_rgAmmo, ammoType) < maxRounds) {
        new name[32]
        rg_get_weapon_info(weaponId, WI_NAME, name, charsmax(name))
        rg_give_item(other, name)

        SetTouch(id, "")
        set_entvar(id, var_flags, FL_KILLME)
    }
    return HAM_SUPERCEDE
}

mapFromWeaponId(WeaponIdType:weaponId) {
    switch (weaponId) {
        case WEAPON_HEGRENADE: {
            return GRENADE_HEGRENADE
        }
        case WEAPON_FLASHBANG: {
            return GRENADE_FLASHBANG
        }
        case WEAPON_SMOKEGRENADE: {
            return GRENADE_SMOKEGRENADE
        }
    }
    return -1
}
Назад
Верх