You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
347 lines
11 KiB
347 lines
11 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "cs_hud_freezepanel.h" |
|
#include <vgui/IVGui.h> |
|
#include "vgui_controls/AnimationController.h" |
|
#include "iclientmode.h" |
|
#include "c_cs_player.h" |
|
#include "c_cs_playerresource.h" |
|
#include <vgui_controls/Label.h> |
|
#include <vgui/ILocalize.h> |
|
#include <vgui/ISurface.h> |
|
#include "VGUI/bordered_panel.h" |
|
#include "fmtstr.h" |
|
#include "cs_gamerules.h" |
|
#include "view.h" |
|
#include "ivieweffects.h" |
|
#include "viewrender.h" |
|
#include "usermessages.h" |
|
#include "hud_macros.h" |
|
#include "c_baseanimating.h" |
|
#include "backgroundpanel.h" // rounded border support |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
DECLARE_HUDELEMENT_DEPTH( CCSFreezePanel, 1 ); |
|
// DECLARE_HUD_MESSAGE( CCSFreezePanel, Damage ); |
|
// DECLARE_HUD_MESSAGE( CCSFreezePanel, DroppedEquipment ); |
|
|
|
#define CALLOUT_WIDE (XRES(100)) |
|
#define CALLOUT_TALL (XRES(50)) |
|
|
|
|
|
ConVar cl_disablefreezecam( |
|
"cl_disablefreezecam", |
|
"0", |
|
FCVAR_ARCHIVE, |
|
"Turn on/off freezecam on client" |
|
); |
|
|
|
|
|
Color LerpColors( Color cStart, Color cEnd, float flPercent ) |
|
{ |
|
float r = (float)((float)(cStart.r()) + (float)(cEnd.r() - cStart.r()) * flPercent); |
|
float g = (float)((float)(cStart.g()) + (float)(cEnd.g() - cStart.g()) * flPercent); |
|
float b = (float)((float)(cStart.b()) + (float)(cEnd.b() - cStart.b()) * flPercent); |
|
float a = (float)((float)(cStart.a()) + (float)(cEnd.a() - cStart.a()) * flPercent); |
|
return Color( r, g, b, a ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Clips the health image to the appropriate percentage |
|
//----------------------------------------------------------------------------- |
|
class HorizontalGauge : public vgui::Panel |
|
{ |
|
public: |
|
DECLARE_CLASS_SIMPLE( HorizontalGauge, vgui::Panel ); |
|
|
|
HorizontalGauge( Panel *parent, const char *name ) : |
|
vgui::Panel( parent, name ), |
|
m_fPercent(0.0f) |
|
{ |
|
} |
|
|
|
/* |
|
void ApplySettings(KeyValues *inResourceData) |
|
{ |
|
BaseClass::ApplySettings(inResourceData); |
|
|
|
Color color0 = inResourceData->GetColor( "color0"); |
|
Color color1 = inResourceData->GetColor( "color1"); |
|
} |
|
*/ |
|
|
|
void PaintBackground() |
|
{ |
|
int wide, tall; |
|
GetSize(wide, tall); |
|
|
|
surface()->DrawSetColor( Color(0, 0, 0, 128) ); |
|
surface()->DrawFilledRect(0, 0, wide, tall); |
|
|
|
// do the border explicitly here |
|
surface()->DrawSetColor( Color(0,0,0,255)); |
|
surface()->DrawOutlinedRect(0, 0, wide, tall); |
|
} |
|
|
|
virtual void Paint() |
|
{ |
|
int wide, tall; |
|
GetSize(wide, tall); |
|
|
|
Color lowHealth(192, 32, 32, 255); |
|
Color highHealth(32, 255, 32, 255); |
|
|
|
surface()->DrawSetColor( LerpColors(lowHealth, highHealth, m_fPercent) ); |
|
surface()->DrawFilledRect(1, 1, (int)((wide - 1) * m_fPercent), tall - 1); |
|
} |
|
|
|
void SetPercent( float fPercent ) { m_fPercent = fPercent; } |
|
|
|
private: |
|
float m_fPercent; |
|
}; |
|
|
|
DECLARE_BUILD_FACTORY( HorizontalGauge ); |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
CCSFreezePanel::CCSFreezePanel( const char *pElementName ) : |
|
EditablePanel( NULL, "FreezePanel" ), |
|
CHudElement( pElementName ), |
|
m_pBackgroundPanel(NULL), |
|
m_pKillerHealth(NULL), |
|
m_pAvatar(NULL), |
|
m_pDominationIcon(NULL) |
|
{ |
|
SetSize( 10, 10 ); // Quiet "parent not sized yet" spew |
|
SetParent(g_pClientMode->GetViewport()); |
|
m_bShouldBeVisible = false; |
|
SetScheme( "ClientScheme" ); |
|
RegisterForRenderGroup( "hide_for_scoreboard" ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCSFreezePanel::Reset() |
|
{ |
|
Hide(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCSFreezePanel::Init() |
|
{ |
|
CHudElement::Init(); |
|
|
|
// listen for events |
|
ListenForGameEvent( "show_freezepanel" ); |
|
ListenForGameEvent( "hide_freezepanel" ); |
|
ListenForGameEvent( "freezecam_started" ); |
|
ListenForGameEvent( "player_death" ); |
|
|
|
Hide(); |
|
|
|
InitLayout(); |
|
|
|
} |
|
|
|
void CCSFreezePanel::InitLayout() |
|
{ |
|
LoadControlSettings( "resource/UI/FreezePanel_Basic.res" ); |
|
|
|
m_pBackgroundPanel = dynamic_cast<BorderedPanel*>( FindChildByName("FreezePanelBG")); |
|
m_pAvatar = dynamic_cast<CAvatarImagePanel*>( m_pBackgroundPanel->FindChildByName("AvatarImage")); |
|
m_pKillerHealth = dynamic_cast<HorizontalGauge*>( m_pBackgroundPanel->FindChildByName("KillerHealth")); |
|
m_pDominationIcon = dynamic_cast<ImagePanel*>( m_pBackgroundPanel->FindChildByName("DominationIcon")); |
|
|
|
m_pAvatar->SetDefaultAvatar(scheme()->GetImage( CSTRIKE_DEFAULT_AVATAR, true )); |
|
m_pAvatar->SetShouldScaleImage(true); |
|
m_pAvatar->SetShouldDrawFriendIcon(false); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Applies scheme settings |
|
//----------------------------------------------------------------------------- |
|
void CCSFreezePanel::ApplySchemeSettings( vgui::IScheme *pScheme ) |
|
{ |
|
BaseClass::ApplySchemeSettings( pScheme ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCSFreezePanel::FireGameEvent( IGameEvent * event ) |
|
{ |
|
const char *pEventName = event->GetName(); |
|
|
|
if ( Q_strcmp( "player_death", pEventName ) == 0 ) |
|
{ |
|
// see if the local player died |
|
int iPlayerIndexVictim = engine->GetPlayerForUserID( event->GetInt( "userid" ) ); |
|
int iPlayerIndexKiller = engine->GetPlayerForUserID( event->GetInt( "attacker" ) ); |
|
C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer(); |
|
CCSPlayer* pKiller = ToCSPlayer(ClientEntityList().GetBaseEntity(iPlayerIndexKiller)); |
|
|
|
if ( pLocalPlayer && iPlayerIndexVictim == pLocalPlayer->entindex() ) |
|
{ |
|
// the local player is dead, see if this is a new nemesis or a revenge |
|
if ( event->GetInt( "dominated" ) > 0) |
|
{ |
|
m_pDominationIcon->SetImage("../hud/freeze_nemesis"); |
|
m_pDominationIcon->SetVisible(true); |
|
|
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel1", g_pVGuiLocalize->Find("#FreezePanel_NewNemesis1")); |
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel2", g_pVGuiLocalize->Find("#FreezePanel_NewNemesis2")); |
|
} |
|
// was the killer your pre-existing nemesis? |
|
else if ( pKiller != NULL && pKiller->IsPlayerDominated(iPlayerIndexVictim) ) |
|
{ |
|
m_pDominationIcon->SetImage("../hud/freeze_nemesis"); |
|
m_pDominationIcon->SetVisible(true); |
|
|
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel1", g_pVGuiLocalize->Find("#FreezePanel_OldNemesis1")); |
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel2", g_pVGuiLocalize->Find("#FreezePanel_OldNemesis2")); |
|
} |
|
else if ( event->GetInt( "revenge" ) > 0 ) |
|
{ |
|
m_pDominationIcon->SetImage("../hud/freeze_revenge"); |
|
m_pDominationIcon->SetVisible(true); |
|
|
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel1", g_pVGuiLocalize->Find("#FreezePanel_Revenge1")); |
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel2", g_pVGuiLocalize->Find("#FreezePanel_Revenge2")); |
|
} |
|
else |
|
{ |
|
m_pDominationIcon->SetVisible(false); |
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel1", g_pVGuiLocalize->Find("#FreezePanel_Killer1")); |
|
m_pBackgroundPanel->SetDialogVariable( "InfoLabel2", g_pVGuiLocalize->Find("#FreezePanel_Killer2")); |
|
} |
|
} |
|
} |
|
else if ( Q_strcmp( "hide_freezepanel", pEventName ) == 0 ) |
|
{ |
|
Hide(); |
|
} |
|
else if ( Q_strcmp( "freezecam_started", pEventName ) == 0 ) |
|
{ |
|
} |
|
else if ( Q_strcmp( "show_freezepanel", pEventName ) == 0 ) |
|
{ |
|
C_CS_PlayerResource *cs_PR = dynamic_cast<C_CS_PlayerResource *>( g_PR ); |
|
if ( !cs_PR ) |
|
return; |
|
|
|
Show(); |
|
|
|
// Get the entity who killed us |
|
int iKillerIndex = event->GetInt( "killer" ); |
|
CCSPlayer* pKiller = ToCSPlayer(ClientEntityList().GetBaseEntity(iKillerIndex)); |
|
m_pAvatar->ClearAvatar(); |
|
|
|
if ( pKiller ) |
|
{ |
|
int iMaxHealth = pKiller->GetMaxHealth(); |
|
int iKillerHealth = pKiller->GetHealth(); |
|
if ( !pKiller->IsAlive() ) |
|
{ |
|
iKillerHealth = 0; |
|
} |
|
|
|
m_pKillerHealth->SetPercent( (float)iKillerHealth / iMaxHealth ); |
|
|
|
char killerName[128]; |
|
V_snprintf( killerName, sizeof(killerName), "%s", g_PR->GetPlayerName(iKillerIndex) ); |
|
// V_strupr( killerName ); |
|
|
|
m_pBackgroundPanel->SetDialogVariable( "killername", killerName); |
|
|
|
int iKillerIndex = pKiller->entindex(); |
|
player_info_t pi; |
|
|
|
m_pAvatar->SetDefaultAvatar( GetDefaultAvatarImage( pKiller ) ); |
|
|
|
if ( engine->GetPlayerInfo(iKillerIndex, &pi) ) |
|
{ |
|
m_pAvatar->SetPlayer( (C_BasePlayer*)pKiller, k_EAvatarSize64x64); |
|
m_pAvatar->SetVisible(true); |
|
} |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
bool CCSFreezePanel::ShouldDraw( void ) |
|
{ |
|
//============================================================================= |
|
// HPE_BEGIN: |
|
// [Forrest] Added sv_disablefreezecam check |
|
//============================================================================= |
|
static ConVarRef sv_disablefreezecam( "sv_disablefreezecam" ); |
|
return ( m_bShouldBeVisible && !cl_disablefreezecam.GetBool() && !sv_disablefreezecam.GetBool() && CHudElement::ShouldDraw() ); |
|
//============================================================================= |
|
// HPE_END |
|
//============================================================================= |
|
} |
|
|
|
void CCSFreezePanel::OnScreenSizeChanged( int nOldWide, int nOldTall ) |
|
{ |
|
BaseClass::OnScreenSizeChanged(nOldWide, nOldTall); |
|
|
|
InitLayout(); |
|
} |
|
|
|
void CCSFreezePanel::SetActive( bool bActive ) |
|
{ |
|
CHudElement::SetActive( bActive ); |
|
|
|
if ( bActive ) |
|
{ |
|
// Setup replay key binding in UI |
|
const char *pKey = engine->Key_LookupBinding( "save_replay" ); |
|
if ( pKey == NULL || FStrEq( pKey, "(null)" ) ) |
|
{ |
|
pKey = "<NOT BOUND>"; |
|
} |
|
|
|
char szKey[16]; |
|
Q_snprintf( szKey, sizeof(szKey), "%s", pKey ); |
|
wchar_t wKey[16]; |
|
wchar_t wLabel[256]; |
|
|
|
g_pVGuiLocalize->ConvertANSIToUnicode( szKey, wKey, sizeof( wKey ) ); |
|
g_pVGuiLocalize->ConstructString( wLabel, sizeof( wLabel ), g_pVGuiLocalize->Find("#FreezePanel_SaveReplay" ), 1, wKey ); |
|
|
|
m_pBackgroundPanel->SetDialogVariable( "savereplay", wLabel ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCSFreezePanel::Show() |
|
{ |
|
m_bShouldBeVisible = true; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CCSFreezePanel::Hide() |
|
{ |
|
m_bShouldBeVisible = false; |
|
}
|
|
|