Diff
checker
Texto
Texto
Imagens
Documentos
Excel
Pastas
Legal
Enterprise
Aplicativo para desktop
Preços
Fazer login
Baixar o Diffchecker Desktop
Comparar texto
Encontre a diferença entre dois arquivos de texto
Ferramentas
Histórico
Editor live
Recolher inalteradas
Sem quebra de linha
Layout
Dividido
Unificado
Nível de detalhe
Inteligente
Palavra
Caractere
Realce de sintaxe
Escolher sintaxe
Ignorar
Transformar texto
Ir à primeira mudança
Editar entrada
Diffchecker Desktop
A maneira mais segura de usar o Diffchecker. Obtenha o aplicativo Diffchecker Desktop: seus diffs nunca saem do seu computador!
Obter Desktop
Untitled diff
Criado
há 11 anos
O diff nunca expira
Limpar
Exportar
Compartilhar
Explicar
11 remoções
Linhas
Total
Removido
Caracteres
Total
Removido
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
615 linhas
Copiar tudo
33 adições
Linhas
Total
Adicionado
Caracteres
Total
Adicionado
Para continuar usando este recurso, atualize para
Diff
checker
Pro
Ver preços
635 linhas
Copiar tudo
//========= 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
Copiar
Copiado
Copiar
Copiado
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
= NULL
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
[MAX_SPLITSCREEN_PLAYERS]
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
{
{
Copiar
Copiado
Copiar
Copiado
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 )
{
{
Copiar
Copiado
Copiar
Copiado
s_pInstance
= this;
s_pInstance
[GET_ACTIVE_SPLITSCREEN_SLOT()]
= this;
Copiar
Copiado
Copiar
Copiado
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
Copiar
Copiado
Copiar
Copiado
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
Copiar
Copiado
Copiar
Copiado
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?
Copiar
Copiado
Copiar
Copiado
if (
gHUD
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
if (
GetHud()
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
{
{
if ( IsWeaponSelectable() )
if ( IsWeaponSelectable() )
{
{
Copiar
Copiado
Copiar
Copiado
#ifndef TF_CLIENT_DLL
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
Copiar
Copiado
Copiar
Copiado
#endif
{
{
// Swallow the button
// Swallow the button
Copiar
Copiado
Copiar
Copiado
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;
}
}
Copiar
Copiado
Copiar
Copiado
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() );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
Copiar
Copiado
Copiar
Copiado
// 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
Copiar
Copiado
Copiar
Copiado
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;
}
}
Diferenças salvas
Texto original
Abrir arquivo
//========= 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; }
Texto alterado
Abrir arquivo
//========= 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; }
Encontrar Diferença