1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#include "cbase.h"
#include "dod_viewmodel.h"
#ifdef CLIENT_DLL
#include "c_dod_player.h"
#include "prediction.h"
#endif
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
LINK_ENTITY_TO_CLASS( dod_viewmodel, CDODViewModel );
IMPLEMENT_NETWORKCLASS_ALIASED( DODViewModel, DT_DODViewModel )
BEGIN_NETWORK_TABLE( CDODViewModel, DT_DODViewModel )
END_NETWORK_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
#ifdef CLIENT_DLL
CDODViewModel::CDODViewModel() : m_LagAnglesHistory("CDODViewModel::m_LagAnglesHistory")
{
m_vLagAngles.Init();
m_LagAnglesHistory.Setup( &m_vLagAngles, 0 );
m_vLoweredWeaponOffset.Init();
}
#else
CDODViewModel::CDODViewModel()
{
}
#endif
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CDODViewModel::~CDODViewModel()
{
}
#ifdef CLIENT_DLL
ConVar cl_wpn_sway_interp( "cl_wpn_sway_interp", "0.1", FCVAR_CLIENTDLL );
ConVar cl_wpn_sway_scale( "cl_wpn_sway_scale", "2.6", FCVAR_CLIENTDLL );
#endif
void CDODViewModel::CalcViewModelLag( Vector& origin, QAngle& angles, QAngle& original_angles )
{
#ifdef CLIENT_DLL
if ( prediction->InPrediction() )
{
return;
}
float flSwayScale = cl_wpn_sway_scale.GetFloat();
CWeaponDODBase *pWeapon = dynamic_cast<CWeaponDODBase*>(GetWeapon());
if ( pWeapon )
{
flSwayScale *= pWeapon->GetViewModelSwayScale();
}
// Calculate our drift
Vector forward, right, up;
AngleVectors( angles, &forward, &right, &up );
// Add an entry to the history.
m_vLagAngles = angles;
m_LagAnglesHistory.NoteChanged( gpGlobals->curtime, cl_wpn_sway_interp.GetFloat(), false );
// Interpolate back 100ms.
m_LagAnglesHistory.Interpolate( gpGlobals->curtime, cl_wpn_sway_interp.GetFloat() );
// Now take the 100ms angle difference and figure out how far the forward vector moved in local space.
Vector vLaggedForward;
QAngle angleDiff = m_vLagAngles - angles;
AngleVectors( -angleDiff, &vLaggedForward, 0, 0 );
Vector vForwardDiff = Vector(1,0,0) - vLaggedForward;
// Now offset the origin using that.
vForwardDiff *= flSwayScale;
origin += forward*vForwardDiff.x + right*-vForwardDiff.y + up*vForwardDiff.z;
#endif
}
#ifdef CLIENT_DLL
ConVar cl_gunlowerangle( "cl_gunlowerangle", "30", FCVAR_CLIENTDLL );
ConVar cl_gunlowerspeed( "cl_gunlowerspeed", "2", FCVAR_CLIENTDLL );
ConVar cl_test_vm_offset( "cl_test_vm_offset", "0 0 0", FCVAR_CHEAT | FCVAR_CLIENTDLL );
#endif
void CDODViewModel::CalcViewModelView( CBasePlayer *owner, const Vector& eyePosition, const QAngle& eyeAngles )
{
#if defined( CLIENT_DLL )
Vector vecNewOrigin = eyePosition;
QAngle vecNewAngles = eyeAngles;
// Check for lowering the weapon
C_DODPlayer *pPlayer = ToDODPlayer( owner );
Assert( pPlayer );
bool bLowered = pPlayer->IsWeaponLowered();
QAngle vecLoweredAngles(0,0,0);
m_vLoweredWeaponOffset.x = Approach( bLowered ? cl_gunlowerangle.GetFloat() : 0, m_vLoweredWeaponOffset.x, cl_gunlowerspeed.GetFloat() );
vecLoweredAngles.x += m_vLoweredWeaponOffset.x;
vecNewAngles += vecLoweredAngles;
Vector forward, right, up;
AngleVectors( vecNewAngles, &forward, &right, &up );
Vector test;
const char *szTestOffset = cl_test_vm_offset.GetString();
sscanf( szTestOffset, " %f %f %f", &test[0], &test[1], &test[2] );
// cvar cl_test_vm_offset overrides calculated view model offset
if ( test.Length() > 0 )
{
vecNewOrigin += forward * test[0] + right * test[1] + up * test[2];
}
else
{
// Move the view model origin between the script standing and prone position
// based on the current view height
CWeaponDODBase *pWeapon = dynamic_cast<CWeaponDODBase*>(GetWeapon());
if ( pWeapon )
{
Vector offset = pWeapon->GetDesiredViewModelOffset( pPlayer );
// add our offset in the proper direction
vecNewOrigin += forward * offset[0] + right * offset[1] + up * offset[2];
}
}
BaseClass::CalcViewModelView( owner, vecNewOrigin, vecNewAngles );
#endif
}
|