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.
116 lines
3.3 KiB
116 lines
3.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $Workfile: $ |
|
// $Date: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "animation.h" |
|
#include "baseviewmodel.h" |
|
#include "player.h" |
|
#include <KeyValues.h> |
|
#include "studio.h" |
|
#include "vguiscreen.h" |
|
#include "saverestore_utlvector.h" |
|
#include "hltvdirector.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
void SendProxy_AnimTime( const void *pStruct, const void *pVarData, DVariant *pOut, int iElement, int objectID ); |
|
void SendProxy_SequenceChanged( const void *pStruct, const void *pVarData, DVariant *pOut, int iElement, int objectID ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Save Data for Base Weapon object |
|
//-----------------------------------------------------------------------------// |
|
BEGIN_DATADESC( CBaseViewModel ) |
|
|
|
DEFINE_FIELD( m_hOwner, FIELD_EHANDLE ), |
|
|
|
// Client only |
|
// DEFINE_FIELD( m_LagAnglesHistory, CInterpolatedVar < QAngle > ), |
|
// DEFINE_FIELD( m_vLagAngles, FIELD_VECTOR ), |
|
|
|
DEFINE_FIELD( m_nViewModelIndex, FIELD_INTEGER ), |
|
DEFINE_FIELD( m_flTimeWeaponIdle, FIELD_FLOAT ), |
|
DEFINE_FIELD( m_nAnimationParity, FIELD_INTEGER ), |
|
|
|
// Client only |
|
// DEFINE_FIELD( m_nOldAnimationParity, FIELD_INTEGER ), |
|
|
|
DEFINE_FIELD( m_vecLastFacing, FIELD_VECTOR ), |
|
DEFINE_FIELD( m_hWeapon, FIELD_EHANDLE ), |
|
DEFINE_UTLVECTOR( m_hScreens, FIELD_EHANDLE ), |
|
|
|
// Read from weapons file |
|
// DEFINE_FIELD( m_sVMName, FIELD_STRING ), |
|
// DEFINE_FIELD( m_sAnimationPrefix, FIELD_STRING ), |
|
|
|
// --------------------------------------------------------------------- |
|
|
|
// Don't save these, init to 0 and regenerate |
|
// DEFINE_FIELD( m_Activity, FIELD_INTEGER ), |
|
|
|
END_DATADESC() |
|
|
|
int CBaseViewModel::UpdateTransmitState() |
|
{ |
|
if ( IsEffectActive( EF_NODRAW ) ) |
|
{ |
|
return SetTransmitState( FL_EDICT_DONTSEND ); |
|
} |
|
|
|
return SetTransmitState( FL_EDICT_FULLCHECK ); |
|
} |
|
|
|
int CBaseViewModel::ShouldTransmit( const CCheckTransmitInfo *pInfo ) |
|
{ |
|
// check if receipient owns this weapon viewmodel |
|
CBasePlayer *pOwner = ToBasePlayer( m_hOwner ); |
|
|
|
if ( pOwner && pOwner->edict() == pInfo->m_pClientEnt ) |
|
{ |
|
return FL_EDICT_ALWAYS; |
|
} |
|
|
|
// check if recipient spectates the own of this viewmodel |
|
CBaseEntity *pRecipientEntity = CBaseEntity::Instance( pInfo->m_pClientEnt ); |
|
|
|
if ( pRecipientEntity->IsPlayer() ) |
|
{ |
|
CBasePlayer *pPlayer = static_cast<CBasePlayer*>( pRecipientEntity ); |
|
#ifndef _XBOX |
|
if ( pPlayer->IsHLTV() || pPlayer->IsReplay() ) |
|
{ |
|
// if this is the HLTV client, transmit all viewmodels in our PVS |
|
return FL_EDICT_PVSCHECK; |
|
} |
|
#endif |
|
if ( (pPlayer->GetObserverMode() == OBS_MODE_IN_EYE) && (pPlayer->GetObserverTarget() == pOwner) ) |
|
{ |
|
return FL_EDICT_ALWAYS; |
|
} |
|
} |
|
|
|
// Don't send to anyone else except the local player or his spectators |
|
return FL_EDICT_DONTSEND; |
|
} |
|
|
|
void CBaseViewModel::SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways ) |
|
{ |
|
// Are we already marked for transmission? |
|
if ( pInfo->m_pTransmitEdict->Get( entindex() ) ) |
|
return; |
|
|
|
BaseClass::SetTransmit( pInfo, bAlways ); |
|
|
|
// Force our screens to be sent too. |
|
for ( int i=0; i < m_hScreens.Count(); i++ ) |
|
{ |
|
CVGuiScreen *pScreen = m_hScreens[i].Get(); |
|
if ( pScreen ) |
|
pScreen->SetTransmit( pInfo, bAlways ); |
|
} |
|
}
|
|
|