Diff
checker
Text
Text
Bilder
Dokumente
Excel
Ordner
Legal
Enterprise
Desktop-App
Preise
Einloggen
Diffchecker Desktop herunterladen
Texte vergleichen
Finde den Unterschied zwischen zwei Textdateien
Werkzeuge
Verlauf
Live-Editor
Gleiches ausblenden
Zeilenumbruch aus
Ansicht
Zweispaltig
Einspaltig
Vergleichsgenauigkeit
Intelligent
Wort
Zeichen
Syntaxhervorhebung
Syntax auswählen
Ignorieren
Text umwandeln
Zur ersten Änderung
Eingabe bearbeiten
Diffchecker Desktop
Der sicherste Weg, Diffchecker zu nutzen. Hol dir die Desktop-App: Deine Diffs verlassen nie deinen Computer!
Desktop holen
Untitled diff
Erstellt
vor 11 Jahren
Diff läuft nie ab
Löschen
Exportieren
Teilen
Erklären
11 Entfernungen
Zeilen
Gesamt
Entfernt
Zeichen
Gesamt
Entfernt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
615 Zeilen
Kopieren
33 Hinzufügungen
Zeilen
Gesamt
Hinzugefügt
Zeichen
Gesamt
Hinzugefügt
Um diese Funktion weiterhin zu nutzen, aktualisiere auf
Diff
checker
Pro
Preise anzeigen
635 Zeilen
Kopieren
//========= 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
Kopieren
Kopiert
Kopieren
Kopiert
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
= NULL
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
[MAX_SPLITSCREEN_PLAYERS]
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
{
{
Kopieren
Kopiert
Kopieren
Kopiert
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 )
{
{
Kopieren
Kopiert
Kopieren
Kopiert
s_pInstance
= this;
s_pInstance
[GET_ACTIVE_SPLITSCREEN_SLOT()]
= this;
Kopieren
Kopiert
Kopieren
Kopiert
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
Kopieren
Kopiert
Kopieren
Kopiert
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
Kopieren
Kopiert
Kopieren
Kopiert
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?
Kopieren
Kopiert
Kopieren
Kopiert
if (
gHUD
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
if (
GetHud()
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
{
{
if ( IsWeaponSelectable() )
if ( IsWeaponSelectable() )
{
{
Kopieren
Kopiert
Kopieren
Kopiert
#ifndef TF_CLIENT_DLL
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
Kopieren
Kopiert
Kopieren
Kopiert
#endif
{
{
// Swallow the button
// Swallow the button
Kopieren
Kopiert
Kopieren
Kopiert
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;
}
}
Kopieren
Kopiert
Kopieren
Kopiert
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() );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
Kopieren
Kopiert
Kopieren
Kopiert
// 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
Kopieren
Kopiert
Kopieren
Kopiert
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;
}
}
Gespeicherte Diffs
Originaltext
Datei öffnen
//========= 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; }
Bearbeitung
Datei öffnen
//========= 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; }
Unterschied finden