//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: MiniMap.h: interface for the CMiniMap class. // // $NoKeywords: $ //=============================================================================// #if !defined HLTVPANEL_H #define HLTVPANEL_H #ifdef _WIN32 #pragma once #endif #include #include #include "mathlib/vector.h" #include #include #include #include "hudelement.h" class IMapOverviewPanel { public: virtual void SetMode( int mode ) = 0; virtual int GetMode( void ) = 0; virtual void FlashEntity( int entityID ) = 0; virtual void SetPlayerPositions(int index, const Vector &position, const QAngle &angle) = 0; virtual void SetVisible(bool state) = 0; virtual float GetZoom( void ) = 0; virtual vgui::Panel *GetAsPanel() = 0; virtual bool AllowConCommandsWhileAlive() = 0; virtual void SetPlayerPreferredMode( int mode ) = 0; virtual void SetPlayerPreferredViewSize( float viewSize ) = 0; virtual bool IsVisible() = 0; virtual void GetBounds(int &x, int &y, int &wide, int &tall) = 0; virtual float GetFullZoom( void ) = 0; virtual float GetMapScale( void ) = 0; }; #define MAX_TRAIL_LENGTH 30 #define OVERVIEW_MAP_SIZE 1024 // an overview map is 1024x1024 pixels typedef bool ( *FnCustomMapOverviewObjectPaint )( int textureID, Vector pos, float scale, float angle, const char *text, Color *textColor, float status, Color *statusColor ); class CMapOverview : public CHudElement, public vgui::Panel, public IMapOverviewPanel { DECLARE_CLASS_SIMPLE( CMapOverview, vgui::Panel ); public: enum { MAP_MODE_OFF = 0, // Totally off MAP_MODE_INSET, // A little map up in a corner MAP_MODE_FULL, // Full screen, full map MAP_MODE_RADAR // In game radar, extra functionality }; CMapOverview( const char *pElementName ); virtual ~CMapOverview(); virtual bool ShouldDraw( void ); vgui::Panel *GetAsPanel(){ return this; } virtual bool AllowConCommandsWhileAlive(){return true;} virtual void SetPlayerPreferredMode( int mode ){} virtual void SetPlayerPreferredViewSize( float viewSize ){}; protected: // private structures & types float GetViewAngle( void ); // The angle that determines the viewport twist from map texture to panel drawing. // list of game events the hLTV takes care of typedef struct { int xpos; int ypos; } FootStep_t; typedef struct MapPlayer_s { int index; // player's index int userid; // user ID on server int icon; // players texture icon ID Color color; // players team color char name[MAX_PLAYER_NAME_LENGTH]; int team; // N,T,CT int health; // 0..100, 7 bit Vector position; // current x,y pos QAngle angle; // view origin 0..360 Vector2D trail[MAX_TRAIL_LENGTH]; // save 1 footstep each second for 1 minute } MapPlayer_t; typedef struct MapObject_s { int objectID; // unique object ID int index; // entity index if any int icon; // players texture icon ID Color color; // players team color char name[MAX_PLAYER_NAME_LENGTH]; // show text under icon Vector position; // current x,y pos QAngle angle; // view origin 0..360 float endtime; // time stop showing object float size; // object size float status; // green status bar [0..1], -1 = disabled Color statusColor; // color of status bar int flags; // MAB_OBJECT_* const char *text; // text to draw underneath the icon } MapObject_t; #define MAP_OBJECT_ALIGN_TO_MAP (1<<0) public: // IViewPortPanel interface: virtual const char *GetName( void ) { return PANEL_OVERVIEW; } virtual void SetData(KeyValues *data); virtual void Reset(); virtual void OnThink(); virtual void Update(); virtual bool NeedsUpdate( void ); virtual bool HasInputElements( void ) { return false; } virtual void ShowPanel( bool bShow ); virtual void Init( void ); // both vgui::Frame and IViewPortPanel define these, so explicitly define them here as passthroughs to vgui vgui::VPANEL GetVPanel( void ) { return BaseClass::GetVPanel(); } virtual bool IsVisible() { return BaseClass::IsVisible(); } virtual void GetBounds(int &x, int &y, int &wide, int &tall) { BaseClass::GetBounds(x, y, wide, tall); } virtual void SetParent(vgui::VPANEL parent) { BaseClass::SetParent(parent); } public: // IGameEventListener virtual void FireGameEvent( IGameEvent *event); public: // VGUI overrides virtual void Paint(); virtual void OnMousePressed( vgui::MouseCode code ); virtual void ApplySchemeSettings(vgui::IScheme *scheme); virtual void SetVisible(bool state){BaseClass::SetVisible(state);} public: virtual float GetZoom( void ); virtual int GetMode( void ); virtual float GetFullZoom( void ){ return m_fFullZoom; } virtual float GetMapScale( void ){ return m_fMapScale; } // Player settings: virtual void ShowPlayerNames(bool state); virtual void ShowPlayerHealth(bool state); virtual void ShowPlayerTracks(float seconds); virtual void SetPlayerPositions(int index, const Vector &position, const QAngle &angle); // general settings: virtual void SetMap(const char * map); virtual void SetTime( float time ); virtual void SetMode( int mode ); virtual bool SetTeamColor(int team, Color color); virtual void SetFollowAngle(bool state); virtual void SetFollowEntity(int entindex); // 0 = off virtual void SetCenter( const Vector2D &mappos); virtual void SetAngle( float angle); virtual Vector2D WorldToMap( const Vector &worldpos ); // Object settings virtual int AddObject( const char *icon, int entity, float timeToLive ); // returns object ID, 0 = no entity, -1 = forever virtual void SetObjectIcon( int objectID, const char *icon, float size ); // icon world size virtual void SetObjectText( int objectID, const char *text, Color color ); // text under icon virtual void SetObjectStatus( int objectID, float value, Color statusColor ); // status bar under icon virtual void SetObjectPosition( int objectID, const Vector &position, const QAngle &angle ); // world pos/angles virtual void AddObjectFlags( int objectID, int flags ); virtual void SetObjectFlags( int objectID, int flags ); virtual void RemoveObject( int objectID ); virtual void RemoveObjectByIndex( int index ); virtual void FlashEntity( int entityID ){} // rules that define if you can see a player on the overview or not virtual bool CanPlayerBeSeen(MapPlayer_t *player); /// allows mods to restrict health virtual bool CanPlayerHealthBeSeen(MapPlayer_t *player); /// allows mods to restrict names (e.g. CS when mp_playerid is non-zero) virtual bool CanPlayerNameBeSeen(MapPlayer_t *player); virtual int GetIconNumberFromTeamNumber( int teamNumber ){return teamNumber;} protected: virtual void DrawCamera(); virtual void DrawObjects(); virtual void DrawMapTexture(); virtual void DrawMapPlayers(); virtual void DrawMapPlayerTrails(); virtual void UpdatePlayerTrails(); virtual void ResetRound(); virtual void InitTeamColorsAndIcons(); virtual void UpdateSizeAndPosition(); virtual bool RunHudAnimations(){ return true; } bool IsInPanel(Vector2D &pos); MapPlayer_t* GetPlayerByUserID( int userID ); int AddIconTexture(const char *filename); Vector2D MapToPanel( const Vector2D &mappos ); int GetPixelOffset( float height ); void UpdateFollowEntity(); virtual void UpdatePlayers(); void UpdateObjects(); // objects bound to entities MapObject_t* FindObjectByID(int objectID); virtual bool IsRadarLocked() {return false;} virtual bool DrawIcon( MapObject_t *obj ); /*virtual bool DrawIcon( int textureID, int offscreenTextureID, Vector pos, float scale, float angle, int alpha = 255, const char *text = NULL, Color *textColor = NULL, float status = -1, Color *statusColor = NULL, int objectType = OBJECT_TYPE_NORMAL );*/ int m_nMode; Vector2D m_vPosition; Vector2D m_vSize; float m_flChangeSpeed; float m_flIconSize; IViewPort * m_pViewPort; MapPlayer_t m_Players[MAX_PLAYERS]; CUtlDict< int, int> m_TextureIDs; CUtlVector m_Objects; Color m_TeamColors[MAX_TEAMS]; int m_TeamIcons[MAX_TEAMS]; int m_ObjectIcons[64]; int m_ObjectCounterID; vgui::HFont m_hIconFont; bool m_bShowNames; bool m_bShowTrails; bool m_bShowHealth; int m_nMapTextureID; // texture id for current overview image KeyValues * m_MapKeyValues; // keyvalues describing overview parameters Vector m_MapOrigin; // read from KeyValues files float m_fMapScale; // origin and scale used when screenshot was made bool m_bRotateMap; // if true roatate map around 90 degress, so it fits better to 4:3 screen ratio int m_nFollowEntity;// entity number to follow, 0 = off CPanelAnimationVar( float, m_fZoom, "zoom", "1.0" ); // current zoom n = overview panel shows 1/n^2 of whole map' float m_fFullZoom; // best zoom factor for full map view (1.0 is map is a square) Vector2D m_ViewOrigin; // map coordinates that are in the center of the pverview panel Vector2D m_MapCenter; // map coordinates that are in the center of the pverview panel float m_fNextUpdateTime; float m_fViewAngle; // rotation of overview map float m_fWorldTime; // current world time float m_fNextTrailUpdate; // next time to update player trails float m_fTrailUpdateInterval; // if -1 don't show trails bool m_bFollowAngle; // if true, map rotates with view angle }; extern IMapOverviewPanel *g_pMapOverview; #endif //