Diff
checker
Texte
Texte
Images
Documents
Excel
Dossiers
Legal
Enterprise
Application de bureau
Prix
Se connecter
Télécharger Diffchecker Desktop
Comparer le texte
Trouver la différence entre deux fichiers texte
Outils
Historique
Éditeur live
Cacher identiques
Sans retour à la ligne
Vue
Divisé
Unifié
Niveau de précision
Intelligent
Mot
Caractère
Coloration syntaxique
Choisir la syntaxe
Ignorer
Transformer le texte
Aller au premier écart
Modifier l'entrée
Diffchecker Desktop
La façon la plus sécurisée d'utiliser Diffchecker. Obtenez l'application Diffchecker Desktop : vos diffs ne quittent jamais votre ordinateur !
Obtenir Desktop
Untitled diff
Créé
il y a 11 ans
Le diff n'expire jamais
Effacer
Exporter
Partager
Expliquer
11 suppressions
Lignes
Total
Supprimé
Caractères
Total
Supprimé
Pour continuer à utiliser cette fonctionnalité, passez à
Diff
checker
Pro
Voir les prix
615 lignes
Copier tout
33 ajouts
Lignes
Total
Ajouté
Caractères
Total
Ajouté
Pour continuer à utiliser cette fonctionnalité, passez à
Diff
checker
Pro
Voir les prix
635 lignes
Copier tout
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
//
// Purpose: Weapon selection handling
// Purpose: Weapon selection handling
//
//
// $NoKeywords: $
// $NoKeywords: $
//=============================================================================//
//=============================================================================//
#include "cbase.h"
#include "cbase.h"
#include "weapon_selection.h"
#include "weapon_selection.h"
#include "hud_macros.h"
#include "hud_macros.h"
#include "history_resource.h"
#include "history_resource.h"
#include "menu.h"
#include "menu.h"
#include "in_buttons.h"
#include "in_buttons.h"
#include <KeyValues.h>
#include <KeyValues.h>
#include "filesystem.h"
#include "filesystem.h"
#include "iinput.h"
#include "iinput.h"
// memdbgon must be the last include file in a .cpp file!!!
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#include "tier0/memdbgon.h"
#define HISTORY_DRAW_TIME "5"
#define HISTORY_DRAW_TIME "5"
ConVar hud_drawhistory_time( "hud_drawhistory_time", HISTORY_DRAW_TIME, 0 );
ConVar hud_drawhistory_time( "hud_drawhistory_time", HISTORY_DRAW_TIME, 0 );
ConVar hud_fastswitch( "hud_fastswitch", "0", FCVAR_ARCHIVE | FCVAR_ARCHIVE_XBOX );
ConVar hud_fastswitch( "hud_fastswitch", "0", FCVAR_ARCHIVE | FCVAR_ARCHIVE_XBOX );
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Weapon Selection commands
// Purpose: Weapon Selection commands
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot1, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot1, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot2, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot2, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot3, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot3, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot4, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot4, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot5, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot5, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot6, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot6, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot7, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot7, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot8, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot8, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot9, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot9, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot0, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot0, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot10, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot10, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Close, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Close, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, NextWeapon, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, NextWeapon, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, PrevWeapon, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, PrevWeapon, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, LastWeapon, "CHudWeaponSelection");
DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, LastWeapon, "CHudWeaponSelection");
HOOK_COMMAND( slot1, Slot1 );
HOOK_COMMAND( slot1, Slot1 );
HOOK_COMMAND( slot2, Slot2 );
HOOK_COMMAND( slot2, Slot2 );
HOOK_COMMAND( slot3, Slot3 );
HOOK_COMMAND( slot3, Slot3 );
HOOK_COMMAND( slot4, Slot4 );
HOOK_COMMAND( slot4, Slot4 );
HOOK_COMMAND( slot5, Slot5 );
HOOK_COMMAND( slot5, Slot5 );
HOOK_COMMAND( slot6, Slot6 );
HOOK_COMMAND( slot6, Slot6 );
HOOK_COMMAND( slot7, Slot7 );
HOOK_COMMAND( slot7, Slot7 );
HOOK_COMMAND( slot8, Slot8 );
HOOK_COMMAND( slot8, Slot8 );
HOOK_COMMAND( slot9, Slot9 );
HOOK_COMMAND( slot9, Slot9 );
HOOK_COMMAND( slot0, Slot0 );
HOOK_COMMAND( slot0, Slot0 );
HOOK_COMMAND( slot10, Slot10 );
HOOK_COMMAND( slot10, Slot10 );
HOOK_COMMAND( cancelselect, Close );
HOOK_COMMAND( cancelselect, Close );
HOOK_COMMAND( invnext, NextWeapon );
HOOK_COMMAND( invnext, NextWeapon );
HOOK_COMMAND( invprev, PrevWeapon );
HOOK_COMMAND( invprev, PrevWeapon );
HOOK_COMMAND( lastinv, LastWeapon );
HOOK_COMMAND( lastinv, LastWeapon );
// instance info
// instance info
Copier
Copié
Copier
Copié
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
= NULL
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
[MAX_SPLITSCREEN_PLAYERS]
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
{
{
Copier
Copié
Copier
Copié
return s_pInstance
;
return s_pInstance
[GET_ACTIVE_SPLITSCREEN_SLOT()]
;
}
}
CBaseHudWeaponSelection *GetHudWeaponSelection()
CBaseHudWeaponSelection *GetHudWeaponSelection()
{
{
return CBaseHudWeaponSelection::GetInstance();
return CBaseHudWeaponSelection::GetInstance();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Constructor
// Purpose: Constructor
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
CBaseHudWeaponSelection::CBaseHudWeaponSelection( const char *pElementName ) : CHudElement( pElementName )
CBaseHudWeaponSelection::CBaseHudWeaponSelection( const char *pElementName ) : CHudElement( pElementName )
{
{
Copier
Copié
Copier
Copié
s_pInstance
= this;
s_pInstance
[GET_ACTIVE_SPLITSCREEN_SLOT()]
= this;
Copier
Copié
Copier
Copié
SetHiddenBits( HIDEHUD_WEAPONSELECTION | HIDEHUD_NEEDSUIT | HIDEHUD_PLAYERDEAD | HIDEHUD_INVEHICLE );
SetHiddenBits( HIDEHUD_WEAPONSELECTION | HIDEHUD_NEEDSUIT | HIDEHUD_PLAYERDEAD | HIDEHUD_INVEHICLE );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::Init(void)
void CBaseHudWeaponSelection::Init(void)
{
{
Reset();
Reset();
// Initialise the weapons resource
// Initialise the weapons resource
gWR.Init();
gWR.Init();
m_flSelectionTime = gpGlobals->curtime;
m_flSelectionTime = gpGlobals->curtime;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::Reset(void)
void CBaseHudWeaponSelection::Reset(void)
{
{
gWR.Reset();
gWR.Reset();
// Start hidden
// Start hidden
m_bSelectionVisible = false;
m_bSelectionVisible = false;
m_flSelectionTime = gpGlobals->curtime;
m_flSelectionTime = gpGlobals->curtime;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::UpdateSelectionTime( void )
void CBaseHudWeaponSelection::UpdateSelectionTime( void )
{
{
m_flSelectionTime = gpGlobals->curtime;
m_flSelectionTime = gpGlobals->curtime;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::VidInit(void)
void CBaseHudWeaponSelection::VidInit(void)
{
{
// If we've already loaded weapons, let's get new sprites
// If we've already loaded weapons, let's get new sprites
gWR.LoadAllWeaponSprites();
gWR.LoadAllWeaponSprites();
// set spacing of pickup history
// set spacing of pickup history
CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource );
CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource );
if( pHudHR )
if( pHudHR )
{
{
pHudHR->SetHistoryGap( 21 );
pHudHR->SetHistoryGap( 21 );
}
}
Reset();
Reset();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::OnThink( void )
void CBaseHudWeaponSelection::OnThink( void )
{
{
// Don't allow weapon selection if we're frozen in place
// Don't allow weapon selection if we're frozen in place
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() )
if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() )
{
{
if ( IsInSelectionMode() )
if ( IsInSelectionMode() )
{
{
CancelWeaponSelection();
CancelWeaponSelection();
}
}
}
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Think used for selection of weapon menu item.
// Purpose: Think used for selection of weapon menu item.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::ProcessInput()
void CBaseHudWeaponSelection::ProcessInput()
{
{
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
if ( !pPlayer )
if ( !pPlayer )
return;
return;
// Check to see if the player is in VGUI mode...
// Check to see if the player is in VGUI mode...
if ( pPlayer->IsInVGuiInputMode() && !pPlayer->IsInViewModelVGuiInputMode() )
if ( pPlayer->IsInVGuiInputMode() && !pPlayer->IsInViewModelVGuiInputMode() )
{
{
// If so, close weapon selection when they press fire
// If so, close weapon selection when they press fire
Copier
Copié
Copier
Copié
if (
gHUD
.m_iKeyBits & IN_ATTACK )
if (
GetHud()
.m_iKeyBits & IN_ATTACK )
{
{
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
{
{
// Swallow the button
// Swallow the button
Copier
Copié
Copier
Copié
gHUD
.m_iKeyBits &= ~IN_ATTACK;
GetHud()
.m_iKeyBits &= ~IN_ATTACK;
input->ClearInputButton( IN_ATTACK );
input->ClearInputButton( IN_ATTACK );
}
}
engine->ClientCmd( "cancelselect\n" );
engine->ClientCmd( "cancelselect\n" );
}
}
return;
return;
}
}
// Has the player selected a weapon?
// Has the player selected a weapon?
Copier
Copié
Copier
Copié
if (
gHUD
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
if (
GetHud()
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
{
{
if ( IsWeaponSelectable() )
if ( IsWeaponSelectable() )
{
{
Copier
Copié
Copier
Copié
#ifndef TF_CLIENT_DLL
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
Copier
Copié
Copier
Copié
#endif
{
{
// Swallow the button
// Swallow the button
Copier
Copié
Copier
Copié
gHUD
.m_iKeyBits &= ~(IN_ATTACK | IN_ATTACK2);
GetHud()
.m_iKeyBits &= ~(IN_ATTACK | IN_ATTACK2);
input->ClearInputButton( IN_ATTACK );
input->ClearInputButton( IN_ATTACK );
input->ClearInputButton( IN_ATTACK2 );
input->ClearInputButton( IN_ATTACK2 );
}
}
// select weapon
// select weapon
SelectWeapon();
SelectWeapon();
}
}
}
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool CBaseHudWeaponSelection::IsInSelectionMode()
bool CBaseHudWeaponSelection::IsInSelectionMode()
{
{
return m_bSelectionVisible;
return m_bSelectionVisible;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::OpenSelection( void )
void CBaseHudWeaponSelection::OpenSelection( void )
{
{
m_bSelectionVisible = true;
m_bSelectionVisible = true;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::HideSelection( void )
void CBaseHudWeaponSelection::HideSelection( void )
{
{
m_bSelectionVisible = false;
m_bSelectionVisible = false;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Returns whether a weapon can be selected in the HUD, based on hud type
// Purpose: Returns whether a weapon can be selected in the HUD, based on hud type
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool CBaseHudWeaponSelection::CanBeSelectedInHUD( C_BaseCombatWeapon *pWeapon )
bool CBaseHudWeaponSelection::CanBeSelectedInHUD( C_BaseCombatWeapon *pWeapon )
{
{
// Xbox: In plus type, weapons without ammo can still be selected in the HUD
// Xbox: In plus type, weapons without ammo can still be selected in the HUD
if( HUDTYPE_PLUS == hud_fastswitch.GetInt() )
if( HUDTYPE_PLUS == hud_fastswitch.GetInt() )
{
{
return pWeapon->VisibleInWeaponSelection();
return pWeapon->VisibleInWeaponSelection();
}
}
if ( !pWeapon->VisibleInWeaponSelection() )
if ( !pWeapon->VisibleInWeaponSelection() )
{
{
return false;
return false;
}
}
// All other current hud types
// All other current hud types
return pWeapon->CanBeSelected();
return pWeapon->CanBeSelected();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: handles keyboard input
// Purpose: handles keyboard input
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
int CBaseHudWeaponSelection::KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding )
int CBaseHudWeaponSelection::KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding )
{
{
if (IsInSelectionMode() && pszCurrentBinding && !stricmp(pszCurrentBinding, "cancelselect"))
if (IsInSelectionMode() && pszCurrentBinding && !stricmp(pszCurrentBinding, "cancelselect"))
{
{
HideSelection();
HideSelection();
// returning 0 indicates, we've handled it, no more action needs to be taken
// returning 0 indicates, we've handled it, no more action needs to be taken
return 0;
return 0;
}
}
Copier
Copié
Copier
Copié
if ( down >= 1 && keynum >= KEY_1 && keynum <= KEY_9 )
{
if ( HandleHudMenuInput( keynum - KEY_0 ) )
return 0;
}
// let someone else handle it
// let someone else handle it
return 1;
return 1;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: called when a weapon has been picked up
// Purpose: called when a weapon has been picked up
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::OnWeaponPickup( C_BaseCombatWeapon *pWeapon )
void CBaseHudWeaponSelection::OnWeaponPickup( C_BaseCombatWeapon *pWeapon )
{
{
// add to pickup history
// add to pickup history
CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource );
CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource );
if ( pHudHR )
if ( pHudHR )
{
{
pHudHR->AddToHistory( pWeapon );
pHudHR->AddToHistory( pWeapon );
}
}
}
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// Command Handlers
// Command Handlers
//------------------------------------------------------------------------
//------------------------------------------------------------------------
void CBaseHudWeaponSelection::UserCmd_Slot1(void)
void CBaseHudWeaponSelection::UserCmd_Slot1(void)
{
{
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
{
{
UserCmd_LastWeapon();
UserCmd_LastWeapon();
}
}
else
else
{
{
SelectSlot( 1 );
SelectSlot( 1 );
}
}
}
}
void CBaseHudWeaponSelection::UserCmd_Slot2(void)
void CBaseHudWeaponSelection::UserCmd_Slot2(void)
{
{
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
{
{
UserCmd_NextWeapon();
UserCmd_NextWeapon();
}
}
else
else
{
{
SelectSlot( 2 );
SelectSlot( 2 );
}
}
}
}
void CBaseHudWeaponSelection::UserCmd_Slot3(void)
void CBaseHudWeaponSelection::UserCmd_Slot3(void)
{
{
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
{
{
engine->ClientCmd( "phys_swap" );
engine->ClientCmd( "phys_swap" );
}
}
else
else
{
{
SelectSlot( 3 );
SelectSlot( 3 );
}
}
}
}
void CBaseHudWeaponSelection::UserCmd_Slot4(void)
void CBaseHudWeaponSelection::UserCmd_Slot4(void)
{
{
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() )
{
{
UserCmd_PrevWeapon();
UserCmd_PrevWeapon();
}
}
else
else
{
{
SelectSlot( 4 );
SelectSlot( 4 );
}
}
}
}
void CBaseHudWeaponSelection::UserCmd_Slot5(void)
void CBaseHudWeaponSelection::UserCmd_Slot5(void)
{
{
SelectSlot( 5 );
SelectSlot( 5 );
}
}
void CBaseHudWeaponSelection::UserCmd_Slot6(void)
void CBaseHudWeaponSelection::UserCmd_Slot6(void)
{
{
SelectSlot( 6 );
SelectSlot( 6 );
}
}
void CBaseHudWeaponSelection::UserCmd_Slot7(void)
void CBaseHudWeaponSelection::UserCmd_Slot7(void)
{
{
SelectSlot( 7 );
SelectSlot( 7 );
}
}
void CBaseHudWeaponSelection::UserCmd_Slot8(void)
void CBaseHudWeaponSelection::UserCmd_Slot8(void)
{
{
SelectSlot( 8 );
SelectSlot( 8 );
}
}
void CBaseHudWeaponSelection::UserCmd_Slot9(void)
void CBaseHudWeaponSelection::UserCmd_Slot9(void)
{
{
SelectSlot( 9 );
SelectSlot( 9 );
}
}
void CBaseHudWeaponSelection::UserCmd_Slot0(void)
void CBaseHudWeaponSelection::UserCmd_Slot0(void)
{
{
SelectSlot( 0 );
SelectSlot( 0 );
}
}
void CBaseHudWeaponSelection::UserCmd_Slot10(void)
void CBaseHudWeaponSelection::UserCmd_Slot10(void)
{
{
SelectSlot( 10 );
SelectSlot( 10 );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: returns true if the CHudMenu should take slot1, etc commands
// Purpose: returns true if the CHudMenu should take slot1, etc commands
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool CBaseHudWeaponSelection::IsHudMenuTakingInput()
bool CBaseHudWeaponSelection::IsHudMenuTakingInput()
{
{
CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu );
CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu );
return ( pHudMenu && pHudMenu->IsMenuOpen() );
return ( pHudMenu && pHudMenu->IsMenuOpen() );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
Copier
Copié
Copier
Copié
// Purpose: returns true if the CHudMenu handles the slot command
//-----------------------------------------------------------------------------
bool CBaseHudWeaponSelection::HandleHudMenuInput( int iSlot )
{
CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu );
if ( !pHudMenu || !pHudMenu->IsMenuOpen() )
return false;
pHudMenu->SelectMenuItem( iSlot );
return true;
}
//-----------------------------------------------------------------------------
// Purpose: returns true if the weapon selection hud should be hidden because
// Purpose: returns true if the weapon selection hud should be hidden because
// the CHudMenu is open
// the CHudMenu is open
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool CBaseHudWeaponSelection::IsHudMenuPreventingWeaponSelection()
bool CBaseHudWeaponSelection::IsHudMenuPreventingWeaponSelection()
{
{
// Don't allow weapon selection if we're frozen in place
// Don't allow weapon selection if we're frozen in place
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() )
if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() )
return true;
return true;
return IsHudMenuTakingInput();
return IsHudMenuTakingInput();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Menu Selection Code
// Purpose: Menu Selection Code
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::SelectSlot( int iSlot )
void CBaseHudWeaponSelection::SelectSlot( int iSlot )
{
{
// A menu may be overriding weapon selection commands
// A menu may be overriding weapon selection commands
Copier
Copié
Copier
Copié
CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu );
if ( HandleHudMenuInput( iSlot ) )
if ( pHudMenu && IsHudMenuTakingInput() )
{
{
pHudMenu->SelectMenuItem( iSlot ); // slots are one off the key numbers
return;
return;
}
}
// If we're not allowed to draw, ignore weapon selections
// If we're not allowed to draw, ignore weapon selections
if ( !BaseClass::ShouldDraw() )
if ( !BaseClass::ShouldDraw() )
{
{
return;
return;
}
}
UpdateSelectionTime();
UpdateSelectionTime();
SelectWeaponSlot( iSlot );
SelectWeaponSlot( iSlot );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Close the weapon selection
// Purpose: Close the weapon selection
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::UserCmd_Close(void)
void CBaseHudWeaponSelection::UserCmd_Close(void)
{
{
CancelWeaponSelection();
CancelWeaponSelection();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Selects the next item in the weapon menu
// Purpose: Selects the next item in the weapon menu
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::UserCmd_NextWeapon(void)
void CBaseHudWeaponSelection::UserCmd_NextWeapon(void)
{
{
// If we're not allowed to draw, ignore weapon selections
// If we're not allowed to draw, ignore weapon selections
if ( !BaseClass::ShouldDraw() )
if ( !BaseClass::ShouldDraw() )
return;
return;
CycleToNextWeapon();
CycleToNextWeapon();
if( hud_fastswitch.GetInt() > 0 )
if( hud_fastswitch.GetInt() > 0 )
{
{
SelectWeapon();
SelectWeapon();
}
}
UpdateSelectionTime();
UpdateSelectionTime();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Selects the previous item in the menu
// Purpose: Selects the previous item in the menu
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::UserCmd_PrevWeapon(void)
void CBaseHudWeaponSelection::UserCmd_PrevWeapon(void)
{
{
// If we're not allowed to draw, ignore weapon selections
// If we're not allowed to draw, ignore weapon selections
if ( !BaseClass::ShouldDraw() )
if ( !BaseClass::ShouldDraw() )
return;
return;
CycleToPrevWeapon();
CycleToPrevWeapon();
if( hud_fastswitch.GetInt() > 0 )
if( hud_fastswitch.GetInt() > 0 )
{
{
SelectWeapon();
SelectWeapon();
}
}
UpdateSelectionTime();
UpdateSelectionTime();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Switches the last weapon the player was using
// Purpose: Switches the last weapon the player was using
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::UserCmd_LastWeapon(void)
void CBaseHudWeaponSelection::UserCmd_LastWeapon(void)
{
{
// If we're not allowed to draw, ignore weapon selections
// If we're not allowed to draw, ignore weapon selections
if ( !BaseClass::ShouldDraw() )
if ( !BaseClass::ShouldDraw() )
return;
return;
/*
/*
if ( IsHudMenuPreventingWeaponSelection() )
if ( IsHudMenuPreventingWeaponSelection() )
{
{
return;
return;
}
}
*/
*/
SwitchToLastWeapon();
SwitchToLastWeapon();
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Switches the last weapon the player was using
// Purpose: Switches the last weapon the player was using
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::SwitchToLastWeapon( void )
void CBaseHudWeaponSelection::SwitchToLastWeapon( void )
{
{
// Get the player's last weapon
// Get the player's last weapon
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
if ( !player )
if ( !player )
return;
return;
input->MakeWeaponSelection( player->GetLastWeapon() );
input->MakeWeaponSelection( player->GetLastWeapon() );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::SetWeaponSelected( void )
void CBaseHudWeaponSelection::SetWeaponSelected( void )
{
{
Assert( GetSelectedWeapon() );
Assert( GetSelectedWeapon() );
// Mark selection so that it's placed into next CUserCmd created
// Mark selection so that it's placed into next CUserCmd created
input->MakeWeaponSelection( GetSelectedWeapon() );
input->MakeWeaponSelection( GetSelectedWeapon() );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Player has chosen to draw the currently selected weapon
// Purpose: Player has chosen to draw the currently selected weapon
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::SelectWeapon( void )
void CBaseHudWeaponSelection::SelectWeapon( void )
{
{
if ( !GetSelectedWeapon() )
if ( !GetSelectedWeapon() )
{
{
engine->ClientCmd( "cancelselect\n" );
engine->ClientCmd( "cancelselect\n" );
return;
return;
}
}
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
if ( !player )
if ( !player )
return;
return;
// Don't allow selections of weapons that can't be selected (out of ammo, etc)
// Don't allow selections of weapons that can't be selected (out of ammo, etc)
if ( !GetSelectedWeapon()->CanBeSelected() )
if ( !GetSelectedWeapon()->CanBeSelected() )
{
{
player->EmitSound( "Player.DenyWeaponSelection" );
player->EmitSound( "Player.DenyWeaponSelection" );
}
}
else
else
{
{
SetWeaponSelected();
SetWeaponSelected();
m_hSelectedWeapon = NULL;
m_hSelectedWeapon = NULL;
engine->ClientCmd( "cancelselect\n" );
engine->ClientCmd( "cancelselect\n" );
// Play the "weapon selected" sound
// Play the "weapon selected" sound
player->EmitSound( "Player.WeaponSelected" );
player->EmitSound( "Player.WeaponSelected" );
}
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Abort selecting a weapon
// Purpose: Abort selecting a weapon
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void CBaseHudWeaponSelection::CancelWeaponSelection( void )
void CBaseHudWeaponSelection::CancelWeaponSelection( void )
{
{
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
if ( !player )
if ( !player )
return;
return;
// Fastswitches happen in a single frame, so the Weapon Selection HUD Element isn't visible
// Fastswitches happen in a single frame, so the Weapon Selection HUD Element isn't visible
// yet, but it's going to be next frame. We need to ask it if it thinks it's going to draw,
// yet, but it's going to be next frame. We need to ask it if it thinks it's going to draw,
// instead of checking it's IsActive flag.
// instead of checking it's IsActive flag.
if ( ShouldDraw() )
if ( ShouldDraw() )
{
{
HideSelection();
HideSelection();
m_hSelectedWeapon = NULL;
m_hSelectedWeapon = NULL;
// Play the "close weapon selection" sound
// Play the "close weapon selection" sound
player->EmitSound( "Player.WeaponSelectionClose" );
player->EmitSound( "Player.WeaponSelectionClose" );
}
}
else
else
{
{
engine->ClientCmd("escape");
engine->ClientCmd("escape");
}
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose: Returns the first weapon for a given slot.
// Purpose: Returns the first weapon for a given slot.
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
C_BaseCombatWeapon *CBaseHudWeaponSelection::GetFirstPos( int iSlot )
C_BaseCombatWeapon *CBaseHudWeaponSelection::GetFirstPos( int iSlot )
{
{
int iLowestPosition = MAX_WEAPON_POSITIONS;
int iLowestPosition = MAX_WEAPON_POSITIONS;
C_BaseCombatWeapon *pFirstWeapon = NULL;
C_BaseCombatWeapon *pFirstWeapon = NULL;
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
if ( !player )
if ( !player )
return NULL;
return NULL;
for ( int i = 0; i < MAX_WEAPONS; i++ )
for ( int i = 0; i < MAX_WEAPONS; i++ )
{
{
C_BaseCombatWeapon *pWeapon = player->GetWeapon( i );
C_BaseCombatWeapon *pWeapon = player->GetWeapon( i );
if ( !pWeapon )
if ( !pWeapon )
continue;
continue;
if ( ( pWeapon->GetSlot() == iSlot ) && (pWeapon->VisibleInWeaponSelection()) )
if ( ( pWeapon->GetSlot() == iSlot ) && (pWeapon->VisibleInWeaponSelection()) )
{
{
// If this weapon is lower in the slot than the current lowest, it's our new winner
// If this weapon is lower in the slot than the current lowest, it's our new winner
if ( pWeapon->GetPosition() <= iLowestPosition )
if ( pWeapon->GetPosition() <= iLowestPosition )
{
{
iLowestPosition = pWeapon->GetPosition();
iLowestPosition = pWeapon->GetPosition();
pFirstWeapon = pWeapon;
pFirstWeapon = pWeapon;
}
}
}
}
}
}
return pFirstWeapon;
return pFirstWeapon;
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Purpose:
// Purpose:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
C_BaseCombatWeapon *CBaseHudWeaponSelection::GetNextActivePos( int iSlot, int iSlotPos )
C_BaseCombatWeapon *CBaseHudWeaponSelection::GetNextActivePos( int iSlot, int iSlotPos )
{
{
if ( iSlotPos >= MAX_WEAPON_POSITIONS || iSlot >= MAX_WEAPON_SLOTS )
if ( iSlotPos >= MAX_WEAPON_POSITIONS || iSlot >= MAX_WEAPON_SLOTS )
return NULL;
return NULL;
int iLowestPosition = MAX_WEAPON_POSITIONS;
int iLowestPosition = MAX_WEAPON_POSITIONS;
C_BaseCombatWeapon *pNextWeapon = NULL;
C_BaseCombatWeapon *pNextWeapon = NULL;
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
C_BasePlayer *player = C_BasePlayer::GetLocalPlayer();
if ( !player )
if ( !player )
return NULL;
return NULL;
for ( int i = 0; i < MAX_WEAPONS; i++ )
for ( int i = 0; i < MAX_WEAPONS; i++ )
{
{
C_BaseCombatWeapon *pWeapon = player->GetWeapon( i );
C_BaseCombatWeapon *pWeapon = player->GetWeapon( i );
if ( !pWeapon )
if ( !pWeapon )
continue;
continue;
if ( CanBeSelectedInHUD( pWeapon ) && pWeapon->GetSlot() == iSlot )
if ( CanBeSelectedInHUD( pWeapon ) && pWeapon->GetSlot() == iSlot )
{
{
// If this weapon is lower in the slot than the current lowest, and above our desired position, it's our new winner
// If this weapon is lower in the slot than the current lowest, and above our desired position, it's our new winner
if ( pWeapon->GetPosition() <= iLowestPosition && pWeapon->GetPosition() >= iSlotPos )
if ( pWeapon->GetPosition() <= iLowestPosition && pWeapon->GetPosition() >= iSlotPos )
{
{
iLowestPosition = pWeapon->GetPosition();
iLowestPosition = pWeapon->GetPosition();
pNextWeapon = pWeapon;
pNextWeapon = pWeapon;
}
}
}
}
}
}
return pNextWeapon;
return pNextWeapon;
}
}
Différences enregistrées
Texte d'origine
Ouvrir un fichier
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: Weapon selection handling // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "weapon_selection.h" #include "hud_macros.h" #include "history_resource.h" #include "menu.h" #include "in_buttons.h" #include <KeyValues.h> #include "filesystem.h" #include "iinput.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" #define HISTORY_DRAW_TIME "5" ConVar hud_drawhistory_time( "hud_drawhistory_time", HISTORY_DRAW_TIME, 0 ); ConVar hud_fastswitch( "hud_fastswitch", "0", FCVAR_ARCHIVE | FCVAR_ARCHIVE_XBOX ); //----------------------------------------------------------------------------- // Purpose: Weapon Selection commands //----------------------------------------------------------------------------- DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot1, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot2, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot3, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot4, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot5, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot6, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot7, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot8, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot9, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot0, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot10, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Close, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, NextWeapon, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, PrevWeapon, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, LastWeapon, "CHudWeaponSelection"); HOOK_COMMAND( slot1, Slot1 ); HOOK_COMMAND( slot2, Slot2 ); HOOK_COMMAND( slot3, Slot3 ); HOOK_COMMAND( slot4, Slot4 ); HOOK_COMMAND( slot5, Slot5 ); HOOK_COMMAND( slot6, Slot6 ); HOOK_COMMAND( slot7, Slot7 ); HOOK_COMMAND( slot8, Slot8 ); HOOK_COMMAND( slot9, Slot9 ); HOOK_COMMAND( slot0, Slot0 ); HOOK_COMMAND( slot10, Slot10 ); HOOK_COMMAND( cancelselect, Close ); HOOK_COMMAND( invnext, NextWeapon ); HOOK_COMMAND( invprev, PrevWeapon ); HOOK_COMMAND( lastinv, LastWeapon ); // instance info CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance = NULL; CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance() { return s_pInstance; } CBaseHudWeaponSelection *GetHudWeaponSelection() { return CBaseHudWeaponSelection::GetInstance(); } //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CBaseHudWeaponSelection::CBaseHudWeaponSelection( const char *pElementName ) : CHudElement( pElementName ) { s_pInstance = this; SetHiddenBits( HIDEHUD_WEAPONSELECTION | HIDEHUD_NEEDSUIT | HIDEHUD_PLAYERDEAD | HIDEHUD_INVEHICLE ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::Init(void) { Reset(); // Initialise the weapons resource gWR.Init(); m_flSelectionTime = gpGlobals->curtime; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::Reset(void) { gWR.Reset(); // Start hidden m_bSelectionVisible = false; m_flSelectionTime = gpGlobals->curtime; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UpdateSelectionTime( void ) { m_flSelectionTime = gpGlobals->curtime; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::VidInit(void) { // If we've already loaded weapons, let's get new sprites gWR.LoadAllWeaponSprites(); // set spacing of pickup history CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource ); if( pHudHR ) { pHudHR->SetHistoryGap( 21 ); } Reset(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::OnThink( void ) { // Don't allow weapon selection if we're frozen in place C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() ) { if ( IsInSelectionMode() ) { CancelWeaponSelection(); } } } //----------------------------------------------------------------------------- // Purpose: Think used for selection of weapon menu item. //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::ProcessInput() { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return; // Check to see if the player is in VGUI mode... if ( pPlayer->IsInVGuiInputMode() && !pPlayer->IsInViewModelVGuiInputMode() ) { // If so, close weapon selection when they press fire if ( gHUD.m_iKeyBits & IN_ATTACK ) { if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() ) { // Swallow the button gHUD.m_iKeyBits &= ~IN_ATTACK; input->ClearInputButton( IN_ATTACK ); } engine->ClientCmd( "cancelselect\n" ); } return; } // Has the player selected a weapon? if ( gHUD.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) ) { if ( IsWeaponSelectable() ) { #ifndef TF_CLIENT_DLL if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() ) #endif { // Swallow the button gHUD.m_iKeyBits &= ~(IN_ATTACK | IN_ATTACK2); input->ClearInputButton( IN_ATTACK ); input->ClearInputButton( IN_ATTACK2 ); } // select weapon SelectWeapon(); } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::IsInSelectionMode() { return m_bSelectionVisible; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::OpenSelection( void ) { m_bSelectionVisible = true; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::HideSelection( void ) { m_bSelectionVisible = false; } //----------------------------------------------------------------------------- // Purpose: Returns whether a weapon can be selected in the HUD, based on hud type //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::CanBeSelectedInHUD( C_BaseCombatWeapon *pWeapon ) { // Xbox: In plus type, weapons without ammo can still be selected in the HUD if( HUDTYPE_PLUS == hud_fastswitch.GetInt() ) { return pWeapon->VisibleInWeaponSelection(); } if ( !pWeapon->VisibleInWeaponSelection() ) { return false; } // All other current hud types return pWeapon->CanBeSelected(); } //----------------------------------------------------------------------------- // Purpose: handles keyboard input //----------------------------------------------------------------------------- int CBaseHudWeaponSelection::KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding ) { if (IsInSelectionMode() && pszCurrentBinding && !stricmp(pszCurrentBinding, "cancelselect")) { HideSelection(); // returning 0 indicates, we've handled it, no more action needs to be taken return 0; } // let someone else handle it return 1; } //----------------------------------------------------------------------------- // Purpose: called when a weapon has been picked up //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::OnWeaponPickup( C_BaseCombatWeapon *pWeapon ) { // add to pickup history CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource ); if ( pHudHR ) { pHudHR->AddToHistory( pWeapon ); } } //------------------------------------------------------------------------ // Command Handlers //------------------------------------------------------------------------ void CBaseHudWeaponSelection::UserCmd_Slot1(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { UserCmd_LastWeapon(); } else { SelectSlot( 1 ); } } void CBaseHudWeaponSelection::UserCmd_Slot2(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { UserCmd_NextWeapon(); } else { SelectSlot( 2 ); } } void CBaseHudWeaponSelection::UserCmd_Slot3(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { engine->ClientCmd( "phys_swap" ); } else { SelectSlot( 3 ); } } void CBaseHudWeaponSelection::UserCmd_Slot4(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { UserCmd_PrevWeapon(); } else { SelectSlot( 4 ); } } void CBaseHudWeaponSelection::UserCmd_Slot5(void) { SelectSlot( 5 ); } void CBaseHudWeaponSelection::UserCmd_Slot6(void) { SelectSlot( 6 ); } void CBaseHudWeaponSelection::UserCmd_Slot7(void) { SelectSlot( 7 ); } void CBaseHudWeaponSelection::UserCmd_Slot8(void) { SelectSlot( 8 ); } void CBaseHudWeaponSelection::UserCmd_Slot9(void) { SelectSlot( 9 ); } void CBaseHudWeaponSelection::UserCmd_Slot0(void) { SelectSlot( 0 ); } void CBaseHudWeaponSelection::UserCmd_Slot10(void) { SelectSlot( 10 ); } //----------------------------------------------------------------------------- // Purpose: returns true if the CHudMenu should take slot1, etc commands //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::IsHudMenuTakingInput() { CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu ); return ( pHudMenu && pHudMenu->IsMenuOpen() ); } //----------------------------------------------------------------------------- // Purpose: returns true if the weapon selection hud should be hidden because // the CHudMenu is open //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::IsHudMenuPreventingWeaponSelection() { // Don't allow weapon selection if we're frozen in place C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() ) return true; return IsHudMenuTakingInput(); } //----------------------------------------------------------------------------- // Purpose: Menu Selection Code //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SelectSlot( int iSlot ) { // A menu may be overriding weapon selection commands CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu ); if ( pHudMenu && IsHudMenuTakingInput() ) { pHudMenu->SelectMenuItem( iSlot ); // slots are one off the key numbers return; } // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) { return; } UpdateSelectionTime(); SelectWeaponSlot( iSlot ); } //----------------------------------------------------------------------------- // Purpose: Close the weapon selection //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_Close(void) { CancelWeaponSelection(); } //----------------------------------------------------------------------------- // Purpose: Selects the next item in the weapon menu //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_NextWeapon(void) { // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) return; CycleToNextWeapon(); if( hud_fastswitch.GetInt() > 0 ) { SelectWeapon(); } UpdateSelectionTime(); } //----------------------------------------------------------------------------- // Purpose: Selects the previous item in the menu //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_PrevWeapon(void) { // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) return; CycleToPrevWeapon(); if( hud_fastswitch.GetInt() > 0 ) { SelectWeapon(); } UpdateSelectionTime(); } //----------------------------------------------------------------------------- // Purpose: Switches the last weapon the player was using //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_LastWeapon(void) { // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) return; /* if ( IsHudMenuPreventingWeaponSelection() ) { return; } */ SwitchToLastWeapon(); } //----------------------------------------------------------------------------- // Purpose: Switches the last weapon the player was using //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SwitchToLastWeapon( void ) { // Get the player's last weapon C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return; input->MakeWeaponSelection( player->GetLastWeapon() ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SetWeaponSelected( void ) { Assert( GetSelectedWeapon() ); // Mark selection so that it's placed into next CUserCmd created input->MakeWeaponSelection( GetSelectedWeapon() ); } //----------------------------------------------------------------------------- // Purpose: Player has chosen to draw the currently selected weapon //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SelectWeapon( void ) { if ( !GetSelectedWeapon() ) { engine->ClientCmd( "cancelselect\n" ); return; } C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return; // Don't allow selections of weapons that can't be selected (out of ammo, etc) if ( !GetSelectedWeapon()->CanBeSelected() ) { player->EmitSound( "Player.DenyWeaponSelection" ); } else { SetWeaponSelected(); m_hSelectedWeapon = NULL; engine->ClientCmd( "cancelselect\n" ); // Play the "weapon selected" sound player->EmitSound( "Player.WeaponSelected" ); } } //----------------------------------------------------------------------------- // Purpose: Abort selecting a weapon //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::CancelWeaponSelection( void ) { C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return; // Fastswitches happen in a single frame, so the Weapon Selection HUD Element isn't visible // yet, but it's going to be next frame. We need to ask it if it thinks it's going to draw, // instead of checking it's IsActive flag. if ( ShouldDraw() ) { HideSelection(); m_hSelectedWeapon = NULL; // Play the "close weapon selection" sound player->EmitSound( "Player.WeaponSelectionClose" ); } else { engine->ClientCmd("escape"); } } //----------------------------------------------------------------------------- // Purpose: Returns the first weapon for a given slot. //----------------------------------------------------------------------------- C_BaseCombatWeapon *CBaseHudWeaponSelection::GetFirstPos( int iSlot ) { int iLowestPosition = MAX_WEAPON_POSITIONS; C_BaseCombatWeapon *pFirstWeapon = NULL; C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return NULL; for ( int i = 0; i < MAX_WEAPONS; i++ ) { C_BaseCombatWeapon *pWeapon = player->GetWeapon( i ); if ( !pWeapon ) continue; if ( ( pWeapon->GetSlot() == iSlot ) && (pWeapon->VisibleInWeaponSelection()) ) { // If this weapon is lower in the slot than the current lowest, it's our new winner if ( pWeapon->GetPosition() <= iLowestPosition ) { iLowestPosition = pWeapon->GetPosition(); pFirstWeapon = pWeapon; } } } return pFirstWeapon; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- C_BaseCombatWeapon *CBaseHudWeaponSelection::GetNextActivePos( int iSlot, int iSlotPos ) { if ( iSlotPos >= MAX_WEAPON_POSITIONS || iSlot >= MAX_WEAPON_SLOTS ) return NULL; int iLowestPosition = MAX_WEAPON_POSITIONS; C_BaseCombatWeapon *pNextWeapon = NULL; C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return NULL; for ( int i = 0; i < MAX_WEAPONS; i++ ) { C_BaseCombatWeapon *pWeapon = player->GetWeapon( i ); if ( !pWeapon ) continue; if ( CanBeSelectedInHUD( pWeapon ) && pWeapon->GetSlot() == iSlot ) { // If this weapon is lower in the slot than the current lowest, and above our desired position, it's our new winner if ( pWeapon->GetPosition() <= iLowestPosition && pWeapon->GetPosition() >= iSlotPos ) { iLowestPosition = pWeapon->GetPosition(); pNextWeapon = pWeapon; } } } return pNextWeapon; }
Texte modifié
Ouvrir un fichier
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: Weapon selection handling // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "weapon_selection.h" #include "hud_macros.h" #include "history_resource.h" #include "menu.h" #include "in_buttons.h" #include <KeyValues.h> #include "filesystem.h" #include "iinput.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" #define HISTORY_DRAW_TIME "5" ConVar hud_drawhistory_time( "hud_drawhistory_time", HISTORY_DRAW_TIME, 0 ); ConVar hud_fastswitch( "hud_fastswitch", "0", FCVAR_ARCHIVE | FCVAR_ARCHIVE_XBOX ); //----------------------------------------------------------------------------- // Purpose: Weapon Selection commands //----------------------------------------------------------------------------- DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot1, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot2, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot3, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot4, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot5, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot6, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot7, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot8, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot9, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot0, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Slot10, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, Close, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, NextWeapon, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, PrevWeapon, "CHudWeaponSelection"); DECLARE_HUD_COMMAND_NAME(CBaseHudWeaponSelection, LastWeapon, "CHudWeaponSelection"); HOOK_COMMAND( slot1, Slot1 ); HOOK_COMMAND( slot2, Slot2 ); HOOK_COMMAND( slot3, Slot3 ); HOOK_COMMAND( slot4, Slot4 ); HOOK_COMMAND( slot5, Slot5 ); HOOK_COMMAND( slot6, Slot6 ); HOOK_COMMAND( slot7, Slot7 ); HOOK_COMMAND( slot8, Slot8 ); HOOK_COMMAND( slot9, Slot9 ); HOOK_COMMAND( slot0, Slot0 ); HOOK_COMMAND( slot10, Slot10 ); HOOK_COMMAND( cancelselect, Close ); HOOK_COMMAND( invnext, NextWeapon ); HOOK_COMMAND( invprev, PrevWeapon ); HOOK_COMMAND( lastinv, LastWeapon ); // instance info CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance[MAX_SPLITSCREEN_PLAYERS]; CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance() { return s_pInstance[GET_ACTIVE_SPLITSCREEN_SLOT()]; } CBaseHudWeaponSelection *GetHudWeaponSelection() { return CBaseHudWeaponSelection::GetInstance(); } //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CBaseHudWeaponSelection::CBaseHudWeaponSelection( const char *pElementName ) : CHudElement( pElementName ) { s_pInstance[GET_ACTIVE_SPLITSCREEN_SLOT()] = this; SetHiddenBits( HIDEHUD_WEAPONSELECTION | HIDEHUD_NEEDSUIT | HIDEHUD_PLAYERDEAD | HIDEHUD_INVEHICLE ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::Init(void) { Reset(); // Initialise the weapons resource gWR.Init(); m_flSelectionTime = gpGlobals->curtime; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::Reset(void) { gWR.Reset(); // Start hidden m_bSelectionVisible = false; m_flSelectionTime = gpGlobals->curtime; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UpdateSelectionTime( void ) { m_flSelectionTime = gpGlobals->curtime; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::VidInit(void) { // If we've already loaded weapons, let's get new sprites gWR.LoadAllWeaponSprites(); // set spacing of pickup history CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource ); if( pHudHR ) { pHudHR->SetHistoryGap( 21 ); } Reset(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::OnThink( void ) { // Don't allow weapon selection if we're frozen in place C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() ) { if ( IsInSelectionMode() ) { CancelWeaponSelection(); } } } //----------------------------------------------------------------------------- // Purpose: Think used for selection of weapon menu item. //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::ProcessInput() { C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return; // Check to see if the player is in VGUI mode... if ( pPlayer->IsInVGuiInputMode() && !pPlayer->IsInViewModelVGuiInputMode() ) { // If so, close weapon selection when they press fire if ( GetHud().m_iKeyBits & IN_ATTACK ) { if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() ) { // Swallow the button GetHud().m_iKeyBits &= ~IN_ATTACK; input->ClearInputButton( IN_ATTACK ); } engine->ClientCmd( "cancelselect\n" ); } return; } // Has the player selected a weapon? if ( GetHud().m_iKeyBits & (IN_ATTACK | IN_ATTACK2) ) { if ( IsWeaponSelectable() ) { if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() ) { // Swallow the button GetHud().m_iKeyBits &= ~(IN_ATTACK | IN_ATTACK2); input->ClearInputButton( IN_ATTACK ); input->ClearInputButton( IN_ATTACK2 ); } // select weapon SelectWeapon(); } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::IsInSelectionMode() { return m_bSelectionVisible; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::OpenSelection( void ) { m_bSelectionVisible = true; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::HideSelection( void ) { m_bSelectionVisible = false; } //----------------------------------------------------------------------------- // Purpose: Returns whether a weapon can be selected in the HUD, based on hud type //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::CanBeSelectedInHUD( C_BaseCombatWeapon *pWeapon ) { // Xbox: In plus type, weapons without ammo can still be selected in the HUD if( HUDTYPE_PLUS == hud_fastswitch.GetInt() ) { return pWeapon->VisibleInWeaponSelection(); } if ( !pWeapon->VisibleInWeaponSelection() ) { return false; } // All other current hud types return pWeapon->CanBeSelected(); } //----------------------------------------------------------------------------- // Purpose: handles keyboard input //----------------------------------------------------------------------------- int CBaseHudWeaponSelection::KeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding ) { if (IsInSelectionMode() && pszCurrentBinding && !stricmp(pszCurrentBinding, "cancelselect")) { HideSelection(); // returning 0 indicates, we've handled it, no more action needs to be taken return 0; } if ( down >= 1 && keynum >= KEY_1 && keynum <= KEY_9 ) { if ( HandleHudMenuInput( keynum - KEY_0 ) ) return 0; } // let someone else handle it return 1; } //----------------------------------------------------------------------------- // Purpose: called when a weapon has been picked up //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::OnWeaponPickup( C_BaseCombatWeapon *pWeapon ) { // add to pickup history CHudHistoryResource *pHudHR = GET_HUDELEMENT( CHudHistoryResource ); if ( pHudHR ) { pHudHR->AddToHistory( pWeapon ); } } //------------------------------------------------------------------------ // Command Handlers //------------------------------------------------------------------------ void CBaseHudWeaponSelection::UserCmd_Slot1(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { UserCmd_LastWeapon(); } else { SelectSlot( 1 ); } } void CBaseHudWeaponSelection::UserCmd_Slot2(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { UserCmd_NextWeapon(); } else { SelectSlot( 2 ); } } void CBaseHudWeaponSelection::UserCmd_Slot3(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { engine->ClientCmd( "phys_swap" ); } else { SelectSlot( 3 ); } } void CBaseHudWeaponSelection::UserCmd_Slot4(void) { if( HUDTYPE_CAROUSEL == hud_fastswitch.GetInt() ) { UserCmd_PrevWeapon(); } else { SelectSlot( 4 ); } } void CBaseHudWeaponSelection::UserCmd_Slot5(void) { SelectSlot( 5 ); } void CBaseHudWeaponSelection::UserCmd_Slot6(void) { SelectSlot( 6 ); } void CBaseHudWeaponSelection::UserCmd_Slot7(void) { SelectSlot( 7 ); } void CBaseHudWeaponSelection::UserCmd_Slot8(void) { SelectSlot( 8 ); } void CBaseHudWeaponSelection::UserCmd_Slot9(void) { SelectSlot( 9 ); } void CBaseHudWeaponSelection::UserCmd_Slot0(void) { SelectSlot( 0 ); } void CBaseHudWeaponSelection::UserCmd_Slot10(void) { SelectSlot( 10 ); } //----------------------------------------------------------------------------- // Purpose: returns true if the CHudMenu should take slot1, etc commands //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::IsHudMenuTakingInput() { CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu ); return ( pHudMenu && pHudMenu->IsMenuOpen() ); } //----------------------------------------------------------------------------- // Purpose: returns true if the CHudMenu handles the slot command //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::HandleHudMenuInput( int iSlot ) { CHudMenu *pHudMenu = GET_HUDELEMENT( CHudMenu ); if ( !pHudMenu || !pHudMenu->IsMenuOpen() ) return false; pHudMenu->SelectMenuItem( iSlot ); return true; } //----------------------------------------------------------------------------- // Purpose: returns true if the weapon selection hud should be hidden because // the CHudMenu is open //----------------------------------------------------------------------------- bool CBaseHudWeaponSelection::IsHudMenuPreventingWeaponSelection() { // Don't allow weapon selection if we're frozen in place C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); if ( pPlayer->GetFlags() & FL_FROZEN || pPlayer->IsPlayerDead() ) return true; return IsHudMenuTakingInput(); } //----------------------------------------------------------------------------- // Purpose: Menu Selection Code //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SelectSlot( int iSlot ) { // A menu may be overriding weapon selection commands if ( HandleHudMenuInput( iSlot ) ) { return; } // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) { return; } UpdateSelectionTime(); SelectWeaponSlot( iSlot ); } //----------------------------------------------------------------------------- // Purpose: Close the weapon selection //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_Close(void) { CancelWeaponSelection(); } //----------------------------------------------------------------------------- // Purpose: Selects the next item in the weapon menu //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_NextWeapon(void) { // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) return; CycleToNextWeapon(); if( hud_fastswitch.GetInt() > 0 ) { SelectWeapon(); } UpdateSelectionTime(); } //----------------------------------------------------------------------------- // Purpose: Selects the previous item in the menu //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_PrevWeapon(void) { // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) return; CycleToPrevWeapon(); if( hud_fastswitch.GetInt() > 0 ) { SelectWeapon(); } UpdateSelectionTime(); } //----------------------------------------------------------------------------- // Purpose: Switches the last weapon the player was using //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::UserCmd_LastWeapon(void) { // If we're not allowed to draw, ignore weapon selections if ( !BaseClass::ShouldDraw() ) return; /* if ( IsHudMenuPreventingWeaponSelection() ) { return; } */ SwitchToLastWeapon(); } //----------------------------------------------------------------------------- // Purpose: Switches the last weapon the player was using //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SwitchToLastWeapon( void ) { // Get the player's last weapon C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return; input->MakeWeaponSelection( player->GetLastWeapon() ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SetWeaponSelected( void ) { Assert( GetSelectedWeapon() ); // Mark selection so that it's placed into next CUserCmd created input->MakeWeaponSelection( GetSelectedWeapon() ); } //----------------------------------------------------------------------------- // Purpose: Player has chosen to draw the currently selected weapon //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::SelectWeapon( void ) { if ( !GetSelectedWeapon() ) { engine->ClientCmd( "cancelselect\n" ); return; } C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return; // Don't allow selections of weapons that can't be selected (out of ammo, etc) if ( !GetSelectedWeapon()->CanBeSelected() ) { player->EmitSound( "Player.DenyWeaponSelection" ); } else { SetWeaponSelected(); m_hSelectedWeapon = NULL; engine->ClientCmd( "cancelselect\n" ); // Play the "weapon selected" sound player->EmitSound( "Player.WeaponSelected" ); } } //----------------------------------------------------------------------------- // Purpose: Abort selecting a weapon //----------------------------------------------------------------------------- void CBaseHudWeaponSelection::CancelWeaponSelection( void ) { C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return; // Fastswitches happen in a single frame, so the Weapon Selection HUD Element isn't visible // yet, but it's going to be next frame. We need to ask it if it thinks it's going to draw, // instead of checking it's IsActive flag. if ( ShouldDraw() ) { HideSelection(); m_hSelectedWeapon = NULL; // Play the "close weapon selection" sound player->EmitSound( "Player.WeaponSelectionClose" ); } else { engine->ClientCmd("escape"); } } //----------------------------------------------------------------------------- // Purpose: Returns the first weapon for a given slot. //----------------------------------------------------------------------------- C_BaseCombatWeapon *CBaseHudWeaponSelection::GetFirstPos( int iSlot ) { int iLowestPosition = MAX_WEAPON_POSITIONS; C_BaseCombatWeapon *pFirstWeapon = NULL; C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return NULL; for ( int i = 0; i < MAX_WEAPONS; i++ ) { C_BaseCombatWeapon *pWeapon = player->GetWeapon( i ); if ( !pWeapon ) continue; if ( ( pWeapon->GetSlot() == iSlot ) && (pWeapon->VisibleInWeaponSelection()) ) { // If this weapon is lower in the slot than the current lowest, it's our new winner if ( pWeapon->GetPosition() <= iLowestPosition ) { iLowestPosition = pWeapon->GetPosition(); pFirstWeapon = pWeapon; } } } return pFirstWeapon; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- C_BaseCombatWeapon *CBaseHudWeaponSelection::GetNextActivePos( int iSlot, int iSlotPos ) { if ( iSlotPos >= MAX_WEAPON_POSITIONS || iSlot >= MAX_WEAPON_SLOTS ) return NULL; int iLowestPosition = MAX_WEAPON_POSITIONS; C_BaseCombatWeapon *pNextWeapon = NULL; C_BasePlayer *player = C_BasePlayer::GetLocalPlayer(); if ( !player ) return NULL; for ( int i = 0; i < MAX_WEAPONS; i++ ) { C_BaseCombatWeapon *pWeapon = player->GetWeapon( i ); if ( !pWeapon ) continue; if ( CanBeSelectedInHUD( pWeapon ) && pWeapon->GetSlot() == iSlot ) { // If this weapon is lower in the slot than the current lowest, and above our desired position, it's our new winner if ( pWeapon->GetPosition() <= iLowestPosition && pWeapon->GetPosition() >= iSlotPos ) { iLowestPosition = pWeapon->GetPosition(); pNextWeapon = pWeapon; } } } return pNextWeapon; }
Trouver la différence