Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

448 lines
12 KiB

5 years ago
//========= 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 );