diff --git a/game/client/c_baseentity.h b/game/client/c_baseentity.h index e1c1173314..2ae0e8ec5d 100644 --- a/game/client/c_baseentity.h +++ b/game/client/c_baseentity.h @@ -1357,6 +1357,9 @@ public: bool BecameDormantThisPacket( void ) const; void SetDormantPredictable( bool dormant ); + // TODO_ENHANCED: make trigger predictables. + virtual void GetGroundVelocityToApply( Vector &vecGroundVel ) { vecGroundVel = GetBaseVelocity(); } + int GetWaterLevel() const; void SetWaterLevel( int nLevel ); int GetWaterType() const; diff --git a/game/client/movehelper_client.cpp b/game/client/movehelper_client.cpp index 7c071879f5..6145a8472c 100644 --- a/game/client/movehelper_client.cpp +++ b/game/client/movehelper_client.cpp @@ -5,6 +5,7 @@ // $NoKeywords: $ //=============================================================================// #include "cbase.h" + #include #include "engine/IEngineSound.h" #include "filesystem.h" @@ -108,7 +109,20 @@ void CMoveHelperClient::ResetTouchList( void ) bool CMoveHelperClient::AddToTouched( const trace_t& tr, const Vector& impactvelocity ) { - int i; + int i; + + auto pPlayer = C_BasePlayer::GetLocalPlayer(); + if ( !pPlayer ) + return false; + + if ( !tr.m_pEnt ) + return false; + + if ( tr.m_pEnt == pPlayer->GetBaseEntity() ) + { + Assert( !"CMoveHelperClient::AddToTouched: Tried to add self to touchlist!!!" ); + return false; + } // Look for duplicates for (i = 0; i < m_TouchList.Size(); i++) @@ -147,7 +161,11 @@ void CMoveHelperClient::ProcessImpacts( void ) // Touch other objects that were intersected during the movement. for (int i = 0 ; i < m_TouchList.Size(); i++) - { + { + // We didn't touch an entity ... + if (!m_TouchList[i].trace.m_pEnt) + continue; + // Run the impact function as if we had run it during movement. C_BaseEntity *entity = ClientEntityList().GetEnt( m_TouchList[i].trace.m_pEnt->entindex() ); if ( !entity ) diff --git a/game/client/prediction.cpp b/game/client/prediction.cpp index 6646f8f9e0..0bb34533df 100644 --- a/game/client/prediction.cpp +++ b/game/client/prediction.cpp @@ -6,7 +6,9 @@ //=============================================================================// #include "cbase.h" #include "prediction.h" +#include "cdll_client_int.h" #include "igamemovement.h" +#include "mathlib/mathlib.h" #include "prediction_private.h" #include "ivrenderview.h" #include "iinput.h" @@ -687,12 +689,26 @@ void CPrediction::FinishMove( C_BasePlayer *player, CUserCmd *ucmd, CMoveData *m player->m_RefEHandle = move->m_nPlayerHandle; - player->m_vecVelocity = move->m_vecVelocity; + player->SetLocalVelocity(move->m_vecVelocity); player->m_vecNetworkOrigin = move->GetAbsOrigin(); player->m_Local.m_nOldButtons = move->m_nButtons; + float pitch = move->m_vecAngles[PITCH]; + + if (pitch > 180.0f) + { + pitch -= 360.0f; + } + + pitch = clamp(pitch, -90.f, 90.f); + + move->m_vecAngles[PITCH] = pitch; + + player->SetPoseParameter(player->LookupPoseParameter("body_pitch"), pitch); + + player->SetLocalAngles(move->m_vecAngles); // NOTE: Don't copy this. the movement code modifies its local copy but is not expecting to be authoritative //player->m_flMaxspeed = move->m_flClientMaxSpeed; @@ -816,6 +832,39 @@ void CPrediction::RunPostThink( C_BasePlayer *player ) #endif } +void CPrediction::CheckMovingGround( CBasePlayer *player, double frametime ) +{ + VPROF( "CPrediction::CheckMovingGround()" ); + + CBaseEntity *groundentity; + + if ( player->GetFlags() & FL_ONGROUND ) + { + groundentity = player->GetGroundEntity(); + if ( groundentity && ( groundentity->GetFlags() & FL_CONVEYOR) ) + { + Vector vecNewVelocity; + groundentity->GetGroundVelocityToApply( vecNewVelocity ); + + if ( player->GetFlags() & FL_BASEVELOCITY ) + { + vecNewVelocity += player->GetBaseVelocity(); + } + player->SetBaseVelocity( vecNewVelocity ); + player->AddFlag( FL_BASEVELOCITY ); + } + } + + if ( !( player->GetFlags() & FL_BASEVELOCITY ) ) + { + // Apply momentum (add in half of the previous frame of velocity first) + player->ApplyAbsVelocityImpulse( (1.0 + ( frametime * 0.5 )) * player->GetBaseVelocity() ); + player->SetBaseVelocity( vec3_origin ); + } + + player->RemoveFlag( FL_BASEVELOCITY ); +} + //----------------------------------------------------------------------------- // Purpose: Predicts a single movement command for player // Input : *moveHelper - @@ -830,15 +879,20 @@ void CPrediction::RunCommand( C_BasePlayer *player, CUserCmd *ucmd, IMoveHelper char sz[ 32 ]; Q_snprintf( sz, sizeof( sz ), "runcommand%04d", ucmd->command_number ); PREDICTION_TRACKVALUECHANGESCOPE( sz ); -#endif + #endif + StartCommand( player, ucmd ); - // Set globals appropriately - gpGlobals->curtime = player->m_nTickBase * TICK_INTERVAL; - gpGlobals->frametime = m_bEnginePaused ? 0 : TICK_INTERVAL; - g_pGameMovement->StartTrackPredictionErrors( player ); + gpGlobals->frametime = m_bEnginePaused ? 0 : TICK_INTERVAL; + // Run post think after PreThink/Think function, this makes a room space for local interpolation. + gpGlobals->curtime = (player->m_nTickBase - 1) * TICK_INTERVAL; + + RunPostThink( player ); + + gpGlobals->curtime = player->m_nTickBase * TICK_INTERVAL; + // TODO // TODO: Check for impulse predicted? @@ -868,18 +922,27 @@ void CPrediction::RunCommand( C_BasePlayer *player, CUserCmd *ucmd, IMoveHelper // Get button states player->UpdateButtonState( ucmd->buttons ); -// TODO -// CheckMovingGround( player, ucmd->frametime ); + // CheckMovingGround( player, gpGlobals->frametime ); -// TODO -// g_pMoveData->m_vecOldAngles = player->pl.v_angle; + g_pMoveData->m_vecOldAngles = player->pl.v_angle; + + // TODO_ENHANCED: this will be implemented with trigger prediction update + // // Copy from command to player unless game .dll has set angle using fixangle + // if ( player->pl.fixangle == FIXANGLE_NONE ) + // { + // player->pl.v_angle = ucmd->viewangles; + // } + // else if( player->pl.fixangle == FIXANGLE_RELATIVE ) + // { + // player->pl.v_angle = ucmd->viewangles + player->pl.anglechange; + // } // Copy from command to player unless game .dll has set angle using fixangle // if ( !player->pl.fixangle ) { player->SetLocalViewAngles( ucmd->viewangles ); } - + // Call standard client pre-think RunPreThink( player ); @@ -905,8 +968,8 @@ void CPrediction::RunCommand( C_BasePlayer *player, CUserCmd *ucmd, IMoveHelper FinishMove( player, ucmd, g_pMoveData ); - RunPostThink( player ); - + moveHelper->ProcessImpacts(); + g_pGameMovement->FinishTrackPredictionErrors( player ); FinishCommand( player ); diff --git a/game/client/prediction.h b/game/client/prediction.h index 1a77f0ab75..46630904b1 100644 --- a/game/client/prediction.h +++ b/game/client/prediction.h @@ -91,7 +91,7 @@ protected: void RunPreThink( C_BasePlayer *player ); void RunThink (C_BasePlayer *ent, double frametime ); void RunPostThink( C_BasePlayer *player ); - + void CheckMovingGround( CBasePlayer *player, double frametime ); private: virtual void _Update ( diff --git a/game/server/cstrike/cs_player.cpp b/game/server/cstrike/cs_player.cpp index 74b4aba97b..8cfd96024d 100644 --- a/game/server/cstrike/cs_player.cpp +++ b/game/server/cstrike/cs_player.cpp @@ -210,7 +210,6 @@ public: SetAbsVelocity( m_hPlayer->GetAbsVelocity() ); AddSolidFlags( FSOLID_NOT_SOLID ); ChangeTeam( m_hPlayer->GetTeamNumber() ); - // UseClientSideAnimation(); } public: @@ -417,9 +416,6 @@ CCSPlayer::CCSPlayer() { m_PlayerAnimState = CreatePlayerAnimState( this, this, LEGANIM_9WAY, true ); - // TODO: one day we need to remove this shit. - // UseClientSideAnimation(); - m_iLastWeaponFireUsercmd = 0; m_iAddonBits = 0; m_bEscaped = false; diff --git a/game/server/cstrike/hostage/cs_simple_hostage.cpp b/game/server/cstrike/hostage/cs_simple_hostage.cpp index d6374100fa..1bc4f3984c 100644 --- a/game/server/cstrike/hostage/cs_simple_hostage.cpp +++ b/game/server/cstrike/hostage/cs_simple_hostage.cpp @@ -103,9 +103,6 @@ CHostage::CHostage() { g_Hostages.AddToTail( this ); m_PlayerAnimState = CreateHostageAnimState( this, this, LEGANIM_8WAY, false ); - - // ENHANCED_TODO: remove this - // UseClientSideAnimation(); SetBloodColor( BLOOD_COLOR_RED ); } diff --git a/game/server/player.cpp b/game/server/player.cpp index 86fb5ad9b6..ba71d9820c 100644 --- a/game/server/player.cpp +++ b/game/server/player.cpp @@ -7913,14 +7913,6 @@ void CMovementSpeedMod::InputSpeedMod(inputdata_t &data) } } - -void SendProxy_CropFlagsToPlayerFlagBitsLength( const SendProp *pProp, const void *pStruct, const void *pVarData, DVariant *pOut, int iElement, int objectID) -{ - int mask = (1<m_Int = ( data & mask ); -} // -------------------------------------------------------------------------------- // // SendTable for CPlayerState. // -------------------------------------------------------------------------------- // @@ -8003,7 +7995,7 @@ void SendProxy_CropFlagsToPlayerFlagBitsLength( const SendProp *pProp, const voi SendPropInt (SENDINFO(m_iBonusProgress), 15 ), SendPropInt (SENDINFO(m_iBonusChallenge), 4 ), SendPropFloat (SENDINFO(m_flMaxspeed), 12, SPROP_ROUNDDOWN, 0.0f, 2048.0f ), // CL - SendPropInt (SENDINFO(m_fFlags), PLAYER_FLAG_BITS, SPROP_UNSIGNED|SPROP_CHANGES_OFTEN, SendProxy_CropFlagsToPlayerFlagBitsLength ), + SendPropInt (SENDINFO(m_fFlags)), SendPropInt (SENDINFO(m_iObserverMode), 3, SPROP_UNSIGNED ), SendPropEHandle (SENDINFO(m_hObserverTarget) ), SendPropInt (SENDINFO(m_iFOV), 8, SPROP_UNSIGNED ), diff --git a/game/server/player_command.cpp b/game/server/player_command.cpp index 1bbc73ad80..fc69967676 100644 --- a/game/server/player_command.cpp +++ b/game/server/player_command.cpp @@ -316,7 +316,6 @@ void CommentarySystem_PePlayerRunCommand( CBasePlayer *player, CUserCmd *ucmd ); //----------------------------------------------------------------------------- void CPlayerMove::RunCommand ( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper *moveHelper ) { - const float playerCurTime = player->m_nTickBase * TICK_INTERVAL; const float playerFrameTime = player->m_bGamePaused ? 0 : TICK_INTERVAL; const float flTimeAllowedForProcessing = player->ConsumeMovementTimeForUserCmdProcessing( playerFrameTime ); if ( !player->IsBot() && ( flTimeAllowedForProcessing < playerFrameTime ) ) @@ -334,13 +333,20 @@ void CPlayerMove::RunCommand ( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper } } return; // Don't process this command - } + } - StartCommand( player, ucmd ); + StartCommand( player, ucmd ); + + g_pGameMovement->StartTrackPredictionErrors( player ); + + gpGlobals->frametime = playerFrameTime; + gpGlobals->curtime = (player->m_nTickBase - 1) * TICK_INTERVAL; + + // Run post think first, this will let some space for client side interpolation. + RunPostThink( player ); // Set globals appropriately - gpGlobals->curtime = playerCurTime; - gpGlobals->frametime = playerFrameTime; + gpGlobals->curtime = player->m_nTickBase * TICK_INTERVAL; extern ConVar sv_showhitboxes; @@ -381,8 +387,6 @@ void CPlayerMove::RunCommand ( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper } */ - g_pGameMovement->StartTrackPredictionErrors( player ); - CommentarySystem_PePlayerRunCommand( player, ucmd ); // Do weapon selection @@ -453,13 +457,11 @@ void CPlayerMove::RunCommand ( CBasePlayer *player, CUserCmd *ucmd, IMoveHelper // Copy output FinishMove( player, ucmd, g_pMoveData ); - // Let server invoke any needed impact functions + // Let server invoke any needed impact functions VPROF_SCOPE_BEGIN( "moveHelper->ProcessImpacts" ); moveHelper->ProcessImpacts(); VPROF_SCOPE_END(); - RunPostThink( player ); - g_pGameMovement->FinishTrackPredictionErrors( player ); FinishCommand( player ); diff --git a/game/server/player_lagcompensation.cpp b/game/server/player_lagcompensation.cpp index f8b3cc75b5..3e749c362e 100644 --- a/game/server/player_lagcompensation.cpp +++ b/game/server/player_lagcompensation.cpp @@ -440,7 +440,7 @@ void CLagCompensationManager::BacktrackPlayer( CBasePlayer *pPlayer, CUserCmd *c return; } - // TODO: do proper teleportation checks. + // TODO_ENHANCED: do proper teleportation checks. // did we find a context smaller than target time ? if ( recordSim->m_flSimulationTime <= flTargetSimulationTime ) diff --git a/game/shared/basegrenade_shared.cpp b/game/shared/basegrenade_shared.cpp index b981d07819..8e5d06a320 100644 --- a/game/shared/basegrenade_shared.cpp +++ b/game/shared/basegrenade_shared.cpp @@ -70,7 +70,7 @@ BEGIN_NETWORK_TABLE( CBaseGrenade, DT_BaseGrenade ) SendPropVector( SENDINFO( m_vecVelocity ), 0, SPROP_NOSCALE ), // HACK: Use same flag bits as player for now - SendPropInt ( SENDINFO(m_fFlags), PLAYER_FLAG_BITS, SPROP_UNSIGNED, SendProxy_CropFlagsToPlayerFlagBitsLength ), + SendPropInt ( SENDINFO(m_fFlags) ), #else RecvPropFloat( RECVINFO( m_flDamage ) ), RecvPropFloat( RECVINFO( m_DmgRadius ) ), diff --git a/ivp b/ivp index 47533475e0..c7c4073205 160000 --- a/ivp +++ b/ivp @@ -1 +1 @@ -Subproject commit 47533475e01cbff05fbc3bbe8b4edc485f292cea +Subproject commit c7c407320533bdce609712dbd535862a065c7da7 diff --git a/public/PlayerState.h b/public/PlayerState.h index 9097ca7149..14d5631ef5 100644 --- a/public/PlayerState.h +++ b/public/PlayerState.h @@ -32,16 +32,15 @@ public: CNetworkVar( bool, deadflag ); // Viewing angle (player only) QAngle v_angle; - + // 0:nothing, 1:force view angles, 2:add avelocity + int fixangle; + // delta angle for fixangle == FIXANGLE_RELATIVE + QAngle anglechange; // The client .dll only cares about deadflag // the game and engine .dlls need to worry about the rest of this data #if !defined( CLIENT_DLL ) // Player's network name string_t netname; - // 0:nothing, 1:force view angles, 2:add avelocity - int fixangle; - // delta angle for fixangle == FIXANGLE_RELATIVE - QAngle anglechange; // flag to single the HLTV/Replay fake client, not transmitted bool hltv; bool replay; diff --git a/public/const.h b/public/const.h index 0ed97e9e42..ad81699574 100644 --- a/public/const.h +++ b/public/const.h @@ -161,8 +161,6 @@ // NON-PLAYER SPECIFIC (i.e., not used by GameMovement or the client .dll ) -- Can still be applied to players, though #define FL_INWATER (1<<10) // In water -// NOTE if you move things up, make sure to change this value -#define PLAYER_FLAG_BITS 11 #define FL_FLY (1<<11) // Changes the SV_Movestep() behavior to not need to be on ground #define FL_SWIM (1<<12) // Changes the SV_Movestep() behavior to not need to be on ground (but stay in water)