mirror of
https://github.com/celisej567/cool-source-archive.git
synced 2026-09-04 15:33:19 +03:00
134 lines
4.5 KiB
C++
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;
|
|
} |