summaryrefslogtreecommitdiff
path: root/game/client/tf2/c_harpoon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf2/c_harpoon.cpp')
-rw-r--r--game/client/tf2/c_harpoon.cpp95
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