//========= Copyright 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: Normal HUD mode // // $Workfile: $ // $Date: $ // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "clientmode_shared.h" #include "iinput.h" #include "view_shared.h" #include "keydefs.h" #include "iviewrender.h" #include "hud_basechat.h" #include "weapon_selection.h" #include <vgui/IVGUI.h> #include <vgui/Cursor.h> #include <vgui/IPanel.h> #include "engine/ienginesound.h" #include <keyvalues.h> #include <vgui_controls/AnimationController.h> #include "vgui_int.h" #include "hud_macros.h" #include "hltvcamera.h" #include "particlemgr.h" #include "c_vguiscreen.h" #include "c_team.h" #include "c_rumble.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" class CHudWeaponSelection; class CHudChat; static vgui::HContext s_hVGuiContext = DEFAULT_VGUI_CONTEXT; ConVar cl_drawhud( "cl_drawhud","1", FCVAR_CHEAT, "Enable the rendering of the hud" ); extern ConVar v_viewmodel_fov; CON_COMMAND( hud_reloadscheme, "Reloads hud layout and animation scripts." ) { ClientModeShared *mode = ( ClientModeShared * )GetClientModeNormal(); if ( !mode ) return; mode->ReloadScheme(); } #ifdef _XBOX static void __MsgFunc_XBoxRumble( bf_read &msg ) { unsigned char waveformIndex; unsigned char rumbleData; unsigned char rumbleFlags; waveformIndex = msg.ReadByte(); rumbleData = msg.ReadByte(); rumbleFlags = msg.ReadByte(); RumbleEffect( waveformIndex, rumbleData, rumbleFlags ); } #endif//_XBOX static void __MsgFunc_VGUIMenu( bf_read &msg ) { char panelname[2048]; msg.ReadString( panelname, sizeof(panelname) ); bool bShow = msg.ReadByte()!=0; IViewPortPanel *viewport = gViewPortInterface->FindPanelByName( panelname ); if ( !viewport ) { // DevMsg("VGUIMenu: couldn't find panel '%s'.\n", panelname ); return; } int count = msg.ReadByte(); if ( count > 0 ) { KeyValues *keys = new KeyValues("data"); for ( int i=0; i<count; i++) { char name[255]; char data[255]; msg.ReadString( name, sizeof(name) ); msg.ReadString( data, sizeof(data) ); keys->SetString( name, data ); } viewport->SetData( keys ); keys->deleteThis(); } gViewPortInterface->ShowPanel( viewport, bShow ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- ClientModeShared::ClientModeShared() { m_pViewport = NULL; m_pChatElement = NULL; m_pWeaponSelection = NULL; m_nRootSize[ 0 ] = m_nRootSize[ 1 ] = -1; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- ClientModeShared::~ClientModeShared() { delete m_pViewport; } void ClientModeShared::ReloadScheme( void ) { m_pViewport->ReloadScheme( "resource/ClientScheme.res" ); ClearKeyValuesCache(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ClientModeShared::Init() { if ( IsPC() ) { m_pChatElement = ( CBaseHudChat * )GET_HUDELEMENT( CHudChat ); Assert( m_pChatElement ); } m_pWeaponSelection = ( CBaseHudWeaponSelection * )GET_HUDELEMENT( CHudWeaponSelection ); Assert( m_pWeaponSelection ); // Derived ClientMode class must make sure m_Viewport is instantiated Assert( m_pViewport ); m_pViewport->LoadControlSettings("scripts/HudLayout.res"); gameeventmanager->AddListener( this, "player_connect", false ); gameeventmanager->AddListener( this, "player_disconnect", false ); gameeventmanager->AddListener( this, "player_team", false ); gameeventmanager->AddListener( this, "server_cvar", false ); gameeventmanager->AddListener( this, "player_changename", false ); #ifndef _XBOX HLTVCamera()->Init(); #endif m_CursorNone = vgui::dc_none; HOOK_MESSAGE( VGUIMenu ); #ifdef _XBOX HOOK_MESSAGE( XBoxRumble ); #endif //_XBOX } void ClientModeShared::InitViewport() { } void ClientModeShared::VGui_Shutdown() { delete m_pViewport; m_pViewport = NULL; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ClientModeShared::Shutdown() { gameeventmanager->RemoveListener( this ); } //----------------------------------------------------------------------------- // Purpose: // Input : frametime - // *cmd - //----------------------------------------------------------------------------- void ClientModeShared::CreateMove( float flInputSampleTime, CUserCmd *cmd ) { // Let the player override the view. C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if(!pPlayer) return; // Let the player at it pPlayer->CreateMove( flInputSampleTime, cmd ); } //----------------------------------------------------------------------------- // Purpose: // Input : *pSetup - //----------------------------------------------------------------------------- void ClientModeShared::OverrideView( CViewSetup *pSetup ) { QAngle camAngles; // Let the player override the view. C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if(!pPlayer) return; pPlayer->OverrideView( pSetup ); if( ::input->CAM_IsThirdPerson() ) { Vector cam_ofs; ::input->CAM_GetCameraOffset( cam_ofs ); camAngles[ PITCH ] = cam_ofs[ PITCH ]; camAngles[ YAW ] = cam_ofs[ YAW ]; camAngles[ ROLL ] = 0; Vector camForward, camRight, camUp; AngleVectors( camAngles, &camForward, &camRight, &camUp ); VectorMA( pSetup->origin, -cam_ofs[ ROLL ], camForward, pSetup->origin ); // Override angles from third person camera VectorCopy( camAngles, pSetup->angles ); } 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; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool ClientModeShared::ShouldDrawEntity(C_BaseEntity *pEnt) { return true; } bool ClientModeShared::ShouldDrawParticles( ) { return true; } //----------------------------------------------------------------------------- // Purpose: Allow weapons to override mouse input (for binoculars) //----------------------------------------------------------------------------- void ClientModeShared::OverrideMouseInput( float *x, float *y ) { C_BaseCombatWeapon *pWeapon = GetActiveWeapon(); if ( pWeapon ) { pWeapon->OverrideMouseInput( x, y ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool ClientModeShared::ShouldDrawViewModel() { return true; } bool ClientModeShared::ShouldDrawDetailObjects( ) { return true; } //----------------------------------------------------------------------------- // Purpose: // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool ClientModeShared::ShouldDrawCrosshair( void ) { return true; } //----------------------------------------------------------------------------- // Purpose: Don't draw the current view entity if we are not in 3rd person //----------------------------------------------------------------------------- bool ClientModeShared::ShouldDrawLocalPlayer( C_BasePlayer *pPlayer ) { if ( ( pPlayer->index == render->GetViewEntity() ) && !C_BasePlayer::ShouldDrawLocalPlayer() ) return false; return true; } //----------------------------------------------------------------------------- // Purpose: The mode can choose to not draw fog //----------------------------------------------------------------------------- bool ClientModeShared::ShouldDrawFog( void ) { return true; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ClientModeShared::AdjustEngineViewport( int& x, int& y, int& width, int& height ) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ClientModeShared::PreRender( CViewSetup *pSetup ) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ClientModeShared::PostRender() { // Let the particle manager simulate things that haven't been simulated. ParticleMgr()->PostRender(); } void ClientModeShared::PostRenderVGui() { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ClientModeShared::Update() { if ( m_pViewport->IsVisible() != cl_drawhud.GetBool() ) { m_pViewport->SetVisible( cl_drawhud.GetBool() ); } #ifdef _XBOX UpdateRumbleEffects(); #endif//_XBOX } //----------------------------------------------------------------------------- // This processes all input before SV Move messages are sent //----------------------------------------------------------------------------- void ClientModeShared::ProcessInput(bool bActive) { gHUD.ProcessInput( bActive ); } //----------------------------------------------------------------------------- // Purpose: We've received a keypress from the engine. Return 1 if the engine is allowed to handle it. //----------------------------------------------------------------------------- int ClientModeShared::KeyInput( int down, int keynum, const char *pszCurrentBinding ) { if ( engine->Con_IsVisible() ) return 1; // Should we start typing a message? if ( pszCurrentBinding && ( Q_strcmp( pszCurrentBinding, "messagemode" ) == 0 || Q_strcmp( pszCurrentBinding, "say" ) == 0 ) ) { if ( down ) { StartMessageMode( MM_SAY ); } return 0; } else if ( pszCurrentBinding && ( Q_strcmp( pszCurrentBinding, "messagemode2" ) == 0 || Q_strcmp( pszCurrentBinding, "say_team" ) == 0 ) ) { if ( down ) { StartMessageMode( MM_SAY_TEAM ); } return 0; } C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); // if ingame spectator mode, intercept key event here if( pPlayer && pPlayer->GetObserverMode() > OBS_MODE_DEATHCAM ) { // we are in spectator mode, open spectator menu if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+duck" ) == 0 ) { m_pViewport->ShowPanel( PANEL_SPECMENU, true ); return 0; // we handled it, don't handle twice or send to server } else if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+attack" ) == 0 ) { engine->ClientCmd( "spec_next" ); return 0; } else if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+attack2" ) == 0 ) { engine->ClientCmd( "spec_prev" ); return 0; } else if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+jump" ) == 0 ) { engine->ClientCmd( "spec_mode" ); return 0; } } if ( m_pWeaponSelection ) { if ( !m_pWeaponSelection->KeyInput( down, keynum, pszCurrentBinding ) ) { return 0; } } C_BaseCombatWeapon *pWeapon = GetActiveWeapon(); if ( pWeapon ) { return pWeapon->KeyInput( down, keynum, pszCurrentBinding ); } return 1; } //----------------------------------------------------------------------------- // Purpose: // Output : vgui::Panel //----------------------------------------------------------------------------- vgui::Panel *ClientModeShared::GetMessagePanel() { if ( m_pChatElement && m_pChatElement->GetInputPanel() && m_pChatElement->GetInputPanel()->IsVisible() ) return m_pChatElement->GetInputPanel(); return NULL; } //----------------------------------------------------------------------------- // Purpose: The player has started to type a message //----------------------------------------------------------------------------- void ClientModeShared::StartMessageMode( int iMessageModeType ) { // Can only show chat UI in multiplayer!!! if ( gpGlobals->maxClients == 1 ) { return; } if ( m_pChatElement ) { m_pChatElement->StartMessageMode( iMessageModeType ); } } //----------------------------------------------------------------------------- // Purpose: // Input : *newmap - //----------------------------------------------------------------------------- void ClientModeShared::LevelInit( const char *newmap ) { m_pViewport->GetAnimationController()->StartAnimationSequence("LevelInit"); // Tell the Chat Interface if ( m_pChatElement ) { m_pChatElement->LevelInit( newmap ); } // we have to fake this event clientside, because clients connect after that IGameEvent *event = gameeventmanager->CreateEvent( "game_newmap" ); if ( event ) { event->SetString("mapname", newmap ); gameeventmanager->FireEventClientSide( event ); } // Create a vgui context for all of the in-game vgui panels... if ( s_hVGuiContext == DEFAULT_VGUI_CONTEXT ) { s_hVGuiContext = vgui::ivgui()->CreateContext(); } // Reset any player explosion/shock effects CLocalPlayerFilter filter; enginesound->SetPlayerDSP( filter, 0, true ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void ClientModeShared::LevelShutdown( void ) { if ( m_pChatElement ) { m_pChatElement->LevelShutdown(); } if ( s_hVGuiContext != DEFAULT_VGUI_CONTEXT ) { vgui::ivgui()->DestroyContext( s_hVGuiContext ); s_hVGuiContext = DEFAULT_VGUI_CONTEXT; } // Reset any player explosion/shock effects CLocalPlayerFilter filter; enginesound->SetPlayerDSP( filter, 0, true ); } void ClientModeShared::Enable() { vgui::VPANEL pRoot; // Add our viewport to the root panel. if( (pRoot = VGui_GetClientDLLRootPanel() ) != NULL ) { m_pViewport->SetParent( pRoot ); } m_pViewport->SetCursor( m_CursorNone ); vgui::surface()->SetCursor( m_CursorNone ); m_pViewport->SetVisible( true ); m_pViewport->RequestFocus(); Layout(); } void ClientModeShared::Disable() { vgui::VPANEL pRoot; // Remove our viewport from the root panel. if( ( pRoot = VGui_GetClientDLLRootPanel() ) != NULL ) { m_pViewport->SetParent( (vgui::VPANEL)NULL ); } m_pViewport->SetVisible( false ); } void ClientModeShared::Layout() { vgui::VPANEL pRoot; int wide, tall; // Make the viewport fill the root panel. if( ( pRoot = VGui_GetClientDLLRootPanel() ) != NULL ) { vgui::ipanel()->GetSize(pRoot, wide, tall); bool changed = wide != m_nRootSize[ 0 ] || tall != m_nRootSize[ 1 ]; m_nRootSize[ 0 ] = wide; m_nRootSize[ 1 ] = tall; m_pViewport->SetBounds(0, 0, wide, tall); if ( changed ) { ReloadScheme(); } } } float ClientModeShared::GetViewModelFOV( void ) { return v_viewmodel_fov.GetFloat(); } class CHudChat; void ClientModeShared::FireGameEvent( IGameEvent *event ) { CBaseHudChat *hudChat = (CBaseHudChat *)GET_HUDELEMENT( CHudChat ); const char *eventname = event->GetName(); if ( Q_strcmp( "player_connect", eventname ) == 0 ) { if ( !hudChat ) return; hudChat->Printf( "%s has joined the game\n", event->GetString("name") ); } else if ( Q_strcmp( "player_disconnect", eventname ) == 0 ) { C_BasePlayer *pPlayer = USERID2PLAYER( event->GetInt("userid") ); if ( !hudChat || !pPlayer ) return; hudChat->Printf( "%s left the game (%s)\n", pPlayer->GetPlayerName(), event->GetString("reason") ); } else if ( Q_strcmp( "player_team", eventname ) == 0 ) { C_BasePlayer *pPlayer = USERID2PLAYER( event->GetInt("userid") ); if ( !hudChat ) return; if ( !pPlayer ) return; bool bDisconnected = event->GetBool("disconnect"); if ( bDisconnected ) return; int team = event->GetInt( "team" ); C_Team *pTeam = GetGlobalTeam( team ); if ( pTeam ) { hudChat->Printf( "Player %s joined team %s\n", pPlayer->GetPlayerName(), pTeam->Get_Name() ); } else { hudChat->Printf( "Player %s joined team %i\n", pPlayer->GetPlayerName(), team ); } if ( pPlayer->IsLocalPlayer() ) { // that's me pPlayer->TeamChange( team ); } } else if ( Q_strcmp( "player_changename", eventname ) == 0 ) { if ( !hudChat ) return; hudChat->Printf( "%s changed name to %s\n", event->GetString( "oldname" ), event->GetString( "newname" ) ); } else if ( Q_strcmp( "server_cvar", eventname ) == 0 ) { hudChat->Printf( "Server cvar \"%s\" changed to %s\n", event->GetString("cvarname"), event->GetString("cvarvalue") ); } else { DevMsg( 2, "Unhandled GameEvent in ClientModeShared::FireGameEvent - %s\n", event->GetName() ); } } //----------------------------------------------------------------------------- // In-game VGUI context //----------------------------------------------------------------------------- void ClientModeShared::ActivateInGameVGuiContext( vgui::Panel *pPanel ) { vgui::ivgui()->AssociatePanelWithContext( s_hVGuiContext, pPanel->GetVPanel() ); vgui::ivgui()->ActivateContext( s_hVGuiContext ); } void ClientModeShared::DeactivateInGameVGuiContext() { vgui::ivgui()->ActivateContext( DEFAULT_VGUI_CONTEXT ); }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 5821 | Knut Wikstrom |
Added Valve Source code. This is NOT to be commited to other than new code from Valve. |