Files
cool-source-archive/game/client/sdk/basenetworkedplayer_cl.cpp
Totterynine 4b952b0e4e init
2021-09-13 15:31:53 +05:00

134 lines
4.5 KiB
C++

#include "cbase.h"
#include "basenetworkedplayer_cl.h"
#include "prediction.h"
#undef CBaseNetworkedPlayer
// ***************** C_TEPlayerAnimEvent **********************
IMPLEMENT_CLIENTCLASS_EVENT( C_TEPlayerAnimEvent, DT_TEPlayerAnimEvent, CTEPlayerAnimEvent );
BEGIN_RECV_TABLE_NOBASE( C_TEPlayerAnimEvent, DT_TEPlayerAnimEvent )
RecvPropEHandle( RECVINFO( m_hPlayer ) ),
RecvPropInt( RECVINFO( m_iEvent ) ),
RecvPropInt( RECVINFO( m_nData ) )
END_RECV_TABLE()
void C_TEPlayerAnimEvent::PostDataUpdate( DataUpdateType_t updateType )
{
C_BaseNetworkedPlayer *pPlayer = (C_BaseNetworkedPlayer*)m_hPlayer.Get();
if ( pPlayer && !pPlayer->IsDormant() )
pPlayer->DoAnimationEvent( (PlayerAnimEvent_t)m_iEvent.Get(), m_nData );
}
// ***************** C_BaseNetworkedPlayer **********************
BEGIN_RECV_TABLE_NOBASE( C_BaseNetworkedPlayer, DT_BaseNetworkedPlayerExclusive )
RecvPropVector( RECVINFO_NAME( m_vecNetworkOrigin, m_vecOrigin ) ), // RECVINFO_NAME copies the networked value over to the 'real' one
RecvPropFloat( RECVINFO( m_angEyeAngles[0] ) ),
END_RECV_TABLE()
BEGIN_RECV_TABLE_NOBASE( C_BaseNetworkedPlayer, DT_BaseNetworkedPlayerNonLocalExclusive )
RecvPropVector( RECVINFO_NAME( m_vecNetworkOrigin, m_vecOrigin ) ), // RECVINFO_NAME again
RecvPropFloat( RECVINFO( m_angEyeAngles[0] ) ),
RecvPropFloat( RECVINFO( m_angEyeAngles[1] ) ),
END_RECV_TABLE()
IMPLEMENT_CLIENTCLASS_DT(C_BaseNetworkedPlayer, DT_BaseNetworkedPlayer, CBaseNetworkedPlayer )
RecvPropBool( RECVINFO( m_bSpawnInterpCounter ) ),
RecvPropEHandle( RECVINFO( m_hRagdoll ) ),
RecvPropDataTable( "netplayer_localdata", 0, 0, &REFERENCE_RECV_TABLE(DT_BaseNetworkedPlayerExclusive) ),
RecvPropDataTable( "netplayer_nonlocaldata", 0, 0, &REFERENCE_RECV_TABLE(DT_BaseNetworkedPlayerNonLocalExclusive) ),
END_NETWORK_TABLE()
BEGIN_PREDICTION_DATA( C_BaseNetworkedPlayer )
DEFINE_PRED_FIELD( m_flCycle, FIELD_FLOAT, FTYPEDESC_OVERRIDE | FTYPEDESC_PRIVATE | FTYPEDESC_NOERRORCHECK ),
DEFINE_PRED_FIELD( m_nSequence, FIELD_INTEGER, FTYPEDESC_OVERRIDE | FTYPEDESC_PRIVATE | FTYPEDESC_NOERRORCHECK ),
DEFINE_PRED_FIELD( m_flPlaybackRate, FIELD_FLOAT, FTYPEDESC_OVERRIDE | FTYPEDESC_PRIVATE | FTYPEDESC_NOERRORCHECK ),
DEFINE_PRED_ARRAY_TOL( m_flEncodedController, FIELD_FLOAT, MAXSTUDIOBONECTRLS, FTYPEDESC_OVERRIDE | FTYPEDESC_PRIVATE, 0.02f ),
DEFINE_PRED_FIELD( m_nNewSequenceParity, FIELD_INTEGER, FTYPEDESC_OVERRIDE | FTYPEDESC_PRIVATE | FTYPEDESC_NOERRORCHECK ),
END_PREDICTION_DATA()
C_BaseNetworkedPlayer::C_BaseNetworkedPlayer() : m_iv_angEyeAngles( "C_BaseNetworkedPlayer::m_iv_angEyeAngles" )
{
m_angEyeAngles.Init();
AddVar( &m_angEyeAngles, &m_iv_angEyeAngles, LATCH_SIMULATION_VAR );
m_bSpawnInterpCounterCache,m_bSpawnInterpCounter = false;
SetPredictionEligible(true);
};
const QAngle& C_BaseNetworkedPlayer::EyeAngles()
{
if( IsLocalPlayer() )
return BaseClass::EyeAngles();
else
return m_angEyeAngles;
}
const QAngle& C_BaseNetworkedPlayer::GetRenderAngles()
{
if ( IsRagdoll() )
return vec3_angle;
else
return m_PlayerAnimState->GetRenderAngles();
}
void C_BaseNetworkedPlayer::DoAnimationEvent( PlayerAnimEvent_t event, int nData )
{
if ( IsLocalPlayer() && prediction->InPrediction() && !prediction->IsFirstTimePredicted() )
return;
MDLCACHE_CRITICAL_SECTION();
m_PlayerAnimState->DoAnimationEvent( event, nData );
}
void C_BaseNetworkedPlayer::UpdateClientSideAnimation()
{
// Keep the model upright; pose params will handle pitch aiming.
QAngle angles = GetLocalAngles();
angles[PITCH] = 0;
SetLocalAngles( angles );
m_PlayerAnimState->Update( EyeAngles()[YAW], EyeAngles()[PITCH] );
BaseClass::UpdateClientSideAnimation();
}
void C_BaseNetworkedPlayer::PostDataUpdate( DataUpdateType_t updateType )
{
// C_BaseEntity assumes we're networking the entity's angles, so pretend that it
// networked the same value we already have.
SetNetworkAngles( GetLocalAngles() );
// respawn test (can't use a recvproxy with a bool value?!?)
if ( m_bSpawnInterpCounter != m_bSpawnInterpCounterCache )
Respawn();
BaseClass::PostDataUpdate( updateType );
}
#include "view_scene.h" // for tone mapping reset
void C_BaseNetworkedPlayer::Respawn()
{
// fix up interp
MoveToLastReceivedPosition( true );
ResetLatched();
m_bSpawnInterpCounterCache = m_bSpawnInterpCounter;
// reset HDR
if ( IsLocalPlayer() )
ResetToneMapping(1.0);
}
IRagdoll* C_BaseNetworkedPlayer::GetRepresentativeRagdoll() const
{
if ( m_hRagdoll.Get() )
{
C_BaseNetworkedRagdoll *pRagdoll = (C_BaseNetworkedRagdoll*)m_hRagdoll.Get();
return pRagdoll->GetIRagdoll();
}
else
return NULL;
}