hl2_src-leak-2017/src/game/client/tf2/c_harpoon.cpp

95 lines
2.8 KiB
C++

//========= 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( );
}