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/tf2/c_obj_mcv_selection_panel.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/tf2/c_obj_mcv_selection_panel.cpp')
| -rw-r--r-- | game/client/tf2/c_obj_mcv_selection_panel.cpp | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/game/client/tf2/c_obj_mcv_selection_panel.cpp b/game/client/tf2/c_obj_mcv_selection_panel.cpp new file mode 100644 index 0000000..1e57f0b --- /dev/null +++ b/game/client/tf2/c_obj_mcv_selection_panel.cpp @@ -0,0 +1,279 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "c_baseobject.h" +#include "ObjectControlPanel.h" +#include "hud_minimap.h" +#include "vgui_bitmapimage.h" +#include "c_vehicle_teleport_station.h" +#include <vgui/MouseCode.h> + + +class C_ObjMCVSelectionPanel; +CUtlLinkedList<C_ObjMCVSelectionPanel*,int> g_SelectionPanels; + + +// ------------------------------------------------------------------------------------------------ // +// C_ObjMCVSelectionPanel +// ------------------------------------------------------------------------------------------------ // + +class C_ObjMCVSelectionPanel : public C_BaseObject +{ +public: + + DECLARE_CLASS( C_ObjMCVSelectionPanel, C_BaseObject ); + DECLARE_CLIENTCLASS(); + + C_ObjMCVSelectionPanel(); + ~C_ObjMCVSelectionPanel(); + + typedef CHandle<C_VehicleTeleportStation> VehicleTeleportStationHandle; + CUtlVector<VehicleTeleportStationHandle> m_DeployedTeleportStations; + + +private: + static C_ObjMCVSelectionPanel *s_pSelectionPanel; + + friend void RecvProxy_TeleportStationCount( void *pStruct, int objectID, int currentArrayLength ); + friend void RecvProxy_TeleportStationElement( const CRecvProxyData *pData, void *pStruct, void *pOut ); + + C_ObjMCVSelectionPanel( const C_ObjMCVSelectionPanel & ); +}; + + +void RecvProxy_TeleportStationCount( void *pStruct, int objectID, int currentArrayLength ) +{ + C_ObjMCVSelectionPanel *pPanel = (C_ObjMCVSelectionPanel*)pStruct; + if ( pPanel->m_DeployedTeleportStations.Count() != currentArrayLength ) + { + pPanel->m_DeployedTeleportStations.SetSize( currentArrayLength ); + } +} + + +void RecvProxy_TeleportStationElement( const CRecvProxyData *pData, void *pStruct, void *pOut ) +{ + C_ObjMCVSelectionPanel *pPanel = (C_ObjMCVSelectionPanel*)pStruct; + + Assert( pData->m_iElement < pPanel->m_DeployedTeleportStations.Count() ); + + RecvProxy_IntToEHandle( pData, pStruct, &pPanel->m_DeployedTeleportStations[pData->m_iElement] ); +} + + +IMPLEMENT_CLIENTCLASS_DT( C_ObjMCVSelectionPanel, DT_MCVSelectionPanel, CObjMCVSelectionPanel ) + RecvPropVirtualArray( + RecvProxy_TeleportStationCount, + 32, + RecvPropEHandle( "teleport_station_element", 0, 0, RecvProxy_TeleportStationElement ), + "teleport_stations" ) +END_RECV_TABLE() + + +C_ObjMCVSelectionPanel::C_ObjMCVSelectionPanel() +{ + g_SelectionPanels.AddToTail( this ); +} + +C_ObjMCVSelectionPanel::~C_ObjMCVSelectionPanel() +{ + g_SelectionPanels.FindAndRemove( this ); +} + + + +//----------------------------------------------------------------------------- +// CMCVMinimapPanel +//----------------------------------------------------------------------------- + +class CMCVMinimapPanel : public CMinimapPanel +{ +public: + + DECLARE_CLASS( CMCVMinimapPanel, CMinimapPanel ); + + CMCVMinimapPanel( vgui::Panel *pParent, const char *pElementName ); + virtual ~CMCVMinimapPanel(); + + virtual void Paint(); + virtual void OnMousePressed( vgui::MouseCode code ); + virtual void OnCursorMoved( int x, int y ); + + +private: + BitmapImage m_MCVImage; + BitmapImage m_SelectedMCVImage; + int m_LastX, m_LastY; +}; + + +CMCVMinimapPanel::CMCVMinimapPanel( vgui::Panel *pParent, const char *pElementName ) + : CMinimapPanel( pElementName ) +{ + SetParent( pParent ); + m_MCVImage.Init( GetVPanel(), "hud/minimap/icon_mcv_unselected" ); + m_SelectedMCVImage.Init( GetVPanel(), "hud/minimap/icon_mcv_selected" ); + m_LastX = m_LastY = 0; +} + + +CMCVMinimapPanel::~CMCVMinimapPanel() +{ +} + + +void CMCVMinimapPanel::Paint() +{ + // Draw the minimap. + BaseClass::Paint(); + + // Now draw the MCVs. + if ( g_SelectionPanels.Count() > 0 ) + { + C_ObjMCVSelectionPanel *pPanel = g_SelectionPanels[ g_SelectionPanels.Head() ]; + C_BaseEntity *pSelectedMCV = C_BaseTFPlayer::GetLocalPlayer()->GetSelectedMCV(); + + for ( int i=0; i < pPanel->m_DeployedTeleportStations.Count(); i++ ) + { + C_VehicleTeleportStation *pStation = pPanel->m_DeployedTeleportStations[i]; + if ( pStation ) + { + float x, y; + if ( WorldToMinimap( MINIMAP_CLAMP, pStation->GetAbsOrigin(), x, y ) ) + { + int size = 20; + + if ( pStation == pSelectedMCV ) + m_SelectedMCVImage.DoPaint( x-size/2, y-size/2, size, size ); + else + m_MCVImage.DoPaint( x-size/2, y-size/2, size, size ); + } + } + } + } +} + + + +void CMCVMinimapPanel::OnMousePressed( vgui::MouseCode code ) +{ + BaseClass::OnMousePressed( code ); + + if ( code != vgui::MOUSE_LEFT ) + return; + + // Now draw the MCVs. + if ( g_SelectionPanels.Count() > 0 ) + { + C_ObjMCVSelectionPanel *pPanel = g_SelectionPanels[ g_SelectionPanels.Head() ]; + + // Find the closest MCV to their mouse press. + int iClosest = -1; + float flClosest = 1e24; + Vector2D curMousePos( m_LastX, m_LastY ); + + for ( int i=0; i < pPanel->m_DeployedTeleportStations.Count(); i++ ) + { + C_VehicleTeleportStation *pStation = pPanel->m_DeployedTeleportStations[i]; + if ( pStation ) + { + Vector2D mcvPos; + if ( WorldToMinimap( MINIMAP_CLAMP, pStation->GetAbsOrigin(), mcvPos.x, mcvPos.y ) ) + { + float flTestDist = mcvPos.DistTo( curMousePos ); + if ( flTestDist < flClosest ) + { + flClosest = flTestDist; + iClosest = i; + } + } + } + } + + if ( iClosest != -1 && flClosest < 10 ) + { + C_VehicleTeleportStation *pClosest = pPanel->m_DeployedTeleportStations[iClosest]; + + char str[512]; + Q_snprintf( str, sizeof( str ), "SelectMCV %d", pClosest->entindex() ); + pPanel->SendClientCommand( str ); + } + } +} + + +void CMCVMinimapPanel::OnCursorMoved( int x, int y ) +{ + BaseClass::OnCursorMoved( x, y ); + + m_LastX = x; + m_LastY = y; +} + + + +// ------------------------------------------------------------------------------------------------ // +// CMCVSelectionPanel +// ------------------------------------------------------------------------------------------------ // + +class CMCVSelectionPanel : public CObjectControlPanel +{ + DECLARE_CLASS( CMCVSelectionPanel, CObjectControlPanel ); + + +public: + + CMCVSelectionPanel( vgui::Panel *parent, const char *panelName ); + virtual ~CMCVSelectionPanel(); + + virtual bool Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ); + virtual void OnCommand( const char *command ); + + +private: + + CMCVMinimapPanel *m_pMinimapPanel; +}; + + +DECLARE_VGUI_SCREEN_FACTORY( CMCVSelectionPanel, "mcv_selection_panel" ); + + +CMCVSelectionPanel::CMCVSelectionPanel( vgui::Panel *parent, const char *panelName ) + : BaseClass( parent, "CMCVSelectionPanel" ) +{ + m_pMinimapPanel = new CMCVMinimapPanel( this, "MinimapPanel" ); + m_pMinimapPanel->SetZPos( 10 ); + m_pMinimapPanel->Init( NULL ); +} + + +CMCVSelectionPanel::~CMCVSelectionPanel() +{ + delete m_pMinimapPanel; +} + + +bool CMCVSelectionPanel::Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ) +{ + if ( !BaseClass::Init( pKeyValues, pInitData ) ) + return false; + + m_pMinimapPanel->LevelInit( engine->GetLevelName() ); + m_pMinimapPanel->SetVisible( true ); + + return true; +} + + +void CMCVSelectionPanel::OnCommand( const char *command ) +{ + BaseClass::OnCommand( command ); +} + + + |