summaryrefslogtreecommitdiff
path: root/game/shared/dod/weapon_dodbasegun.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/shared/dod/weapon_dodbasegun.cpp')
-rw-r--r--game/shared/dod/weapon_dodbasegun.cpp252
1 files changed, 252 insertions, 0 deletions
diff --git a/game/shared/dod/weapon_dodbasegun.cpp b/game/shared/dod/weapon_dodbasegun.cpp
new file mode 100644
index 0000000..93fc0df
--- /dev/null
+++ b/game/shared/dod/weapon_dodbasegun.cpp
@@ -0,0 +1,252 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "weapon_dodbasegun.h"
+#include "fx_dod_shared.h"
+//#include "effect_dispatch_data.h"
+
+#ifdef CLIENT_DLL
+ #include "c_dod_player.h"
+ #include "prediction.h"
+#else
+ #include "dod_player.h"
+ #include "te_effect_dispatch.h"
+ #include "util.h"
+ #include "ndebugoverlay.h"
+#endif
+
+#ifndef CLIENT_DLL
+//-----------------------------------------------------------------------------
+// Purpose: Only send to local player if this weapon is the active weapon
+// Input : *pStruct -
+// *pVarData -
+// *pRecipients -
+// objectID -
+// Output : void*
+//-----------------------------------------------------------------------------
+void* SendProxy_SendActiveLocalBaseGunDataTable( const SendProp *pProp, const void *pStruct, const void *pVarData, CSendProxyRecipients *pRecipients, int objectID )
+{
+ // Get the weapon entity
+ CBaseCombatWeapon *pWeapon = (CBaseCombatWeapon*)pVarData;
+ if ( pWeapon )
+ {
+ // Only send this chunk of data to the player carrying this weapon
+ CBasePlayer *pPlayer = ToBasePlayer( pWeapon->GetOwner() );
+ if ( pPlayer )
+ {
+ pRecipients->SetOnly( pPlayer->GetClientIndex() );
+ return (void*)pVarData;
+ }
+ }
+
+ return NULL;
+}
+REGISTER_SEND_PROXY_NON_MODIFIED_POINTER( SendProxy_SendActiveLocalBaseGunDataTable );
+#endif
+
+IMPLEMENT_NETWORKCLASS_ALIASED( WeaponDODBaseGun, DT_WeaponDODBaseGun )
+
+BEGIN_NETWORK_TABLE_NOBASE( CWeaponDODBaseGun, DT_LocalActiveWeaponBaseGunData )
+END_NETWORK_TABLE()
+
+BEGIN_NETWORK_TABLE( CWeaponDODBaseGun, DT_WeaponDODBaseGun )
+ #ifdef CLIENT_DLL
+ RecvPropDataTable("LocalActiveWeaponBaseGunData", 0, 0, &REFERENCE_RECV_TABLE(DT_LocalActiveWeaponBaseGunData))
+ #else
+ SendPropDataTable("LocalActiveWeaponBaseGunData", 0, &REFERENCE_SEND_TABLE(DT_LocalActiveWeaponBaseGunData), SendProxy_SendActiveLocalBaseGunDataTable )
+ #endif
+END_NETWORK_TABLE()
+
+#ifdef CLIENT_DLL
+
+ BEGIN_PREDICTION_DATA( CWeaponDODBaseGun )
+ END_PREDICTION_DATA()
+
+#else
+
+ BEGIN_DATADESC( CWeaponDODBaseGun )
+ END_DATADESC()
+
+#endif
+
+LINK_ENTITY_TO_CLASS( weapon_dod_base_gun, CWeaponDODBaseGun );
+
+extern ConVar friendlyfire;
+
+CWeaponDODBaseGun::CWeaponDODBaseGun()
+{
+}
+
+
+void CWeaponDODBaseGun::Spawn()
+{
+ DODBaseGunSpawn();
+
+ SetZoomed( false );
+}
+
+void CWeaponDODBaseGun::Precache()
+{
+ BaseClass::Precache();
+
+ // Precache all weapon ejections, since every weapon will appear in the game.
+ PrecacheModel( "models/shells/shell_small.mdl" );
+ PrecacheModel( "models/shells/shell_medium.mdl" );
+ PrecacheModel( "models/shells/shell_large.mdl" );
+ PrecacheModel( "models/shells/garand_clip.mdl" );
+}
+
+void CWeaponDODBaseGun::PrimaryAttack()
+{
+ Assert( m_pWeaponInfo );
+
+ DODBaseGunFire();
+}
+
+void CWeaponDODBaseGun::DODBaseGunSpawn( void )
+{
+ WEAPON_FILE_INFO_HANDLE hWpnInfo = LookupWeaponInfoSlot( GetClassname() );
+
+ Assert( hWpnInfo != GetInvalidWeaponInfoHandle() );
+
+ CDODWeaponInfo *pWeaponInfo = dynamic_cast< CDODWeaponInfo* >( GetFileWeaponInfoFromHandle( hWpnInfo ) );
+
+ Assert( pWeaponInfo && "Failed to get CDODWeaponInfo in weapon spawn" );
+
+ m_pWeaponInfo = pWeaponInfo;
+
+ BaseClass::Spawn();
+}
+
+float CWeaponDODBaseGun::GetWeaponAccuracy( float flPlayerSpeed )
+{
+ //snipers and deployable weapons inherit this and override when we need a different accuracy
+
+ float flSpread = m_pWeaponInfo->m_flAccuracy;
+
+ if( flPlayerSpeed > 45 )
+ flSpread += m_pWeaponInfo->m_flAccuracyMovePenalty;
+
+ return flSpread;
+}
+
+bool CWeaponDODBaseGun::DODBaseGunFire()
+{
+ CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() );
+
+ Assert( pPlayer );
+
+ // Out of ammo?
+ if ( m_iClip1 <= 0 )
+ {
+ if (m_bFireOnEmpty)
+ {
+ PlayEmptySound();
+ m_flNextPrimaryAttack = gpGlobals->curtime + 0.2;
+ }
+
+ return false;
+ }
+
+ if( pPlayer->GetWaterLevel() > 2 )
+ {
+ PlayEmptySound();
+ m_flNextPrimaryAttack = gpGlobals->curtime + 1.0;
+ return false;
+ }
+
+ /* decrement before calling PlayPrimaryAttackAnim, so we can play the empty anim if necessary */
+ m_iClip1--;
+
+ SendWeaponAnim( GetPrimaryAttackActivity() );
+
+ // player "shoot" animation
+ pPlayer->SetAnimation( PLAYER_ATTACK1 );
+
+ FX_FireBullets(
+ pPlayer->entindex(),
+ pPlayer->Weapon_ShootPosition(),
+ pPlayer->EyeAngles() + pPlayer->GetPunchAngle(),
+ GetWeaponID(),
+ Primary_Mode,
+ CBaseEntity::GetPredictionRandomSeed() & 255,
+ GetWeaponAccuracy( pPlayer->GetAbsVelocity().Length2D() ) );
+
+ DoFireEffects();
+
+#ifndef CLIENT_DLL
+ IGameEvent * event = gameeventmanager->CreateEvent( "dod_stats_weapon_attack" );
+ if ( event )
+ {
+ event->SetInt( "attacker", pPlayer->GetUserID() );
+ event->SetInt( "weapon", GetStatsWeaponID() );
+
+ gameeventmanager->FireEvent( event );
+ }
+#endif //CLIENT_DLL
+
+#ifdef CLIENT_DLL
+ CDODPlayer *p = ToDODPlayer( GetPlayerOwner() );
+
+ if ( prediction->IsFirstTimePredicted() )
+ p->DoRecoil( GetWeaponID(), GetRecoil() );
+#endif
+
+ m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + GetFireDelay();
+
+ m_flTimeWeaponIdle = gpGlobals->curtime + m_pWeaponInfo->m_flTimeToIdleAfterFire;
+ return true;
+}
+
+float CWeaponDODBaseGun::GetFireDelay( void )
+{
+ return m_pWeaponInfo->m_flFireDelay;
+}
+
+void CWeaponDODBaseGun::DoFireEffects()
+{
+ CBasePlayer *pPlayer = GetPlayerOwner();
+
+ if ( pPlayer )
+ pPlayer->DoMuzzleFlash();
+}
+
+
+bool CWeaponDODBaseGun::Reload()
+{
+ CBasePlayer *pPlayer = GetPlayerOwner();
+
+ if (pPlayer->GetAmmoCount( GetPrimaryAmmoType() ) <= 0 && m_iClip1 <= 0 )
+ {
+ CDODPlayer *pDODPlayer = ToDODPlayer( pPlayer );
+ pDODPlayer->HintMessage( HINT_AMMO_EXHAUSTED );
+ return false;
+ }
+
+ int iResult = DefaultReload( GetMaxClip1(), GetMaxClip2(), GetReloadActivity() );
+ if ( !iResult )
+ return false;
+
+ pPlayer->SetAnimation( PLAYER_RELOAD );
+
+ return true;
+}
+
+Activity CWeaponDODBaseGun::GetPrimaryAttackActivity( void )
+{
+ return ACT_VM_PRIMARYATTACK;
+}
+
+Activity CWeaponDODBaseGun::GetReloadActivity( void )
+{
+ return ACT_VM_RELOAD;
+}
+
+Activity CWeaponDODBaseGun::GetDrawActivity( void )
+{
+ return ACT_VM_DRAW;
+}