source-engine/game/shared/sdk/weapon_sdkbase.cpp

163 lines
3.9 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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