Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= 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
|