mirror of
https://github.com/mapbase-source/source-sdk-2013.git
synced 2025-04-12 20:50:07 +03:00
264 lines
7.1 KiB
C++
264 lines
7.1 KiB
C++
//========= 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,
|
|
};
|
|
|
|
#ifdef MAPBASE
|
|
extern acttable_t *GetAR2Acttable();
|
|
extern int GetAR2ActtableCount();
|
|
#endif
|
|
|
|
//=========================================================
|
|
//=========================================================
|
|
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;
|
|
}
|
|
}
|
|
|
|
#ifdef MAPBSAE
|
|
virtual acttable_t *GetBackupActivityList() { return GetAR2Acttable(); }
|
|
virtual int GetBackupActivityListCount() { return GetAR2ActtableCount(); }
|
|
#endif
|
|
|
|
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 },
|
|
|
|
#if EXPANDED_HL2_UNUSED_WEAPON_ACTIVITIES
|
|
// Optional new NPC activities
|
|
// (these should fall back to AR2 animations when they don't exist on an NPC)
|
|
{ ACT_RELOAD, ACT_RELOAD_AR1, true },
|
|
{ ACT_IDLE, ACT_IDLE_AR1, true },
|
|
{ ACT_IDLE_ANGRY, ACT_IDLE_ANGRY_AR1, true },
|
|
|
|
// Readiness activities (not aiming)
|
|
{ ACT_IDLE_RELAXED, ACT_IDLE_AR1_RELAXED, false },//never aims
|
|
{ ACT_IDLE_STIMULATED, ACT_IDLE_AR1_STIMULATED, false },
|
|
{ ACT_IDLE_AGITATED, ACT_IDLE_ANGRY_AR1, false },//always aims
|
|
|
|
{ ACT_WALK_RELAXED, ACT_WALK_AR1_RELAXED, false },//never aims
|
|
{ ACT_WALK_STIMULATED, ACT_WALK_AR1_STIMULATED, false },
|
|
{ ACT_WALK_AGITATED, ACT_WALK_AIM_AR1, false },//always aims
|
|
|
|
{ ACT_RUN_RELAXED, ACT_RUN_AR1_RELAXED, false },//never aims
|
|
{ ACT_RUN_STIMULATED, ACT_RUN_AR1_STIMULATED, false },
|
|
{ ACT_RUN_AGITATED, ACT_RUN_AIM_AR1, false },//always aims
|
|
|
|
// Readiness activities (aiming)
|
|
{ ACT_IDLE_AIM_RELAXED, ACT_IDLE_AR1_RELAXED, false },//never aims
|
|
{ ACT_IDLE_AIM_STIMULATED, ACT_IDLE_AIM_AR1_STIMULATED, false },
|
|
{ ACT_IDLE_AIM_AGITATED, ACT_IDLE_ANGRY_AR1, false },//always aims
|
|
|
|
{ ACT_WALK_AIM_RELAXED, ACT_WALK_AR1_RELAXED, false },//never aims
|
|
{ ACT_WALK_AIM_STIMULATED, ACT_WALK_AIM_AR1_STIMULATED, false },
|
|
{ ACT_WALK_AIM_AGITATED, ACT_WALK_AIM_AR1, false },//always aims
|
|
|
|
{ ACT_RUN_AIM_RELAXED, ACT_RUN_AR1_RELAXED, false },//never aims
|
|
{ ACT_RUN_AIM_STIMULATED, ACT_RUN_AIM_AR1_STIMULATED, false },
|
|
{ ACT_RUN_AIM_AGITATED, ACT_RUN_AIM_AR1, false },//always aims
|
|
//End readiness activities
|
|
|
|
{ ACT_WALK, ACT_WALK_AR1, true },
|
|
{ ACT_WALK_AIM, ACT_WALK_AIM_AR1, true },
|
|
{ ACT_WALK_CROUCH, ACT_WALK_CROUCH_RIFLE, true },
|
|
{ ACT_WALK_CROUCH_AIM, ACT_WALK_CROUCH_AIM_RIFLE, true },
|
|
{ ACT_RUN, ACT_RUN_AR1, true },
|
|
{ ACT_RUN_AIM, ACT_RUN_AIM_AR1, true },
|
|
{ ACT_RUN_CROUCH, ACT_RUN_CROUCH_RIFLE, true },
|
|
{ ACT_RUN_CROUCH_AIM, ACT_RUN_CROUCH_AIM_RIFLE, true },
|
|
{ ACT_GESTURE_RANGE_ATTACK1, ACT_GESTURE_RANGE_ATTACK_AR1, true },
|
|
{ ACT_RANGE_ATTACK1_LOW, ACT_RANGE_ATTACK_AR1_LOW, true },
|
|
{ ACT_COVER_LOW, ACT_COVER_AR1_LOW, false },
|
|
{ ACT_RANGE_AIM_LOW, ACT_RANGE_AIM_AR1_LOW, false },
|
|
{ ACT_RELOAD_LOW, ACT_RELOAD_AR1_LOW, false },
|
|
{ ACT_GESTURE_RELOAD, ACT_GESTURE_RELOAD_AR1, true },
|
|
|
|
{ ACT_ARM, ACT_ARM_RIFLE, false },
|
|
{ ACT_DISARM, ACT_DISARM_RIFLE, false },
|
|
|
|
#if EXPANDED_HL2_COVER_ACTIVITIES
|
|
{ ACT_RANGE_AIM_MED, ACT_RANGE_AIM_AR1_MED, false },
|
|
{ ACT_RANGE_ATTACK1_MED, ACT_RANGE_ATTACK_AR1_MED, false },
|
|
#endif
|
|
|
|
#if EXPANDED_HL2DM_ACTIVITIES
|
|
// HL2:DM activities (for third-person animations in SP)
|
|
{ ACT_HL2MP_IDLE, ACT_HL2MP_IDLE_AR1, false },
|
|
{ ACT_HL2MP_RUN, ACT_HL2MP_RUN_AR1, false },
|
|
{ ACT_HL2MP_IDLE_CROUCH, ACT_HL2MP_IDLE_CROUCH_AR1, false },
|
|
{ ACT_HL2MP_WALK_CROUCH, ACT_HL2MP_WALK_CROUCH_AR1, false },
|
|
{ ACT_HL2MP_GESTURE_RANGE_ATTACK, ACT_HL2MP_GESTURE_RANGE_ATTACK_AR1, false },
|
|
{ ACT_HL2MP_GESTURE_RELOAD, ACT_HL2MP_GESTURE_RELOAD_AR1, false },
|
|
{ ACT_HL2MP_JUMP, ACT_HL2MP_JUMP_AR1, false },
|
|
{ ACT_HL2MP_WALK, ACT_HL2MP_WALK_AR1, false },
|
|
{ ACT_HL2MP_GESTURE_RANGE_ATTACK2, ACT_HL2MP_GESTURE_RANGE_ATTACK2_AR1, false },
|
|
#endif
|
|
#endif
|
|
};
|
|
|
|
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" );
|
|
}
|