//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef CSSPECTATORGUI_H #define CSSPECTATORGUI_H #ifdef _WIN32 #pragma once #endif #include "spectatorgui.h" #include "mapoverview.h" #include "cs_shareddefs.h" extern ConVar mp_playerid; // in cs_gamerules.h extern ConVar mp_forcecamera; // in gamevars_shared.h extern ConVar mp_fadetoblack; //----------------------------------------------------------------------------- // Purpose: Cstrike Spectator UI //----------------------------------------------------------------------------- class CCSSpectatorGUI : public CSpectatorGUI { private: DECLARE_CLASS_SIMPLE( CCSSpectatorGUI, CSpectatorGUI ); public: CCSSpectatorGUI( IViewPort *pViewPort ); virtual void ApplySchemeSettings(vgui::IScheme *pScheme); virtual void UpdateSpectatorPlayerList( void ); virtual void Update( void ); virtual bool NeedsUpdate( void ); //============================================================================= // HPE_BEGIN: // [smessick] //============================================================================= virtual void ShowPanel( bool bShow ); //============================================================================= // HPE_END //============================================================================= protected: void UpdateTimer(); void UpdateAccount(); int m_nLastAccount; int m_nLastTime; int m_nLastSpecMode; CBaseEntity *m_nLastSpecTarget; void StoreWidths( void ); void ResizeControls( void ); bool ControlsPresent( void ) const; vgui::Label *m_pCTLabel; vgui::Label *m_pCTScore; vgui::Label *m_pTerLabel; vgui::Label *m_pTerScore; vgui::Label *m_pTimer; vgui::Label *m_pTimerLabel; vgui::Panel *m_pDivider; vgui::Label *m_pExtraInfo; bool m_modifiedWidths; int m_scoreWidth; int m_extraInfoWidth; }; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// #define DESIRED_RADAR_RESOLUTION 450 class CCSMapOverview : public CMapOverview { DECLARE_CLASS_SIMPLE( CCSMapOverview, CMapOverview ); public: enum { MAP_ICON_T = 0, MAP_ICON_CT, MAP_ICON_HOSTAGE, MAP_ICON_COUNT }; CCSMapOverview( const char *pElementName ); virtual ~CCSMapOverview(); virtual bool ShouldDraw( void ); vgui::Panel *GetAsPanel(){ return this; } virtual bool AllowConCommandsWhileAlive(){return false;} virtual void SetPlayerPreferredMode( int mode ); virtual void SetPlayerPreferredViewSize( float viewSize ); virtual void ApplySchemeSettings( vgui::IScheme *scheme ); protected: // private structures & types // list of game events the hLTV takes care of typedef struct { int xpos; int ypos; } FootStep_t; // Extra stuff in a this-level parallel array typedef struct CSMapPlayer_s { int overrideIcon; // if not -1, the icon to use instead int overrideIconOffscreen; // to use with overrideIcon float overrideFadeTime; // Time to start fading the override icon float overrideExpirationTime; // Time to not use the override icon any more Vector overridePosition; // Where the overridden icon will draw QAngle overrideAngle; // And at what angle bool isDead; // Death latch, since client can be behind the times on health messages. float timeLastSeen; // curtime that we last saw this guy. float timeFirstSeen; // curtime that we started seeing this guy bool isHostage; // Not a full player, a hostage. Special icon, different death event float flashUntilTime; float nextFlashPeakTime; int currentFlashAlpha; } CSMapPlayer_t; typedef struct CSMapBomb_s { Vector position; enum BombState { BOMB_PLANTED, //planted and ticking down BOMB_DROPPED, //dropped and lying loose BOMB_CARRIED, //in the arms of a player BOMB_GONE, //defused or exploded, but was planted BOMB_INVALID //no bomb }; BombState state; float timeLastSeen; float timeFirstSeen; float timeFade; float timeGone; float currentRingRadius; float currentRingAlpha; float maxRingRadius; float ringTravelTime; } CSMapBomb_t; typedef struct CSMapGoal_s { Vector position; int iconToUse; } CSMapGoal_t; public: // IViewPortPanel interface: virtual void Update(); 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 SetParent(vgui::VPANEL parent) { BaseClass::SetParent(parent); } // IGameEventListener virtual void FireGameEvent( IGameEvent *event); // VGUI overrides // Player settings: void SetPlayerSeen( int index ); void SetBombSeen( bool seen ); // general settings: virtual void SetMap(const char * map); virtual void SetMode( int mode ); // Object settings 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); virtual int GetIconNumberFromTeamNumber( int teamNumber ); protected: virtual void DrawCamera(); virtual void DrawMapTexture(); virtual void DrawMapPlayers(); void DrawHostages(); void DrawBomb(); void DrawGoalIcons(); virtual void ResetRound(); virtual void InitTeamColorsAndIcons(); virtual void UpdateSizeAndPosition(); void UpdateGoalIcons(); void ClearGoalIcons(); virtual bool IsRadarLocked(); Vector2D PanelToMap( const Vector2D &panelPos ); bool AdjustPointToPanel(Vector2D *pos); MapPlayer_t* GetPlayerByEntityID( int entityID ); MapPlayer_t* GetHostageByEntityID( int entityID ); virtual void UpdatePlayers(); void UpdateHostages();///< Update hostages in the MapPlayer list void UpdateBomb(); void UpdateFlashes(); bool CreateRadarImage(const char *mapName, const char *radarFileName); virtual bool RunHudAnimations(){ return false; } private: bool DrawIconCS( int textureID, int offscreenTextureID, Vector pos, float scale, float angle, int alpha, bool allowRotation = true, const char *text = NULL, Color *textColor = NULL, float status = -1, Color *statusColor = NULL ); int GetMasterAlpha( void );// The main alpha that the map part should be, determined by using the mode to look at the right convar int GetBorderSize( void );// How far in from the edge of the panel we draw, based on mode. Let's the background fancy corners show. CSMapPlayer_t* GetCSInfoForPlayerIndex( int index ); CSMapPlayer_t* GetCSInfoForPlayer(MapPlayer_t *player); CSMapPlayer_t* GetCSInfoForHostage(MapPlayer_t *hostage); bool CanHostageBeSeen(MapPlayer_t *hostage); CSMapPlayer_t m_PlayersCSInfo[MAX_PLAYERS]; CSMapBomb_t m_bomb; MapPlayer_t m_Hostages[MAX_HOSTAGES]; CSMapPlayer_t m_HostagesCSInfo[MAX_HOSTAGES]; CUtlVector< CSMapGoal_t > m_goalIcons; bool m_goalIconsLoaded; int m_TeamIconsSelf[MAP_ICON_COUNT]; int m_TeamIconsDead[MAP_ICON_COUNT]; int m_TeamIconsOffscreen[MAP_ICON_COUNT]; int m_TeamIconsDeadOffscreen[MAP_ICON_COUNT]; int m_bombIconPlanted; int m_bombIconDropped; int m_bombIconCarried; int m_bombRingPlanted; int m_bombRingDropped; int m_bombRingCarried; int m_bombRingCarriedOffscreen; int m_radioFlash; int m_radioFlashOffscreen; int m_radarTint; int m_hostageFollowing; int m_hostageFollowingOffscreen; int m_playerFacing; int m_cameraIconFirst; int m_cameraIconThird; int m_cameraIconFree; int m_hostageRescueIcon; int m_bombSiteIconA; int m_bombSiteIconB; int m_nRadarMapTextureID; // texture id for radar version of current overview image int m_playerPreferredMode; // The mode the player wants to be in for when we aren't being the radar }; #endif // CSSPECTATORGUI_H