2013-12-03 07:31:46 +04:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Client side implementation of CBaseCombatWeapon.
//
// $NoKeywords: $
//=============================================================================//
# include "cbase.h"
# include "history_resource.h"
# include "iclientmode.h"
# include "iinput.h"
# include "weapon_selection.h"
# include "hud_crosshair.h"
# include "engine/ivmodelinfo.h"
# include "tier0/vprof.h"
# include "hltvcamera.h"
# include "tier1/KeyValues.h"
# include "toolframework/itoolframework.h"
# include "toolframework_client.h"
2019-08-31 22:28:20 +03:00
# ifdef MAPBASE
# include "viewrender.h"
# endif
2013-12-03 07:31:46 +04:00
// memdbgon must be the last include file in a .cpp file!!!
# include "tier0/memdbgon.h"
//-----------------------------------------------------------------------------
// Purpose: Gets the local client's active weapon, if any.
//-----------------------------------------------------------------------------
C_BaseCombatWeapon * GetActiveWeapon ( void )
{
C_BasePlayer * player = C_BasePlayer : : GetLocalPlayer ( ) ;
if ( ! player )
return NULL ;
return player - > GetActiveWeapon ( ) ;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : SetDormant ( bool bDormant )
{
// If I'm going from active to dormant and I'm carried by another player, holster me.
if ( ! IsDormant ( ) & & bDormant & & GetOwner ( ) & & ! IsCarriedByLocalPlayer ( ) )
{
Holster ( NULL ) ;
}
BaseClass : : SetDormant ( bDormant ) ;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : NotifyShouldTransmit ( ShouldTransmitState_t state )
{
BaseClass : : NotifyShouldTransmit ( state ) ;
if ( state = = SHOULDTRANSMIT_END )
{
if ( m_iState = = WEAPON_IS_ACTIVE )
{
m_iState = WEAPON_IS_CARRIED_BY_PLAYER ;
}
}
else if ( state = = SHOULDTRANSMIT_START )
{
if ( m_iState = = WEAPON_IS_CARRIED_BY_PLAYER )
{
if ( GetOwner ( ) & & GetOwner ( ) - > GetActiveWeapon ( ) = = this )
{
// Restore the Activeness of the weapon if we client-twiddled it off in the first case above.
m_iState = WEAPON_IS_ACTIVE ;
}
}
}
}
//-----------------------------------------------------------------------------
// Purpose: To wrap PORTAL mod specific functionality into one place
//-----------------------------------------------------------------------------
static inline bool ShouldDrawLocalPlayerViewModel ( void )
{
# if defined( PORTAL )
return false ;
Mapbase v5.0
- Added keyvalue to hl2_gamerules which allows respawning in singleplayer
- Added the game instructor system (including env_instructor_hint) from later Valve games using a VDC tutorial which adjusts the version from the Alien Swarm SDK to FPS rules and a Source 2013 environment; Also added new KV and icons for further control from mappers (tutorial mentioned by Maestra Fenix)
- Added L4D/TF2 glows + point_glow entity as an all-purpose SDK-based off-shoot of tf_glow
- Fixed weapon pickup sound not playing (reported by Sl0th and later Cvoxulary)
- Fixed env_projectedtextures not updating on save/load
- Added func_fake_worldportal, a spatial point_camera inspired by linked_portal_door based on SDK code alone (WIP, may be changed a lot in future updates)
- Added option for point_camera and func_reflective_glass to use different render targets, therefore allowing multiple cameras and mirrors to be active at the same time
- Added additional RT camera textures to choose from with a default of 3, but also controllable through a -numcameratextures command line param
- Added adjustable convars for main view NearZ and skybox NearZ (suggested by someone recently, also suggested by Klems over a year ago)
- Fixed map-specific localization files, cleaned up map-specific file code
- Added a new block to gameinfo.txt which allows mods to automatically append their own command line parameters
- Fixed math_lightpattern corruption when setting pattern/style while active
- Fixed the "Touch" input crashing when given no entity
- Added a way to add EFlags via keyvalue (suggested by Niker107)
- Fixed ai_script_conditions not working without a NPC actor (reported by MetroHam)
- Fixed point_radiation_source causing huge problems when intensity is 0, even though it was already advised against (reported by beefbacon)
- Added "Mapbase" header to Mapbase-specific code files
- Fixed an issue with updating sky_camera not obtaining area correctly, causing some entities to not draw in the skybox
- Added "CopyFogController" and "CopyFogControllerWithScale" inputs to sky_camera, which copy fog parameters directly from a fog controller
- Added "SetScale" input to sky_camera for live scale changing
- Added convar to control player crouch speed multiplier (suggested by ArtyIF)
- Added a ton of fixes for people running the Debug configuration of the codebase (partial credit to stepa2)
- Added support for pre-defined enums and constants in VScript, starting with various values from the SDK code (damage types, trace masks, etc.)
- Added limited support for Valve's Quaternion class in VScript
- Added new instance helper capabilities, destructible game instances, and other misc. changes to VScript library
- Replaced most of the VScript "accessor" classes with direct references to the original classes, as they were getting complicated fast and adding new VScript-only functions to the original classes might not be as bad as previously thought
- Added base NPC hooks for AI sensing in VScript (allows control over sight and hearing), also exposed CSound for it
- Added various functions and hooks for VPhysics integration in VScript
- Added VScript-based custom suit devices
- Expanded trace info exposed to VScript to allow plane and surface access (suggested by krassell)
- Added ability to insert localization strings through VScript
- Added various misc. VScript functions with various purposes, including reading/writing EFlags, movetypes, collision groups, etc.
- Fixed VBSP not being able to correctly parse parallax corrected cubemaps in maps with instances
2020-08-15 00:21:25 +03:00
# elif MAPBASE
2019-08-31 22:28:20 +03:00
// We shouldn't draw the viewmodel externally.
C_BasePlayer * localplayer = C_BasePlayer : : GetLocalPlayer ( ) ;
if ( localplayer )
{
if ( localplayer - > m_bDrawPlayerModelExternally )
{
// If this isn't the main view, draw the weapon.
view_id_t viewID = CurrentViewID ( ) ;
if ( viewID ! = VIEW_MAIN & & viewID ! = VIEW_INTRO_CAMERA )
return false ;
}
// Since we already have the local player, check its own ShouldDrawThisPlayer() to avoid extra checks
Mapbase v5.0
- Added keyvalue to hl2_gamerules which allows respawning in singleplayer
- Added the game instructor system (including env_instructor_hint) from later Valve games using a VDC tutorial which adjusts the version from the Alien Swarm SDK to FPS rules and a Source 2013 environment; Also added new KV and icons for further control from mappers (tutorial mentioned by Maestra Fenix)
- Added L4D/TF2 glows + point_glow entity as an all-purpose SDK-based off-shoot of tf_glow
- Fixed weapon pickup sound not playing (reported by Sl0th and later Cvoxulary)
- Fixed env_projectedtextures not updating on save/load
- Added func_fake_worldportal, a spatial point_camera inspired by linked_portal_door based on SDK code alone (WIP, may be changed a lot in future updates)
- Added option for point_camera and func_reflective_glass to use different render targets, therefore allowing multiple cameras and mirrors to be active at the same time
- Added additional RT camera textures to choose from with a default of 3, but also controllable through a -numcameratextures command line param
- Added adjustable convars for main view NearZ and skybox NearZ (suggested by someone recently, also suggested by Klems over a year ago)
- Fixed map-specific localization files, cleaned up map-specific file code
- Added a new block to gameinfo.txt which allows mods to automatically append their own command line parameters
- Fixed math_lightpattern corruption when setting pattern/style while active
- Fixed the "Touch" input crashing when given no entity
- Added a way to add EFlags via keyvalue (suggested by Niker107)
- Fixed ai_script_conditions not working without a NPC actor (reported by MetroHam)
- Fixed point_radiation_source causing huge problems when intensity is 0, even though it was already advised against (reported by beefbacon)
- Added "Mapbase" header to Mapbase-specific code files
- Fixed an issue with updating sky_camera not obtaining area correctly, causing some entities to not draw in the skybox
- Added "CopyFogController" and "CopyFogControllerWithScale" inputs to sky_camera, which copy fog parameters directly from a fog controller
- Added "SetScale" input to sky_camera for live scale changing
- Added convar to control player crouch speed multiplier (suggested by ArtyIF)
- Added a ton of fixes for people running the Debug configuration of the codebase (partial credit to stepa2)
- Added support for pre-defined enums and constants in VScript, starting with various values from the SDK code (damage types, trace masks, etc.)
- Added limited support for Valve's Quaternion class in VScript
- Added new instance helper capabilities, destructible game instances, and other misc. changes to VScript library
- Replaced most of the VScript "accessor" classes with direct references to the original classes, as they were getting complicated fast and adding new VScript-only functions to the original classes might not be as bad as previously thought
- Added base NPC hooks for AI sensing in VScript (allows control over sight and hearing), also exposed CSound for it
- Added various functions and hooks for VPhysics integration in VScript
- Added VScript-based custom suit devices
- Expanded trace info exposed to VScript to allow plane and surface access (suggested by krassell)
- Added ability to insert localization strings through VScript
- Added various misc. VScript functions with various purposes, including reading/writing EFlags, movetypes, collision groups, etc.
- Fixed VBSP not being able to correctly parse parallax corrected cubemaps in maps with instances
2020-08-15 00:21:25 +03:00
return ! localplayer - > ShouldDrawThisPlayer ( ) ;
2019-08-31 22:28:20 +03:00
}
else
return false ;
# else
2013-12-03 07:31:46 +04:00
return ! C_BasePlayer : : ShouldDrawLocalPlayer ( ) ;
# endif
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : OnRestore ( )
{
BaseClass : : OnRestore ( ) ;
// if the player is holding this weapon,
// mark it as just restored so it won't show as a new pickup
if ( GetOwner ( ) = = C_BasePlayer : : GetLocalPlayer ( ) )
{
m_bJustRestored = true ;
}
}
int C_BaseCombatWeapon : : GetWorldModelIndex ( void )
{
if ( GameRules ( ) )
{
const char * pBaseName = modelinfo - > GetModelName ( modelinfo - > GetModel ( m_iWorldModelIndex ) ) ;
const char * pTranslatedName = GameRules ( ) - > TranslateEffectForVisionFilter ( " weapons " , pBaseName ) ;
if ( pTranslatedName ! = pBaseName )
{
return modelinfo - > GetModelIndex ( pTranslatedName ) ;
}
}
return m_iWorldModelIndex ;
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : bnewentity -
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : OnDataChanged ( DataUpdateType_t updateType )
{
BaseClass : : OnDataChanged ( updateType ) ;
CHandle < C_BaseCombatWeapon > handle = this ;
// If it's being carried by the *local* player, on the first update,
// find the registered weapon for this ID
C_BasePlayer * pPlayer = C_BasePlayer : : GetLocalPlayer ( ) ;
C_BaseCombatCharacter * pOwner = GetOwner ( ) ;
// check if weapon is carried by local player
bool bIsLocalPlayer = pPlayer & & pPlayer = = pOwner ;
if ( bIsLocalPlayer & & ShouldDrawLocalPlayerViewModel ( ) ) // TODO: figure out the purpose of the ShouldDrawLocalPlayer() test.
{
// If I was just picked up, or created & immediately carried, add myself to this client's list of weapons
if ( ( m_iState ! = WEAPON_NOT_CARRIED ) & & ( m_iOldState = = WEAPON_NOT_CARRIED ) )
{
// Tell the HUD this weapon's been picked up
if ( ShouldDrawPickup ( ) )
{
CBaseHudWeaponSelection * pHudSelection = GetHudWeaponSelection ( ) ;
if ( pHudSelection )
{
pHudSelection - > OnWeaponPickup ( this ) ;
}
pPlayer - > EmitSound ( " Player.PickupWeapon " ) ;
}
}
}
else // weapon carried by other player or not at all
{
2020-07-16 18:43:30 +03:00
// See comment below
EnsureCorrectRenderingModel ( ) ;
2013-12-03 07:31:46 +04:00
}
UpdateVisibility ( ) ;
m_iOldState = m_iState ;
m_bJustRestored = false ;
}
//-----------------------------------------------------------------------------
// Is anyone carrying it?
//-----------------------------------------------------------------------------
bool C_BaseCombatWeapon : : IsBeingCarried ( ) const
{
return ( m_hOwner . Get ( ) ! = NULL ) ;
}
//-----------------------------------------------------------------------------
// Is the carrier alive?
//-----------------------------------------------------------------------------
bool C_BaseCombatWeapon : : IsCarrierAlive ( ) const
{
if ( ! m_hOwner . Get ( ) )
return false ;
return m_hOwner . Get ( ) - > GetHealth ( ) > 0 ;
}
//-----------------------------------------------------------------------------
// Should this object cast shadows?
//-----------------------------------------------------------------------------
ShadowType_t C_BaseCombatWeapon : : ShadowCastType ( )
{
if ( IsEffectActive ( /*EF_NODRAW |*/ EF_NOSHADOW ) )
return SHADOWS_NONE ;
if ( ! IsBeingCarried ( ) )
return SHADOWS_RENDER_TO_TEXTURE ;
if ( IsCarriedByLocalPlayer ( ) & & ! C_BasePlayer : : ShouldDrawLocalPlayer ( ) )
return SHADOWS_NONE ;
return SHADOWS_RENDER_TO_TEXTURE ;
}
//-----------------------------------------------------------------------------
// Purpose: This weapon is the active weapon, and it should now draw anything
// it wants to. This gets called every frame.
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : Redraw ( )
{
if ( g_pClientMode - > ShouldDrawCrosshair ( ) )
{
DrawCrosshair ( ) ;
}
// ammo drawing has been moved into hud_ammo.cpp
}
//-----------------------------------------------------------------------------
// Purpose: Draw the weapon's crosshair
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : DrawCrosshair ( )
{
C_BasePlayer * player = C_BasePlayer : : GetLocalPlayer ( ) ;
if ( ! player )
return ;
Color clr = gHUD . m_clrNormal ;
/*
// TEST: if the thing under your crosshair is on a different team, light the crosshair with a different color.
Vector vShootPos , vShootAngles ;
GetShootPosition ( vShootPos , vShootAngles ) ;
Vector vForward ;
AngleVectors ( vShootAngles , & vForward ) ;
// Change the color depending on if we're looking at a friend or an enemy.
CPartitionFilterListMask filter ( PARTITION_ALL_CLIENT_EDICTS ) ;
trace_t tr ;
traceline - > TraceLine ( vShootPos , vShootPos + vForward * 10000 , COLLISION_GROUP_NONE , MASK_SHOT , & tr , true , ~ 0 , & filter ) ;
if ( tr . index ! = 0 & & tr . index ! = INVALID_CLIENTENTITY_HANDLE )
{
C_BaseEntity * pEnt = ClientEntityList ( ) . GetBaseEntityFromHandle ( tr . index ) ;
if ( pEnt )
{
if ( pEnt - > GetTeamNumber ( ) ! = player - > GetTeamNumber ( ) )
{
g = b = 0 ;
}
}
}
*/
CHudCrosshair * crosshair = GET_HUDELEMENT ( CHudCrosshair ) ;
if ( ! crosshair )
return ;
// Find out if this weapon's auto-aimed onto a target
bool bOnTarget = ( m_iState = = WEAPON_IS_ONTARGET ) ;
if ( player - > GetFOV ( ) > = 90 )
{
// normal crosshairs
if ( bOnTarget & & GetWpnData ( ) . iconAutoaim )
{
clr [ 3 ] = 255 ;
crosshair - > SetCrosshair ( GetWpnData ( ) . iconAutoaim , clr ) ;
}
else if ( GetWpnData ( ) . iconCrosshair )
{
clr [ 3 ] = 255 ;
crosshair - > SetCrosshair ( GetWpnData ( ) . iconCrosshair , clr ) ;
}
else
{
crosshair - > ResetCrosshair ( ) ;
}
}
else
{
Color white ( 255 , 255 , 255 , 255 ) ;
// zoomed crosshairs
if ( bOnTarget & & GetWpnData ( ) . iconZoomedAutoaim )
crosshair - > SetCrosshair ( GetWpnData ( ) . iconZoomedAutoaim , white ) ;
else if ( GetWpnData ( ) . iconZoomedCrosshair )
crosshair - > SetCrosshair ( GetWpnData ( ) . iconZoomedCrosshair , white ) ;
else
crosshair - > ResetCrosshair ( ) ;
}
}
//-----------------------------------------------------------------------------
// Purpose: This weapon is the active weapon, and the viewmodel for it was just drawn.
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : ViewModelDrawn ( C_BaseViewModel * pViewModel )
{
}
//-----------------------------------------------------------------------------
// Purpose: Returns true if this client's carrying this weapon
//-----------------------------------------------------------------------------
bool C_BaseCombatWeapon : : IsCarriedByLocalPlayer ( void )
{
if ( ! GetOwner ( ) )
return false ;
return ( GetOwner ( ) = = C_BasePlayer : : GetLocalPlayer ( ) ) ;
}
//-----------------------------------------------------------------------------
// Purpose: Returns true if this client is carrying this weapon and is
// using the view models
//-----------------------------------------------------------------------------
bool C_BaseCombatWeapon : : ShouldDrawUsingViewModel ( void )
{
return IsCarriedByLocalPlayer ( ) & & ! C_BasePlayer : : ShouldDrawLocalPlayer ( ) ;
}
//-----------------------------------------------------------------------------
// Purpose: Returns true if this weapon is the local client's currently wielded weapon
//-----------------------------------------------------------------------------
bool C_BaseCombatWeapon : : IsActiveByLocalPlayer ( void )
{
if ( IsCarriedByLocalPlayer ( ) )
{
return ( m_iState = = WEAPON_IS_ACTIVE ) ;
}
return false ;
}
bool C_BaseCombatWeapon : : GetShootPosition ( Vector & vOrigin , QAngle & vAngles )
{
// Get the entity because the weapon doesn't have the right angles.
C_BaseCombatCharacter * pEnt = ToBaseCombatCharacter ( GetOwner ( ) ) ;
if ( pEnt )
{
if ( pEnt = = C_BasePlayer : : GetLocalPlayer ( ) )
{
vAngles = pEnt - > EyeAngles ( ) ;
}
else
{
vAngles = pEnt - > GetRenderAngles ( ) ;
}
}
else
{
vAngles . Init ( ) ;
}
QAngle vDummy ;
if ( IsActiveByLocalPlayer ( ) & & ShouldDrawLocalPlayerViewModel ( ) )
{
C_BasePlayer * player = ToBasePlayer ( pEnt ) ;
C_BaseViewModel * vm = player ? player - > GetViewModel ( 0 ) : NULL ;
if ( vm )
{
int iAttachment = vm - > LookupAttachment ( " muzzle " ) ;
if ( vm - > GetAttachment ( iAttachment , vOrigin , vDummy ) )
{
return true ;
}
}
}
else
{
// Thirdperson
int iAttachment = LookupAttachment ( " muzzle " ) ;
if ( GetAttachment ( iAttachment , vOrigin , vDummy ) )
{
return true ;
}
}
vOrigin = GetRenderOrigin ( ) ;
return false ;
}
//-----------------------------------------------------------------------------
// Purpose:
// Output : Returns true on success, false on failure.
//-----------------------------------------------------------------------------
bool C_BaseCombatWeapon : : ShouldDraw ( void )
{
if ( m_iWorldModelIndex = = 0 )
return false ;
// FIXME: All weapons with owners are set to transmit in CBaseCombatWeapon::UpdateTransmitState,
// even if they have EF_NODRAW set, so we have to check this here. Ideally they would never
// transmit except for the weapons owned by the local player.
if ( IsEffectActive ( EF_NODRAW ) )
return false ;
C_BaseCombatCharacter * pOwner = GetOwner ( ) ;
// weapon has no owner, always draw it
if ( ! pOwner )
return true ;
bool bIsActive = ( m_iState = = WEAPON_IS_ACTIVE ) ;
C_BasePlayer * pLocalPlayer = C_BasePlayer : : GetLocalPlayer ( ) ;
// carried by local player?
if ( pOwner = = pLocalPlayer )
{
// Only ever show the active weapon
if ( ! bIsActive )
return false ;
if ( ! pOwner - > ShouldDraw ( ) )
{
// Our owner is invisible.
// This also tests whether the player is zoomed in, in which case you don't want to draw the weapon.
return false ;
}
// 3rd person mode?
if ( ! ShouldDrawLocalPlayerViewModel ( ) )
return true ;
2019-08-31 22:28:20 +03:00
# ifdef MAPBASE
// We're drawing this in non-main views, handle it in DrawModel()
if ( pLocalPlayer - > m_bDrawPlayerModelExternally )
return true ;
# endif
2013-12-03 07:31:46 +04:00
// don't draw active weapon if not in some kind of 3rd person mode, the viewmodel will do that
return false ;
}
// If it's a player, then only show active weapons
if ( pOwner - > IsPlayer ( ) )
{
// Show it if it's active...
return bIsActive ;
}
// FIXME: We may want to only show active weapons on NPCs
// These are carried by AIs; always show them
return true ;
}
//-----------------------------------------------------------------------------
// Purpose: Return true if a weapon-pickup icon should be displayed when this weapon is received
//-----------------------------------------------------------------------------
bool C_BaseCombatWeapon : : ShouldDrawPickup ( void )
{
if ( GetWeaponFlags ( ) & ITEM_FLAG_NOITEMPICKUP )
return false ;
if ( m_bJustRestored )
return false ;
return true ;
}
//-----------------------------------------------------------------------------
// Purpose: Render the weapon. Draw the Viewmodel if the weapon's being carried
// by this player, otherwise draw the worldmodel.
//-----------------------------------------------------------------------------
int C_BaseCombatWeapon : : DrawModel ( int flags )
{
VPROF_BUDGET ( " C_BaseCombatWeapon::DrawModel " , VPROF_BUDGETGROUP_MODEL_RENDERING ) ;
if ( ! m_bReadyToDraw )
return 0 ;
if ( ! IsVisible ( ) )
return 0 ;
// check if local player chases owner of this weapon in first person
C_BasePlayer * localplayer = C_BasePlayer : : GetLocalPlayer ( ) ;
if ( localplayer & & localplayer - > IsObserver ( ) & & GetOwner ( ) )
{
2019-08-31 22:28:20 +03:00
# ifdef MAPBASE
if ( localplayer - > m_bDrawPlayerModelExternally )
{
// If this isn't the main view, draw the weapon.
view_id_t viewID = CurrentViewID ( ) ;
if ( viewID ! = VIEW_MAIN & & viewID ! = VIEW_INTRO_CAMERA )
return BaseClass : : DrawModel ( flags ) ;
}
# endif
2013-12-03 07:31:46 +04:00
// don't draw weapon if chasing this guy as spectator
// we don't check that in ShouldDraw() since this may change
// without notification
if ( localplayer - > GetObserverMode ( ) = = OBS_MODE_IN_EYE & &
localplayer - > GetObserverTarget ( ) = = GetOwner ( ) )
return false ;
}
return BaseClass : : DrawModel ( flags ) ;
}
//-----------------------------------------------------------------------------
// Allows the client-side entity to override what the network tells it to use for
// a model. This is used for third person mode, specifically in HL2 where the
// the weapon timings are on the view model and not the world model. That means the
// server needs to use the view model, but the client wants to use the world model.
//-----------------------------------------------------------------------------
int C_BaseCombatWeapon : : CalcOverrideModelIndex ( )
{
C_BasePlayer * localplayer = C_BasePlayer : : GetLocalPlayer ( ) ;
if ( localplayer & &
localplayer = = GetOwner ( ) & &
ShouldDrawLocalPlayerViewModel ( ) )
{
return BaseClass : : CalcOverrideModelIndex ( ) ;
}
else
{
return GetWorldModelIndex ( ) ;
}
}
2020-07-16 18:43:30 +03:00
//-----------------------------------------------------------------------------
// If the local player is visible (thirdperson mode, tf2 taunts, etc., then make sure that we are using the
// w_ (world) model not the v_ (view) model or else the model can flicker, etc.
// Otherwise, if we're not the local player, always use the world model
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : EnsureCorrectRenderingModel ( )
{
C_BasePlayer * localplayer = C_BasePlayer : : GetLocalPlayer ( ) ;
if ( localplayer & &
localplayer = = GetOwner ( ) & &
! ShouldDrawUsingViewModel ( ) )
{
return ;
}
// BRJ 10/14/02
// FIXME: Remove when Yahn's client-side prediction is done
// It's a hacky workaround for the model indices fighting
// (GetRenderBounds uses the model index, which is for the view model)
SetModelIndex ( GetWorldModelIndex ( ) ) ;
// Validate our current sequence just in case ( in theory the view and weapon models should have the same sequences for sequences that overlap at least )
CStudioHdr * pStudioHdr = GetModelPtr ( ) ;
if ( pStudioHdr & &
GetSequence ( ) > = pStudioHdr - > GetNumSeq ( ) )
{
SetSequence ( 0 ) ;
}
}
2013-12-03 07:31:46 +04:00
//-----------------------------------------------------------------------------
// tool recording
//-----------------------------------------------------------------------------
void C_BaseCombatWeapon : : GetToolRecordingState ( KeyValues * msg )
{
if ( ! ToolsEnabled ( ) )
return ;
int nModelIndex = GetModelIndex ( ) ;
int nWorldModelIndex = GetWorldModelIndex ( ) ;
if ( nModelIndex ! = nWorldModelIndex )
{
SetModelIndex ( nWorldModelIndex ) ;
}
BaseClass : : GetToolRecordingState ( msg ) ;
if ( m_iState = = WEAPON_NOT_CARRIED )
{
BaseEntityRecordingState_t * pBaseEntity = ( BaseEntityRecordingState_t * ) msg - > GetPtr ( " baseentity " ) ;
pBaseEntity - > m_nOwner = - 1 ;
}
else
{
msg - > SetInt ( " worldmodel " , 1 ) ;
if ( m_iState = = WEAPON_IS_ACTIVE )
{
BaseEntityRecordingState_t * pBaseEntity = ( BaseEntityRecordingState_t * ) msg - > GetPtr ( " baseentity " ) ;
pBaseEntity - > m_bVisible = true ;
}
}
if ( nModelIndex ! = nWorldModelIndex )
{
SetModelIndex ( nModelIndex ) ;
}
}