summaryrefslogtreecommitdiff
path: root/game/client/tf2/c_harpoon.cpp
blob: 1ea93e6a9554785c58f885301f874035afe89a57 (plain) (blame)
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( );
}