diff options
Diffstat (limited to 'game/shared/dod/weapon_dodbasegun.cpp')
| -rw-r--r-- | game/shared/dod/weapon_dodbasegun.cpp | 252 |
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; +} |