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.
279 lines
6.9 KiB
279 lines
6.9 KiB
//========= 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 ); |
|
} |
|
|
|
|
|
|
|
|