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
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "hud.h"
#include "particles_simple.h"
//-----------------------------------------------------------------------------
// Purpose: Client side entity for the harpoon
//-----------------------------------------------------------------------------
class C_Harpoon : public C_BaseAnimating
{
DECLARE_CLASS( C_Harpoon, C_BaseAnimating );
public:
DECLARE_CLIENTCLASS();
C_Harpoon();
virtual void OnDataChanged( DataUpdateType_t updateType );
virtual void GetAimEntOrigin( IClientEntity *pAttachedTo, Vector *pOrigin, QAngle *pAngles );
public:
C_Harpoon( const C_Harpoon & );
private:
// Impaling
Vector m_vecOffset;
QAngle m_angOffset;
};
IMPLEMENT_CLIENTCLASS_DT(C_Harpoon, DT_Harpoon, CHarpoon)
RecvPropVector( RECVINFO(m_vecOffset) ),
RecvPropVector( RECVINFO(m_angOffset) ),
END_RECV_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
C_Harpoon::C_Harpoon( void )
{
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_Harpoon::OnDataChanged( DataUpdateType_t updateType )
{
BaseClass::OnDataChanged( updateType );
}
//-----------------------------------------------------------------------------
// Returns the attachment render origin + origin
//-----------------------------------------------------------------------------
void C_Harpoon::GetAimEntOrigin( IClientEntity *pAttachedTo, Vector *pOrigin, QAngle *pAngles )
{
C_BaseAnimating *pEnt = dynamic_cast< C_BaseAnimating * >( pAttachedTo->GetBaseEntity() );
if (!pEnt)
return;
float controllers[MAXSTUDIOBONES];
pEnt->GetBoneControllers(controllers);
float headcontroller = controllers[ 0 ];
// Compute angles as well, since parent uses bone controller for rotation
// Convert 0 - 1 to angles
float renderYaw = -180.0f + 360.0f * headcontroller;
matrix3x4_t matrix;
// Convert roll/pitch only to matrix
AngleMatrix( pEnt->GetAbsAngles(), matrix );
// Convert desired yaw to vector
QAngle anglesRotated( 0, renderYaw, 0 );
Vector forward;
AngleVectors( anglesRotated, &forward );
Vector rotatedForward;
// Rotate desired yaw vector by roll/pitch matrix
VectorRotate( forward, matrix, rotatedForward );
// Convert rotated vector back to orientation
VectorAngles( rotatedForward, *pAngles );
//*pAngles -= m_angOffset;
// HACK: Until we have a proper bone solution, hack the origin for all moving objects
*pOrigin = pEnt->WorldSpaceCenter( );
}
|