Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
3.4 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "basehlcombatweapon.h"
#include "NPCevent.h"
#include "basecombatcharacter.h"
#include "ai_basenpc.h"
#include "player.h"
#include "in_buttons.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define DAMAGE_PER_SECOND 10
#define MAX_SETTINGS 5
float RateOfFire[ MAX_SETTINGS ] =
{
0.1,
0.2,
0.5,
0.7,
1.0,
};
float Damage[ MAX_SETTINGS ] =
{
2,
4,
10,
14,
20,
};
//=========================================================
//=========================================================
class CWeaponAR1 : public CHLMachineGun
{
DECLARE_DATADESC();
public:
DECLARE_CLASS( CWeaponAR1, CHLMachineGun );
DECLARE_SERVERCLASS();
CWeaponAR1();
int m_ROF;
void Precache( void );
bool Deploy( void );
float GetFireRate( void ) {return RateOfFire[ m_ROF ];}
int CapabilitiesGet( void ) { return bits_CAP_WEAPON_RANGE_ATTACK1; }
void SecondaryAttack( void );
virtual void FireBullets( const FireBulletsInfo_t &info );
virtual const Vector& GetBulletSpread( void )
{
static const Vector cone = VECTOR_CONE_10DEGREES;
return cone;
}
void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator )
{
switch( pEvent->event )
{
case EVENT_WEAPON_AR1:
{
Vector vecShootOrigin, vecShootDir;
vecShootOrigin = pOperator->Weapon_ShootPosition( );
CAI_BaseNPC *npc = pOperator->MyNPCPointer();
ASSERT( npc != NULL );
vecShootDir = npc->GetActualShootTrajectory( vecShootOrigin );
WeaponSound(SINGLE_NPC);
pOperator->FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_PRECALCULATED, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2 );
pOperator->DoMuzzleFlash();
}
break;
default:
CBaseCombatWeapon::Operator_HandleAnimEvent( pEvent, pOperator );
break;
}
}
DECLARE_ACTTABLE();
};
IMPLEMENT_SERVERCLASS_ST(CWeaponAR1, DT_WeaponAR1)
END_SEND_TABLE()
LINK_ENTITY_TO_CLASS( weapon_ar1, CWeaponAR1 );
PRECACHE_WEAPON_REGISTER(weapon_ar1);
acttable_t CWeaponAR1::m_acttable[] =
{
{ ACT_RANGE_ATTACK1, ACT_RANGE_ATTACK_AR1, true },
};
IMPLEMENT_ACTTABLE(CWeaponAR1);
//---------------------------------------------------------
// Save/Restore
//---------------------------------------------------------
BEGIN_DATADESC( CWeaponAR1 )
DEFINE_FIELD( m_ROF, FIELD_INTEGER ),
END_DATADESC()
CWeaponAR1::CWeaponAR1( )
{
m_ROF = 0;
}
void CWeaponAR1::Precache( void )
{
BaseClass::Precache();
}
bool CWeaponAR1::Deploy( void )
{
//CBaseCombatCharacter *pOwner = m_hOwner;
return BaseClass::Deploy();
}
//=========================================================
//=========================================================
void CWeaponAR1::FireBullets( const FireBulletsInfo_t &info )
{
if(CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ))
{
pPlayer->FireBullets( info );
}
}
void CWeaponAR1::SecondaryAttack( void )
{
CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
if ( pPlayer )
{
pPlayer->m_nButtons &= ~IN_ATTACK2;
}
m_flNextSecondaryAttack = gpGlobals->curtime + 0.1;
m_ROF += 1;
if( m_ROF == MAX_SETTINGS )
{
m_ROF = 0;
}
int i;
Msg( "\n" );
for( i = 0 ; i < MAX_SETTINGS ; i++ )
{
if( i == m_ROF )
{
Msg( "|" );
}
else
{
Msg( "-" );
}
}
Msg( "\n" );
}