diff options
Diffstat (limited to 'game/shared/tf2/tf_obj_base_manned_gun.cpp')
| -rw-r--r-- | game/shared/tf2/tf_obj_base_manned_gun.cpp | 680 |
1 files changed, 680 insertions, 0 deletions
diff --git a/game/shared/tf2/tf_obj_base_manned_gun.cpp b/game/shared/tf2/tf_obj_base_manned_gun.cpp new file mode 100644 index 0000000..6d3f015 --- /dev/null +++ b/game/shared/tf2/tf_obj_base_manned_gun.cpp @@ -0,0 +1,680 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: A stationary gun that players can man +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "tf_obj_base_manned_gun.h" +#include "tf_obj_manned_plasmagun_shared.h" +#include "in_buttons.h" +#include "tf_movedata.h" +#include "tf_gamerules.h" + +#if defined( CLIENT_DLL ) +#include "hudelement.h" +#include "bone_setup.h" +#include "hud_ammo.h" +#include "hud_crosshair.h" +#else +#endif + +IMPLEMENT_NETWORKCLASS_ALIASED( ObjectBaseMannedGun, DT_ObjectBaseMannedGun ) + +BEGIN_NETWORK_TABLE( CObjectBaseMannedGun, DT_ObjectBaseMannedGun ) +#if !defined( CLIENT_DLL ) + SendPropInt (SENDINFO(m_nMoveStyle), 2, SPROP_UNSIGNED ), + SendPropInt (SENDINFO(m_nAmmoType), 8 ), + SendPropInt (SENDINFO(m_nAmmoCount), 6, SPROP_UNSIGNED ), + SendPropAngle(SENDINFO(m_flGunYaw), 12 ), + SendPropAngle(SENDINFO(m_flGunPitch), 12 ), + SendPropAngle(SENDINFO(m_flBarrelPitch), 12 ), + + SendPropEHandle( SENDINFO( m_hLaserDesignation ) ), + SendPropEHandle( SENDINFO( m_hBeam ) ), + +#else + RecvPropInt( RECVINFO(m_nMoveStyle) ), + RecvPropInt( RECVINFO(m_nAmmoType) ), + RecvPropInt( RECVINFO(m_nAmmoCount) ), + RecvPropFloat( RECVINFO(m_flGunYaw) ), + RecvPropFloat( RECVINFO(m_flGunPitch) ), + RecvPropFloat( RECVINFO(m_flBarrelPitch) ), + + RecvPropEHandle( RECVINFO( m_hLaserDesignation ) ), + RecvPropEHandle( RECVINFO( m_hBeam ) ), + +#endif +END_NETWORK_TABLE() + +LINK_ENTITY_TO_CLASS( tf_obj_base_manned_gun, CObjectBaseMannedGun ); + +BEGIN_PREDICTION_DATA( CObjectBaseMannedGun ) + + DEFINE_PRED_FIELD( m_nMoveStyle, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ), + DEFINE_PRED_FIELD( m_nAmmoType, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ), + DEFINE_PRED_FIELD( m_nAmmoCount, FIELD_INTEGER, FTYPEDESC_INSENDTABLE ), + + DEFINE_PRED_FIELD_TOL( m_flGunYaw, FIELD_FLOAT, FTYPEDESC_INSENDTABLE, 0.5f), + DEFINE_PRED_FIELD_TOL( m_flGunPitch, FIELD_FLOAT, FTYPEDESC_INSENDTABLE | FTYPEDESC_NOERRORCHECK, 0.125f ), + DEFINE_PRED_FIELD_TOL( m_flBarrelPitch, FIELD_FLOAT, FTYPEDESC_INSENDTABLE | FTYPEDESC_NOERRORCHECK, 0.125f ), + + DEFINE_PRED_FIELD( m_hLaserDesignation, FIELD_EHANDLE, FTYPEDESC_INSENDTABLE ), + + DEFINE_PRED_FIELD( m_hBeam, FIELD_EHANDLE, FTYPEDESC_INSENDTABLE ), + + DEFINE_FIELD( m_flBarrelHeight, FIELD_FLOAT ), + +// DEFINE_FIELD( m_nBarrelAttachment, FIELD_INTEGER ), +// DEFINE_FIELD( m_nBarrelPivotAttachment, FIELD_INTEGER ), +// DEFINE_FIELD( m_nStandAttachment, FIELD_INTEGER ), +// DEFINE_FIELD( m_nEyesAttachment, FIELD_INTEGER ), + +END_PREDICTION_DATA() + +extern ConVar mannedgun_usethirdperson; +static ConVar obj_manned_gun_designator_range( "obj_manned_gun_designator_range","2048", FCVAR_REPLICATED, "Manned gun's laser designation range" ); +ConVar obj_child_range_factor( "obj_child_range_factor","1.1", FCVAR_REPLICATED, "Factor applied to range of objects that are built on a buildpoint" ); + +// Restoring initial state handling +#define OBJ_BASE_MANNEDGUN_THINK_CONTEXT "BaseMannedGunThink" +#define MANNEDGUN_RESTORE_TIME 5.0 +#define MANNEDGUN_RESTORE_TURN_RATE 150 + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CObjectBaseMannedGun::CObjectBaseMannedGun() +{ + m_nMoveStyle = MOVEMENT_STYLE_STANDARD; +} + + +//----------------------------------------------------------------------------- +// Sets the movement style +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::SetMovementStyle( MovementStyle_t style ) +{ + m_nMoveStyle = style; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::Precache() +{ + BaseClass::Precache(); +#if !defined( CLIENT_DLL ) + PrecacheVGuiScreen( "screen_obj_manned_plasmagun" ); + PrecacheMaterial( "sprites/laserbeam" ); +#endif +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::Spawn() +{ + m_takedamage = DAMAGE_YES; + + SetMaxPassengerCount( 1 ); + + m_flGunYaw = 0; + m_flGunPitch = 0; + m_flBarrelPitch = 0; + + BaseClass::Spawn(); + + // Manned guns don't need to be built like other vehicles + int curFlags = GetObjectFlags(); + curFlags &= ~OF_MUST_BE_BUILT_IN_CONSTRUCTION_YARD; + curFlags &= ~OF_MUST_BE_BUILT_ON_ATTACHMENT; + curFlags &= ~OF_DOESNT_NEED_POWER; + curFlags |= OF_DONT_PREVENT_BUILD_NEAR_OBJ; + SetObjectFlags( curFlags ); + + m_flMaxRange = 0; +} + +//----------------------------------------------------------------------------- +// Purpose: Calculate the max range of this gun +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::CalculateMaxRange( float flDefensiveRange, float flOffensiveRange ) +{ + if ( GetTeamNumber() == TEAM_HUMANS ) + { + m_flMaxRange = flDefensiveRange; + if ( GetParentObject() ) + { + m_flMaxRange *= obj_child_range_factor.GetFloat(); + } + } + else + { + m_flMaxRange = flOffensiveRange; + } +} + +//----------------------------------------------------------------------------- +// Sets up various attachment points once the model is selected +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::OnModelSelected() +{ + m_nBarrelAttachment = LookupAttachment( "barrel" ); + m_nBarrelPivotAttachment = LookupAttachment( "barrelpivot" ); + m_nStandAttachment = LookupAttachment( "vehicle_feet_passenger0" ); + m_nEyesAttachment = LookupAttachment( "vehicle_eyes_passenger0" ); + + // Find the barrel height in its quiescent state... + Vector vBarrel; + QAngle vBarrelAngles; + GetAttachmentLocal( m_nBarrelAttachment, vBarrel, vBarrelAngles ); + m_flBarrelHeight = vBarrel.z; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::UpdateOnRemove( void ) +{ + if ( m_hLaserDesignation.Get() ) + { + m_hLaserDesignation->Remove( ); + m_hLaserDesignation = NULL; + } + + // Chain at end to mimic destructor unwind order + BaseClass::UpdateOnRemove(); +} + + +//----------------------------------------------------------------------------- +// Purpose: Gets info about the control panels +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::GetControlPanelInfo( int nPanelIndex, const char *&pPanelName ) +{ + pPanelName = "screen_obj_manned_plasmagun"; +} + + +//----------------------------------------------------------------------------- +// Purpose: Hide the base of the gun if it's on an attachment +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::SetupAttachedVersion( void ) +{ + BaseClass::SetupAttachedVersion(); + + SetBodygroup( 1, true ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::SetupUnattachedVersion( void ) +{ + BaseClass::SetupUnattachedVersion(); + + SetBodygroup( 1, false ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::OnGoInactive( void ) +{ + BaseClass::OnGoInactive(); + + // If we've got a player in the gun, tell him he's got to get out + if ( GetDriverPlayer() ) + { + ClientPrint( GetDriverPlayer(), HUD_PRINTCENTER, "Lost power to the manned gun!" ); + GetDriverPlayer()->LeaveVehicle(); + } + +#if 0 + if ( GetBuffStation() ) + { + GetBuffStation()->DeBuffObject( this ); + } +#endif +} + +//----------------------------------------------------------------------------- +// Purpose: Can we get into the vehicle? +//----------------------------------------------------------------------------- +bool CObjectBaseMannedGun::CanGetInVehicle( CBaseTFPlayer *pPlayer ) +{ + if ( !IsPowered() ) + { + ClientPrint( pPlayer, HUD_PRINTCENTER, "No power source for the manned gun!" ); + return false; + } + + return true; +} + + +//----------------------------------------------------------------------------- +// Returns the eye position +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::GetVehicleViewPosition( int nRole, Vector *pOrigin, QAngle *pAngles, float *pFOV /*= NULL*/ ) +{ + BaseClass::GetVehicleViewPosition( nRole, pOrigin, pAngles, pFov ); + return; + Assert( nRole == VEHICLE_DRIVER ); + QAngle vPlayerFeetAngles; + GetAttachment(m_nEyesAttachment, *pOrigin, vPlayerFeetAngles); +} + +//----------------------------------------------------------------------------- +// Purpose: Return to our original facing after a while +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::BaseMannedGunThink( void ) +{ + // If someone's got in the gun, stop moving + if ( GetDriverPlayer() ) + return; + + // Otherwise, move back towards the initial state + if ( m_flGunPitch ) + { + float flPitch = anglemod( m_flGunPitch ); + if (( flPitch <= 180 ) && ( flPitch >= 0 )) + { + m_flGunPitch = MAX( 0, flPitch - (gpGlobals->frametime * MANNEDGUN_RESTORE_TURN_RATE) ); + } + else + { + m_flGunPitch = flPitch + (gpGlobals->frametime * MANNEDGUN_RESTORE_TURN_RATE); + if ( m_flGunPitch >= 360 ) + { + m_flGunPitch = 0; + } + } + } + else if ( m_flGunYaw ) + { + if ( m_flGunYaw > 180 ) + { + m_flGunYaw = m_flGunYaw + (gpGlobals->frametime * MANNEDGUN_RESTORE_TURN_RATE); + if ( m_flGunYaw >= 360 ) + { + m_flGunYaw = 0; + } + } + else + { + m_flGunYaw = MAX( 0, m_flGunYaw - (gpGlobals->frametime * MANNEDGUN_RESTORE_TURN_RATE) ); + } + + } + else + { + // We're done + return; + } + + // Keep thinking + SetContextThink( BaseMannedGunThink, gpGlobals->curtime + 0.1, OBJ_BASE_MANNEDGUN_THINK_CONTEXT ); +} + +#ifndef CLIENT_DLL +//----------------------------------------------------------------------------- +// Purpose: Get and set the current driver. +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::SetPassenger( int nRole, CBasePlayer *pEnt ) +{ + BaseClass::SetPassenger( nRole, pEnt ); + + // If we don't have a driver anymore, return to our original facing after a while + if ( !GetDriverPlayer() && (m_flGunPitch || m_flGunYaw) ) + { + StopDesignating(); + SetContextThink( BaseMannedGunThink, gpGlobals->curtime + MANNEDGUN_RESTORE_TIME, OBJ_BASE_MANNEDGUN_THINK_CONTEXT ); + } +} +#endif + +//----------------------------------------------------------------------------- +// Here's where we deal with weapons +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::OnItemPostFrame( CBaseTFPlayer *pDriver ) +{ + // I can't do anything if I'm not active + if ( !ShouldBeActive() ) + return; + + if ( !IsReadyToDrive() ) + return; + + // If we don't have a laser designator yet, create one + if ( !m_hLaserDesignation ) + { + m_hLaserDesignation = CEnvLaserDesignation::CreatePredicted( pDriver ); + } + + // Designating? + if (pDriver->m_nButtons & IN_ATTACK2) + { + UpdateDesignator(); + return; + } + + StopDesignating(); + + // Fire our base weapon? + if ( pDriver->m_nButtons & IN_ATTACK ) + { + Fire(); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::StopDesignating( void ) +{ + // Remove our beam if we just stopped designating + if ( m_hBeam.Get() ) + { + m_hBeam->Remove( ); + } + + if ( m_hLaserDesignation.Get() ) + { + m_hLaserDesignation->SetActive( false ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Update the designator position +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::UpdateDesignator( void ) +{ + // Make the beam, if we don't have one yet + if ( !m_hBeam && GetDriverPlayer() ) + { + m_hBeam = BEAM_CREATE_PREDICTABLE_PERSIST( "sprites/laserbeam.vmt", 5, GetDriverPlayer() ); + if ( m_hBeam.Get() ) + { + m_hBeam->PointEntInit( vec3_origin, this ); + m_hBeam->SetEndAttachment( m_nBarrelAttachment ); + m_hBeam->SetColor( 255, 32, 32 ); + m_hBeam->SetBrightness( 255 ); + m_hBeam->SetNoise( 0 ); + m_hBeam->SetWidth( 0.5 ); + m_hBeam->SetEndWidth( 0.5 ); + } + } + + // We have to flush the bone cache because it's possible that only the bone controllers + // have changed since the bonecache was generated, and bone controllers aren't checked. + InvalidateBoneCache(); + + QAngle vecAng; + Vector vecSrc, vecAim; + GetAttachment( m_nBarrelAttachment, vecSrc, vecAng ); + AngleVectors( vecAng, &vecAim, 0, 0 ); + + // "Fire" the designator beam + Vector vecEnd = vecSrc + vecAim * obj_manned_gun_designator_range.GetFloat(); + trace_t tr; + TFGameRules()->WeaponTraceLine(vecSrc, vecEnd, MASK_SHOT, this, DMG_PROBE, &tr); + + if ( m_hLaserDesignation.Get() ) + { + // Only update our designated target point if we hit something + if ( tr.fraction != 1.0 ) + { + m_hLaserDesignation->SetActive( true ); + m_hLaserDesignation->SetAbsOrigin( tr.endpos ); + } + else + { + m_hLaserDesignation->SetActive( false ); + } + } + + // Update beam visual + if ( m_hBeam.Get() ) + { + m_hBeam->SetStartPos( tr.endpos ); + m_hBeam->RelinkBeam(); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::SetupMove( CBasePlayer *pPlayer, CUserCmd *ucmd, IMoveHelper *pHelper, CMoveData *move ) +{ + BaseClass::SetupMove( pPlayer, ucmd, pHelper, move ); + + CTFMoveData *pMoveData = (CTFMoveData*)move; + Assert( sizeof(MannedPlasmagunData_t) <= pMoveData->VehicleDataMaxSize() ); + + MannedPlasmagunData_t *pVehicleData = (MannedPlasmagunData_t*)pMoveData->VehicleData(); + pVehicleData->m_pVehicle = this; + pVehicleData->m_flGunYaw = m_flGunYaw; + pVehicleData->m_flGunPitch = m_flGunPitch; + pVehicleData->m_flBarrelPitch = m_flBarrelPitch; + pVehicleData->m_nMoveStyle = m_nMoveStyle; + pVehicleData->m_flBarrelHeight = m_flBarrelHeight; + pVehicleData->m_nBarrelPivotAttachment = m_nBarrelPivotAttachment; + pVehicleData->m_nBarrelAttachment = m_nBarrelAttachment; + pVehicleData->m_nStandAttachment = m_nStandAttachment; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::FinishMove( CBasePlayer *player, CUserCmd *ucmd, CMoveData *move ) +{ + BaseClass::FinishMove( player, ucmd, move ); + CTFMoveData *pMoveData = (CTFMoveData*)move; + Assert( sizeof(MannedPlasmagunData_t) <= pMoveData->VehicleDataMaxSize() ); + + MannedPlasmagunData_t *pVehicleData = (MannedPlasmagunData_t*)pMoveData->VehicleData(); + m_flGunYaw = pVehicleData->m_flGunYaw; + m_flGunPitch = pVehicleData->m_flGunPitch; + m_flBarrelPitch = pVehicleData->m_flBarrelPitch; + + // Set the bone state.. + SetBoneController( 0, m_flGunYaw ); + SetBoneController( 1, m_flGunPitch ); + + if ( m_nMoveStyle == MOVEMENT_STYLE_BARREL_PIVOT ) + { + SetBoneController( 2, m_flBarrelPitch ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectBaseMannedGun::ProcessMovement( CBasePlayer *pPlayer, CMoveData *pMove ) +{ + m_Movement.ProcessMovement( pPlayer, pMove ); + + m_flGunPitch = AngleNormalize( m_flGunPitch ); + m_flBarrelPitch = AngleNormalize( m_flBarrelPitch ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +float CObjectBaseMannedGun::GetGunYaw() const +{ + return m_flGunYaw; +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +float CObjectBaseMannedGun::GetGunPitch() const +{ + return m_flGunPitch; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CObjectBaseMannedGun::ShouldUseThirdPersonVehicleView( void ) +{ + if ( mannedgun_usethirdperson.GetInt() ) + { + // We want to use third person if we're mounted on a vehicle. + return dynamic_cast< CBaseTFVehicle* >( GetMoveParent() ) != NULL; + } + else + { + return false; + } +} + +#if defined( CLIENT_DLL ) +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_ObjectBaseMannedGun::OnDataChanged( DataUpdateType_t updateType ) +{ + BaseClass::OnDataChanged(updateType); + + if ( updateType == DATA_UPDATE_CREATED ) + { + // FIXME: Will this work with build animations models? + + m_nBarrelAttachment = LookupAttachment( "barrel" ); + m_nBarrelPivotAttachment = LookupAttachment( "barrelpivot" ); + m_nStandAttachment = LookupAttachment( "vehicle_feet_passenger0" ); + + // Find the barrel height in its quiescent state... + Vector vBarrel; + QAngle vBarrelAngles; + GetAttachmentLocal(m_nBarrelAttachment, vBarrel, vBarrelAngles); + m_flBarrelHeight = vBarrel.z; + + // HACK HACK: This should be read from a .txt file at some point!!!! + CHudTexture newTexture; + Q_strncpy( newTexture.szTextureFile, "sprites/crosshairs", sizeof( newTexture.szTextureFile ) ); + + newTexture.rc.left = 0; + newTexture.rc.top = 48; + newTexture.rc.right = newTexture.rc.left + 24; + newTexture.rc.bottom = newTexture.rc.top + 24; + iconCrosshair = gHUD.AddUnsearchableHudIconToList( newTexture ); + } + else + { + // Set the bone state.. + SetBoneController( 0, m_flGunYaw ); + SetBoneController( 1, m_flGunPitch ); + + if ( m_nMoveStyle == MOVEMENT_STYLE_BARREL_PIVOT ) + { + SetBoneController( 2, m_flBarrelPitch ); + } + } +} + +//----------------------------------------------------------------------------- +// Clamps the view angles while manning the gun +//----------------------------------------------------------------------------- +void C_ObjectBaseMannedGun::UpdateViewAngles( C_BasePlayer *pLocalPlayer, CUserCmd *pCmd ) +{ +#if 0 + // Confine the view to the appropriate yaw range... + float flAngleDiff = AngleDiff( pCmd->viewangles[YAW], flCenterYaw ); + + // Here, we must clamp to the cone... + if (flAngleDiff < m_Movement.GetMinYaw()) + pCmd->viewangles[YAW] = anglemod(flCenterYaw + m_Movement.GetMinYaw()); + else if (flAngleDiff > m_Movement.GetMaxYaw()) + pCmd->viewangles[YAW] = anglemod(flCenterYaw + m_Movement.GetMaxYaw()); +#endif + + // Prevent too much downward looking + if ( pCmd->viewangles[PITCH] > m_Movement.GetMaxPitch()) + { + pCmd->viewangles[PITCH] = m_Movement.GetMaxPitch(); + } +} + +//----------------------------------------------------------------------------- +// Orients the gun correctly +//----------------------------------------------------------------------------- +void C_ObjectBaseMannedGun::GetBoneControllers(float controllers[MAXSTUDIOBONECTRLS], float dadt) +{ + // turret angle values: + // 0 = front, 90 = left, 180 = back, 270 = right + studiohdr_t *pModel = modelinfo->GetStudiomodel( GetModel() ); + Studio_SetController(pModel, 0, m_flGunYaw, controllers[0]); + Studio_SetController(pModel, 1, m_flGunPitch, controllers[1]); + + if ( m_nMoveStyle == MOVEMENT_STYLE_BARREL_PIVOT ) + { + Studio_SetController(pModel, 2, m_flBarrelPitch, controllers[2]); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Get the angles that a player in the specified role should be using for visuals +//----------------------------------------------------------------------------- +QAngle C_ObjectBaseMannedGun::GetPassengerAngles( QAngle angCurrent, int nRole ) +{ + // Stomp the current angle's pitch with our rotation + QAngle vecNewAngles = angCurrent; + angCurrent[PITCH] = m_flGunPitch; + + return angCurrent; +} + +//----------------------------------------------------------------------------- +// Renders hud elements +//----------------------------------------------------------------------------- +void C_ObjectBaseMannedGun::DrawHudElements( void ) +{ + GetHudAmmo()->SetPrimaryAmmo( m_nAmmoType, m_nAmmoCount ); + GetHudAmmo()->SetSecondaryAmmo( -1, -1 ); + + // Let the plasma gun operator see a crosshair + DrawCrosshair(); +} + + +//----------------------------------------------------------------------------- +// Purpose: Draw the weapon's crosshair +//----------------------------------------------------------------------------- +void C_ObjectBaseMannedGun::DrawCrosshair() +{ + C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); + if ( !player ) + return; + + CHudCrosshair *crosshair = GET_HUDELEMENT( CHudCrosshair ); + if ( !crosshair ) + return; + + if ( iconCrosshair ) + { + crosshair->SetCrosshair( iconCrosshair, gHUD.m_clrNormal ); + } + else + { + static wrect_t nullrc; + crosshair->SetCrosshair( 0, Color( 255, 255, 255, 255 ) ); + } +} + +#endif |