summaryrefslogtreecommitdiff
path: root/game/client/tf/tf_hud_menu_taunt_selection.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/tf_hud_menu_taunt_selection.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf/tf_hud_menu_taunt_selection.cpp')
-rw-r--r--game/client/tf/tf_hud_menu_taunt_selection.cpp465
1 files changed, 465 insertions, 0 deletions
diff --git a/game/client/tf/tf_hud_menu_taunt_selection.cpp b/game/client/tf/tf_hud_menu_taunt_selection.cpp
new file mode 100644
index 0000000..cc17e2d
--- /dev/null
+++ b/game/client/tf/tf_hud_menu_taunt_selection.cpp
@@ -0,0 +1,465 @@
+//========= 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 );