//========= Copyright 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include <cdll_client_int.h> #include "teammenu.h" #include <vgui/IScheme.h> #include <vgui/ILocalize.h> #include <vgui/ISurface.h> #include <KeyValues.h> #include <vgui_controls/ImageList.h> #include <FileSystem.h> #include <vgui_controls/RichText.h> #include <vgui_controls/Label.h> #include <vgui_controls/Button.h> #include <vgui_controls/HTML.h> #include "IGameUIFuncs.h" // for key bindings #include <igameresources.h> #ifndef _XBOX extern IGameUIFuncs *gameuifuncs; // for key binding details #endif #include <cl_dll/iviewport.h> #include <stdlib.h> // MAX_PATH define #include <stdio.h> // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" using namespace vgui; void UpdateCursorState(); // void DuckMessage(const char *str); // helper function const char *GetStringTeamColor( int i ) { switch( i ) { case 0: return "team0"; case 1: return "team1"; case 2: return "team2"; case 3: return "team3"; case 4: default: return "team4"; } } //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CTeamMenu::CTeamMenu(IViewPort *pViewPort) : Frame(NULL, PANEL_TEAM ) { m_pViewPort = pViewPort; m_iJumpKey = -1; // this is looked up in Activate() m_iScoreBoardKey = -1; // this is looked up in Activate() // initialize dialog SetTitle("", true); // load the new scheme early!! SetScheme("ClientScheme"); SetMoveable(false); SetSizeable(false); // hide the system buttons SetTitleBarVisible( false ); SetProportional(true); // info window about this map m_pMapInfo = new RichText( this, "MapInfo" ); m_pMapInfoHTML = new HTML( this, "MapInfoHTML"); LoadControlSettings("Resource/UI/TeamMenu.res"); InvalidateLayout(); m_szMapName[0] = 0; } //----------------------------------------------------------------------------- // Purpose: Destructor //----------------------------------------------------------------------------- CTeamMenu::~CTeamMenu() { } //----------------------------------------------------------------------------- // Purpose: sets the text color of the map description field //----------------------------------------------------------------------------- void CTeamMenu::ApplySchemeSettings(IScheme *pScheme) { BaseClass::ApplySchemeSettings(pScheme); m_pMapInfo->SetFgColor( pScheme->GetColor("MapDescriptionText", Color(255, 255, 255, 0)) ); if ( *m_szMapName ) { LoadMapPage( m_szMapName ); // reload the map description to pick up the color } } //----------------------------------------------------------------------------- // Purpose: makes the user choose the auto assign option //----------------------------------------------------------------------------- void CTeamMenu::AutoAssign() { engine->ClientCmd("jointeam 0"); } //----------------------------------------------------------------------------- // Purpose: shows the team menu //----------------------------------------------------------------------------- void CTeamMenu::ShowPanel(bool bShow) { if ( BaseClass::IsVisible() == bShow ) return; if ( bShow ) { Activate(); SetMouseInputEnabled( true ); // get key bindings if shown if( m_iJumpKey < 0 ) // you need to lookup the jump key AFTER the engine has loaded { m_iJumpKey = gameuifuncs->GetEngineKeyCodeForBind( "jump" ); } if ( m_iScoreBoardKey < 0 ) { m_iScoreBoardKey = gameuifuncs->GetEngineKeyCodeForBind( "showscores" ); } } else { SetVisible( false ); SetMouseInputEnabled( false ); } m_pViewPort->ShowBackGround( bShow ); } //----------------------------------------------------------------------------- // Purpose: updates the UI with a new map name and map html page, and sets up the team buttons //----------------------------------------------------------------------------- void CTeamMenu::Update() { char mapname[MAX_MAP_NAME]; Q_FileBase( engine->GetLevelName(), mapname, sizeof(mapname) ); SetLabelText( "mapname", mapname ); LoadMapPage( mapname ); } //----------------------------------------------------------------------------- // Purpose: chooses and loads the text page to display that describes mapName map //----------------------------------------------------------------------------- void CTeamMenu::LoadMapPage( const char *mapName ) { // Save off the map name so we can re-load the page in ApplySchemeSettings(). Q_strncpy( m_szMapName, mapName, strlen( mapName ) + 1 ); char mapRES[ MAX_PATH ]; char uilanguage[ 64 ]; engine->GetUILanguage( uilanguage, sizeof( uilanguage ) ); Q_snprintf( mapRES, sizeof( mapRES ), "resource/maphtml/%s_%s.html", mapName, uilanguage ); bool bFoundHTML = false; if ( !vgui::filesystem()->FileExists( mapRES ) ) { // try english Q_snprintf( mapRES, sizeof( mapRES ), "resource/maphtml/%s_english.html", mapName ); } else { bFoundHTML = true; } if( bFoundHTML || vgui::filesystem()->FileExists( mapRES ) ) { // it's a local HTML file char localURL[ _MAX_PATH + 7 ]; Q_strncpy( localURL, "file://", sizeof( localURL ) ); char pPathData[ _MAX_PATH ]; vgui::filesystem()->GetLocalPath( mapRES, pPathData, sizeof(pPathData) ); Q_strncat( localURL, pPathData, sizeof( localURL ), COPY_ALL_CHARACTERS ); // force steam to dump a local copy vgui::filesystem()->GetLocalCopy( pPathData ); m_pMapInfo->SetVisible( false ); m_pMapInfoHTML->SetVisible( true ); m_pMapInfoHTML->OpenURL( localURL ); InvalidateLayout(); Repaint(); return; } else { m_pMapInfo->SetVisible( true ); m_pMapInfoHTML->SetVisible( false ); } Q_snprintf( mapRES, sizeof( mapRES ), "maps/%s.txt", mapName); // if no map specific description exists, load default text if( !vgui::filesystem()->FileExists( mapRES ) ) { if ( vgui::filesystem()->FileExists( "maps/default.txt" ) ) { Q_snprintf ( mapRES, sizeof( mapRES ), "maps/default.txt"); } else { m_pMapInfo->SetText( "" ); return; } } FileHandle_t f = vgui::filesystem()->Open( mapRES, "r" ); // read into a memory block int fileSize = vgui::filesystem()->Size(f); int dataSize = fileSize + sizeof( wchar_t ); if ( dataSize % 2 ) ++dataSize; wchar_t *memBlock = (wchar_t *)malloc(dataSize); memset( memBlock, 0x0, dataSize); int bytesRead = vgui::filesystem()->Read(memBlock, fileSize, f); if ( bytesRead < fileSize ) { // NULL-terminate based on the length read in, since Read() can transform \r\n to \n and // return fewer bytes than we were expecting. char *data = reinterpret_cast<char *>( memBlock ); data[ bytesRead ] = 0; data[ bytesRead+1 ] = 0; } // null-terminate the stream (redundant, since we memset & then trimmed the transformed buffer already) memBlock[dataSize / sizeof(wchar_t) - 1] = 0x0000; // check the first character, make sure this a little-endian unicode file if (memBlock[0] != 0xFEFF) { // its a ascii char file m_pMapInfo->SetText( reinterpret_cast<char *>( memBlock ) ); } else { m_pMapInfo->SetText( memBlock+1 ); } // go back to the top of the text buffer m_pMapInfo->GotoTextStart(); vgui::filesystem()->Close( f ); free(memBlock); InvalidateLayout(); Repaint(); } /* //----------------------------------------------------------------------------- // Purpose: sets the text on and displays the team buttons //----------------------------------------------------------------------------- void CTeamMenu::MakeTeamButtons(void) { int i = 0; for( i = 0; i< m_pTeamButtons.Count(); i++ ) { m_pTeamButtons[i]->SetVisible(false); } i = 0; while( true ) { const char *teamname = GameResources()->GetTeamName( i ); if ( !teamname || !teamname[0] ) return; // no more teams char buttonText[32]; Q_snprintf( buttonText, sizeof(buttonText), "&%i %s", i +1, teamname ); m_pTeamButtons[i]->SetText( buttonText ); m_pTeamButtons[i]->SetCommand( new KeyValues("TeamButton", "team", i ) ); IScheme *pScheme = scheme()->GetIScheme( GetScheme() ); m_pTeamButtons[i]->SetArmedColor(pScheme->GetColor(GetStringTeamColor(i), Color(255, 255, 255, 255)) , pScheme->GetColor("SelectionBG", Color(255, 255, 255, 0)) ); m_pTeamButtons[i]->SetDepressedColor( pScheme->GetColor(GetStringTeamColor(i), Color(255, 255, 255, 255)), pScheme->GetColor("ButtonArmedBgColor", Color(255, 255, 255, 0)) ); m_pTeamButtons[i]->SetDefaultColor( pScheme->GetColor(GetStringTeamColor(i), Color(255, 255, 255, 255)), pScheme->GetColor("ButtonDepressedBgColor", Color(255, 255, 255, 0)) ); m_pTeamButtons[i]->SetVisible(true); i++; } } //----------------------------------------------------------------------------- // Purpose: When a team button is pressed it triggers this function to cause the player to join a team //----------------------------------------------------------------------------- void CTeamMenu::OnTeamButton( int team ) { char cmd[64]; if( team >= m_iNumTeams ) // its a special button { if( team == m_iNumTeams ) // first extra team is auto assign { Q_snprintf( cmd, sizeof( cmd ), "jointeam 5" ); } else // next is spectate { // DuckMessage( "#Spec_Duck" ); gViewPortInterface->ShowBackGround( false ); } } else { Q_snprintf( cmd, sizeof( cmd ), "jointeam %i", team + 1 ); //g_iTeamNumber = team + 1; } engine->ClientCmd(cmd); SetVisible( false ); OnClose(); } */ //----------------------------------------------------------------------------- // Purpose: Sets the text of a control by name //----------------------------------------------------------------------------- void CTeamMenu::SetLabelText(const char *textEntryName, const char *text) { Label *entry = dynamic_cast<Label *>(FindChildByName(textEntryName)); if (entry) { entry->SetText(text); } } void CTeamMenu::OnKeyCodePressed(KeyCode code) { int lastPressedEngineKey = engine->GetLastPressedEngineKey(); if( m_iJumpKey >= 0 && m_iJumpKey == lastPressedEngineKey ) { AutoAssign(); } else if ( m_iScoreBoardKey >= 0 && m_iScoreBoardKey == lastPressedEngineKey ) { gViewPortInterface->ShowPanel( PANEL_SCOREBOARD, true ); } else { BaseClass::OnKeyCodePressed( code ); } }
# | 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. |