void CInput::CreateMove ( int sequence_number, float input_sample_frametime, bool active ) { CUserCmd *cmd = &m_pCommands[ sequence_number % MULTIPLAYER_BACKUP ]; #ifdef C17 CVerifiedUserCmd *pVerified = &m_pVerifiedCommands[sequence_number % MULTIPLAYER_BACKUP]; #else CVerifiedUserCmd *pVerified = &m_pVerifiedCommands[ sequence_number % MULTIPLAYER_BACKUP ]; #endif cmd->Reset(); cmd->command_number = sequence_number; cmd->tick_count = gpGlobals->tickcount; QAngle viewangles; engine->GetViewAngles( viewangles ); QAngle originalViewangles = viewangles; if ( active || sv_noclipduringpause.GetInt() ) { // Determine view angles AdjustAngles ( input_sample_frametime ); // Determine sideways movement ComputeSideMove( cmd ); // Determine vertical movement ComputeUpwardMove( cmd ); // Determine forward movement ComputeForwardMove( cmd ); // Scale based on holding speed key or having too fast of a velocity based on client maximum // speed. ScaleMovements( cmd ); // Allow mice and other controllers to add their inputs ControllerMove( input_sample_frametime, cmd ); #ifdef SIXENSE g_pSixenseInput->SixenseFrame( input_sample_frametime, cmd ); if( g_pSixenseInput->IsEnabled() ) { g_pSixenseInput->SetView( input_sample_frametime, cmd ); } #endif } else { // need to run and reset mouse input so that there is no view pop when unpausing if ( !m_fCameraInterceptingMouse && m_fMouseActive ) { float mx, my; GetAccumulatedMouseDeltasAndResetAccumulators( &mx, &my ); ResetMouse(); } #ifdef C17_HAPTICS // Haptics shut down the haptics device if we are not using the cursor movement from it. if (hap_cursor.GetInt() == 0) cliHaptics->Shutdown_Haptics(); #endif } // Retreive view angles from engine ( could have been set in IN_AdjustAngles above ) engine->GetViewAngles( viewangles ); // Latch and clear impulse cmd->impulse = in_impulse; in_impulse = 0; // Latch and clear weapon selection if ( m_hSelectedWeapon != NULL ) { C_BaseCombatWeapon *weapon = m_hSelectedWeapon; cmd->weaponselect = weapon->entindex(); cmd->weaponsubtype = weapon->GetSubType(); // Always clear weapon selection m_hSelectedWeapon = NULL; } // Set button and flag bits #ifdef SIXENSE if( g_pSixenseInput->IsEnabled() ) { // Some buttons were set in SixenseUpdateKeys, so or in any real keypresses cmd->buttons |= GetButtonBits( 1 ); } else { cmd->buttons = GetButtonBits( 1 ); } #else // Set button and flag bits cmd->buttons = GetButtonBits( 1 ); #endif #ifdef C17_HAPTICS //==MJB== hack to fix the weapon selection issue - this could probably be optimized by using a global for the selection object class CHudWeaponSelection; CBaseHudWeaponSelection* hud = (CBaseHudWeaponSelection*)GET_HUDELEMENT(CHudWeaponSelection); if (hud->IsInSelectionMode()) { cmd->buttons &= ~(IN_ATTACK | IN_ATTACK2); } #endif // Using joystick? #ifdef SIXENSE if ( in_joystick.GetInt() || g_pSixenseInput->IsEnabled() ) #else if ( in_joystick.GetInt() ) #endif { if ( cmd->forwardmove > 0 ) { cmd->buttons |= IN_FORWARD; } else if ( cmd->forwardmove < 0 ) { cmd->buttons |= IN_BACK; } } // Use new view angles if alive, otherwise user last angles we stored off. if ( g_iAlive ) { VectorCopy( viewangles, cmd->viewangles ); VectorCopy( viewangles, m_angPreviousViewAngles ); } else { VectorCopy( m_angPreviousViewAngles, cmd->viewangles ); } // Let the move manager override anything it wants to. if ( g_pClientMode->CreateMove( input_sample_frametime, cmd ) ) { // Get current view angles after the client mode tweaks with it #ifdef SIXENSE // Only set the engine angles if sixense is not enabled. It is done in SixenseInput::SetView otherwise. if( !g_pSixenseInput->IsEnabled() ) { engine->SetViewAngles( cmd->viewangles ); } #else engine->SetViewAngles( cmd->viewangles ); #endif if ( UseVR() ) { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if( pPlayer && !pPlayer->GetVehicle() ) { QAngle curViewangles, newViewangles; Vector curMotion, newMotion; engine->GetViewAngles( curViewangles ); curMotion.Init ( cmd->forwardmove, cmd->sidemove, cmd->upmove ); g_ClientVirtualReality.OverridePlayerMotion ( input_sample_frametime, originalViewangles, curViewangles, curMotion, &newViewangles, &newMotion ); engine->SetViewAngles( newViewangles ); cmd->forwardmove = newMotion[0]; cmd->sidemove = newMotion[1]; cmd->upmove = newMotion[2]; cmd->viewangles = newViewangles; } else { Vector vPos; g_ClientVirtualReality.GetTorsoRelativeAim( &vPos, &cmd->viewangles ); engine->SetViewAngles( cmd->viewangles ); } } } m_flLastForwardMove = cmd->forwardmove; cmd->random_seed = MD5_PseudoRandom( sequence_number ) & 0x7fffffff; HLTVCamera()->CreateMove( cmd ); #if defined( REPLAY_ENABLED ) ReplayCamera()->CreateMove( cmd ); #endif #if defined( HL2_CLIENT_DLL ) // copy backchannel data int i; for (i = 0; i < m_EntityGroundContact.Count(); i++) { cmd->entitygroundcontact.AddToTail( m_EntityGroundContact[i] ); } m_EntityGroundContact.RemoveAll(); #endif pVerified->m_cmd = *cmd; pVerified->m_crc = cmd->GetChecksum(); }