summaryrefslogtreecommitdiff
path: root/game/client/tf2/resourcezoneoverlay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf2/resourcezoneoverlay.cpp')
-rw-r--r--game/client/tf2/resourcezoneoverlay.cpp249
1 files changed, 249 insertions, 0 deletions
diff --git a/game/client/tf2/resourcezoneoverlay.cpp b/game/client/tf2/resourcezoneoverlay.cpp
new file mode 100644
index 0000000..97a7d51
--- /dev/null
+++ b/game/client/tf2/resourcezoneoverlay.cpp
@@ -0,0 +1,249 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Revision: $
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include <VGUI_EntityPanel.h>
+#include <KeyValues.h>
+#include "commanderoverlay.h"
+#include "clientmode_tfnormal.h"
+#include "tf_shareddefs.h"
+#include "shareddefs.h"
+#include "c_func_resource.h"
+#include "techtree.h"
+#include "c_basetfplayer.h"
+#include "vgui_HealthBar.h"
+#include "vgui_bitmapimage.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+class CResourceZoneOverlay : public CEntityPanel
+{
+ DECLARE_CLASS( CResourceZoneOverlay, CEntityPanel );
+
+public:
+ CResourceZoneOverlay( vgui::Panel *parent, const char *panelName );
+ virtual ~CResourceZoneOverlay( void );
+
+ bool Init( KeyValues* pKeyValues, C_BaseEntity* pEntity );
+ bool InitResourceBitmaps( KeyValues* pKeyValues );
+
+ void SetColor( int r, int g, int b, int a );
+ void SetImage( BitmapImage *pImage );
+
+ virtual void OnTick();
+
+ virtual void Paint( void );
+ virtual void PaintBackground( void ) {}
+
+private:
+ class CResourceBitmaps
+ {
+ public:
+ CResourceBitmaps() : m_pImage(0) {}
+
+ BitmapImage *m_pImage;
+ Color m_Color;
+ };
+
+ struct Rect_t
+ {
+ int x, y, w, h;
+ };
+
+ bool ParseSingleResourceBitmap( KeyValues *pKeyValues,
+ const char *pResourceName, CResourceBitmaps *pResourceBitmap );
+ bool ParseTeamResourceBitmaps( CResourceBitmaps *pT, KeyValues *pTeam );
+
+ int m_r, m_g, m_b, m_a;
+ CHealthBarPanel m_UsageBar;
+ Rect_t m_Icon;
+ C_ResourceZone *m_pResourceZone;
+ CResourceBitmaps m_pResourceBitmap;
+ BitmapImage *m_pImage;
+
+};
+
+
+//-----------------------------------------------------------------------------
+// Class factory
+//-----------------------------------------------------------------------------
+
+DECLARE_OVERLAY_FACTORY( CResourceZoneOverlay, "resourcezone" );
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+
+CResourceZoneOverlay::CResourceZoneOverlay( vgui::Panel *parent, const char *panelName )
+: BaseClass( parent, "CResourceZoneOverlay" )
+{
+ m_pImage = 0;
+ SetPaintBackgroundEnabled( false );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+
+CResourceZoneOverlay::~CResourceZoneOverlay( void )
+{
+ if ( m_pResourceBitmap.m_pImage )
+ {
+ delete m_pResourceBitmap.m_pImage;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Parse class icons
+//-----------------------------------------------------------------------------
+
+bool CResourceZoneOverlay::ParseSingleResourceBitmap( KeyValues *pKeyValues,
+ const char *pResourceName, CResourceBitmaps *pResourceBitmap )
+{
+ const char *image;
+ KeyValues *pResource;
+ pResource = pKeyValues->FindKey( pResourceName );
+ if ( !pResource )
+ return false;
+
+ image = pResource->GetString( "material" );
+ if ( image && image[ 0 ] )
+ {
+ pResourceBitmap->m_pImage = new BitmapImage( GetVPanel(), image );
+ }
+ else
+ {
+ return( false );
+ }
+
+ return ParseRGBA( pResource, "color", pResourceBitmap->m_Color );
+}
+
+bool CResourceZoneOverlay::ParseTeamResourceBitmaps( CResourceBitmaps *pT, KeyValues *pTeam )
+{
+ if ( !ParseSingleResourceBitmap( pTeam, "Alpha", pT ) )
+ return false;
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Initialization
+//-----------------------------------------------------------------------------
+
+bool CResourceZoneOverlay::InitResourceBitmaps( KeyValues* pKeyValues )
+{
+// char teamkey[ 128 ];
+// for (int i = 0; i < 3; ++i)
+// {
+// Q_snprintf( teamkey, sizeof( teamkey ), "Team%i", i );
+// KeyValues *pTeam = pKeyValues->getSection( teamkey );
+// if (pTeam)
+ {
+ if (!ParseTeamResourceBitmaps( &m_pResourceBitmap, pKeyValues ))
+ return false;
+ }
+// }
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Initialization
+//-----------------------------------------------------------------------------
+
+bool CResourceZoneOverlay::Init( KeyValues* pKeyValues, C_BaseEntity* pEntity )
+{
+ if (!BaseClass::Init( pKeyValues, pEntity))
+ return false;
+
+ if (!pKeyValues)
+ return false;
+
+ // We gotta be attached to a resource zone
+ m_pResourceZone = dynamic_cast<C_ResourceZone*>(GetEntity());
+ if (!m_pResourceZone)
+ return false;
+
+ KeyValues* pUsage = pKeyValues->FindKey("Usage");
+ if (!m_UsageBar.Init( pUsage ))
+ return false;
+ m_UsageBar.SetParent( this );
+
+ // get the icon info...
+ if (!ParseRect( pKeyValues, "iconposition", m_Icon.x, m_Icon.y, m_Icon.w, m_Icon.h ))
+ return false;
+
+ if (!InitResourceBitmaps( pKeyValues ))
+ return false;
+
+ SetImage( 0 );
+ SetColor( m_pResourceBitmap.m_Color[0], m_pResourceBitmap.m_Color[1], m_pResourceBitmap.m_Color[2], m_pResourceBitmap.m_Color[3] );
+
+ // we need updating
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// called when we're ticked...
+//-----------------------------------------------------------------------------
+
+void CResourceZoneOverlay::OnTick()
+{
+ // Update position
+ CEntityPanel::OnTick();
+
+ SetImage( m_pResourceBitmap.m_pImage );
+ int r, g, b, a;
+ m_pResourceBitmap.m_Color.GetColor( r, g, b, a );
+ SetColor( r, g, b, a );
+
+ m_UsageBar.SetHealth( m_pResourceZone->m_flClientResources );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : pImage - Class specific image
+//-----------------------------------------------------------------------------
+
+void CResourceZoneOverlay::SetImage( BitmapImage *pImage )
+{
+ m_pImage = pImage;
+}
+
+//-----------------------------------------------------------------------------
+// Sets the draw color
+//-----------------------------------------------------------------------------
+
+void CResourceZoneOverlay::SetColor( int r, int g, int b, int a )
+{
+ m_r = r;
+ m_g = g;
+ m_b = b;
+ m_a = a;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+
+void CResourceZoneOverlay::Paint( void )
+{
+ if ( !m_pImage )
+ return;
+
+ ComputeAndSetSize();
+
+ Color color;
+ color.SetColor( m_r, m_g, m_b, m_a );
+ m_pImage->SetPos( m_Icon.x, m_Icon.y );
+ m_pImage->SetColor( color );
+ m_pImage->DoPaint( GetVPanel() );
+} \ No newline at end of file