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.
163 lines
3.9 KiB
163 lines
3.9 KiB
//========= 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 |