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.
322 lines
7.2 KiB
322 lines
7.2 KiB
//========= 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); |
|
}
|
|
|