summaryrefslogtreecommitdiff
path: root/game/shared/tfc/weapon_tfc_minigun.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/tfc/weapon_tfc_minigun.cpp')
-rw-r--r--game/shared/tfc/weapon_tfc_minigun.cpp282
1 files changed, 282 insertions, 0 deletions
diff --git a/game/shared/tfc/weapon_tfc_minigun.cpp b/game/shared/tfc/weapon_tfc_minigun.cpp
new file mode 100644
index 0000000..fb5015c
--- /dev/null
+++ b/game/shared/tfc/weapon_tfc_minigun.cpp
@@ -0,0 +1,282 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "util.h"
+#include "weapon_tfc_minigun.h"
+#include "decals.h"
+#include "in_buttons.h"
+
+#if defined( CLIENT_DLL )
+ #include "c_tfc_player.h"
+#else
+ #include "tfc_player.h"
+#endif
+
+
+// ----------------------------------------------------------------------------- //
+// CTFCMinigun tables.
+// ----------------------------------------------------------------------------- //
+
+IMPLEMENT_NETWORKCLASS_ALIASED( TFCMinigun, DT_WeaponMinigun )
+
+BEGIN_NETWORK_TABLE( CTFCMinigun, DT_WeaponMinigun )
+END_NETWORK_TABLE()
+
+BEGIN_PREDICTION_DATA( CTFCMinigun )
+END_PREDICTION_DATA()
+
+LINK_ENTITY_TO_CLASS( weapon_minigun, CTFCMinigun );
+PRECACHE_WEAPON_REGISTER( weapon_minigun );
+
+#ifndef CLIENT_DLL
+
+ BEGIN_DATADESC( CTFCMinigun )
+ END_DATADESC()
+
+#endif
+
+// ----------------------------------------------------------------------------- //
+// CTFCMinigun implementation.
+// ----------------------------------------------------------------------------- //
+
+CTFCMinigun::CTFCMinigun()
+{
+ m_iWeaponState = AC_STATE_IDLE;
+}
+
+
+bool CTFCMinigun::HasPrimaryAmmo()
+{
+ return true;
+}
+
+
+bool CTFCMinigun::CanBeSelected()
+{
+ return true;
+}
+
+void CTFCMinigun::Precache()
+{
+ BaseClass::Precache();
+
+ PrecacheScriptSound( "Weapon_Minigun.Deploy" );
+}
+
+bool CTFCMinigun::Deploy()
+{
+ CPASAttenuationFilter filter( this );
+ filter.UsePredictionRules();
+ EmitSound( filter, entindex(), "Weapon_Minigun.Deploy" );
+
+ return BaseClass::Deploy();
+}
+
+
+TFCWeaponID CTFCMinigun::GetWeaponID( void ) const
+{
+ return WEAPON_MINIGUN;
+}
+
+
+void CTFCMinigun::WindUp( )
+{
+ CTFCPlayer *pOwner = GetPlayerOwner();
+ if ( !pOwner )
+ return;
+
+ if ( !(pOwner->m_nButtons & IN_ATTACK) )
+ return;
+
+ WeaponSound( SPECIAL1 ); // "special1" = wind up
+
+ m_iWeaponState = AC_STATE_STARTFIRING;
+ pOwner->m_Shared.AddStateFlags( TFSTATE_AIMING );
+
+ // Play the "spin down" animation.
+ SendWeaponAnim( ACT_VM_PULLBACK_HIGH );
+
+#ifdef GAME_DLL
+ pOwner->TeamFortress_SetSpeed();
+#endif
+}
+
+
+void CTFCMinigun::WindDown( bool bFromHolster )
+{
+ CTFCPlayer *pOwner = GetPlayerOwner();
+ if ( !pOwner )
+ return;
+
+ WeaponSound( SPECIAL2 );
+
+ m_iWeaponState = AC_STATE_IDLE;
+ pOwner->m_Shared.RemoveStateFlags( TFSTATE_AIMING );
+ m_flTimeWeaponIdle = gpGlobals->curtime + 2.0;
+
+ // Play the "spin down" animation.
+ SendWeaponAnim( ACT_VM_PULLBACK_LOW );
+
+#ifdef GAME_DLL
+ pOwner->TeamFortress_SetSpeed();
+#endif
+}
+
+
+void CTFCMinigun::Spin()
+{
+ CTFCPlayer *pOwner = GetPlayerOwner();
+ if ( !pOwner )
+ return;
+
+ WeaponSound( SPECIAL3 ); // "special3" = spin
+
+ pOwner->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN );
+}
+
+
+void CTFCMinigun::Fire()
+{
+ if ( m_flNextPrimaryAttack > gpGlobals->curtime )
+ return;
+
+ CTFCPlayer *pOwner = GetPlayerOwner();
+ if ( !pOwner )
+ return;
+
+ pOwner->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN );
+
+ BaseClass::PrimaryAttack(); // Use the base HL2 system to fire.
+}
+
+
+void CTFCMinigun::StartSpin()
+{
+ CTFCPlayer *pOwner = GetPlayerOwner();
+ if ( !pOwner )
+ return;
+
+ WeaponSound( SPECIAL1 ); // "special1" = wind up
+
+ // Rotate barrel without firing for fun
+ m_iWeaponState = AC_STATE_SPINNING;
+
+ pOwner->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN );
+}
+
+
+void CTFCMinigun::PrimaryAttack()
+{
+ CTFCPlayer *pOwner = GetPlayerOwner();
+ if ( !pOwner )
+ return;
+
+ switch ( m_iWeaponState )
+ {
+ default:
+ case AC_STATE_IDLE:
+ // Removed the need for cells to powerup the AC
+ WindUp();
+ m_flNextPrimaryAttack = gpGlobals->curtime + 0.5;
+ m_flTimeWeaponIdle = gpGlobals->curtime + 0.6;
+ break;
+
+ case AC_STATE_STARTFIRING:
+ // Start playing the looping fire sound
+ if ( m_flNextPrimaryAttack <= gpGlobals->curtime )
+ {
+ WeaponSound( SINGLE ); // "single" = the looping fire sound
+ m_iWeaponState = AC_STATE_FIRING;
+ m_flNextPrimaryAttack = m_flTimeWeaponIdle = gpGlobals->curtime + 0.1;
+ }
+ break;
+
+ case AC_STATE_FIRING:
+ Fire();
+ m_flNextPrimaryAttack = m_flTimeWeaponIdle = gpGlobals->curtime + 0.1;
+ break;
+ }
+}
+
+
+void CTFCMinigun::HandleFireOnEmpty()
+{
+ if ( m_iWeaponState == AC_STATE_FIRING )
+ {
+ StartSpin();
+ m_flNextPrimaryAttack = m_flTimeWeaponIdle = gpGlobals->curtime + 0.1;
+ }
+ else if ( m_iWeaponState == AC_STATE_SPINNING )
+ {
+ if ( HasPrimaryAmmo() )
+ Spin();
+ else
+ m_iWeaponState = AC_STATE_STARTFIRING;
+
+ m_flNextPrimaryAttack = m_flTimeWeaponIdle = gpGlobals->curtime + 0.1;
+ }
+ else
+ {
+ BaseClass::HandleFireOnEmpty();
+ }
+}
+
+
+void CTFCMinigun::WeaponIdle()
+{
+ //ResetEmptySound( );
+
+ if ( gpGlobals->curtime < m_flTimeWeaponIdle )
+ return;
+
+ // Always wind down if we've hit here, because it only happens when the player has stopped firing/spinning
+ if ( m_iWeaponState != AC_STATE_IDLE )// && !(m_pPlayer->pev->button & IN_ATTACK) )
+ {
+ WindDown( FALSE );
+ return;
+ }
+
+ SendWeaponAnim( ACT_IDLE );
+
+ m_flTimeWeaponIdle = gpGlobals->curtime + 12.5;// how long till we do this again.
+}
+
+
+bool CTFCMinigun::SendWeaponAnim( int iActivity )
+{
+ if ( GetActivity() == ACT_VM_PRIMARYATTACK && iActivity == ACT_VM_PRIMARYATTACK )
+ {
+ // The minigun's fire animation loops, so we don't want it to reset each time
+ // they fire a bullet.
+ return true;
+ }
+ else
+ {
+ return BaseClass::SendWeaponAnim( iActivity );
+ }
+}
+
+
+
+#ifdef CLIENT_DLL
+
+ // ------------------------------------------------------------------------------------------------ //
+ // ------------------------------------------------------------------------------------------------ //
+ // CLIENT DLL SPECIFIC CODE
+ // ------------------------------------------------------------------------------------------------ //
+ // ------------------------------------------------------------------------------------------------ //
+
+
+#else
+
+ // ------------------------------------------------------------------------------------------------ //
+ // ------------------------------------------------------------------------------------------------ //
+ // GAME DLL SPECIFIC CODE
+ // ------------------------------------------------------------------------------------------------ //
+ // ------------------------------------------------------------------------------------------------ //
+
+#endif