summaryrefslogtreecommitdiff
path: root/game/client/cstrike/cs_hud_freezepanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/cstrike/cs_hud_freezepanel.cpp')
-rw-r--r--game/client/cstrike/cs_hud_freezepanel.cpp347
1 files changed, 347 insertions, 0 deletions
diff --git a/game/client/cstrike/cs_hud_freezepanel.cpp b/game/client/cstrike/cs_hud_freezepanel.cpp
new file mode 100644
index 0000000..866be24
--- /dev/null
+++ b/game/client/cstrike/cs_hud_freezepanel.cpp
@@ -0,0 +1,347 @@
+//========= 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;
+}