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.
 
 
 
 
 
 

465 lines
11 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================
#include "cbase.h"
#include "hud.h"
#include "hudelement.h"
#include "c_tf_player.h"
#include "iclientmode.h"
#include "ienginevgui.h"
#include <vgui/ILocalize.h>
#include <vgui/ISurface.h>
#include <vgui/IVGui.h>
#include "c_baseobject.h"
#include "IGameUIFuncs.h" // for key bindings
#include "inputsystem/iinputsystem.h"
#ifdef SIXENSE
#include "sixense/in_sixense.h"
#endif
#include "tf_hud_menu_taunt_selection.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
using namespace vgui;
//======================================
DECLARE_HUDELEMENT( CHudMenuTauntSelection );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CHudMenuTauntSelection::CHudMenuTauntSelection( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudMenuTauntSelection" )
{
Panel *pParent = g_pClientMode->GetViewport();
SetParent( pParent );
SetHiddenBits( HIDEHUD_MISCSTATUS );
for ( int i=0; i<NUM_TAUNT_SLOTS; ++i )
{
char pszKeyItemModelPanelName[128];
V_sprintf_safe( pszKeyItemModelPanelName, "TauntModelPanel%d", i+1 );
m_pItemModelPanels[i] = new CItemModelPanel( this, pszKeyItemModelPanelName );
/* char pszKeyIconName[64];
V_sprintf_safe( pszKeyIconName, "NumberBg%d", i+1 );
m_pKeyIcons[i] = new CIconPanel( this, pszKeyIconName );
char pszNumberLabel[64];
V_sprintf_safe( pszNumberLabel, "NumberLabel%d", i+1 );
m_pKeyLabels[i] = new CExLabel( this, pszNumberLabel, CFmtStr( "%d", i+1 ) ); */
}
ListenForGameEvent( "gameui_hidden" );
m_iSelectedItem = -1;
InvalidateLayout( false, true );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudMenuTauntSelection::ApplySchemeSettings( IScheme *pScheme )
{
// load control settings...
if ( ::input->IsSteamControllerActive() )
{
LoadControlSettings( "resource/UI/HudMenuTauntSelection_SC.res" );
m_iSelectedItem = 1;
}
else
{
LoadControlSettings( "resource/UI/HudMenuTauntSelection.res" );
}
BaseClass::ApplySchemeSettings( pScheme );
UpdateItemModelPanels();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CHudMenuTauntSelection::ShouldDraw( void )
{
if ( !CHudElement::ShouldDraw() )
return false;
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer || !pPlayer->IsAlive() )
return false;
if ( pPlayer->m_Shared.InCond( TF_COND_TAUNTING ) )
return false;
if ( pPlayer->m_Shared.InCond( TF_COND_COMPETITIVE_LOSER ) )
return false;
if ( pPlayer->m_Shared.InCond( TF_COND_HALLOWEEN_KART ) )
return false;
return pPlayer->ShouldShowHudMenuTauntSelection();
}
//-----------------------------------------------------------------------------
// Purpose: Keyboard input hook. Return 0 if handled
//-----------------------------------------------------------------------------
int CHudMenuTauntSelection::HudElementKeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding )
{
if ( !ShouldDraw() )
{
return 1;
}
if ( !down )
{
return 1;
}
static struct TauntInput_t
{
const char *m_pszCommand;
int m_iReturnValue;
bool m_bDoWeaponTaunt;
} s_tauntInput[] =
{
{ "lastinv", 0, false },
{ "invnext", 1, false },
{ "invprev", 1, false },
{ "+attack", 1, false },
{ "+taunt", 0, true },
{ "weapon_taunt", 0, true },
};
// Handles specific key
for ( int i=0; i<ARRAYSIZE( s_tauntInput ); ++i )
{
if ( keynum == gameuifuncs->GetButtonCodeForBind( s_tauntInput[i].m_pszCommand ) )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( s_tauntInput[i].m_bDoWeaponTaunt )
{
SelectTaunt( 0 );
}
else if ( pPlayer )
{
pPlayer->SetShowHudMenuTauntSelection( false );
}
return s_tauntInput[i].m_iReturnValue;
}
}
bool bController = ( IsConsole() || ( keynum >= JOYSTICK_FIRST ) );
if ( bController )
{
int iNewSelection = m_iSelectedItem;
switch( keynum )
{
case KEY_XBUTTON_UP:
// jump to last
iNewSelection = NUM_TAUNT_SLOTS;
break;
case KEY_XBUTTON_DOWN:
// jump to first
iNewSelection = 1;
break;
case KEY_XBUTTON_RIGHT:
case STEAMCONTROLLER_DPAD_RIGHT:
// move selection to the right
iNewSelection++;
if ( iNewSelection > NUM_TAUNT_SLOTS )
iNewSelection = 1;
break;
case KEY_XBUTTON_LEFT:
case STEAMCONTROLLER_DPAD_LEFT:
// move selection to the right
iNewSelection--;
if ( iNewSelection < 1 )
iNewSelection = NUM_TAUNT_SLOTS;
break;
case KEY_XBUTTON_RTRIGGER:
case KEY_XBUTTON_A:
case STEAMCONTROLLER_A:
{
SelectTaunt( m_iSelectedItem );
}
return 0;
case STEAMCONTROLLER_B:
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( pPlayer )
{
pPlayer->SetShowHudMenuTauntSelection( false );
}
}
return 0;
case STEAMCONTROLLER_X:
SelectTaunt( 0 ); // Weapon X
return 0;
default:
return 1; // key not handled
}
SetSelectedItem( iNewSelection );
return 0;
}
else
{
int iSlot = -1;
#ifdef SIXENSE
if ( !g_pSixenseInput->IsEnabled() )
#endif
{
// convert slot1, slot2 etc to 1,2,3,4
if ( pszCurrentBinding && !Q_strncmp( pszCurrentBinding, "slot", 4 ) && Q_strlen(pszCurrentBinding) > 4 )
{
const char *pszNum = pszCurrentBinding+4;
iSlot = atoi(pszNum);
// allow slot1 - slot4
if ( iSlot < 1 || iSlot > NUM_TAUNT_SLOTS )
return 1;
}
}
if ( iSlot == -1 )
{
switch( keynum )
{
case KEY_1:
case KEY_2:
case KEY_3:
case KEY_4:
case KEY_5:
case KEY_6:
case KEY_7:
case KEY_8:
{
iSlot = keynum - KEY_1 + 1;
}
break;
default:
return 1; // key not handled
}
}
if ( iSlot >= 0 )
{
SelectTaunt( iSlot );
return 0;
}
}
return 1; // key not handled
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudMenuTauntSelection::FindTauntKeyBinding( void )
{
const char *key = engine->Key_LookupBinding( "taunt" );
if ( !key )
{
key = "< not bound >";
}
SetDialogVariable( "taunt", key );
key = engine->Key_LookupBinding( "lastinv" );
if ( !key )
{
key = "< not bound >";
}
SetDialogVariable( "lastinv", key );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
extern const char *g_szItemBorders[][5];
void CHudMenuTauntSelection::UpdateItemModelPanels()
{
C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
bool bSteamController = ::input->IsSteamControllerActive();
int iClass = pPlayer->GetPlayerClass()->GetClassIndex();
vgui::IScheme *pScheme = vgui::scheme()->GetIScheme( GetScheme() );
for ( int i=0; i<ARRAYSIZE( m_pItemModelPanels ); ++i )
{
int iTauntSlot = LOADOUT_POSITION_TAUNT + i;
CItemModelPanel *pItemModelPanel = m_pItemModelPanels[i];
CEconItemView *pOwnedItemInSlot = pPlayer->Inventory()->GetCacheServerItemInLoadout( iClass, iTauntSlot );
pItemModelPanel->SetItem( pOwnedItemInSlot );
pItemModelPanel->SetNoItemText( "#Hud_Menu_Taunt_NoItem" );
int iRarity = 0;
if ( pOwnedItemInSlot && pOwnedItemInSlot->IsValid() )
iRarity = pOwnedItemInSlot->GetItemQuality();
const char *pszBorder = g_szItemBorders[iRarity][0];
IBorder *pBorder = pScheme->GetBorder( pszBorder );
pItemModelPanel->SetBorder( !bSteamController || i == (m_iSelectedItem - 1) ? pBorder : nullptr );
pItemModelPanel->UpdatePanels();
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudMenuTauntSelection::SelectTaunt( int iTaunt )
{
CTFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( pPlayer )
{
if ( !pPlayer->IsAllowedToTaunt() )
{
pPlayer->EmitSound( "Player.DenyWeaponSelection" );
return;
}
char pszTaunt[32];
V_sprintf_safe( pszTaunt, "taunt %d", iTaunt );
engine->ClientCmd( pszTaunt );
pPlayer->SetShowHudMenuTauntSelection( false );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudMenuTauntSelection::SetSelectedItem( int iSlot )
{
if ( m_iSelectedItem != iSlot )
{
m_iSelectedItem = iSlot;
UpdateItemModelPanels();
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudMenuTauntSelection::FireGameEvent( IGameEvent *event )
{
const char * type = event->GetName();
if ( Q_strcmp(type, "gameui_hidden") == 0 )
{
FindTauntKeyBinding();
}
else
{
CHudElement::FireGameEvent( event );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudMenuTauntSelection::SetVisible( bool state )
{
if ( state == true )
{
// close the weapon selection menu
engine->ClientCmd( "cancelselect" );
FindTauntKeyBinding();
HideLowerPriorityHudElementsInGroup( "mid" );
InvalidateLayout( true, true );
}
else
{
UnhideLowerPriorityHudElementsInGroup( "mid" );
}
BaseClass::SetVisible( state );
}
static void OpenTauntSelectionUI()
{
C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer )
return;
if ( !pPlayer->IsAllowedToTaunt() )
return;
if ( pPlayer->ShouldShowHudMenuTauntSelection() )
return;
CTFWeaponBase *pWpn = pPlayer->GetActiveTFWeapon();
if ( !pWpn )
return;
if ( pWpn->GetWeaponID() == TF_WEAPON_PDA_SPY )
{
engine->ClientCmd( "taunt" );
return;
}
int iClass = pPlayer->GetPlayerClass()->GetClassIndex();
bool bHasAnyTauntEquipped = false;
CTFPlayerInventory *pInv = pPlayer->Inventory();
if ( pInv )
{
for ( int iTauntSlot = LOADOUT_POSITION_TAUNT; iTauntSlot <= LOADOUT_POSITION_TAUNT8; ++iTauntSlot )
{
CEconItemView *pItem = pInv->GetCacheServerItemInLoadout( iClass, iTauntSlot );
if ( pItem && pItem->IsValid() )
{
bHasAnyTauntEquipped = true;
break;
}
}
}
if ( !bHasAnyTauntEquipped )
{
engine->ClientCmd( "taunt" );
return;
}
pPlayer->SetShowHudMenuTauntSelection( true );
}
static ConCommand in_taunt_keydown( "+taunt", OpenTauntSelectionUI );