Участник
Пользователь
- Сообщения
- 67
- Реакции
- 18
Доброго времени, захотелось улучшить некоторое кастомное оружие, не имеющего активного действия на ПКМ возможностью менять режим огня, как у автомата FAMAS у КТ или пистолета Glock-19 у ТТ. Начал искать реализацию, наткнулся на один плагин пулемёта ПКМ из CSO, где ввинтили следующую реализацию (буду комментировать, чтобы проверить своё понимание):
Как я понял, здесь улавливается количество патронов в строгой верхней ограниченности (150 по исходному квару) и уже от этого числа начинаются танцы по мере отсчёта трёх пуль. Реализация, конечно, мне понравилась, но всё же кажется немного дубовой.
Вопрос: Есть ли ещё варианты реализации стрельбы по три/два патрона, кроме как в приведённом выше примере? Может уже есть какой нибудь форвард в ReAPI для этого?
Код:
//Создание переменной смена режима стрельбы
new g_mode[33]
//Собственно, функция, отвечающая за смену режима стрельба (через старый, добрый и немножечко тяжёлый форвард FM_CmdStart)
public fw_CmdStart(id, uc_handle, seed)
{
if(!g_isalive[id] || !g_has_pkm[id] || get_user_weapon(id) != CSW_M249)
return PLUGIN_HANDLED
static button; button = get_uc(uc_handle, UC_Buttons)
static oldbutton; oldbutton = pev(id, pev_oldbuttons)
if((button & IN_ATTACK2) && !(oldbutton & IN_ATTACK2))
{
switch(g_mode[id])
{
case 0: g_mode[id] = 1 //Полуавтоматика 3 патрона
case 1: g_mode[id] = 0 //Автомат
}
mode_message(id) // Сообщение о смене режима
}
return PLUGIN_HANDLED
}
//Сама стрельба пулемёта
public fw_pkm_PrimaryAttack_Post(Weapon)
{
g_IsInPrimaryAttack = 0
new Player = get_pdata_cbase(Weapon, 41, 4)
new szClip, szAmmo
get_user_weapon(Player, szClip, szAmmo)
if(!g_isalive[Player])
return
if(g_has_pkm[Player])
{
if (!g_clip_ammo[Player])
return
//Подозреваю, что это имитация отдачи (тряски) при стрельбе
new Float:push[3]
pev(Player,pev_punchangle,push)
xs_vec_sub(push,cl_pushangle[Player],push)
xs_vec_mul_scalar(push,cvar_recoil_pkm,push)
xs_vec_add(push,cl_pushangle[Player],push)
set_pev(Player,pev_punchangle,push)
//Собсна начало стрельбы тремя патронами
if(g_mode[Player] == 1)
{
switch(szClip)
{
case 148: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 145: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 142: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 139: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 136: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 133: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 130: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 127: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 124: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 121: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 118: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 115: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 112: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 109: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 106: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 103: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 100: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 97: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 94: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 91: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 88: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 85: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 82: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 79: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 76: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 73: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 70: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 67: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 64: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 61: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 58: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 55: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 52: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 49: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 46: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 43: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 40: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 37: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 34: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 31: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 28: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 25: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 22: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 19: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 16: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 13: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 10: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 7: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
case 4: set_pdata_float(Player, m_flNextAttack, 0.6, PLAYER_LINUX_XTRA_OFF)
}
}
emit_sound(Player, CHAN_WEAPON, Fire_Sounds[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
UTIL_PlayWeaponAnimation(Player, random_num(pkm_SHOOT1, pkm_SHOOT2))
}
}
Вопрос: Есть ли ещё варианты реализации стрельбы по три/два патрона, кроме как в приведённом выше примере? Может уже есть какой нибудь форвард в ReAPI для этого?