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.
252 lines
5.9 KiB
252 lines
5.9 KiB
//========= 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; |
|
}
|
|
|