mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-04-07 08:54:25 +00:00
406 lines
12 KiB
C++
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 );
|
|
} |