diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /sp/src/game/server/hl2/hl_playermove.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/game/server/hl2/hl_playermove.cpp')
| -rw-r--r-- | sp/src/game/server/hl2/hl_playermove.cpp | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/sp/src/game/server/hl2/hl_playermove.cpp b/sp/src/game/server/hl2/hl_playermove.cpp new file mode 100644 index 00000000..a46ee427 --- /dev/null +++ b/sp/src/game/server/hl2/hl_playermove.cpp @@ -0,0 +1,178 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "player_command.h"
+#include "player.h"
+#include "igamemovement.h"
+#include "hl_movedata.h"
+#include "ipredictionsystem.h"
+#include "iservervehicle.h"
+#include "hl2_player.h"
+#include "vehicle_base.h"
+#include "gamestats.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+class CHLPlayerMove : public CPlayerMove
+{
+ DECLARE_CLASS( CHLPlayerMove, CPlayerMove );
+public:
+ CHLPlayerMove() :
+ m_bWasInVehicle( false ),
+ m_bVehicleFlipped( false ),
+ m_bInGodMode( false ),
+ m_bInNoClip( false )
+ {
+ m_vecSaveOrigin.Init();
+ }
+
+ void SetupMove( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move );
+ void FinishMove( CBasePlayer *player, CUserCmd *ucmd, CMoveData *move );
+
+private:
+ Vector m_vecSaveOrigin;
+ bool m_bWasInVehicle;
+ bool m_bVehicleFlipped;
+ bool m_bInGodMode;
+ bool m_bInNoClip;
+};
+
+//
+//
+// PlayerMove Interface
+static CHLPlayerMove g_PlayerMove;
+
+//-----------------------------------------------------------------------------
+// Singleton accessor
+//-----------------------------------------------------------------------------
+CPlayerMove *PlayerMove()
+{
+ return &g_PlayerMove;
+}
+
+//
+
+static CHLMoveData g_HLMoveData;
+CMoveData *g_pMoveData = &g_HLMoveData;
+
+IPredictionSystem *IPredictionSystem::g_pPredictionSystems = NULL;
+
+void CHLPlayerMove::SetupMove( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move )
+{
+ // Call the default SetupMove code.
+ BaseClass::SetupMove( player, ucmd, pHelper, move );
+
+ // Convert to HL2 data.
+ CHL2_Player *pHLPlayer = static_cast<CHL2_Player*>( player );
+ Assert( pHLPlayer );
+
+ CHLMoveData *pHLMove = static_cast<CHLMoveData*>( move );
+ Assert( pHLMove );
+
+ player->m_flForwardMove = ucmd->forwardmove;
+ player->m_flSideMove = ucmd->sidemove;
+
+ pHLMove->m_bIsSprinting = pHLPlayer->IsSprinting();
+
+ if ( gpGlobals->frametime != 0 )
+ {
+ IServerVehicle *pVehicle = player->GetVehicle();
+
+ if ( pVehicle )
+ {
+ pVehicle->SetupMove( player, ucmd, pHelper, move );
+
+ if ( !m_bWasInVehicle )
+ {
+ m_bWasInVehicle = true;
+ m_vecSaveOrigin.Init();
+ }
+ }
+ else
+ {
+ m_vecSaveOrigin = player->GetAbsOrigin();
+ if ( m_bWasInVehicle )
+ {
+ m_bWasInVehicle = false;
+ }
+ }
+ }
+}
+
+
+void CHLPlayerMove::FinishMove( CBasePlayer *player, CUserCmd *ucmd, CMoveData *move )
+{
+ // Call the default FinishMove code.
+ BaseClass::FinishMove( player, ucmd, move );
+ if ( gpGlobals->frametime != 0 )
+ {
+ float distance = 0.0f;
+ IServerVehicle *pVehicle = player->GetVehicle();
+ if ( pVehicle )
+ {
+ pVehicle->FinishMove( player, ucmd, move );
+ IPhysicsObject *obj = player->GetVehicleEntity()->VPhysicsGetObject();
+ if ( obj )
+ {
+ Vector newPos;
+ obj->GetPosition( &newPos, NULL );
+ distance = VectorLength( newPos - m_vecSaveOrigin );
+ if ( m_vecSaveOrigin == vec3_origin || distance > 100.0f )
+ distance = 0.0f;
+ m_vecSaveOrigin = newPos;
+ }
+
+ CPropVehicleDriveable *driveable = dynamic_cast< CPropVehicleDriveable * >( player->GetVehicleEntity() );
+ if ( driveable )
+ {
+ // Overturned and at rest (if still moving it can fix itself)
+ bool bFlipped = driveable->IsOverturned() && ( distance < 0.5f );
+ if ( m_bVehicleFlipped != bFlipped )
+ {
+ if ( bFlipped )
+ {
+ gamestats->Event_FlippedVehicle( player, driveable );
+ }
+ m_bVehicleFlipped = bFlipped;
+ }
+ }
+ else
+ {
+ m_bVehicleFlipped = false;
+ }
+ }
+ else
+ {
+ m_bVehicleFlipped = false;
+ distance = VectorLength( player->GetAbsOrigin() - m_vecSaveOrigin );
+ }
+ if ( distance > 0 )
+ {
+ gamestats->Event_PlayerTraveled( player, distance, pVehicle ? true : false, !pVehicle && static_cast< CHL2_Player * >( player )->IsSprinting() );
+ }
+ }
+
+ bool bGodMode = ( player->GetFlags() & FL_GODMODE ) ? true : false;
+ if ( m_bInGodMode != bGodMode )
+ {
+ m_bInGodMode = bGodMode;
+ if ( bGodMode )
+ {
+ gamestats->Event_PlayerEnteredGodMode( player );
+ }
+ }
+ bool bNoClip = ( player->GetMoveType() == MOVETYPE_NOCLIP );
+ if ( m_bInNoClip != bNoClip )
+ {
+ m_bInNoClip = bNoClip;
+ if ( bNoClip )
+ {
+ gamestats->Event_PlayerEnteredNoClip( player );
+ }
+ }
+}
|