Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions mp/src/game/client/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ target_include_directories(client
${CMAKE_SOURCE_DIR}/game/shared
${CMAKE_SOURCE_DIR}/game/shared/hl2
${CMAKE_SOURCE_DIR}/game/shared/hl2mp
${CMAKE_SOURCE_DIR}/game/shared/Multiplayer
${CMAKE_SOURCE_DIR}/game/shared/neo
${CMAKE_SOURCE_DIR}/game/shared/neo/weapons
${CMAKE_SOURCE_DIR}/public
Expand Down Expand Up @@ -1566,8 +1567,6 @@ target_sources_grouped(
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_player_shared.h
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_player_spawnpoint.cpp
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_player_spawnpoint.h
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_playeranimstate.cpp
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_playeranimstate.h
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_predicted_viewmodel.cpp
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_predicted_viewmodel.h
${CMAKE_SOURCE_DIR}/game/shared/neo/neo_predicted_viewmodel_muzzleflash.cpp
Expand Down Expand Up @@ -1653,6 +1652,14 @@ if(NEO_BUILD_WEAPON_PBK56S)
)
endif()

target_sources_grouped(
TARGET client
NAME "Source Files\\Shared\\Multiplayer"
FILES
${CMAKE_SOURCE_DIR}/game/shared/Multiplayer/multiplayer_animstate.cpp
${CMAKE_SOURCE_DIR}/game/shared/Multiplayer/multiplayer_animstate.h
)

target_sources_grouped(
TARGET client
NAME "HL2MP"
Expand All @@ -1661,6 +1668,8 @@ target_sources_grouped(
${CMAKE_SOURCE_DIR}/game/shared/hl2mp/hl2mp_gamerules.h
${CMAKE_SOURCE_DIR}/game/shared/hl2mp/hl2mp_player_shared.cpp
${CMAKE_SOURCE_DIR}/game/shared/hl2mp/hl2mp_player_shared.h
${CMAKE_SOURCE_DIR}/game/shared/hl2mp/hl2mp_playeranimstate.cpp
${CMAKE_SOURCE_DIR}/game/shared/hl2mp/hl2mp_playeranimstate.h
${CMAKE_SOURCE_DIR}/game/shared/hl2mp/hl2mp_weapon_parse.cpp
${CMAKE_SOURCE_DIR}/game/shared/hl2mp/hl2mp_weapon_parse.h
hl2mp/c_hl2mp_player.cpp
Expand Down
4 changes: 4 additions & 0 deletions mp/src/game/client/c_baseanimating.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,11 @@ void C_BaseAnimating::UpdateRelevantInterpolatedVars()

void C_BaseAnimating::AddBaseAnimatingInterpolatedVars()
{
#ifdef NEO // NEO HACK (Adam) lean interpolation was messed up with change to multiplayer_animstate, NEOTODO workout if this is ok, or how to make the old version work
AddVar( m_flEncodedController, &m_iv_flEncodedController, LATCH_SIMULATION_VAR, true );
#else
AddVar( m_flEncodedController, &m_iv_flEncodedController, LATCH_ANIMATION_VAR, true );
#endif
AddVar( m_flPoseParameter, &m_iv_flPoseParameter, LATCH_ANIMATION_VAR, true );

int flags = LATCH_ANIMATION_VAR;
Expand Down
4 changes: 0 additions & 4 deletions mp/src/game/client/c_baseanimatingoverlay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@

#include "dt_utlvector_recv.h"

#ifndef NEO
#include "neo_playeranimstate.h"
#endif

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

Expand Down
206 changes: 170 additions & 36 deletions mp/src/game/client/hl2mp/c_hl2mp_player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
#include "iviewrender_beams.h" // flashlight beam
#include "r_efx.h"
#include "dlight.h"
#include "c_basetempentity.h"
#include "prediction.h"
#include "bone_setup.h"

#ifdef NEO
#include "c_neo_player.h"
Expand All @@ -29,12 +32,26 @@
LINK_ENTITY_TO_CLASS( player, C_HL2MP_Player );
#endif

IMPLEMENT_CLIENTCLASS_DT(C_HL2MP_Player, DT_HL2MP_Player, CHL2MP_Player)
BEGIN_RECV_TABLE_NOBASE( C_HL2MP_Player, DT_HL2MPLocalPlayerExclusive )
RecvPropVector( RECVINFO_NAME( m_vecNetworkOrigin, m_vecOrigin ) ),
RecvPropFloat( RECVINFO( m_angEyeAngles[0] ) ),
// RecvPropFloat( RECVINFO( m_angEyeAngles[1] ) ),
END_RECV_TABLE()

BEGIN_RECV_TABLE_NOBASE( C_HL2MP_Player, DT_HL2MPNonLocalPlayerExclusive )
RecvPropVector( RECVINFO_NAME( m_vecNetworkOrigin, m_vecOrigin ) ),
RecvPropFloat( RECVINFO( m_angEyeAngles[0] ) ),
RecvPropFloat( RECVINFO( m_angEyeAngles[1] ) ),
#ifdef NEO
RecvPropFloat( RECVINFO( m_angEyeAngles[2] ) ),
#endif
END_RECV_TABLE()

IMPLEMENT_CLIENTCLASS_DT(C_HL2MP_Player, DT_HL2MP_Player, CHL2MP_Player)

RecvPropDataTable( "hl2mplocaldata", 0, 0, &REFERENCE_RECV_TABLE(DT_HL2MPLocalPlayerExclusive) ),
RecvPropDataTable( "hl2mpnonlocaldata", 0, 0, &REFERENCE_RECV_TABLE(DT_HL2MPNonLocalPlayerExclusive) ),

RecvPropEHandle( RECVINFO( m_hRagdoll ) ),
RecvPropInt( RECVINFO( m_iSpawnInterpCounter ) ),
RecvPropInt( RECVINFO( m_iPlayerSoundType) ),
Expand All @@ -43,7 +60,12 @@ IMPLEMENT_CLIENTCLASS_DT(C_HL2MP_Player, DT_HL2MP_Player, CHL2MP_Player)
END_RECV_TABLE()

BEGIN_PREDICTION_DATA( C_HL2MP_Player )
DEFINE_PRED_FIELD( m_flCycle, FIELD_FLOAT, FTYPEDESC_OVERRIDE | FTYPEDESC_PRIVATE | FTYPEDESC_NOERRORCHECK ),
DEFINE_PRED_FIELD( m_fIsWalking, FIELD_BOOLEAN, FTYPEDESC_INSENDTABLE ),
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()

#ifdef NEO
Expand All @@ -61,16 +83,16 @@ static ConVar cl_defaultweapon( "cl_defaultweapon", "weapon_physcannon", FCVAR_U

void SpawnBlood (Vector vecSpot, const Vector &vecDir, int bloodColor, float flDamage);

C_HL2MP_Player::C_HL2MP_Player() : m_PlayerAnimState( this ), m_iv_angEyeAngles( "C_HL2MP_Player::m_iv_angEyeAngles" )
C_HL2MP_Player::C_HL2MP_Player() : m_iv_angEyeAngles( "C_HL2MP_Player::m_iv_angEyeAngles" )
{
m_iIDEntIndex = 0;
m_iSpawnInterpCounterCache = 0;

m_angEyeAngles.Init();

AddVar( &m_angEyeAngles, &m_iv_angEyeAngles, LATCH_SIMULATION_VAR );

m_EntClientFlags |= ENTCLIENTFLAG_DONTUSEIK;
// m_EntClientFlags |= ENTCLIENTFLAG_DONTUSEIK;
m_PlayerAnimState = CreateHL2MPPlayerAnimState( this );

m_blinkTimer.Invalidate();

m_pFlashlightBeam = NULL;
Expand All @@ -79,6 +101,7 @@ C_HL2MP_Player::C_HL2MP_Player() : m_PlayerAnimState( this ), m_iv_angEyeAngles(
C_HL2MP_Player::~C_HL2MP_Player( void )
{
ReleaseFlashlight();
m_PlayerAnimState->Release();
}

int C_HL2MP_Player::GetIDTarget() const
Expand Down Expand Up @@ -179,6 +202,12 @@ CStudioHdr *C_HL2MP_Player::OnNewModel( void )

Initialize( );

// Reset the players animation states, gestures
if ( m_PlayerAnimState )
{
m_PlayerAnimState->OnNewModel();
}

return hdr;
}

Expand Down Expand Up @@ -321,24 +350,6 @@ void C_HL2MP_Player::DoImpactEffect( trace_t &tr, int nDamageType )

void C_HL2MP_Player::PreThink( void )
{
QAngle vTempAngles = GetLocalAngles();

if ( GetLocalPlayer() == this )
{
vTempAngles[PITCH] = EyeAngles()[PITCH];
}
else
{
vTempAngles[PITCH] = m_angEyeAngles[PITCH];
}

if ( vTempAngles[YAW] < 0.0f )
{
vTempAngles[YAW] += 360.0f;
}

SetLocalAngles( vTempAngles );

BaseClass::PreThink();

HandleSpeedChanges();
Expand Down Expand Up @@ -371,13 +382,6 @@ void C_HL2MP_Player::AddEntity( void )
{
BaseClass::AddEntity();

QAngle vTempAngles = GetLocalAngles();
vTempAngles[PITCH] = m_angEyeAngles[PITCH];

SetLocalAngles( vTempAngles );

m_PlayerAnimState.Update();

// Zero out model pitch, blending takes care of all of it.
SetLocalAnglesDim( X_INDEX, 0 );

Expand Down Expand Up @@ -473,7 +477,7 @@ const QAngle& C_HL2MP_Player::GetRenderAngles()
}
else
{
return m_PlayerAnimState.GetRenderAngles();
return m_PlayerAnimState->GetRenderAngles();
}
}

Expand Down Expand Up @@ -845,7 +849,7 @@ void C_HL2MPRagdoll::Interp_Copy( C_BaseAnimatingOverlay *pSourceEntity )

VarMapping_t *pSrc = pSourceEntity->GetVarMapping();
VarMapping_t *pDest = GetVarMapping();

// Find all the VarMapEntry_t's that represent the same variable.
for ( int i = 0; i < pDest->m_Entries.Count(); i++ )
{
Expand Down Expand Up @@ -1041,10 +1045,140 @@ void C_HL2MPRagdoll::SetupWeights( const matrix3x4_t *pBoneToWorld, int nFlexWei
}
}

void C_HL2MP_Player::PostThink( void )
void C_HL2MP_Player::UpdateClientSideAnimation()
{
m_PlayerAnimState->Update( EyeAngles()[YAW], EyeAngles()[PITCH] );

BaseClass::UpdateClientSideAnimation();
}

// -------------------------------------------------------------------------------- //
// Player animation event. Sent to the client when a player fires, jumps, reloads, etc..
// -------------------------------------------------------------------------------- //

class C_TEPlayerAnimEvent : public C_BaseTempEntity
{
public:
DECLARE_CLASS( C_TEPlayerAnimEvent, C_BaseTempEntity );
DECLARE_CLIENTCLASS();

virtual void PostDataUpdate( DataUpdateType_t updateType )
{
// Create the effect.
C_HL2MP_Player *pPlayer = dynamic_cast< C_HL2MP_Player* >( m_hPlayer.Get() );
if ( pPlayer && !pPlayer->IsDormant() )
{
pPlayer->DoAnimationEvent( (PlayerAnimEvent_t)m_iEvent.Get(), m_nData );
}
}

public:
CNetworkHandle( CBasePlayer, m_hPlayer );
CNetworkVar( int, m_iEvent );
CNetworkVar( int, m_nData );
};

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_HL2MP_Player::DoAnimationEvent( PlayerAnimEvent_t event, int nData )
{
if ( IsLocalPlayer() )
{
if ( ( prediction->InPrediction() && !prediction->IsFirstTimePredicted() ) )
return;
}

MDLCACHE_CRITICAL_SECTION();
m_PlayerAnimState->DoAnimationEvent( event, nData );
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_HL2MP_Player::CalculateIKLocks( float currentTime )
{
BaseClass::PostThink();
if (!m_pIk)
return;

int targetCount = m_pIk->m_target.Count();
if ( targetCount == 0 )
return;

// In TF, we might be attaching a player's view to a walking model that's using IK. If we are, it can
// get in here during the view setup code, and it's not normally supposed to be able to access the spatial
// partition that early in the rendering loop. So we allow access right here for that special case.
SpatialPartitionListMask_t curSuppressed = partition->GetSuppressedLists();
partition->SuppressLists( PARTITION_ALL_CLIENT_EDICTS, false );
CBaseEntity::PushEnableAbsRecomputations( false );

for (int i = 0; i < targetCount; i++)
{
trace_t trace;
CIKTarget *pTarget = &m_pIk->m_target[i];

if (!pTarget->IsActive())
continue;

switch( pTarget->type)
{
case IK_GROUND:
{
pTarget->SetPos( Vector( pTarget->est.pos.x, pTarget->est.pos.y, GetRenderOrigin().z ));
pTarget->SetAngles( GetRenderAngles() );
}
break;

case IK_ATTACHMENT:
{
C_BaseEntity *pEntity = NULL;
float flDist = pTarget->est.radius;

// FIXME: make entity finding sticky!
// FIXME: what should the radius check be?
for ( CEntitySphereQuery sphere( pTarget->est.pos, 64 ); ( pEntity = sphere.GetCurrentEntity() ) != NULL; sphere.NextEntity() )
{
C_BaseAnimating *pAnim = pEntity->GetBaseAnimating( );
if (!pAnim)
continue;

int iAttachment = pAnim->LookupAttachment( pTarget->offset.pAttachmentName );
if (iAttachment <= 0)
continue;

Vector origin;
QAngle angles;
pAnim->GetAttachment( iAttachment, origin, angles );

// debugoverlay->AddBoxOverlay( origin, Vector( -1, -1, -1 ), Vector( 1, 1, 1 ), QAngle( 0, 0, 0 ), 255, 0, 0, 0, 0 );

float d = (pTarget->est.pos - origin).Length();

if ( d >= flDist)
continue;

flDist = d;
pTarget->SetPos( origin );
pTarget->SetAngles( angles );
// debugoverlay->AddBoxOverlay( pTarget->est.pos, Vector( -pTarget->est.radius, -pTarget->est.radius, -pTarget->est.radius ), Vector( pTarget->est.radius, pTarget->est.radius, pTarget->est.radius), QAngle( 0, 0, 0 ), 0, 255, 0, 0, 0 );
}

if (flDist >= pTarget->est.radius)
{
// debugoverlay->AddBoxOverlay( pTarget->est.pos, Vector( -pTarget->est.radius, -pTarget->est.radius, -pTarget->est.radius ), Vector( pTarget->est.radius, pTarget->est.radius, pTarget->est.radius), QAngle( 0, 0, 0 ), 0, 0, 255, 0, 0 );
// no solution, disable ik rule
pTarget->IKFailed( );
}
}
break;
}
}

// Store the eye angles pitch so the client can compute its animation state correctly.
m_angEyeAngles = EyeAngles();
CBaseEntity::PopEnableAbsRecomputations();
partition->SuppressLists( curSuppressed, true );
}
10 changes: 5 additions & 5 deletions mp/src/game/client/hl2mp/c_hl2mp_player.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#define HL2MP_PLAYER_H
#pragma once

class C_HL2MP_Player;
#include "hl2mp_playeranimstate.h"
#include "c_basehlplayer.h"
#include "hl2mp_player_shared.h"
#include "beamdraw.h"
Expand Down Expand Up @@ -41,7 +41,6 @@ class C_HL2MP_Player : public C_BaseHLPlayer
virtual int DrawModel( int flags );
virtual void AddEntity( void );

QAngle GetAnimEyeAngles( void ) { return m_angEyeAngles; }
Vector GetAttackSpread( CBaseCombatWeapon *pWeapon, CBaseEntity *pTarget = NULL );


Expand Down Expand Up @@ -98,13 +97,14 @@ class C_HL2MP_Player : public C_BaseHLPlayer

HL2MPPlayerState State_Get() const;

virtual void PostThink( void );
virtual void UpdateClientSideAnimation();
void DoAnimationEvent( PlayerAnimEvent_t event, int nData = 0 );
virtual void CalculateIKLocks( float currentTime );

private:

C_HL2MP_Player( const C_HL2MP_Player & );

CPlayerAnimState m_PlayerAnimState;
CHL2MPPlayerAnimState *m_PlayerAnimState;

QAngle m_angEyeAngles;

Expand Down
Loading