Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "hud.h"
#include "text_message.h"
#include "hud_macros.h"
#include "iclientmode.h"
#include "view.h"
#include <KeyValues.h>
#include <vgui/ISurface.h>
#include <vgui_controls/Panel.h>
#include "VGuiMatSurface/IMatSystemSurface.h"
#include "materialsystem/imaterial.h"
#include "materialsystem/imesh.h"
#include "materialsystem/imaterialvar.h"
#include "IEffects.h"
#include "hudelement.h"
using namespace vgui;
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define DMG_IMAGE_LIFE 2 // seconds that image is up
#define NUM_DMG_TYPES 8
typedef struct { float flExpire; float flBaseline; int x; int y; CHudTexture *icon; long fFlags; } damagetile_t;
//-----------------------------------------------------------------------------
// Purpose: HDU Damage type tiles
//-----------------------------------------------------------------------------
class CHudDamageTiles : public CHudElement, public vgui::Panel { DECLARE_CLASS_SIMPLE( CHudDamageTiles, vgui::Panel );
public: CHudDamageTiles( const char *pElementName );
void Init( void ); void VidInit( void ); void Reset( void ); bool ShouldDraw( void );
// Handler for our message
void MsgFunc_Damage(bf_read &msg);
private: void Paint(); void ApplySchemeSettings(vgui::IScheme *pScheme);
private: CHudTexture *DamageTileIcon( int i ); long DamageTileFlags( int i ); void UpdateTiles( long bits );
private: long m_bitsDamage; damagetile_t m_dmgTileInfo[ NUM_DMG_TYPES ]; };
DECLARE_HUDELEMENT( CHudDamageTiles ); DECLARE_HUD_MESSAGE( CHudDamageTiles, Damage );
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CHudDamageTiles::CHudDamageTiles( const char *pElementName ) : CHudElement( pElementName ), BaseClass(NULL, "HudDamageTiles") { vgui::Panel *pParent = g_pClientMode->GetViewport(); SetParent( pParent ); SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT ); }
void CHudDamageTiles::Init( void ) { HOOK_HUD_MESSAGE( CHudDamageTiles, Damage ); }
void CHudDamageTiles::VidInit( void ) { Reset(); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudDamageTiles::Reset( void ) { m_bitsDamage = 0; for ( int i = 0; i < NUM_DMG_TYPES; i++ ) { m_dmgTileInfo[ i ].flExpire = 0; m_dmgTileInfo[ i ].flBaseline = 0; m_dmgTileInfo[ i ].x = 0; m_dmgTileInfo[ i ].y = 0; m_dmgTileInfo[ i ].icon = DamageTileIcon( i ); m_dmgTileInfo[ i ].fFlags = DamageTileFlags( i ); } }
CHudTexture *CHudDamageTiles::DamageTileIcon( int i ) { switch ( i ) { case 0: default: return gHUD.GetIcon( "dmg_poison" ); break; case 1: return gHUD.GetIcon( "dmg_chem" ); break; case 2: return gHUD.GetIcon( "dmg_cold" ); break; case 3: return gHUD.GetIcon( "dmg_drown" ); break; case 4: return gHUD.GetIcon( "dmg_heat" ); break; case 5: return gHUD.GetIcon( "dmg_gas" ); break; case 6: return gHUD.GetIcon( "dmg_rad" ); break; case 7: return gHUD.GetIcon( "dmg_shock" ); break; } }
long CHudDamageTiles::DamageTileFlags( int i ) { switch ( i ) { case 0: default: return DMG_POISON;
case 1: return DMG_ACID;
case 2: // HL2 hijacked DMG_FREEZE and made it DMG_VEHICLE
// HL2 hijacked DMG_SLOWFREEZE and made it DMG_DISSOLVE
// return DMG_FREEZE | DMG_SLOWFREEZE;
return DMG_VEHICLE | DMG_DISSOLVE;
case 3: return DMG_DROWN;
case 4: return DMG_BURN | DMG_SLOWBURN;
case 5: return DMG_NERVEGAS;
case 6: return DMG_RADIATION;
case 7: return DMG_SHOCK; } }
//-----------------------------------------------------------------------------
// Purpose: Message handler for Damage message
//-----------------------------------------------------------------------------
void CHudDamageTiles::MsgFunc_Damage( bf_read &msg ) { msg.ReadByte(); // armor
msg.ReadByte(); // health
long bitsDamage = msg.ReadLong(); // damage bits, ignore
UpdateTiles( bitsDamage ); }
bool CHudDamageTiles::ShouldDraw( void ) { if ( !CHudElement::ShouldDraw() ) return false;
if ( !m_bitsDamage ) return false;
return true; }
void CHudDamageTiles::Paint( void ) { int r, g, b, a, nUnused; damagetile_t *pDmgTile; Color clrTile;
(gHUD.m_clrYellowish).GetColor( r, g, b, nUnused ); a = (int)( fabs( sin( gpGlobals->curtime * 2 ) ) * 256.0 ); clrTile.SetColor( r, g, b, a );
int i; // Draw all the items
for ( i = 0; i < NUM_DMG_TYPES; i++ ) { pDmgTile = &m_dmgTileInfo[ i ]; if ( m_bitsDamage & pDmgTile->fFlags ) { if ( pDmgTile->icon ) { ( pDmgTile->icon )->DrawSelf( pDmgTile->x, pDmgTile->y, clrTile ); } } }
// check for bits that should be expired
for ( i = 0; i < NUM_DMG_TYPES; i++ ) { pDmgTile = &m_dmgTileInfo[ i ];
if ( m_bitsDamage & pDmgTile->fFlags ) { pDmgTile->flExpire = MIN( gpGlobals->curtime + DMG_IMAGE_LIFE, pDmgTile->flExpire );
if ( pDmgTile->flExpire <= gpGlobals->curtime // when the time has expired
&& a < 40 ) // and the flash is at the low point of the cycle
{ pDmgTile->flExpire = 0;
int y = pDmgTile->y; pDmgTile->x = 0; pDmgTile->y = 0;
m_bitsDamage &= ~pDmgTile->fFlags; // clear the bits
// move everyone above down
for ( int j = 0; j < NUM_DMG_TYPES; j++ ) { damagetile_t *pDmgTileIter = &m_dmgTileInfo[ j ]; if ( ( pDmgTileIter->y ) && ( pDmgTileIter->y < y ) && ( pDmgTileIter->icon ) ) pDmgTileIter->y += ( pDmgTileIter->icon )->Height(); } } } } }
void CHudDamageTiles::UpdateTiles( long bitsDamage ) { damagetile_t *pDmgTile;
// Which types are new?
long bitsOn = ~m_bitsDamage & bitsDamage; for ( int i = 0; i < NUM_DMG_TYPES; i++ ) { pDmgTile = &m_dmgTileInfo[ i ];
// Is this one already on?
if ( m_bitsDamage & pDmgTile->fFlags ) { pDmgTile->flExpire = gpGlobals->curtime + DMG_IMAGE_LIFE; // extend the duration
if ( !pDmgTile->flBaseline ) { pDmgTile->flBaseline = gpGlobals->curtime; } }
// Are we just turning it on?
if ( bitsOn & pDmgTile->fFlags ) { // put this one at the bottom
if ( pDmgTile->icon ) { pDmgTile->x = ( pDmgTile->icon )->Width() / 8; pDmgTile->y = GetTall() - ( pDmgTile->icon )->Height() * 2; } pDmgTile->flExpire = gpGlobals->curtime + DMG_IMAGE_LIFE; // move everyone else up
for ( int j = 0; j < NUM_DMG_TYPES; j++ ) { if ( j == i ) continue;
pDmgTile = &m_dmgTileInfo[ j ]; if ( pDmgTile->y && pDmgTile->icon ) pDmgTile->y -= ( pDmgTile->icon )->Height();
} pDmgTile = &m_dmgTileInfo[ i ]; } }
// damage bits are only turned on here; they are turned off when the draw time has expired (in Paint())
m_bitsDamage |= bitsDamage; }
void CHudDamageTiles::ApplySchemeSettings(vgui::IScheme *pScheme) { BaseClass::ApplySchemeSettings(pScheme); SetPaintBackgroundEnabled(false); }
|