diff options
Diffstat (limited to 'game/client/tf2/c_harpoon.cpp')
| -rw-r--r-- | game/client/tf2/c_harpoon.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/game/client/tf2/c_harpoon.cpp b/game/client/tf2/c_harpoon.cpp new file mode 100644 index 0000000..1ea93e6 --- /dev/null +++ b/game/client/tf2/c_harpoon.cpp @@ -0,0 +1,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( ); +}
\ No newline at end of file |