Альтернативный режим стрельбы пистолета.
В этом туторе я покажу как добавить к пистолету альтернативный режимы стрельбы, а точнее на левую кнопку стреляет как обычно, а на правую 3 патрона.
Итак приступим: зайдём в weapon_pistol.cpp.
Синий цвет: Код Valve Красный цвет: Новый код
Шаг 1 Инициализация:
Перейдите к этой части кода:
private: float m_flSoonestPrimaryAttack; float m_flLastAttackTime; float m_flAccuracyPenalty; int m_nNumShotsFired;
Ниже этого кода вставляем следующее:
float m_flNextFireModeChange; int nFireCount; bool bFiring; bool bFireMode; void checkCount(); void FireMode();
Затем идите к описанию данных initializations:
BEGIN_DATADESC( CWeaponPistol ) DEFINE_FIELD( m_flSoonestPrimaryAttack, FIELD_TIME ), DEFINE_FIELD( m_flLastAttackTime, FIELD_TIME ), DEFINE_FIELD( m_flAccuracyPenalty, FIELD_FLOAT ), DEFINE_FIELD( m_nNumShotsFired, FIELD_INTEGER ),
Надо добавить следующий код:
DEFINE_FIELD( m_flNextFireModeChange, FIELD_TIME ), DEFINE_FIELD( nFireCount, FIELD_INTEGER ), DEFINE_FIELD( bFiring, FIELD_BOOLEAN ), DEFINE_FIELD( bFireMode, FIELD_BOOLEAN ),
Найдите это:
CWeaponPistol::CWeaponPistol( void ) { m_flSoonestPrimaryAttack = gpGlobals->curtime; m_flAccuracyPenalty = 0.0f;
m_fMinRange1 = 24; m_fMaxRange1 = 1500; m_fMinRange2 = 24; m_fMaxRange2 = 200;
m_bFiresUnderwater = true;
И добавьте это:
nFireCount = 3; bFiring = false; bFireMode = false; m_flNextFireModeChange = gpGlobals->curtime;
Шаг 2 Запрос к checkCount():
Добавить: checkCount(); в CWeaponPistol::ItemPostFrame
Показываю как это нужно сделать:
void CWeaponPistol::ItemPostFrame( void ) { ... ... checkCount(); }
Шаг 3 Введение функций:
Создайте где нибудь ниже функцию:
void CWeaponPistol::FireMode( void ) { if ( m_flNextFireModeChange < gpGlobals->curtime ) { nFireCount = 3; bFireMode = !bFireMode; m_flNextFireModeChange = gpGlobals->curtime + 0.5f; } }
И ещё ниже создайте вот эту:
void CWeaponPistol::checkCount( void ) { CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
if (pPlayer == NULL) return;
if (pPlayer->m_afButtonPressed & IN_ATTACK2) { if(bFireMode) bFiring = true; nFireCount = 0; }else if (pPlayer->m_afButtonReleased & IN_ATTACK2) { bFiring = false; }
if((bFireMode==false)&&(gpGlobals->curtime - m_flLastAttackTime >= 0.1f)){ if(nFireCount < 3){ PrimaryAttack(); nFireCount++; } } if((bFiring)&&(gpGlobals->curtime - m_flLastAttackTime >= 0.1f)) PrimaryAttack(); }
Шаг 4:
Найдите функцию перезарядки и добавьте: 'bFiring = false':
bool CWeaponPistol::Reload( void ) { bool fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD ); if ( fRet ) { bFiring = false; WeaponSound( RELOAD ); m_flAccuracyPenalty = 0.0f; }
return fRet; }
Так вроде всё.
Источник: http://stav-mapping.info/e107_plugins/content/content.php?content.45 |
Категория: Туториалы по программированию (HL2) | Добавил: DetLeR (14.07.2007)
| Автор: WeB-Monster
|
Просмотров: 1575 | Комментарии: 3
| Рейтинг: 5.0 |
|