diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/cstrike/cs_hud_freezepanel.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/cstrike/cs_hud_freezepanel.cpp')
| -rw-r--r-- | game/client/cstrike/cs_hud_freezepanel.cpp | 347 |
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; +} |