Выпадающие Магазины От Оружия

Материал из CSM Wiki
Перейти к навигации Перейти к поиску

Доброго времени суток! Сегодня я расскажу как сделать, чтобы при перезарядке пустой магазин падал на пол самым простым способом. Рассмотрим мы этот тутор на примере глока=) Для начала откроем weapons.h, и добавим в class CGlock : public CBasePlayerWeapon строчку:

void SpawnClip( void );

Должно получиться что-то вроде этого:

class CGlock : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 2; }
	int GetItemInfo(ItemInfo *p);

	void PrimaryAttack( void );
	void SecondaryAttack( void );
	void GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim );
	BOOL Deploy( void );
	void Reload( void );
	void SpawnClip( void );
	void WeaponIdle( void );

	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}

private:
	int m_iShell;
	

	unsigned short m_usFireGlock1;
	unsigned short m_usFireGlock2;
};

Далее идем в hl_wpn_glock.cpp и заменяем функцию void CGlock::Reload( void ) на это:

void CGlock::Reload( void )
{
	if ( m_pPlayer->ammo_9mm <= 0 )
		 return;

	int iResult;

	if (m_iClip == 0)
		iResult = DefaultReload( 17, GLOCK_RELOAD, 1.5 );
	else
		iResult = DefaultReload( 17, GLOCK_RELOAD_NOT_EMPTY, 1.5 );

	if (iResult)
	{
		m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
		SetThink( SpawnClip );
		pev->nextthink = gpGlobals->time + 0.8;//выставляем время задержки перед вызовом спавна(ставьте подходящее вам значение)
	}
}

Теперь пишем саму функцию спавна магазина, вставим ее ниже предыдущей функции:

void CGlock::SpawnClip( void )
{	
	int m_iClip9mm;
	m_iClip9mm = PRECACHE_MODEL ("models/w_9mmclip.mdl");// ставим модель магазина.
	UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle );
	Vector	vecClipVelocity = m_pPlayer->pev->velocity 
							 + gpGlobals->v_right * RANDOM_FLOAT(0,5) 
							 + gpGlobals->v_up * RANDOM_FLOAT(-10,-15) 
							 + gpGlobals->v_forward * 1;
	EjectBrass ( pev->origin + gpGlobals->v_up * -4 + gpGlobals->v_forward * 1, vecClipVelocity, pev->angles.y, m_iClip9mm, TE_BOUNCE_NULL);//собственно вместо TE_BOUNCE_NULL можете выставить звук любого материала, а потом заменить его...(если хотите чтобы магазин издавал звук при падении).
}

Вроде ничего не забыл. Теперь по аналогии вы можете добавить эту "фишку" любой пушке). Главное не забывайте добавлять в weapons.h в класс class CИмяПушки : public CBasePlayerWeapon строчку:

void SpawnClip( void );

Автор: PoD-Stas Дата: 12.05.09