Skip to content

Commit 3fcf0cd

Browse files
committed
subtick lerp view angles for scottish resistance
it's not ideal, but moving >180 is a bit hard and i don't want to break hold aim... alternatives include server verification, delta, history log
1 parent fadeca0 commit 3fcf0cd

8 files changed

Lines changed: 52 additions & 7 deletions

File tree

src/game/client/c_baseplayer.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2472,14 +2472,32 @@ const QAngle& C_BasePlayer::Weapon_PunchAngle()
24722472
return vecCurPunch;
24732473
}
24742474

2475-
return Lerp( m_flInterpolationTime, m_Local.m_vecPreTickPunchAngle, vecCurPunch );
2475+
static QAngle vecReturnPunch;
2476+
vecReturnPunch.x = m_Local.m_vecPreTickPunchAngle.x + AngleDiff( vecCurPunch.x, m_Local.m_vecPreTickPunchAngle.x ) * m_flInterpolationTime;
2477+
vecReturnPunch.y = m_Local.m_vecPreTickPunchAngle.y + AngleDiff( vecCurPunch.y, m_Local.m_vecPreTickPunchAngle.y ) * m_flInterpolationTime;
2478+
vecReturnPunch.z = m_Local.m_vecPreTickPunchAngle.z + AngleDiff( vecCurPunch.z, m_Local.m_vecPreTickPunchAngle.z ) * m_flInterpolationTime;
2479+
return vecReturnPunch;
24762480
}
24772481

24782482
void C_BasePlayer::SetPunchAngle( const QAngle &angle )
24792483
{
24802484
m_Local.m_vecPunchAngle = angle;
24812485
}
24822486

2487+
const QAngle& C_BasePlayer::Weapon_EyeAngles()
2488+
{
2489+
if ( !IsInPostThink() || m_flInterpolationTime >= 1.0f )
2490+
{
2491+
return EyeAngles();
2492+
}
2493+
2494+
static QAngle vecReturn;
2495+
QAngle current = EyeAngles();
2496+
vecReturn.x = m_Local.m_vecPreTickEyeAngles.x + AngleDiff( current.x, m_Local.m_vecPreTickEyeAngles.x ) * m_flInterpolationTime;
2497+
vecReturn.y = m_Local.m_vecPreTickEyeAngles.y + AngleDiff( current.y, m_Local.m_vecPreTickEyeAngles.y ) * m_flInterpolationTime;
2498+
vecReturn.z = m_Local.m_vecPreTickEyeAngles.z + AngleDiff( current.z, m_Local.m_vecPreTickEyeAngles.z ) * m_flInterpolationTime;
2499+
return vecReturn;
2500+
}
24832501

24842502
float C_BasePlayer::GetWaterJumpTime() const
24852503
{

src/game/client/c_baseplayer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,8 @@ class C_BasePlayer : public C_BaseCombatCharacter, public CGameEventListener
331331
const QAngle& Weapon_PunchAngle();
332332
void SetPunchAngle( const QAngle &angle );
333333

334+
const QAngle& Weapon_EyeAngles();
335+
334336
float GetWaterJumpTime() const;
335337
void SetWaterJumpTime( float flWaterJumpTime );
336338
float GetSwimSoundTime( void ) const;

src/game/client/c_playerlocaldata.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ class CPlayerLocalData
6060
// Base velocity that was passed in to server physics so
6161
// client can predict conveyors correctly. Server zeroes it, so we need to store here, too.
6262
Vector m_vecClientBaseVelocity;
63-
// Stored before command to subtick with the latest viewpunch
63+
// Stored before command to subtick with the latest angles
6464
QAngle m_vecPreTickPunchAngle;
65+
QAngle m_vecPreTickEyeAngles;
6566
CNetworkQAngle( m_vecPunchAngle ); // auto-decaying view angle adjustment
6667
CInterpolatedVar< QAngle > m_iv_vecPunchAngle;
6768

src/game/client/prediction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -960,8 +960,9 @@ void CPrediction::RunCommand( C_BasePlayer *player, CUserCmd *ucmd, IMoveHelper
960960

961961
// RUN MOVEMENT
962962

963-
// Store pre-tick viewpunch to lerp for subtick
963+
// Store pre-tick angles to lerp for subtick
964964
player->m_Local.m_vecPreTickPunchAngle = player->GetPunchAngle();
965+
player->m_Local.m_vecPreTickEyeAngles = player->EyeAngles();
965966

966967
if ( !pVehicle )
967968
{

src/game/server/player.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3847,8 +3847,9 @@ void CBasePlayer::PlayerRunCommand(CUserCmd *ucmd, IMoveHelper *moveHelper)
38473847
}
38483848
}
38493849

3850-
// Store pre-tick viewpunch to lerp for subtick
3850+
// Store pre-tick angles to lerp for subtick
38513851
m_Local.m_vecPreTickPunchAngle = m_Local.m_vecPunchAngle;
3852+
m_Local.m_vecPreTickEyeAngles = EyeAngles();
38523853

38533854
PlayerMove()->RunCommand(this, ucmd, moveHelper);
38543855
}
@@ -8797,7 +8798,11 @@ const QAngle& CBasePlayer::Weapon_PunchAngle()
87978798
return vecCurPunch;
87988799
}
87998800

8800-
return Lerp( m_flInterpolationTime, m_Local.m_vecPreTickPunchAngle, vecCurPunch );
8801+
static QAngle vecReturnPunch;
8802+
vecReturnPunch.x = m_Local.m_vecPreTickPunchAngle.x + AngleDiff( vecCurPunch.x, m_Local.m_vecPreTickPunchAngle.x ) * m_flInterpolationTime;
8803+
vecReturnPunch.y = m_Local.m_vecPreTickPunchAngle.y + AngleDiff( vecCurPunch.y, m_Local.m_vecPreTickPunchAngle.y ) * m_flInterpolationTime;
8804+
vecReturnPunch.z = m_Local.m_vecPreTickPunchAngle.z + AngleDiff( vecCurPunch.z, m_Local.m_vecPreTickPunchAngle.z ) * m_flInterpolationTime;
8805+
return vecReturnPunch;
88018806
}
88028807

88038808

@@ -8821,6 +8826,21 @@ void CBasePlayer::SetPunchAngle( const QAngle &punchAngle )
88218826
}
88228827
}
88238828

8829+
const QAngle& CBasePlayer::Weapon_EyeAngles()
8830+
{
8831+
if ( !IsInPostThink() || m_flInterpolationTime >= 1.0f )
8832+
{
8833+
return EyeAngles();
8834+
}
8835+
8836+
static QAngle vecReturn;
8837+
QAngle current = EyeAngles();
8838+
vecReturn.x = m_Local.m_vecPreTickEyeAngles.x + AngleDiff( current.x, m_Local.m_vecPreTickEyeAngles.x ) * m_flInterpolationTime;
8839+
vecReturn.y = m_Local.m_vecPreTickEyeAngles.y + AngleDiff( current.y, m_Local.m_vecPreTickEyeAngles.y ) * m_flInterpolationTime;
8840+
vecReturn.z = m_Local.m_vecPreTickEyeAngles.z + AngleDiff( current.z, m_Local.m_vecPreTickEyeAngles.z ) * m_flInterpolationTime;
8841+
return vecReturn;
8842+
}
8843+
88248844
//-----------------------------------------------------------------------------
88258845
// Purpose: Apply a movement constraint to the player
88268846
//-----------------------------------------------------------------------------

src/game/server/player.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,8 @@ class CBasePlayer : public CBaseCombatCharacter
625625
const QAngle& Weapon_PunchAngle();
626626
void SetPunchAngle( const QAngle &punchAngle );
627627

628+
const QAngle& Weapon_EyeAngles();
629+
628630
virtual void DoMuzzleFlash();
629631

630632
const char *GetLastKnownPlaceName( void ) const { return m_szLastPlaceName; } // return the last nav place name the player occupied

src/game/server/playerlocaldata.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ class CPlayerLocalData
4343

4444
Vector m_vecOverViewpoint; // Viewpoint overriding the real player's viewpoint
4545

46-
// Stored before command to subtick with the latest viewpunch
46+
// Stored before command to subtick with the latest angles
4747
QAngle m_vecPreTickPunchAngle;
48+
QAngle m_vecPreTickEyeAngles;
4849

4950
// Fully ducked
5051
CNetworkVar( bool, m_bDucked );

src/game/shared/tf/tf_weapon_pipebomblauncher.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ bool CTFPipebombLauncher::ModifyPipebombsInView( int iEffect )
624624

625625
// Dot product from the view angle to determine which bombs to detonate.
626626
Vector vecPlayerForward;
627-
AngleVectors( pPlayer->EyeAngles(), &vecPlayerForward, NULL, NULL );
627+
AngleVectors( pPlayer->Weapon_EyeAngles(), &vecPlayerForward, NULL, NULL );
628628
vecPlayerForward.NormalizeInPlace();
629629

630630
// Determine the dynamic dot product threshold based on FOV

0 commit comments

Comments
 (0)