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:
//
// $NoKeywords: $
//
//=============================================================================//
//
// Health.cpp
//
// implementation of CHudHealth class
//
#include "cbase.h"
#include "hud.h"
#include "hud_macros.h"
#include "view.h"
#include "iclientmode.h"
#include <KeyValues.h>
#include <vgui/ISurface.h>
#include <vgui/ISystem.h>
#include <vgui_controls/AnimationController.h>
#include <vgui/ILocalize.h>
using namespace vgui;
#include "hudelement.h"
#include "hud_numericdisplay.h"
#include "ConVar.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define INIT_HEALTH -1
//-----------------------------------------------------------------------------
// Purpose: Health panel
//-----------------------------------------------------------------------------
class CHudHealth : public CHudElement, public CHudNumericDisplay { DECLARE_CLASS_SIMPLE( CHudHealth, CHudNumericDisplay );
public: CHudHealth( const char *pElementName ); virtual void Init( void ); virtual void VidInit( void ); virtual void Reset( void ); virtual void OnThink(); void MsgFunc_Damage( bf_read &msg );
private: // old variables
int m_iHealth; int m_bitsDamage; };
DECLARE_HUDELEMENT( CHudHealth ); DECLARE_HUD_MESSAGE( CHudHealth, Damage );
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CHudHealth::CHudHealth( const char *pElementName ) : CHudElement( pElementName ), CHudNumericDisplay(NULL, "HudHealth") { SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT ); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudHealth::Init() { HOOK_HUD_MESSAGE( CHudHealth, Damage ); Reset(); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudHealth::Reset() { m_iHealth = INIT_HEALTH; m_bitsDamage = 0;
wchar_t *tempString = g_pVGuiLocalize->Find("#Valve_Hud_HEALTH");
if (tempString) { SetLabelText(tempString); } else { SetLabelText(L"HEALTH"); } SetDisplayValue(m_iHealth); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudHealth::VidInit() { Reset(); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudHealth::OnThink() { int newHealth = 0; C_BasePlayer *local = C_BasePlayer::GetLocalPlayer(); if ( local ) { // Never below zero
newHealth = MAX( local->GetHealth(), 0 ); }
// Only update the fade if we've changed health
if ( newHealth == m_iHealth ) { return; }
m_iHealth = newHealth;
if ( m_iHealth >= 20 ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("HealthIncreasedAbove20"); } else if ( m_iHealth > 0 ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("HealthIncreasedBelow20"); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("HealthLow"); }
SetDisplayValue(m_iHealth); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudHealth::MsgFunc_Damage( bf_read &msg ) {
int armor = msg.ReadByte(); // armor
int damageTaken = msg.ReadByte(); // health
long bitsDamage = msg.ReadLong(); // damage bits
bitsDamage; // variable still sent but not used
Vector vecFrom;
vecFrom.x = msg.ReadBitCoord(); vecFrom.y = msg.ReadBitCoord(); vecFrom.z = msg.ReadBitCoord();
// Actually took damage?
if ( damageTaken > 0 || armor > 0 ) { if ( damageTaken > 0 ) { // start the animation
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence("HealthDamageTaken"); } } }
|