//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include "cbase.h" #include "vgui/IInput.h" #include #include #include "tf_giveawayitempanel.h" #include "iclientmode.h" #include "baseviewport.h" #include "econ_entity.h" #include "c_tf_player.h" #include "gamestringpool.h" #include "vgui_controls/TextImage.h" #include "vgui_controls/Label.h" #include "vgui_controls/Button.h" #include "econ_item_system.h" #include "ienginevgui.h" #include "achievementmgr.h" #include "fmtstr.h" #include "c_tf_playerresource.h" #include "tf_gamerules.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CGiveawayPlayerPanel::CGiveawayPlayerPanel( vgui::Panel *parent, const char *name ) : BaseClass(parent,name) { m_pNameLabel = new vgui::Label( this, "name_label", "" ); m_pScoreLabel = new vgui::Label( this, "score_label", "" ); REGISTER_COLOR_AS_OVERRIDABLE( m_PlayerColorLocal, "fgcolor_local" ); REGISTER_COLOR_AS_OVERRIDABLE( m_PlayerColorOther, "fgcolor_other" ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CGiveawayPlayerPanel::PerformLayout( void ) { BaseClass::PerformLayout(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CGiveawayPlayerPanel::SetPlayer( CTFPlayer *pPlayer ) { m_iBonus = 0; if ( pPlayer ) { SetVisible( true ); if ( g_TF_PR ) { int playerIndex = pPlayer->entindex(); const char *pszName = g_TF_PR->GetPlayerName( playerIndex ); m_iBonus = pPlayer->m_Shared.GetItemFindBonus(); SetDialogVariable( "playername", pszName ); SetDialogVariable( "playerscore", m_iBonus ); } m_iPlayerIndex = pPlayer->entindex(); if ( pPlayer->IsLocalPlayer() ) { m_pNameLabel->SetFgColor( m_PlayerColorLocal ); m_pScoreLabel->SetFgColor( m_PlayerColorLocal ); } else { m_pNameLabel->SetFgColor( m_PlayerColorOther ); m_pScoreLabel->SetFgColor( m_PlayerColorOther ); } } else { SetVisible( false ); m_iPlayerIndex = 0; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CGiveawayPlayerPanel::SpinBonus( void ) { SetDialogVariable( "playerscore", RandomInt( PLAYER_ROLL_MIN, PLAYER_ROLL_MAX ) ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CGiveawayPlayerPanel::LockBonus( int iRoll ) { m_iRoll = iRoll; SetDialogVariable( "playerscore", m_iBonus + m_iRoll ); } //=========================================================================================================================== //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CTFGiveawayItemPanel::CTFGiveawayItemPanel( IViewPort *pViewPort ) : Frame( NULL, PANEL_GIVEAWAY_ITEM ) { m_pViewPort = pViewPort; // load the new scheme early!! SetScheme( "ClientScheme" ); SetTitleBarVisible( false ); SetMinimizeButtonVisible( false ); SetMaximizeButtonVisible( false ); SetCloseButtonVisible( false ); SetSizeable( false ); SetMoveable( false ); SetProportional( true ); SetVisible( false ); SetKeyBoardInputEnabled( true ); SetMouseInputEnabled( true ); m_pModelPanel = new CItemModelPanel( this, "item_panel" ); m_pPlayerListPanelKVs = NULL; m_iNumActivePlayers = 0; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CTFGiveawayItemPanel::~CTFGiveawayItemPanel( void ) { if ( m_pPlayerListPanelKVs ) { m_pPlayerListPanelKVs->deleteThis(); m_pPlayerListPanelKVs = NULL; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) { BaseClass::ApplySchemeSettings( pScheme ); LoadControlSettings( "Resource/UI/GiveawayItemPanel.res" ); for ( int i = 0; i < m_aPlayerList.Count(); i++ ) { m_aPlayerList[i]->ApplySettings( m_pPlayerListPanelKVs ); m_aPlayerList[i]->SetBorder( pScheme->GetBorder("EconItemBorder") ); m_aPlayerList[i]->InvalidateLayout(); } m_pModelPanel->SetNoItemText( "#Item_Giveaway_NoItem" ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::ApplySettings( KeyValues *inResourceData ) { BaseClass::ApplySettings( inResourceData ); KeyValues *pItemKV = inResourceData->FindKey( "playerlist_panel_kvs" ); if ( pItemKV ) { if ( m_pPlayerListPanelKVs ) { m_pPlayerListPanelKVs->deleteThis(); } m_pPlayerListPanelKVs = new KeyValues("playerlist_panel_kvs"); pItemKV->CopySubkeys( m_pPlayerListPanelKVs ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::PerformLayout( void ) { BaseClass::PerformLayout(); int iPosition = 0; for ( int i = 0; i < m_aPlayerList.Count(); i++ ) { if ( !m_aPlayerList[i]->IsVisible() ) continue; int iCenter = GetWide() * 0.5; int iXPos = iCenter; int iYPos = 0; if ( iPosition < (m_iNumActivePlayers * 0.5) ) { iXPos -= m_aPlayerList[i]->GetWide() + m_iPlayerXOffset; iYPos = m_iPlayerYPos + iPosition * m_aPlayerList[i]->GetTall(); } else { iXPos += m_iPlayerXOffset; iYPos = m_iPlayerYPos + (iPosition - ceil(m_iNumActivePlayers * 0.5)) * m_aPlayerList[i]->GetTall(); } m_aPlayerList[i]->SetPos( iXPos, iYPos ); iPosition++; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::ShowPanel(bool bShow) { if ( bShow ) { SetItem( NULL ); m_bBuiltPlayerList = false; m_flNextRollStart = 0; m_iRollingForPlayer = 0; m_iNumActivePlayers = 0; } SetMouseInputEnabled( bShow ); SetVisible( bShow ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::FireGameEvent( IGameEvent *event ) { const char * type = event->GetName(); if ( Q_strcmp(type, "gameui_hidden") == 0 ) { ShowPanel( false ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::OnCommand( const char *command ) { if ( !Q_stricmp( command, "vguicancel" ) ) { ShowPanel( false ); // If we're connected to a game server, we also close the game UI. if ( engine->IsInGame() ) { engine->ClientCmd_Unrestricted( "gameui_hide" ); } } else { engine->ClientCmd( const_cast( command ) ); } BaseClass::OnCommand( command ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::Update( void ) { // First, wait for the player list to get built if ( !m_bBuiltPlayerList ) { BuildPlayerList(); if ( !m_bBuiltPlayerList ) return; } // Then wait for the server to send us the item details if ( !m_pModelPanel->HasItem() ) { if ( TFGameRules() ) { CBonusRoundLogic *pLogic = TFGameRules()->GetBonusLogic(); if ( pLogic ) { m_pModelPanel->SetItem( pLogic->GetBonusItem() ); } } if ( !m_pModelPanel->HasItem() ) return; } // Then start rolling through the players and locking in their bonuses if ( m_iRollingForPlayer < m_iNumActivePlayers ) { // Spin all the numbers & lock them in one by one for ( int i = 0; i < m_aPlayerList.Count(); i++ ) { if ( m_iRollingForPlayer < i ) { // Haven't got to this player yet, so spin their bonus. m_aPlayerList[i]->SpinBonus(); continue; } if ( i == m_iRollingForPlayer ) { if ( gpGlobals->curtime > m_flNextRollStart ) { // Lock in this player's bonus and move on to the next one CBonusRoundLogic *pLogic = TFGameRules()->GetBonusLogic(); if ( pLogic ) { m_aPlayerList[i]->LockBonus( pLogic->GetPlayerBonusRoll( m_aPlayerList[i]->GetPlayerIndex() ) ); } m_iRollingForPlayer++; m_flNextRollStart = gpGlobals->curtime + 0.4; } else { m_aPlayerList[i]->SpinBonus(); } } } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::BuildPlayerList( void ) { CBonusRoundLogic *pLogic = TFGameRules()->GetBonusLogic(); if ( !pLogic ) return; m_bBuiltPlayerList = true; pLogic->BuildBonusPlayerList(); for ( int i = 0; i < m_aPlayerList.Count(); i++ ) { m_aPlayerList[i]->SetPlayer(NULL); } m_iNumActivePlayers = 0; for( int playerIndex = 0; playerIndex < pLogic->GetNumBonusPlayers(); playerIndex++ ) { C_TFPlayer *pPlayer = pLogic->GetBonusPlayer(playerIndex); if ( !pPlayer ) continue; CGiveawayPlayerPanel *pPlayerPanel; if ( m_iNumActivePlayers < m_aPlayerList.Count() ) { pPlayerPanel = m_aPlayerList[m_iNumActivePlayers]; } else { const char *pszCommand = VarArgs("playerpanel%d",m_iNumActivePlayers); pPlayerPanel = new CGiveawayPlayerPanel( this, pszCommand ); if ( m_pPlayerListPanelKVs ) { pPlayerPanel->ApplySettings( m_pPlayerListPanelKVs ); } pPlayerPanel->MakeReadyForUse(); vgui::IScheme *pScheme = vgui::scheme()->GetIScheme( GetScheme() ); pPlayerPanel->SetBorder( pScheme->GetBorder("EconItemBorder") ); m_aPlayerList.AddToTail( pPlayerPanel ); } pPlayerPanel->SetPlayer( pPlayer ); m_iNumActivePlayers++; } // Start the animation m_flNextRollStart = gpGlobals->curtime + 1.0; m_iRollingForPlayer = 0; InvalidateLayout(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTFGiveawayItemPanel::SetItem( CEconItemView *pItem ) { m_pModelPanel->SetItem( pItem ); } static vgui::DHANDLE g_GiveawayItemPanel; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CTFGiveawayItemPanel *OpenGiveawayItemPanel( CEconItemView *pItem ) { CTFGiveawayItemPanel *pPanel = (CTFGiveawayItemPanel*)gViewPortInterface->FindPanelByName( PANEL_GIVEAWAY_ITEM ); if ( pPanel ) { pPanel->InvalidateLayout( false, true ); pPanel->SetItem( pItem ); gViewPortInterface->ShowPanel( pPanel, true ); } return pPanel; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void Test_GiveawayItemPanel( const CCommand &args ) { C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); if ( !pLocalPlayer ) return; CEconItemView *pScriptCreatedItem = NULL; bool bAllItems = (args.ArgC() <= 1); for ( int i = bAllItems ? 0 : clamp( atoi(args[1]), 0, 2 ); i <= 2; i++ ) { CEconEntity *pItem = dynamic_cast( pLocalPlayer->Weapon_GetWeaponByType( i ) ); if ( !pItem ) continue; pScriptCreatedItem = pItem->GetAttributeContainer()->GetItem(); break; } if ( pScriptCreatedItem ) { OpenGiveawayItemPanel( pScriptCreatedItem ); } } ConCommand test_giveawayitem( "test_giveawayitem", Test_GiveawayItemPanel, "Debugging tool to test the item giveaway panel. Usage: test_giveawayitem \n : 0 = primary, 1 = secondary, 2 = melee.", FCVAR_CHEAT );