source-engine/game/client/tf2base/clientmode_tf.cpp
2022-08-10 19:52:28 +03:00

406 lines
12 KiB
C++

//=========== (C) Copyright 1999 Valve, L.L.C. All rights reserved. ===========
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// $Header: $
// $NoKeywords: $
//
//=============================================================================
#include "cbase.h"
#include "hud.h"
#include "clientmode_tf.h"
#include "cdll_client_int.h"
#include "iinput.h"
#include "vgui/ISurface.h"
#include "vgui/IPanel.h"
#include "GameUI/IGameUI.h"
#include <vgui_controls/AnimationController.h>
#include "ivmodemanager.h"
#include "buymenu.h"
#include "filesystem.h"
#include "vgui/IVGui.h"
#include "hud_chat.h"
#include "view_shared.h"
#include "view.h"
#include "ivrenderview.h"
#include "model_types.h"
#include "iefx.h"
#include "dlight.h"
#include <imapoverview.h>
#include "c_playerresource.h"
#include <KeyValues.h>
#include "text_message.h"
#include "panelmetaclassmgr.h"
#include "c_tf_player.h"
#include "ienginevgui.h"
#include "in_buttons.h"
#include "voice_status.h"
#include "tf_hud_menu_engy_build.h"
#include "tf_hud_menu_engy_destroy.h"
#include "tf_hud_menu_spy_disguise.h"
#include "tf_statsummary.h"
#include "tf_hud_freezepanel.h"
#include "cam_thirdperson.h"
#if defined( _X360 )
#include "tf_clientscoreboard.h"
#endif
ConVar default_fov( "default_fov", "75", FCVAR_CHEAT );
ConVar fov_desired( "fov_desired", "75", FCVAR_ARCHIVE | FCVAR_USERINFO, "Sets the base field-of-view.", true, 75.0, true, 90.0 );
void HUDMinModeChangedCallBack( IConVar *var, const char *pOldString, float flOldValue )
{
engine->ExecuteClientCmd( "hud_reloadscheme" );
}
ConVar cl_hud_minmode( "cl_hud_minmode", "0", FCVAR_ARCHIVE, "Set to 1 to turn on the advanced minimalist HUD mode.", HUDMinModeChangedCallBack );
IClientMode *g_pClientMode = NULL;
// --------------------------------------------------------------------------------- //
// CTFModeManager.
// --------------------------------------------------------------------------------- //
class CTFModeManager : public IVModeManager
{
public:
virtual void Init();
virtual void SwitchMode( bool commander, bool force ) {}
virtual void LevelInit( const char *newmap );
virtual void LevelShutdown( void );
virtual void ActivateMouse( bool isactive ) {}
};
static CTFModeManager g_ModeManager;
IVModeManager *modemanager = ( IVModeManager * )&g_ModeManager;
// --------------------------------------------------------------------------------- //
// CTFModeManager implementation.
// --------------------------------------------------------------------------------- //
#define SCREEN_FILE "scripts/vgui_screens.txt"
void CTFModeManager::Init()
{
g_pClientMode = GetClientModeNormal();
PanelMetaClassMgr()->LoadMetaClassDefinitionFile( SCREEN_FILE );
// Load the objects.txt file.
LoadObjectInfos( ::filesystem );
GetClientVoiceMgr()->SetHeadLabelOffset( 40 );
}
void CTFModeManager::LevelInit( const char *newmap )
{
g_pClientMode->LevelInit( newmap );
ConVarRef voice_steal( "voice_steal" );
if ( voice_steal.IsValid() )
{
voice_steal.SetValue( 1 );
}
g_ThirdPersonManager.Init();
}
void CTFModeManager::LevelShutdown( void )
{
g_pClientMode->LevelShutdown();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
ClientModeTFNormal::ClientModeTFNormal()
{
m_pMenuEngyBuild = NULL;
m_pMenuEngyDestroy = NULL;
m_pMenuSpyDisguise = NULL;
m_pGameUI = NULL;
m_pFreezePanel = NULL;
#if defined( _X360 )
m_pScoreboard = NULL;
#endif
}
//-----------------------------------------------------------------------------
// Purpose: If you don't know what a destructor is by now, you are probably going to get fired
//-----------------------------------------------------------------------------
ClientModeTFNormal::~ClientModeTFNormal()
{
}
// See interface.h/.cpp for specifics: basically this ensures that we actually Sys_UnloadModule the dll and that we don't call Sys_LoadModule
// over and over again.
static CDllDemandLoader g_GameUI( "gameui" );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void ClientModeTFNormal::Init()
{
m_pMenuEngyBuild = ( CHudMenuEngyBuild * )GET_HUDELEMENT( CHudMenuEngyBuild );
Assert( m_pMenuEngyBuild );
m_pMenuEngyDestroy = ( CHudMenuEngyDestroy * )GET_HUDELEMENT( CHudMenuEngyDestroy );
Assert( m_pMenuEngyDestroy );
m_pMenuSpyDisguise = ( CHudMenuSpyDisguise * )GET_HUDELEMENT( CHudMenuSpyDisguise );
Assert( m_pMenuSpyDisguise );
m_pFreezePanel = ( CTFFreezePanel * )GET_HUDELEMENT( CTFFreezePanel );
Assert( m_pFreezePanel );
CreateInterfaceFn gameUIFactory = g_GameUI.GetFactory();
if ( gameUIFactory )
{
m_pGameUI = (IGameUI *) gameUIFactory(GAMEUI_INTERFACE_VERSION, NULL );
if ( NULL != m_pGameUI )
{
// insert stats summary panel as the loading background dialog
CTFStatsSummaryPanel *pPanel = GStatsSummaryPanel();
pPanel->InvalidateLayout( false, true );
pPanel->SetVisible( false );
pPanel->MakePopup( false );
m_pGameUI->SetLoadingBackgroundDialog( pPanel->GetVPanel() );
}
}
#if defined( _X360 )
m_pScoreboard = (CTFClientScoreBoardDialog *)( gViewPortInterface->FindPanelByName( PANEL_SCOREBOARD ) );
Assert( m_pScoreboard );
#endif
BaseClass::Init();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void ClientModeTFNormal::Shutdown()
{
DestroyStatsSummaryPanel();
}
void ClientModeTFNormal::InitViewport()
{
m_pViewport = new TFViewport();
m_pViewport->Start( gameuifuncs, gameeventmanager );
}
ClientModeTFNormal g_ClientModeNormal;
IClientMode *GetClientModeNormal()
{
return &g_ClientModeNormal;
}
ClientModeTFNormal* GetClientModeTFNormal()
{
Assert( dynamic_cast< ClientModeTFNormal* >( GetClientModeNormal() ) );
return static_cast< ClientModeTFNormal* >( GetClientModeNormal() );
}
//-----------------------------------------------------------------------------
// Purpose: Fixes some bugs from base class.
//-----------------------------------------------------------------------------
void ClientModeTFNormal::OverrideView( CViewSetup *pSetup )
{
C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
// Let the player override the view.
pPlayer->OverrideView( pSetup );
if ( ::input->CAM_IsThirdPerson() )
{
int iObserverMode = pPlayer->GetObserverMode();
if ( iObserverMode == OBS_MODE_NONE || iObserverMode == OBS_MODE_IN_EYE )
{
QAngle camAngles;
if ( g_ThirdPersonManager.IsOverridingThirdPerson() == false )
{
VectorCopy( pSetup->angles, camAngles );
}
else
{
const Vector& cam_ofs = g_ThirdPersonManager.GetCameraOffsetAngles();
camAngles[PITCH] = cam_ofs[PITCH];
camAngles[YAW] = cam_ofs[YAW];
camAngles[ROLL] = 0;
// Override angles from third person camera
VectorCopy( camAngles, pSetup->angles );
}
Vector camForward, camRight, camUp, cam_ofs_distance;
// get the forward vector
AngleVectors( camAngles, &camForward, &camRight, &camUp );
if ( g_ThirdPersonManager.IsOverridingThirdPerson() == false )
{
cam_ofs_distance = g_ThirdPersonManager.GetFinalCameraOffset();
}
else
{
cam_ofs_distance = g_ThirdPersonManager.GetDesiredCameraOffset();
}
cam_ofs_distance *= g_ThirdPersonManager.GetDistanceFraction();
VectorMA( pSetup->origin, -cam_ofs_distance[0], camForward, pSetup->origin );
VectorMA( pSetup->origin, cam_ofs_distance[1], camRight, pSetup->origin );
VectorMA( pSetup->origin, cam_ofs_distance[2], camUp, pSetup->origin );
}
}
else if ( ::input->CAM_IsOrthographic() )
{
pSetup->m_bOrtho = true;
float w, h;
::input->CAM_OrthographicSize( w, h );
w *= 0.5f;
h *= 0.5f;
pSetup->m_OrthoLeft = -w;
pSetup->m_OrthoTop = -h;
pSetup->m_OrthoRight = w;
pSetup->m_OrthoBottom = h;
}
}
extern ConVar v_viewmodel_fov;
float g_flViewModelFOV = 75;
float ClientModeTFNormal::GetViewModelFOV( void )
{
return v_viewmodel_fov.GetFloat();
// return g_flViewModelFOV;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool ClientModeTFNormal::ShouldDrawViewModel()
{
C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( pPlayer )
{
if ( pPlayer->m_Shared.InCond( TF_COND_ZOOMED ) )
return false;
}
return true;
}
int ClientModeTFNormal::GetDeathMessageStartHeight( void )
{
return m_pViewport->GetDeathMessageStartHeight();
}
void ClientModeTFNormal::FireGameEvent( IGameEvent *event )
{
const char *eventname = event->GetName();
if ( !eventname || !eventname[0] )
return;
if ( Q_strcmp( "player_changename", eventname ) == 0 )
{
return; // server sends a colorized text string for this
}
BaseClass::FireGameEvent( event );
}
void ClientModeTFNormal::PostRenderVGui()
{
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool ClientModeTFNormal::CreateMove( float flInputSampleTime, CUserCmd *cmd )
{
return BaseClass::CreateMove( flInputSampleTime, cmd );
}
//-----------------------------------------------------------------------------
// Purpose: See if hud elements want key input. Return 0 if the key is swallowed
//-----------------------------------------------------------------------------
int ClientModeTFNormal::HudElementKeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding )
{
// Let scoreboard handle input first because on X360 we need gamertags and
// gamercards accessible at all times when gamertag is visible.
#if defined( _X360 )
if ( m_pScoreboard )
{
if ( !m_pScoreboard->HudElementKeyInput( down, keynum, pszCurrentBinding ) )
{
return 0;
}
}
#endif
// check for hud menus
if ( m_pMenuEngyBuild )
{
if ( !m_pMenuEngyBuild->HudElementKeyInput( down, keynum, pszCurrentBinding ) )
{
return 0;
}
}
if ( m_pMenuEngyDestroy )
{
if ( !m_pMenuEngyDestroy->HudElementKeyInput( down, keynum, pszCurrentBinding ) )
{
return 0;
}
}
if ( m_pMenuSpyDisguise )
{
if ( !m_pMenuSpyDisguise->HudElementKeyInput( down, keynum, pszCurrentBinding ) )
{
return 0;
}
}
if ( m_pFreezePanel )
{
m_pFreezePanel->HudElementKeyInput( down, keynum, pszCurrentBinding );
}
return BaseClass::HudElementKeyInput( down, keynum, pszCurrentBinding );
}
//-----------------------------------------------------------------------------
// Purpose: See if spectator input occurred. Return 0 if the key is swallowed.
//-----------------------------------------------------------------------------
int ClientModeTFNormal::HandleSpectatorKeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding )
{
#if defined( _X360 )
// On X360 when we have scoreboard up in spectator menu we cannot
// steal any input because gamertags must be selectable and gamercards
// must be accessible.
// We cannot rely on any keybindings in this case since user could have
// remapped everything.
if ( m_pScoreboard && m_pScoreboard->IsVisible() )
{
return 1;
}
#endif
return BaseClass::HandleSpectatorKeyInput( down, keynum, pszCurrentBinding );
}