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.
348 lines
11 KiB
348 lines
11 KiB
![]()
4 years ago
|
//========= 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;
|
||
|
}
|