Added new weapon script values for viewmodel FOV override, bob scale, sway scale, and sway speed scale

This commit is contained in:
Blixibon 2022-01-08 15:34:06 -06:00
parent c25053d1d2
commit c1eae4a4f9
7 changed files with 91 additions and 1 deletions

View File

@ -111,6 +111,7 @@ static ConVar v_centerspeed( "v_centerspeed","500" );
// 54 degrees approximates a 35mm camera - we determined that this makes the viewmodels
// and motions look the most natural.
ConVar v_viewmodel_fov( "viewmodel_fov", "54", FCVAR_ARCHIVE );
ConVar v_viewmodel_fov_script_override( "viewmodel_fov_script_override", "0", FCVAR_NONE, "If nonzero, overrides the viewmodel FOV of weapon scripts which override the viewmodel FOV." );
#else
ConVar v_viewmodel_fov( "viewmodel_fov", "54", FCVAR_CHEAT );
#endif
@ -675,6 +676,10 @@ void CViewRender::SetUpViews()
Vector ViewModelOrigin;
QAngle ViewModelAngles;
#ifdef MAPBASE
view.fovViewmodel = g_pClientMode->GetViewModelFOV();
#endif
if ( engine->IsHLTV() )
{
HLTVCamera()->CalcView( view.origin, view.angles, view.fov );
@ -710,6 +715,18 @@ void CViewRender::SetUpViews()
bCalcViewModelView = true;
ViewModelOrigin = view.origin;
ViewModelAngles = view.angles;
#ifdef MAPBASE
// Allow weapons to override viewmodel FOV
C_BaseCombatWeapon *pWeapon = pPlayer->GetActiveWeapon();
if (pWeapon && pWeapon->GetViewmodelFOVOverride() != 0.0f)
{
if (v_viewmodel_fov_script_override.GetFloat() > 0.0f)
view.fovViewmodel = v_viewmodel_fov_script_override.GetFloat();
else
view.fovViewmodel = pWeapon->GetViewmodelFOVOverride();
}
#endif
}
else
{
@ -745,7 +762,7 @@ void CViewRender::SetUpViews()
//Adjust the viewmodel's FOV to move with any FOV offsets on the viewer's end
#ifdef MAPBASE
view.fovViewmodel = max(0.001f, g_pClientMode->GetViewModelFOV() - flFOVOffset);
view.fovViewmodel = max(0.001f, view.fovViewmodel - flFOVOffset);
#else
view.fovViewmodel = g_pClientMode->GetViewModelFOV() - flFOVOffset;
#endif

View File

@ -461,6 +461,28 @@ bool CBaseCombatWeapon::IsMeleeWeapon() const
return GetWpnData().m_bMeleeWeapon;
}
#ifdef MAPBASE
float CBaseCombatWeapon::GetViewmodelFOVOverride() const
{
return GetWpnData().m_flViewmodelFOV;
}
float CBaseCombatWeapon::GetBobScale() const
{
return GetWpnData().m_flBobScale;
}
float CBaseCombatWeapon::GetSwayScale() const
{
return GetWpnData().m_flSwayScale;
}
float CBaseCombatWeapon::GetSwaySpeedScale() const
{
return GetWpnData().m_flSwaySpeedScale;
}
#endif
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------

View File

@ -417,6 +417,12 @@ public:
virtual bool UsesClipsForAmmo1( void ) const;
virtual bool UsesClipsForAmmo2( void ) const;
bool IsMeleeWeapon() const;
#ifdef MAPBASE
float GetViewmodelFOVOverride() const;
float GetBobScale() const;
float GetSwayScale() const;
float GetSwaySpeedScale() const;
#endif
// derive this function if you mod uses encrypted weapon info files
virtual const unsigned char *GetEncryptionKey( void );

View File

@ -513,6 +513,23 @@ void CBaseViewModel::CalcViewModelLag( Vector& origin, QAngle& angles, QAngle& o
float flSpeed = 5.0f;
#ifdef MAPBASE
CBaseCombatWeapon *pWeapon = m_hWeapon.Get();
if (pWeapon)
{
const FileWeaponInfo_t *pInfo = &pWeapon->GetWpnData();
if (pInfo->m_flSwayScale != 1.0f)
{
vDifference *= pInfo->m_flSwayScale;
pInfo->m_flSwayScale != 0.0f ? flSpeed /= pInfo->m_flSwayScale : flSpeed = 0.0f;
}
if (pInfo->m_flSwaySpeedScale != 1.0f)
{
flSpeed *= pInfo->m_flSwaySpeedScale;
}
}
#endif
// If we start to lag too far behind, we'll increase the "catch up" speed. Solves the problem with fast cl_yawspeed, m_yaw or joysticks
// rotating quickly. The old code would slam lastfacing with origin causing the viewmodel to pop to a new position
float flDiff = vDifference.Length();

View File

@ -317,6 +317,14 @@ float CBaseHLCombatWeapon::CalcViewmodelBob( void )
g_lateralBob = speed*0.005f;
g_lateralBob = g_lateralBob*0.3 + g_lateralBob*0.7*sin(cycle);
g_lateralBob = clamp( g_lateralBob, -7.0f, 4.0f );
#ifdef MAPBASE
if (GetBobScale() != 1.0f)
{
//g_verticalBob *= GetBobScale();
g_lateralBob *= GetBobScale();
}
#endif
//NOTENOTE: We don't use this return value in our case (need to restructure the calculation function setup!)
return 0.0f;

View File

@ -401,6 +401,12 @@ FileWeaponInfo_t::FileWeaponInfo_t()
bShowUsageHint = false;
m_bAllowFlipping = true;
m_bBuiltRightHanded = true;
#ifdef MAPBASE
m_flViewmodelFOV = 0.0f;
m_flBobScale = 1.0f;
m_flSwayScale = 1.0f;
m_flSwaySpeedScale = 1.0f;
#endif
}
#ifdef CLIENT_DLL
@ -466,6 +472,13 @@ void FileWeaponInfo_t::Parse( KeyValues *pKeyValuesData, const char *szWeaponNam
m_bAllowFlipping = ( pKeyValuesData->GetInt( "AllowFlipping", 1 ) != 0 ) ? true : false;
m_bMeleeWeapon = ( pKeyValuesData->GetInt( "MeleeWeapon", 0 ) != 0 ) ? true : false;
#ifdef MAPBASE
m_flViewmodelFOV = pKeyValuesData->GetFloat( "viewmodel_fov", 0.0f );
m_flBobScale = pKeyValuesData->GetFloat( "bob_scale", 1.0f );
m_flSwayScale = pKeyValuesData->GetFloat( "sway_scale", 1.0f );
m_flSwaySpeedScale = pKeyValuesData->GetFloat( "sway_speed_scale", 1.0f );
#endif
#ifndef MAPBASE // Mapbase makes weapons in the same slot & position swap each other out, which is a feature mods can intentionally use.
#if defined(_DEBUG) && defined(HL2_CLIENT_DLL)
// make sure two weapons aren't in the same slot & position

View File

@ -116,6 +116,13 @@ public:
bool m_bAllowFlipping; // False to disallow flipping the model, regardless of whether
// it is built left or right handed.
#ifdef MAPBASE
float m_flViewmodelFOV;
float m_flBobScale;
float m_flSwayScale;
float m_flSwaySpeedScale;
#endif
// CLIENT DLL
// Sprite data, read from the data file
int iSpriteCount;