diff options
Diffstat (limited to 'game/client/game_controls/mapoverview.h')
| -rw-r--r-- | game/client/game_controls/mapoverview.h | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/game/client/game_controls/mapoverview.h b/game/client/game_controls/mapoverview.h new file mode 100644 index 0000000..edaa2d1 --- /dev/null +++ b/game/client/game_controls/mapoverview.h @@ -0,0 +1,275 @@ +//========= 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 <vgui_controls/Panel.h> +#include <game/client/iviewport.h> +#include "mathlib/vector.h" +#include <igameevents.h> +#include <shareddefs.h> +#include <const.h> +#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<MapObject_t> 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 // |