diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/hl1/hl1mp_weapon_hornetgun.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/hl1/hl1mp_weapon_hornetgun.cpp')
| -rw-r--r-- | game/shared/hl1/hl1mp_weapon_hornetgun.cpp | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/game/shared/hl1/hl1mp_weapon_hornetgun.cpp b/game/shared/hl1/hl1mp_weapon_hornetgun.cpp new file mode 100644 index 0000000..e35c3dc --- /dev/null +++ b/game/shared/hl1/hl1mp_weapon_hornetgun.cpp @@ -0,0 +1,339 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Hornetgun +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "npcevent.h" +#include "hl1mp_basecombatweapon_shared.h" +//#include "basecombatcharacter.h" +//#include "AI_BaseNPC.h" +#include "gamerules.h" +#include "in_buttons.h" +#ifdef CLIENT_DLL +#include "hl1/c_hl1mp_player.h" +#else +#include "hl1mp_player.h" +#include "soundent.h" +#include "game.h" +#endif +#include "vstdlib/random.h" +#include "engine/IEngineSound.h" +#if !defined(CLIENT_DLL) +#include "hl1_npc_hornet.h" +#endif + + +//----------------------------------------------------------------------------- +// CWeaponHgun +//----------------------------------------------------------------------------- + +#ifdef CLIENT_DLL +#define CWeaponHgun C_WeaponHgun +#endif + +class CWeaponHgun : public CBaseHL1MPCombatWeapon +{ + DECLARE_CLASS( CWeaponHgun, CBaseHL1MPCombatWeapon ); +public: + + DECLARE_NETWORKCLASS(); + DECLARE_PREDICTABLE(); + + CWeaponHgun( void ); + + void Precache( void ); + void PrimaryAttack( void ); + void SecondaryAttack( void ); + void WeaponIdle( void ); + bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL ); + bool Reload( void ); + + virtual void ItemPostFrame( void ); + +// DECLARE_SERVERCLASS(); + DECLARE_DATADESC(); + +private: + +// float m_flRechargeTime; +// int m_iFirePhase; + + CNetworkVar( float, m_flRechargeTime ); + CNetworkVar( int, m_iFirePhase ); +}; + +IMPLEMENT_NETWORKCLASS_ALIASED( WeaponHgun, DT_WeaponHgun ); + +BEGIN_NETWORK_TABLE( CWeaponHgun, DT_WeaponHgun ) +#ifdef CLIENT_DLL + RecvPropFloat( RECVINFO( m_flRechargeTime ) ), + RecvPropInt( RECVINFO( m_iFirePhase ) ), +#else + SendPropFloat( SENDINFO( m_flRechargeTime ) ), + SendPropInt( SENDINFO( m_iFirePhase ) ), +#endif +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CWeaponHgun ) +#ifdef CLIENT_DLL + DEFINE_PRED_FIELD( m_flRechargeTime, FIELD_FLOAT, FTYPEDESC_INSENDTABLE ), + DEFINE_PRED_FIELD( m_iFirePhase, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ), +#endif +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( weapon_hornetgun, CWeaponHgun ); + +PRECACHE_WEAPON_REGISTER( weapon_hornetgun ); + +//IMPLEMENT_SERVERCLASS_ST( CWeaponHgun, DT_WeaponHgun ) +//END_SEND_TABLE() + +BEGIN_DATADESC( CWeaponHgun ) + DEFINE_FIELD( m_flRechargeTime, FIELD_TIME ), + DEFINE_FIELD( m_iFirePhase, FIELD_INTEGER ), +END_DATADESC() + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CWeaponHgun::CWeaponHgun( void ) +{ + m_bReloadsSingly = false; + m_bFiresUnderwater = true; + + m_flRechargeTime = 0.0; + m_iFirePhase = 0; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponHgun::Precache( void ) +{ +#ifndef CLIENT_DLL + UTIL_PrecacheOther( "hornet" ); +#endif + + BaseClass::Precache(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponHgun::PrimaryAttack( void ) +{ + CHL1_Player *pPlayer = ToHL1Player( GetOwner() ); + if ( !pPlayer ) + { + return; + } + + if ( pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) + { + return; + } + + WeaponSound( SINGLE ); +#if !defined(CLIENT_DLL) + CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 200, 0.2 ); +#endif + pPlayer->DoMuzzleFlash(); + + SendWeaponAnim( ACT_VM_PRIMARYATTACK ); + pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + Vector vForward, vRight, vUp; + QAngle vecAngles; + + pPlayer->EyeVectors( &vForward, &vRight, &vUp ); + VectorAngles( vForward, vecAngles ); + +#if !defined(CLIENT_DLL) + CBaseEntity *pHornet = CBaseEntity::Create( "hornet", pPlayer->Weapon_ShootPosition() + vForward * 16 + vRight * 8 + vUp * -12, vecAngles, pPlayer ); + pHornet->SetAbsVelocity( vForward * 300 ); +#endif + + m_flRechargeTime = gpGlobals->curtime + 0.5; + + pPlayer->RemoveAmmo( 1, m_iPrimaryAmmoType ); + + pPlayer->ViewPunch( QAngle( -2, 0, 0 ) ); + + m_flNextPrimaryAttack = m_flNextPrimaryAttack + 0.25; + + if (m_flNextPrimaryAttack < gpGlobals->curtime ) + { + m_flNextPrimaryAttack = gpGlobals->curtime + 0.25; + } + + SetWeaponIdleTime( random->RandomFloat( 10, 15 ) ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponHgun::SecondaryAttack( void ) +{ + CHL1_Player *pPlayer = ToHL1Player( GetOwner() ); + if ( !pPlayer ) + { + return; + } + + if ( pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) + { + return; + } + + WeaponSound( SINGLE ); +#if !defined(CLIENT_DLL) + CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 200, 0.2 ); +#endif + pPlayer->DoMuzzleFlash(); + + SendWeaponAnim( ACT_VM_PRIMARYATTACK ); + pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + CBaseEntity *pHornet; + Vector vecSrc; + + Vector vForward, vRight, vUp; + QAngle vecAngles; + + pPlayer->EyeVectors( &vForward, &vRight, &vUp ); + VectorAngles( vForward, vecAngles ); + + vecSrc = pPlayer->Weapon_ShootPosition() + vForward * 16 + vRight * 8 + vUp * -12; + + m_iFirePhase++; + switch ( m_iFirePhase ) + { + case 1: + vecSrc = vecSrc + vUp * 8; + break; + case 2: + vecSrc = vecSrc + vUp * 8; + vecSrc = vecSrc + vRight * 8; + break; + case 3: + vecSrc = vecSrc + vRight * 8; + break; + case 4: + vecSrc = vecSrc + vUp * -8; + vecSrc = vecSrc + vRight * 8; + break; + case 5: + vecSrc = vecSrc + vUp * -8; + break; + case 6: + vecSrc = vecSrc + vUp * -8; + vecSrc = vecSrc + vRight * -8; + break; + case 7: + vecSrc = vecSrc + vRight * -8; + break; + case 8: + vecSrc = vecSrc + vUp * 8; + vecSrc = vecSrc + vRight * -8; + m_iFirePhase = 0; + break; + } + +#ifdef CLIENT_DLL + pHornet = NULL; +#else + pHornet = CBaseEntity::Create( "hornet", vecSrc, vecAngles, pPlayer ); + pHornet->SetAbsVelocity( vForward * 1200 ); + pHornet->SetThink( &CNPC_Hornet::StartDart ); +#endif + + m_flRechargeTime = gpGlobals->curtime + 0.5; + + pPlayer->ViewPunch( QAngle( -2, 0, 0 ) ); + pPlayer->RemoveAmmo( 1, m_iPrimaryAmmoType ); + + m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + 0.1; + SetWeaponIdleTime( random->RandomFloat( 10, 15 ) ); +} + +void CWeaponHgun::WeaponIdle( void ) +{ + if ( !HasWeaponIdleTimeElapsed() ) + return; + + int iAnim; + float flRand = random->RandomFloat( 0, 1 ); + if ( flRand <= 0.75 ) + { + iAnim = ACT_VM_IDLE; + } + else + { + iAnim = ACT_VM_FIDGET; + } + + SendWeaponAnim( iAnim ); +} + +bool CWeaponHgun::Holster( CBaseCombatWeapon *pSwitchingTo ) +{ + bool bRet; + + bRet = BaseClass::Holster( pSwitchingTo ); + + if ( bRet ) + { + CHL1_Player *pPlayer = ToHL1Player( GetOwner() ); + if ( pPlayer ) + { +#if !defined(CLIENT_DLL) + //!!!HACKHACK - can't select hornetgun if it's empty! no way to get ammo for it, either. + int iCount = pPlayer->GetAmmoCount( m_iPrimaryAmmoType ); + if ( iCount <= 0 ) + { + pPlayer->GiveAmmo( iCount+1, m_iPrimaryAmmoType, true ); + } +#endif + } + } + + return bRet; +} + +bool CWeaponHgun::Reload( void ) +{ + if ( m_flRechargeTime >= gpGlobals->curtime ) + { + return true; + } + + CHL1_Player *pPlayer = ToHL1Player( GetOwner() ); + if ( !pPlayer ) + { + return true; + } + +#ifdef CLIENT_DLL +#else + if ( !g_pGameRules->CanHaveAmmo( pPlayer, m_iPrimaryAmmoType ) ) + return true; + + while ( ( m_flRechargeTime < gpGlobals->curtime ) && g_pGameRules->CanHaveAmmo( pPlayer, m_iPrimaryAmmoType ) ) + { + pPlayer->GiveAmmo( 1, m_iPrimaryAmmoType, true ); + m_flRechargeTime += 0.5; + } +#endif + + return true; +} + +void CWeaponHgun::ItemPostFrame( void ) +{ + Reload(); + + BaseClass::ItemPostFrame(); +} |