Now setupbones uses the right angles for cs players

This commit is contained in:
Kamay Xutax 2024-09-02 00:59:19 +02:00
parent be7d8cc228
commit 2782633e53
12 changed files with 98 additions and 25 deletions

View file

@ -1979,7 +1979,8 @@ void C_BaseAnimating::StandardBlendingRules( CStudioHdr *hdr, Vector pos[], Quat
if ( m_pIk )
{
CIKContext auto_ik;
auto_ik.Init( hdr, GetRenderAngles(), GetRenderOrigin(), currentTime, gpGlobals->framecount, boneMask );
m_iIKCounter++;
auto_ik.Init( hdr, GetRenderAngles(), GetRenderOrigin(), currentTime, m_iIKCounter, boneMask );
boneSetup.CalcAutoplaySequences( pos, q, currentTime, &auto_ik );
}
else
@ -2929,7 +2930,8 @@ bool C_BaseAnimating::SetupBones( matrix3x4_t *pBoneToWorldOut, int nMaxBones, i
if (Teleported() || IsNoInterpolationFrame())
m_pIk->ClearTargets();
m_pIk->Init( hdr, GetRenderAngles(), GetRenderOrigin(), currentTime, gpGlobals->framecount, bonesMaskNeedRecalc );
m_iIKCounter++;
m_pIk->Init( hdr, GetRenderAngles(), GetRenderOrigin(), currentTime, m_iIKCounter, bonesMaskNeedRecalc );
}
// Let pose debugger know that we are blending

View file

@ -688,6 +688,7 @@ IMPLEMENT_CLIENTCLASS_DT( C_CSPlayer, DT_CSPlayer, CCSPlayer )
RecvPropInt( RECVINFO( m_iClass ) ),
RecvPropInt( RECVINFO( m_ArmorValue ) ),
RecvPropQAngles( RECVINFO( m_angEyeAngles ) ),
RecvPropQAngles( RECVINFO( m_angRenderAngles ) ),
RecvPropFloat( RECVINFO( m_flStamina ) ),
RecvPropInt( RECVINFO( m_bHasDefuser ), 0, RecvProxy_HasDefuser ),
RecvPropInt( RECVINFO( m_bNightVisionOn), 0, RecvProxy_NightVision ),
@ -729,11 +730,14 @@ END_RECV_TABLE()
C_CSPlayer::C_CSPlayer() :
m_iv_angEyeAngles( "C_CSPlayer::m_iv_angEyeAngles" )
m_iv_angEyeAngles( "C_CSPlayer::m_iv_angEyeAngles" ),
m_iv_angRenderAngles( "C_CSPlayer::m_iv_angRenderAngles" )
{
m_angEyeAngles.Init();
m_angRenderAngles.Init();
// AddVar( &m_angEyeAngles, &m_iv_angEyeAngles, LATCH_SIMULATION_VAR );
AddVar( &m_angEyeAngles, &m_iv_angEyeAngles, LATCH_SIMULATION_VAR );
AddVar( &m_angRenderAngles, &m_iv_angRenderAngles, LATCH_SIMULATION_VAR );
m_iLastAddonBits = m_iAddonBits = 0;
m_iLastPrimaryAddon = m_iLastSecondaryAddon = WEAPON_NONE;
@ -884,7 +888,7 @@ const QAngle& C_CSPlayer::GetRenderAngles()
}
else
{
return BaseClass::GetRenderAngles();
return m_angRenderAngles;
}
}
@ -2133,7 +2137,7 @@ void C_CSPlayer::FireGameEvent( IGameEvent* event )
if ( index == GetUserID() && IsLocalPlayer() )
{
const auto playerIndex = event->GetInt( "player_index" );
const auto player = UTIL_PlayerByIndex( playerIndex );
const auto player = ( C_CSPlayer* )UTIL_PlayerByIndex( playerIndex );
if ( player && !player->IsLocalPlayer() )
{
@ -2169,7 +2173,7 @@ void C_CSPlayer::FireGameEvent( IGameEvent* event )
float flBackupBoneControllers[MAXSTUDIOBONECTRLS];
C_AnimationLayer backupAnimLayers[C_BaseAnimatingOverlay::MAX_OVERLAYS];
Vector vecBackupPosition = player->GetAbsOrigin();
QAngle angBackupAngles = player->GetAbsAngles();
QAngle angBackupAngles = player->m_angRenderAngles;
auto flOldCycle = GetCycle();
auto iOldSequence = GetSequence();
@ -2192,9 +2196,10 @@ void C_CSPlayer::FireGameEvent( IGameEvent* event )
player->SetAbsOrigin( Vector( event->GetFloat( "position_x" ),
event->GetFloat( "position_y" ),
event->GetFloat( "position_z" ) ) );
player->SetAbsAngles( QAngle( event->GetFloat( "angle_x" ),
event->GetFloat( "angle_y" ),
event->GetFloat( "angle_z" ) ) );
player->m_angRenderAngles = QAngle( event->GetFloat( "angle_x" ),
event->GetFloat( "angle_y" ),
event->GetFloat( "angle_z" ) );
const auto numposeparams = event->GetInt( "num_poseparams" );
Assert( numposeparams == pStudioHdr->GetNumPoseParameters() );
@ -2265,7 +2270,7 @@ void C_CSPlayer::FireGameEvent( IGameEvent* event )
player->SetSequence( iOldSequence );
player->SetCycle( flOldCycle );
player->SetAbsOrigin( vecBackupPosition );
player->SetAbsAngles( angBackupAngles );
player->m_angRenderAngles = angBackupAngles;
for ( int i = 0; i < numposeparams; i++ )
{

View file

@ -329,6 +329,7 @@ private:
int m_iClass;
int m_ArmorValue;
QAngle m_angEyeAngles;
QAngle m_angRenderAngles;
bool m_bHasDefuser;
float m_fNextThinkPushAway;
@ -342,6 +343,7 @@ private:
Vector m_vecRagdollVelocity;
CInterpolatedVar< QAngle > m_iv_angEyeAngles;
CInterpolatedVar< QAngle > m_iv_angRenderAngles;
// ID Target
int m_iIDEntIndex;

View file

@ -434,7 +434,6 @@ void CAnimationLayer::DispatchAnimEvents( CBaseAnimating *eventHandler, CBaseAni
}
void CBaseAnimatingOverlay::GetSkeleton( CStudioHdr *pStudioHdr, Vector pos[], Quaternion q[], int boneMask )
{
if(!pStudioHdr)
@ -481,7 +480,7 @@ void CBaseAnimatingOverlay::GetSkeleton( CStudioHdr *pStudioHdr, Vector pos[], Q
if ( m_pIk )
{
CIKContext auto_ik;
auto_ik.Init( pStudioHdr, GetAbsAngles(), GetAbsOrigin(), gpGlobals->curtime, m_iIKCounter, boneMask );
auto_ik.Init( pStudioHdr, GetRenderAngles(), GetRenderOrigin(), gpGlobals->curtime, m_iIKCounter, boneMask );
boneSetup.CalcAutoplaySequences( pos, q, gpGlobals->curtime, &auto_ik );
}
else

View file

@ -132,7 +132,7 @@ public:
MAX_OVERLAYS = 15,
};
private:
protected:
CUtlVector< CAnimationLayer > m_AnimOverlay;
//int m_nActiveLayers;
//int m_nActiveBaseLayers;

View file

@ -2029,7 +2029,7 @@ void CBaseAnimating::SetupBones( matrix3x4_t *pBoneToWorld, int boneMask )
// FIXME: pass this into Studio_BuildMatrices to skip transforms
CBoneBitList boneComputed;
m_iIKCounter++;
m_pIk->Init( pStudioHdr, GetAbsAngles(), adjOrigin, gpGlobals->curtime, m_iIKCounter, boneMask );
m_pIk->Init( pStudioHdr, GetRenderAngles(), adjOrigin, gpGlobals->curtime, m_iIKCounter, boneMask );
GetSkeleton( pStudioHdr, pos, q, boneMask );
UpdateIKLocks( gpGlobals->curtime );
@ -2053,7 +2053,7 @@ void CBaseAnimating::SetupBones( matrix3x4_t *pBoneToWorld, int boneMask )
{
BuildMatricesWithBoneMerge(
pStudioHdr,
GetAbsAngles(),
GetRenderAngles(),
adjOrigin,
pos,
q,
@ -2072,7 +2072,7 @@ void CBaseAnimating::SetupBones( matrix3x4_t *pBoneToWorld, int boneMask )
Studio_BuildMatrices(
pStudioHdr,
GetAbsAngles(),
GetRenderAngles(),
adjOrigin,
pos,
q,
@ -3033,7 +3033,7 @@ void CBaseAnimating::GetSkeleton( CStudioHdr *pStudioHdr, Vector pos[], Quaterni
if ( m_pIk )
{
CIKContext auto_ik;
auto_ik.Init( pStudioHdr, GetAbsAngles(), GetAbsOrigin(), gpGlobals->curtime, m_iIKCounter, boneMask );
auto_ik.Init( pStudioHdr, GetRenderAngles(), GetAbsOrigin(), gpGlobals->curtime, m_iIKCounter, boneMask );
boneSetup.CalcAutoplaySequences( pos, q, gpGlobals->curtime, &auto_ik );
}
else

View file

@ -425,7 +425,7 @@ protected:
public:
COutputEvent m_OnIgnite;
private:
protected:
CStudioHdr *m_pStudioHdr;
CThreadFastMutex m_StudioHdrInitLock;
CThreadFastMutex m_BoneSetupMutex;

View file

@ -426,6 +426,8 @@ public:
bool IsCurrentlyTouching( void ) const;
const Vector& GetAbsOrigin( void ) const;
const QAngle& GetAbsAngles( void ) const;
virtual const Vector& GetRenderOrigin( void ) const { return GetAbsOrigin(); }
virtual const QAngle& GetRenderAngles( void ) const { return GetAbsAngles(); }
SolidType_t GetSolid() const;
int GetSolidFlags( void ) const;

View file

@ -6,6 +6,7 @@
//=============================================================================//
#include "cbase.h"
#include "bone_setup.h"
#include "cs_player.h"
#include "cs_gamerules.h"
#include "dt_send.h"
@ -300,6 +301,7 @@ IMPLEMENT_SERVERCLASS_ST( CCSPlayer, DT_CSPlayer )
SendPropInt( SENDINFO( m_iClass ), Q_log2( CS_NUM_CLASSES )+1, SPROP_UNSIGNED ),
SendPropInt( SENDINFO( m_ArmorValue ), 8 ),
SendPropQAngles(SENDINFO(m_angEyeAngles)),
SendPropQAngles(SENDINFO(m_angRenderAngles)),
SendPropBool( SENDINFO( m_bHasDefuser ) ),
SendPropBool( SENDINFO( m_bNightVisionOn ) ), //send as int so we can use a RecvProxy on the client
SendPropBool( SENDINFO( m_bHasNightVision ) ),
@ -1161,7 +1163,7 @@ void CCSPlayer::Event_Killed( const CTakeDamageInfo &info )
{
if ( RandomInt( 0, 100 ) < 20 )
{
CHolidayGift::Create( WorldSpaceCenter(), GetAbsAngles(), EyeAngles(), GetAbsVelocity(), this );
CHolidayGift::Create( WorldSpaceCenter(), GetRenderAngles(), EyeAngles(), GetAbsVelocity(), this );
}
}
@ -1452,7 +1454,7 @@ void CCSPlayer::UpdateRadar()
WRITE_SBITLONG( pPlayer->GetAbsOrigin().x/4, COORD_INTEGER_BITS-1 );
WRITE_SBITLONG( pPlayer->GetAbsOrigin().y/4, COORD_INTEGER_BITS-1 );
WRITE_SBITLONG( pPlayer->GetAbsOrigin().z/4, COORD_INTEGER_BITS-1 );
WRITE_SBITLONG( AngleNormalize( pPlayer->GetAbsAngles().y ), 9 );
WRITE_SBITLONG( AngleNormalize( pPlayer->GetRenderAngles().y ), 9 );
}
WRITE_BYTE( 0 ); // end marker
@ -1574,6 +1576,8 @@ void CCSPlayer::PostThink()
m_PlayerAnimState->Update( m_angEyeAngles[YAW], m_angEyeAngles[PITCH] );
m_angRenderAngles = m_PlayerAnimState->GetRenderAngles();
// check if we need to apply a deafness DSP effect.
if ((m_applyDeafnessTime != 0.0f) && (m_applyDeafnessTime <= gpGlobals->curtime))
{
@ -2768,7 +2772,7 @@ void CCSPlayer::DropShield( void )
#ifdef CS_SHIELD_ENABLED
//Drop an item_defuser
Vector vForward, vRight;
AngleVectors( GetAbsAngles(), &vForward, &vRight, NULL );
AngleVectors( GetRenderAngles(), &vForward, &vRight, NULL );
RemoveShield();
@ -6707,7 +6711,7 @@ void CCSPlayer::DropWeapons( bool fromDeath, bool friendlyFire )
{
//Drop an item_defuser
Vector vForward, vRight;
AngleVectors( GetAbsAngles(), &vForward, &vRight, NULL );
AngleVectors( GetRenderAngles(), &vForward, &vRight, NULL );
CBaseAnimating *pDefuser = (CBaseAnimating *)CBaseEntity::Create( "item_defuser", WorldSpaceCenter(), GetLocalAngles(), this );
pDefuser->ApplyAbsVelocityImpulse( vForward * 200 + vRight * random->RandomFloat( -50, 50 ) );

View file

@ -287,6 +287,9 @@ public:
virtual void SetupVisibility( CBaseEntity *pViewEntity, unsigned char *pvs, int pvssize );
virtual int GetNextObserverSearchStartPoint( bool bReverse );
virtual const QAngle& GetRenderAngles( void ) const { return m_angRenderAngles; }
// In shared code.
public:
@ -813,6 +816,7 @@ public:
// Copyed from EyeAngles() so we can send it to the client.
CNetworkQAngle( m_angEyeAngles );
CNetworkQAngle( m_angRenderAngles );
bool m_bVCollisionInitted;

View file

@ -6,6 +6,9 @@
//=============================================================================//
#include "cbase.h"
#ifdef CSTRIKE_DLL
#include "cs_player.h"
#endif
#include "icvar.h"
#include "player.h"
#include "shareddefs.h"
@ -88,6 +91,9 @@ struct LagRecord
{
m_encodedControllers[i] = 0;
}
#ifdef CSTRIKE_DLL
m_angRenderAngles.Init();
#endif
}
LagRecord( const LagRecord& src )
@ -117,6 +123,10 @@ struct LagRecord
{
m_encodedControllers[i] = src.m_encodedControllers[i];
}
#ifdef CSTRIKE_DLL
m_angRenderAngles = src.m_angRenderAngles;
#endif
}
// Did player die this frame
@ -137,6 +147,9 @@ struct LagRecord
float m_masterCycle;
float m_poseParameters[MAXSTUDIOPOSEPARAM];
float m_encodedControllers[MAXSTUDIOBONECTRLS];
#ifdef CSTRIKE_DLL
QAngle m_angRenderAngles;
#endif
};
//
@ -323,6 +336,15 @@ void CLagCompensationManager::TrackPlayerData( CBasePlayer* pPlayer )
}
}
#ifdef CSTRIKE_DLL
const auto csPlayer = dynamic_cast< CCSPlayer* >( pPlayer );
if ( csPlayer )
{
record.m_angRenderAngles = csPlayer->m_angRenderAngles;
}
#endif
track->Push( record );
}
@ -384,10 +406,17 @@ void CLagCompensationManager::BacktrackPlayer( CBasePlayer* pPlayer, CUserCmd* c
Vector minsPreScaled;
Vector maxsPreScaled;
QAngle ang;
#ifdef CSTRIKE_DLL
QAngle renderAngles;
#endif
LagRecord* nextRecordSim;
LagRecord* recordSim;
LagRecord* recordAnim;
#ifdef CSTRIKE_DLL
auto csPlayer = dynamic_cast< CCSPlayer* >( pPlayer );
#endif
int pl_index = pPlayer->entindex();
float flTargetLerpSimTime = cmd->simulationdata[pl_index].lerp_time;
@ -470,6 +499,12 @@ void CLagCompensationManager::BacktrackPlayer( CBasePlayer* pPlayer, CUserCmd* c
org = Lerp( fracSim, recordSim->m_vecOrigin, nextRecordSim->m_vecOrigin );
minsPreScaled = Lerp( fracSim, recordSim->m_vecMinsPreScaled, nextRecordSim->m_vecMinsPreScaled );
maxsPreScaled = Lerp( fracSim, recordSim->m_vecMaxsPreScaled, nextRecordSim->m_vecMaxsPreScaled );
#ifdef CSTRIKE_DLL
if ( csPlayer )
{
renderAngles = Lerp( fracSim, recordSim->m_angRenderAngles, nextRecordSim->m_angRenderAngles );
}
#endif
}
else
{
@ -479,6 +514,9 @@ void CLagCompensationManager::BacktrackPlayer( CBasePlayer* pPlayer, CUserCmd* c
ang = recordSim->m_vecAngles;
minsPreScaled = recordSim->m_vecMinsPreScaled;
maxsPreScaled = recordSim->m_vecMaxsPreScaled;
#ifdef CSTRIKE_DLL
renderAngles = recordSim->m_angRenderAngles;
#endif
}
// See if this represents a change for the player
@ -493,6 +531,14 @@ void CLagCompensationManager::BacktrackPlayer( CBasePlayer* pPlayer, CUserCmd* c
restore->m_flSimulationTime = pPlayer->GetSimulationTime();
restore->m_flAnimTime = pPlayer->GetAnimTime();
#ifdef CSTRIKE_DLL
if ( csPlayer )
{
restore->m_angRenderAngles = csPlayer->m_angRenderAngles;
csPlayer->m_angRenderAngles = renderAngles;
}
#endif
if ( angdiff.LengthSqr() > 0.0f )
{
flags |= LC_ANGLES_CHANGED;
@ -634,6 +680,15 @@ void CLagCompensationManager::FinishLagCompensation( CBasePlayer* player )
LagRecord* restore = &m_RestoreData[i];
LagRecord* change = &m_ChangeData[i];
#ifdef CSTRIKE_DLL
auto csPlayer = dynamic_cast< CCSPlayer* >( pPlayer );
if ( csPlayer )
{
csPlayer->m_angRenderAngles = restore->m_angRenderAngles;
}
#endif
if ( restore->m_fFlags & LC_SIZE_CHANGED )
{
// see if simulation made any changes, if no, then do the restore, otherwise,

View file

@ -541,8 +541,8 @@ void CCSPlayer::FireBullet(
QAngle angles[MAXSTUDIOBONES];
int indexes[MAXSTUDIOBONES];
auto angle = lagPlayer->GetAbsAngles();
auto position = lagPlayer->GetAbsOrigin();
auto angle = lagPlayer->GetRenderAngles();
auto position = lagPlayer->GetRenderOrigin();
event->SetFloat( "position_x", position.x );
event->SetFloat( "position_y", position.y );