Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

575 lines
16 KiB

//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef SFOVERVIEWMAP_H_
#define SFOVERVIEWMAP_H_
#include "hud.h"
#include "hud_element_helper.h"
#include "scaleformui/scaleformui.h"
#include "HUD/sfhudflashinterface.h"
#include "HUD/sfhudradar.h"
#include "c_cs_hostage.h"
#include "usermessages.h"
#define MAX_GRENADES 30
class SFMapOverview : public SFHudFlashInterface
{
// this manages the display of the players and hostages
// in the radar
protected:
enum ICON_PACK_TYPE
{
ICON_PACK_PLAYER,
ICON_PACK_HOSTAGE,
ICON_PACK_GRENADES,
ICON_PACK_DEFUSER,
};
enum
{
R_BELOW = 0,
R_SAMELEVEL = 1,
R_ABOVE = 2,
};
// each enum represents an icon that this class is managing
enum PLAYER_ICON_INDICES
{
PI_GRENADE_HE,
PI_GRENADE_FLASH,
PI_GRENADE_SMOKE,
PI_GRENADE_MOLOTOV,
PI_GRENADE_DECOY,
PI_DEFUSER,
PI_ABOVE,
PI_BELOW,
PI_FLASHED,
PI_PLAYER_NUMBER,
PI_PLAYER_NAME_CT,
PI_PLAYER_NAME_T,
PI_FIRST_ROTATED,
PI_PLAYER_INDICATOR = PI_FIRST_ROTATED,
PI_SPEAKING,
PI_HOSTAGE_MOVING,
PI_CT,
PI_CT_DEAD,
PI_CT_GHOST,
PI_T,
PI_T_DEAD,
PI_T_GHOST,
PI_ENEMY,
PI_ENEMY_DEAD,
PI_ENEMY_GHOST,
PI_HOSTAGE,
PI_HOSTAGE_DEAD,
PI_HOSTAGE_GHOST,
PI_DIRECTION_INDICATOR,
PI_MUZZLE_FLASH,
PI_LOWHEALTH,
PI_SELECTED,
PI_NUM_ICONS
};
class SFMapOverviewIconPackage
{
public:
SFMapOverviewIconPackage();
~SFMapOverviewIconPackage();
// zero all the internal variables
void ClearAll( void );
// get handles to the icons which will all be children
// of the iconPackage handle
void Init( IScaleformUI* pui, SFVALUE iconPackage );
// release all the handles, and clear all the variables
// used when removing players or changing maps
void NukeFromOrbit( SFMapOverview* pSFUI );
// reset all variables to their start of round values
void StartRound( void );
// set the states for this player
void SetIsPlayer( bool value );
void SetIsSpeaking ( bool value );
void SetIsOffMap( bool value );
void SetIsLowHealth( bool value );
void SetIsSelected( bool value );
void SetIsFlashed( bool value );
void SetIsFiring( bool value );
void SetIsAboveOrBelow( int value );
void SetIsMovingHostage( bool value );
void SetIsDead( bool value );
void SetIsRescued( bool value );
void SetPlayerTeam( int team );
void SetIsSpotted( bool value );
void SetAlpha( float newAlpha );
void SetIsOnLocalTeam( bool value );
void SetIsControlledBot( void );
void SetIsDefuse( bool bValue );
void SetGrenadeType( int value );
void SetGrenadeExpireTime( float value );
// given the current set of states, decide which
// icons should be shown and which should be hidden
void SetupIconsFromStates( void );
// each bit in newFlags represents the visibility of one of the
// icons in the PLAYER_ICON_INDICES. If the bit is on, the icon
// is shown.
void SetVisibilityFlags( uint64 newFlags );
bool IsHostageType( void ) { return m_IconPackType == ICON_PACK_HOSTAGE;}
bool IsGrenadeType( void ) { return m_IconPackType == ICON_PACK_GRENADES;}
bool IsPlayerType( void ) { return m_IconPackType == ICON_PACK_PLAYER;}
bool IsDefuserType( void ) { return m_IconPackType == ICON_PACK_DEFUSER;}
bool IsVisible( void );
public:
// pointer to scaleform
IScaleformUI* m_pScaleformUI;
// the parent for all the icons
SFVALUE m_IconPackage;
SFVALUE m_IconPackageRotate;
// the handles for all the icons listed in PLAYER_ICON_INDICES
SFVALUE m_Icons[PI_NUM_ICONS];
// the location and position of this player/hostage
// only updated when the player is spotted
Vector m_Position; // current x,y pos
QAngle m_Angle; // view origin 0..360
// ignore visibility updates until a little time has passed
// this keeps track of when the round started
float m_fRoundStartTime;
// the time at which this player/hostage died ( or was rescued )
// used to calculate the alpha of the X icon.
float m_fDeadTime;
// the time at which the player / hostage was last spotted
// used to fade out the ? icon
float m_fGhostTime;
// the alpha currently used to display all icons
// used to lazy update the actual scaleform value
float m_fCurrentAlpha;
// each bit represents one of the PLAYER_ICON_INDICES
// used to lazy update the visibility of the icons in scaleform
uint64 m_iCurrentVisibilityFlags;
// the index of this player/hostage in the radar.
// used to create the instance name of the icon package in flash
int m_iIndex;
// set from the player objects UserID or EntityID ( for the hostages ). Lets us find the radar
// object that represents a player / hostage
int m_iEntityID;
// state variables used to keep track of the player / hostage state
// so we know which icon( s ) to show
int m_Health; // 0..100, 7 bit
wchar_t m_wcName[MAX_PLAYER_NAME_LENGTH+1];
// the base icon for the player
int m_iPlayerType; // will be PI_CT, PI_T, or PI_HOSTAGE
int m_nAboveOrBelow;// R_BELOW = 0,R_SAMELEVEL = 1,R_ABOVE = 2,
int m_nGrenadeType;
float m_fGrenExpireTime;
ICON_PACK_TYPE m_IconPackType;
bool m_bIsActive : 1;
bool m_bOffMap : 1;
bool m_bIsLowHealth : 1;
bool m_bIsSelected : 1;
bool m_bIsFlashed : 1;
bool m_bIsFiring : 1;
bool m_bIsPlayer : 1;
bool m_bIsSpeaking : 1;
bool m_bIsDead : 1;
bool m_bIsMovingHostage : 1;
bool m_bIsSpotted : 1;
bool m_bIsRescued : 1;
bool m_bIsOnLocalTeam : 1;
bool m_bIsDefuser : 1;
// don't put anything new after the bitfields or suffer the Wrath of the Compiler!
};
// this little class manages the display of the hostage
// indicators in the panel
class SFMapOverviewHostageIcons
{
public:
enum HOSTAGE_ICON_INDICES
{
HI_DEAD,
HI_RESCUED,
HI_ALIVE,
HI_TRANSIT,
HI_NUM_ICONS,
HI_UNUSED = HI_NUM_ICONS,
};
public:
SFMapOverviewHostageIcons();
~SFMapOverviewHostageIcons();
void Init( IScaleformUI* scaleformui, SFVALUE iconPackage );
void ReleaseHandles( SFMapOverview* pradar );
void SetStatus( int status );
public:
IScaleformUI* m_pScaleformUI;
// the parent object of all the icons
SFVALUE m_IconPackage;
// the icons which represent each of the HOSTAGE_ICON_INDICES
SFVALUE m_Icons[HI_NUM_ICONS];
// the index of the icon that is currently shown
int m_iCurrentIcon;
};
// this just keeps track of the bombzone and hostagezone
// icons that are shown on the radar
struct SFMapOverviewGoalIcon
{
Vector m_Position;
SFVALUE m_Icon;
};
public:
explicit SFMapOverview( const char *value );
virtual ~SFMapOverview();
// These overload the CHudElement class
virtual void ProcessInput( void );
virtual void LevelInit( void );
virtual void LevelShutdown( void );
virtual void SetActive( bool bActive );
virtual void Init( void );
virtual bool ShouldDraw( void );
bool CanShowOverview( void );
// these overload the ScaleformFlashInterfaceMixin class
virtual void FlashLoaded( void );
virtual void FlashReady( void );
virtual bool PreUnloadFlash( void );
void MapLoaded( SCALEFORM_CALLBACK_ARGS_DECL );
void ToggleOverviewMap( SCALEFORM_CALLBACK_ARGS_DECL );
// overloads for the CGameEventListener class
virtual void FireGameEvent( IGameEvent *event );
bool MsgFunc_ProcessSpottedEntityUpdate( const CCSUsrMsg_ProcessSpottedEntityUpdate &msg );
void UpdateAllPlayerNamesAndNumbers( void );
void UpdatePlayerNameAndNumber( SFMapOverviewIconPackage* pPackage );
void ShowMapOverview( bool value );
bool IsMapOverviewShown( void ) {return (m_bShowMapOverview && m_bVisible);}
void AllowMapDrawing( SCALEFORM_CALLBACK_ARGS_DECL );
// void GetNavPath( SCALEFORM_CALLBACK_ARGS_DECL );
void GetWorldDistance( SCALEFORM_CALLBACK_ARGS_DECL );
void RefreshGraphs( void );
protected:
void ResetRadar( bool bResetGlobalStates = true );
void ResetForNewMap( void );
void ResetRound( void );
void SetMap( const char* pMapName );
void WorldToRadar( const Vector& ptin, Vector& ptout );
void RadarToWorld( const Vector& ptin, Vector& ptout );
void LazyCreateGoalIcons( void );
void FlashLoadMap( const char* pMapName );
void InitIconPackage( SFMapOverviewIconPackage* pPlayer, int iAbsoluteIndex, ICON_PACK_TYPE packType );
void RemoveIconPackage( SFMapOverviewIconPackage* pPlayer );
SFMapOverviewIconPackage* CreatePlayer( int index );
void ResetPlayer( int index );
void RemovePlayer( int index );
SFMapOverviewIconPackage* CreateHostage( int index );
void ResetHostage( int index );
void RemoveHostage( int index );
void RemoveStaleHostages( void );
SFMapOverviewIconPackage* CreateGrenade( int entityID, int nGrenadeType );
void RemoveAllGrenades( void );
void RemoveGrenade( int index );
SFMapOverviewIconPackage * CreateDefuser( int nEntityID );
SFMapOverviewIconPackage * GetDefuser( int nEntityID, bool bCreateIfNotFound = false );
void SetDefuserPos( int nEntityID, int x, int y, int z, int a );
void UpdateAllDefusers( void );
void RemoveAllDefusers( void );
void RemoveDefuser( int index );
bool LazyUpdateIconArray( SFMapOverviewIconPackage* pArray, int lastIndex );
virtual bool LazyCreateIconPackage( SFMapOverviewIconPackage* pPackage );
void LazyCreatePlayerIcons( void );
void SetPlayerTeam( int index, int team );
int GetPlayerIndexFromUserID( int userID );
int GetHostageIndexFromHostageEntityID( int entityID );
int GetGrenadeIndexFromEntityID( int entityID );
int GetDefuseIndexFromEntityID( int nEntityID );
void ApplySpectatorModes( void );
void PositionRadarViewpoint( void );
void PlaceGoalIcons( void );
void Show( bool show );
void ShowPanel( bool bShow );
void PlacePlayers();
void PlaceHostages();
void SetIconPackagePosition( SFMapOverviewIconPackage* pPackage );
void UpdateMiscIcons( void );
void SetVisibilityFlags( uint64 newFlags );
void SetupIconsFromStates( void );
bool IsEnemyCloseEnoughToShow( Vector vecEnemyPos );
void SetLocationText( wchar_t *newText );
void ResetRoundVariables( bool bResetGlobalStates = true );
void UpdateGrenades( void );
SFMapOverviewIconPackage* GetRadarPlayer( int index );
SFMapOverviewIconPackage* GetRadarHostage( int index );
SFMapOverviewIconPackage* GetRadarGrenade( int index );
SFMapOverviewIconPackage* GetRadarDefuser( int index );
SFMapOverviewIconPackage* GetRadarHeight( int index );
CUserMessageBinder m_UMCMsgProcessSpottedEntityUpdate;
protected:
// these are the icons used individually by the radar and panel
enum RADAR_ICON_INDICES
{
RI_BOMB_IS_PLANTED,
RI_BOMB_IS_PLANTED_MEDIUM,
RI_BOMB_IS_PLANTED_FAST,
RI_IN_HOSTAGE_ZONE,
RI_DASHBOARD,
RI_BOMB_ICON_PLANTED,
RI_BOMB_ICON_DROPPED,
RI_BOMB_ICON_BOMB_CT,
RI_BOMB_ICON_BOMB_T,
RI_BOMB_ICON_BOMB_ABOVE,
RI_BOMB_ICON_BOMB_BELOW,
RI_BOMB_ICON_PACKAGE,
RI_DEFUSER_ICON_DROPPED,
RI_DEFUSER_ICON_PACKAGE,
RI_NUM_ICONS,
};
enum
{
MAX_BOMB_ZONES = 2,
};
// this holds the names and indexes of the messages we receive so that
// we don't have to do a whole bunch of string compares to find them
static CUtlMap<const char*, int> m_messageMap;
// these are used to scale world coordinates to radar coordinates
Vector m_MapOrigin;
float m_fMapSize;
float m_fMapScale;
float m_fPixelToRadarScale;
float m_fWorldToPixelScale;
float m_fWorldToRadarScale;
// this is center of the radar in world and map coordinates
Vector m_RadarViewpointWorld;
Vector m_RadarViewpointMap;
float m_RadarRotation;
// the current position of the bomb
Vector m_BombPosition;
// the last time the bomb was seen. Used to fade
// out the bomb icon after it has dropped out of sight
float m_fBombSeenTime;
float m_fBombAlpha;
// the current position of the defuser
Vector m_DefuserPosition;
// the last time the defuser was seen. Used to fade
// out the defuser icon after it has dropped out of sight
float m_fDefuserSeenTime;
float m_fDefuserAlpha;
// a bitmap of the icons that are currently beeing shown.
// each bit corresponds to one the RADAR_ICON_INDICES
uint64 m_iCurrentVisibilityFlags;
// the handles to the RADAR_ICON_INDICES icons
SFVALUE m_AllIcons[RI_NUM_ICONS];
// Background panel
SFVALUE m_BackgroundPanel;
// handles to the radar movie clips in flash.
// there is a rotation and a translation layer each for the icons and for the background map.
// The map and the icons have separate layers because the map is behind a mask layer, and the
// icons are not.
// the root of the entire radar and dashboard
SFVALUE m_RadarModule;
// the root of the radar part of the module
SFVALUE m_Radar;
// the layers that handle the icons
SFVALUE m_IconTranslation;
SFVALUE m_IconRotation;
// the layers that handle the map
SFVALUE m_MapRotation;
SFVALUE m_MapTranslation;
// handles to the actual bomb zone and hostage icons that are defined
// in the flash file
SFVALUE m_HostageZoneIcons[MAX_HOSTAGE_RESCUES];
SFVALUE m_BombZoneIcons[MAX_BOMB_ZONES];
// "handle" to the text that holds the current location
ISFTextObject* m_LocationText;
// the last index of an active player in the m_Players array
int m_iLastPlayerIndex;
// the last index of an active hostage in the m_Hostages array
int m_iLastHostageIndex;
// the last index of an active decoy in the m_Grenades array
int m_iLastGrenadeIndex;
// the last index of an active defuser in the m_Defuser array
int m_iLastDefuserIndex;
// keeps the state information and icon handles for the players
SFMapOverviewIconPackage m_Players[MAX_PLAYERS];
// keeps the state information and icon handles for the hostages
SFMapOverviewIconPackage m_Hostages[MAX_HOSTAGES];
// keeps the state information and icon handles for the decoys
SFMapOverviewIconPackage m_Grenades[MAX_GRENADES];
// keeps the state information and icon handles for the decoys
SFMapOverviewIconPackage m_Defusers[MAX_PLAYERS];
// the handles to the hostage status icons that appear beneath the dashboard
SFMapOverviewHostageIcons m_HostageStatusIcons[MAX_HOSTAGES];
// a goal icon is either a bomb-area or a hostage-area icon
// This array holds the positions / handles of the ones that are active for the current map
int m_iNumGoalIcons;
SFMapOverviewGoalIcon m_GoalIcons[MAX_HOSTAGE_RESCUES + MAX_BOMB_ZONES];
// the current observer mode. Figures into the placement of the center of the radar
// and a few other things
int m_iObserverMode;
// there is a loaded and a desired so that we don't load the same map twice, and so that we
// can request that a map be loaded before the flash stuff is able to actually load it.
char m_cLoadedMapName[MAX_MAP_NAME+1];
char m_cDesiredMapName[MAX_MAP_NAME+1];
// the name of our current location
wchar_t m_wcLocationString[MAX_LOCATION_TEXT_LENGTH+1];
// // keeps track of weather flash is ready or not and if it's currently being loaded
bool m_bFlashLoading : 1;
bool m_bFlashReady : 1;
// this is set by a con command to hide the whole radar
bool m_bShowMapOverview : 1;
//
// // set to true in spectator mode if we're not in pro mode
bool m_bShowAll : 1;
//
// keep track of whether we've already gotten all the goal icons and player icons from the
// flash file. This is necessary because some of the level information is loaded before
// flash is ready
bool m_bGotGoalIcons : 1;
bool m_bGotPlayerIcons : 1;
// state information about which icons should be displayed
bool m_bShowingHostageZone : 1;
bool m_bBombPlanted : 1;
bool m_bBombDropped : 1;
bool m_bBombDefused : 1;
bool m_bBombExploded : 1;
bool m_bShowBombHighlight : 1;
bool m_bShowingDashboard : 1;
bool m_bBombIsSpotted : 1;
int m_nBombEntIndex;
bool m_bTrackDefusers;
bool m_bVisible;
// entities spotted last ProcessSpottedEntityUpdate
CBitVec<MAX_EDICTS> m_EntitySpotted;
};
#endif /* SFOVERVIEWMAP_H_ */