Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
实时编辑器
折叠未更改行
关闭换行
视图
拆分
统一
比对精度
智能
单词
字符
语法高亮
选择语法
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
Untitled diff
创建于
11年前
差异永不过期
清除
导出
分享
解释
11 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
615 行
全部复制
33 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
635 行
全部复制
//========= 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
复制
已复制
复制
已复制
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
= NULL
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::s_pInstance
[MAX_SPLITSCREEN_PLAYERS]
;
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
CBaseHudWeaponSelection *CBaseHudWeaponSelection::GetInstance()
{
{
复制
已复制
复制
已复制
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 )
{
{
复制
已复制
复制
已复制
s_pInstance
= this;
s_pInstance
[GET_ACTIVE_SPLITSCREEN_SLOT()]
= this;
复制
已复制
复制
已复制
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
复制
已复制
复制
已复制
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
复制
已复制
复制
已复制
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?
复制
已复制
复制
已复制
if (
gHUD
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
if (
GetHud()
.m_iKeyBits & (IN_ATTACK | IN_ATTACK2) )
{
{
if ( IsWeaponSelectable() )
if ( IsWeaponSelectable() )
{
{
复制
已复制
复制
已复制
#ifndef TF_CLIENT_DLL
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
if ( HUDTYPE_PLUS != hud_fastswitch.GetInt() )
复制
已复制
复制
已复制
#endif
{
{
// Swallow the button
// Swallow the button
复制
已复制
复制
已复制
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;
}
}
复制
已复制
复制
已复制
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() );
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
复制
已复制
复制
已复制
// 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
复制
已复制
复制
已复制
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;
}
}
已保存差异
原始文本
打开文件
//========= 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; }
更改后文本
打开文件
//========= 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; }
查找差异