diff options
Diffstat (limited to 'game/client/tf/vgui/tf_giveawayitempanel.cpp')
| -rw-r--r-- | game/client/tf/vgui/tf_giveawayitempanel.cpp | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/game/client/tf/vgui/tf_giveawayitempanel.cpp b/game/client/tf/vgui/tf_giveawayitempanel.cpp new file mode 100644 index 0000000..e85bd06 --- /dev/null +++ b/game/client/tf/vgui/tf_giveawayitempanel.cpp @@ -0,0 +1,447 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "vgui/IInput.h" +#include <vgui/IVGui.h> +#include <vgui/IScheme.h> +#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<char *>( 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<CTFGiveawayItemPanel> 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<CEconEntity *>( 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 <weapon name>\n <weapon id>: 0 = primary, 1 = secondary, 2 = melee.", FCVAR_CHEAT ); |