diff --git a/game/client/c_baseanimatingoverlay.cpp b/game/client/c_baseanimatingoverlay.cpp index d9aa8fb2e6..9edf0bda22 100644 --- a/game/client/c_baseanimatingoverlay.cpp +++ b/game/client/c_baseanimatingoverlay.cpp @@ -8,6 +8,7 @@ #include "cbase.h" #include "c_baseanimatingoverlay.h" #include "bone_setup.h" +#include "studio.h" #include "tier0/vprof.h" #include "engine/ivdebugoverlay.h" #include "datacache/imdlcache.h" @@ -566,3 +567,66 @@ CStudioHdr *C_BaseAnimatingOverlay::OnNewModel() return hdr; } + +void C_BaseAnimatingOverlay::GetSkeleton( CStudioHdr* pStudioHdr, Vector pos[], Quaternion q[], int boneMask, float currentTime ) +{ + if(!pStudioHdr) + { + Assert(!"C_BaseAnimating::GetSkeleton() without a model"); + return; + } + + if (!pStudioHdr->SequencesAvailable()) + { + return; + } + + float poseparameters[MAXSTUDIOPOSEPARAM]; + GetPoseParameters(pStudioHdr, poseparameters); + + IBoneSetup boneSetup( pStudioHdr, boneMask, poseparameters ); + boneSetup.InitPose( pos, q ); + + boneSetup.AccumulatePose( pos, q, GetSequence(), GetCycle(), 1.0, currentTime, m_pIk ); + + // sort the layers + int layer[MAX_OVERLAYS] = {}; + int i; + for (i = 0; i < m_AnimOverlay.Count(); i++) + { + layer[i] = MAX_OVERLAYS; + } + for (i = 0; i < m_AnimOverlay.Count(); i++) + { + CAnimationLayer &pLayer = m_AnimOverlay[i]; + if( (pLayer.m_flWeight > 0) && pLayer.IsActive() && pLayer.m_nOrder >= 0 && pLayer.m_nOrder < m_AnimOverlay.Count()) + { + layer[pLayer.m_nOrder] = i; + } + } + for (i = 0; i < m_AnimOverlay.Count(); i++) + { + if (layer[i] >= 0 && layer[i] < m_AnimOverlay.Count()) + { + CAnimationLayer &pLayer = m_AnimOverlay[layer[i]]; + // UNDONE: Is it correct to use overlay weight for IK too? + boneSetup.AccumulatePose( pos, q, pLayer.m_nSequence, pLayer.m_flCycle, pLayer.m_flWeight, currentTime, m_pIk ); + } + } + + if ( m_pIk ) + { + CIKContext auto_ik; + auto_ik.Init( pStudioHdr, GetRenderAngles(), GetRenderOrigin(), currentTime, 0, boneMask ); + boneSetup.CalcAutoplaySequences( pos, q, currentTime, &auto_ik ); + } + else + { + boneSetup.CalcAutoplaySequences(pos, q, currentTime, NULL); + } + + float controllers[MAXSTUDIOBONECTRLS]; + GetBoneControllers(controllers); + + boneSetup.CalcBoneAdj( pos, q, controllers ); +} \ No newline at end of file diff --git a/game/client/c_baseanimatingoverlay.h b/game/client/c_baseanimatingoverlay.h index de0067dd21..44263d36ae 100644 --- a/game/client/c_baseanimatingoverlay.h +++ b/game/client/c_baseanimatingoverlay.h @@ -40,6 +40,7 @@ public: // model specific virtual void AccumulateLayers( IBoneSetup &boneSetup, Vector pos[], Quaternion q[], float currentTime ); virtual void DoAnimationEvents( CStudioHdr *pStudioHdr ); + virtual void GetSkeleton( CStudioHdr *pStudioHdr, Vector pos[], Quaternion q[], int boneMask, float currentTime ); enum { diff --git a/game/server/cstrike/hostage/cs_simple_hostage.cpp b/game/server/cstrike/hostage/cs_simple_hostage.cpp index 9a6b2a5f28..4f0ea2c817 100644 --- a/game/server/cstrike/hostage/cs_simple_hostage.cpp +++ b/game/server/cstrike/hostage/cs_simple_hostage.cpp @@ -103,7 +103,9 @@ CHostage::CHostage() { g_Hostages.AddToTail( this ); m_PlayerAnimState = CreateHostageAnimState( this, this, LEGANIM_8WAY, false ); - // UseClientSideAnimation(); + + // ENHANCED_TODO: remove this + UseClientSideAnimation(); SetBloodColor( BLOOD_COLOR_RED ); } diff --git a/game/server/player_lagcompensation.cpp b/game/server/player_lagcompensation.cpp index c883f16439..b7aacf6225 100644 --- a/game/server/player_lagcompensation.cpp +++ b/game/server/player_lagcompensation.cpp @@ -6,6 +6,7 @@ //=============================================================================// #include "cbase.h" +#include "icvar.h" #include "usercmd.h" #include "igamesystem.h" #include "ilagcompensationmanager.h" @@ -824,13 +825,17 @@ void CLagCompensationManager::BacktrackPlayer( CBasePlayer *pPlayer, CUserCmd *c restore->m_fFlags = flags; // we need to restore these flags change->m_fFlags = flags; // we have changed these flags - if( sv_showlagcompensation.GetInt() == 1 ) + if( sv_showlagcompensation.GetInt() == pPlayer->entindex() ) { - pPlayer->DrawServerHitboxes(4, true); + pPlayer->DrawServerHitboxes(60, false); } - DevMsg("Server: %s => %f %f %f => %f (frac: %f)\n", pPlayer->GetPlayerName(), change->m_vecOrigin.x, change->m_vecOrigin.y, change->m_vecOrigin.z, flTargetSimulationTime, fracSim); + static ConVar *sv_showplayerhitboxes = g_pCVar->FindVar("sv_showplayerhitboxes"); + if ( sv_showplayerhitboxes->GetInt() == pPlayer->entindex() ) + { + DevMsg("Server: %s => %f %f %f => %f (frac: %f)\n", pPlayer->GetPlayerName(), change->m_vecOrigin.x, change->m_vecOrigin.y, change->m_vecOrigin.z, flTargetSimulationTime, fracSim); + } } diff --git a/game/shared/cstrike/cs_player_shared.cpp b/game/shared/cstrike/cs_player_shared.cpp index 62a40a00f3..d020758554 100644 --- a/game/shared/cstrike/cs_player_shared.cpp +++ b/game/shared/cstrike/cs_player_shared.cpp @@ -416,11 +416,11 @@ void CCSPlayer::FireBullet( if( lagPlayer ) { #ifdef CLIENT_DLL - lagPlayer->DrawClientHitboxes(4, true); - DevMsg("Client: %s => %f %f %f => %f\n", lagPlayer->GetPlayerName(), lagPlayer->GetAbsOrigin().x, lagPlayer->GetAbsOrigin().y, lagPlayer->GetAbsOrigin().z, - lagPlayer->m_flInterpolatedSimulationTime); + lagPlayer->DrawClientHitboxes(60, true); + DevMsg("Client: %s => %f %f %f => %f (%f)\n", lagPlayer->GetPlayerName(), lagPlayer->GetAbsOrigin().x, lagPlayer->GetAbsOrigin().y, lagPlayer->GetAbsOrigin().z, + lagPlayer->m_flInterpolatedSimulationTime, fmod(lagPlayer->m_flInterpolatedSimulationTime, TICK_INTERVAL) / TICK_INTERVAL); #else - lagPlayer->DrawServerHitboxes(4, true); + lagPlayer->DrawServerHitboxes(60, true); #endif } }