You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.8 KiB
95 lines
2.8 KiB
5 years ago
|
//========= 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( );
|
||
|
}
|