//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "in_buttons.h" #include "takedamageinfo.h" #include "weapon_sdkbase.h" #include "ammodef.h" #if defined( CLIENT_DLL ) #include "c_sdk_player.h" #else #include "sdk_player.h" #endif // ----------------------------------------------------------------------------- // // Global functions. // ----------------------------------------------------------------------------- // //-------------------------------------------------------------------------------------------------------- static const char * s_WeaponAliasInfo[] = { "none", // WEAPON_NONE "mp5", // WEAPON_MP5 "shotgun", // WEAPON_SHOTGUN "grenade", // WEAPON_GRENADE NULL, // WEAPON_NONE }; //-------------------------------------------------------------------------------------------------------- // // Given an alias, return the associated weapon ID // int AliasToWeaponID( const char *alias ) { if (alias) { for( int i=0; s_WeaponAliasInfo[i] != NULL; ++i ) if (!Q_stricmp( s_WeaponAliasInfo[i], alias )) return i; } return WEAPON_NONE; } //-------------------------------------------------------------------------------------------------------- // // Given a weapon ID, return its alias // const char *WeaponIDToAlias( int id ) { if ( (id >= WEAPON_MAX) || (id < 0) ) return NULL; return s_WeaponAliasInfo[id]; } // ----------------------------------------------------------------------------- // // CWeaponSDKBase tables. // ----------------------------------------------------------------------------- // IMPLEMENT_NETWORKCLASS_ALIASED( WeaponSDKBase, DT_WeaponSDKBase ) BEGIN_NETWORK_TABLE( CWeaponSDKBase, DT_WeaponSDKBase ) #ifdef CLIENT_DLL #else // world weapon models have no animations SendPropExclude( "DT_AnimTimeMustBeFirst", "m_flAnimTime" ), SendPropExclude( "DT_BaseAnimating", "m_nSequence" ), #endif END_NETWORK_TABLE() #ifdef CLIENT_DLL BEGIN_PREDICTION_DATA( CWeaponSDKBase ) DEFINE_PRED_FIELD( m_flTimeWeaponIdle, FIELD_FLOAT, FTYPEDESC_OVERRIDE | FTYPEDESC_NOERRORCHECK ), END_PREDICTION_DATA() #endif LINK_ENTITY_TO_CLASS( weapon_sdk_base, CWeaponSDKBase ); #ifdef GAME_DLL BEGIN_DATADESC( CWeaponSDKBase ) // New weapon Think and Touch Functions go here.. END_DATADESC() #endif // ----------------------------------------------------------------------------- // // CWeaponCSBase implementation. // ----------------------------------------------------------------------------- // CWeaponSDKBase::CWeaponSDKBase() { SetPredictionEligible( true ); AddSolidFlags( FSOLID_TRIGGER ); // Nothing collides with these but it gets touches. } const CSDKWeaponInfo &CWeaponSDKBase::GetSDKWpnData() const { const FileWeaponInfo_t *pWeaponInfo = &GetWpnData(); const CSDKWeaponInfo *pSDKInfo; #ifdef _DEBUG pSDKInfo = dynamic_cast< const CSDKWeaponInfo* >( pWeaponInfo ); Assert( pSDKInfo ); #else pSDKInfo = static_cast< const CSDKWeaponInfo* >( pWeaponInfo ); #endif return *pSDKInfo; } bool CWeaponSDKBase::PlayEmptySound() { CPASAttenuationFilter filter( this ); filter.UsePredictionRules(); EmitSound( filter, entindex(), "Default.ClipEmpty_Rifle" ); return 0; } CSDKPlayer* CWeaponSDKBase::GetPlayerOwner() const { return dynamic_cast< CSDKPlayer* >( GetOwner() ); } #ifdef GAME_DLL void CWeaponSDKBase::SendReloadEvents() { CSDKPlayer *pPlayer = dynamic_cast< CSDKPlayer* >( GetOwner() ); if ( !pPlayer ) return; // Send a message to any clients that have this entity to play the reload. CPASFilter filter( pPlayer->GetAbsOrigin() ); filter.RemoveRecipient( pPlayer ); UserMessageBegin( filter, "ReloadEffect" ); WRITE_SHORT( pPlayer->entindex() ); MessageEnd(); // Make the player play his reload animation. pPlayer->DoAnimationEvent( PLAYERANIMEVENT_RELOAD ); } #endif