Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

280 lines
7.8 KiB

//========= 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