mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 14:16:50 +00:00
363 lines
8.5 KiB
C++
363 lines
8.5 KiB
C++
//========= 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"
|
|
// NVNT damage
|
|
#include "haptics/haptic_utils.h"
|
|
using namespace vgui;
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: HDU Damage indication
|
|
//-----------------------------------------------------------------------------
|
|
class CHudDamageIndicator : public CHudElement, public vgui::Panel
|
|
{
|
|
DECLARE_CLASS_SIMPLE( CHudDamageIndicator, vgui::Panel );
|
|
|
|
public:
|
|
CHudDamageIndicator( const char *pElementName );
|
|
|
|
void Init( 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:
|
|
void CalcDamageDirection( const Vector &vecFrom );
|
|
void DrawDamageIndicatorFront( float flFade );
|
|
void DrawDamageIndicatorRear( float flFade );
|
|
void DrawDamageIndicatorLeft( float flFade );
|
|
void DrawDamageIndicatorRight( float flFade );
|
|
|
|
private:
|
|
float m_flAttackFront;
|
|
float m_flAttackRear;
|
|
float m_flAttackLeft;
|
|
float m_flAttackRight;
|
|
|
|
Color m_clrIndicator;
|
|
|
|
CHudTexture *icon_up;
|
|
CHudTexture *icon_down;
|
|
CHudTexture *icon_left;
|
|
CHudTexture *icon_right;
|
|
|
|
float m_flFadeCompleteTime; //don't draw past this time
|
|
};
|
|
|
|
DECLARE_HUDELEMENT( CHudDamageIndicator );
|
|
DECLARE_HUD_MESSAGE( CHudDamageIndicator, Damage );
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Constructor
|
|
//-----------------------------------------------------------------------------
|
|
CHudDamageIndicator::CHudDamageIndicator( const char *pElementName ) : CHudElement( pElementName ), BaseClass(NULL, "HudDamageIndicator")
|
|
{
|
|
vgui::Panel *pParent = g_pClientMode->GetViewport();
|
|
SetParent( pParent );
|
|
|
|
SetHiddenBits( HIDEHUD_HEALTH );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CHudDamageIndicator::Reset( void )
|
|
{
|
|
m_flAttackFront = 0.0;
|
|
m_flAttackRear = 0.0;
|
|
m_flAttackRight = 0.0;
|
|
m_flAttackLeft = 0.0;
|
|
|
|
m_flFadeCompleteTime = 0.0;
|
|
|
|
m_clrIndicator.SetColor( 250, 0, 0, 255 );
|
|
}
|
|
|
|
void CHudDamageIndicator::Init( void )
|
|
{
|
|
HOOK_HUD_MESSAGE( CHudDamageIndicator, Damage );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
bool CHudDamageIndicator::ShouldDraw( void )
|
|
{
|
|
if ( !CHudElement::ShouldDraw() )
|
|
return false;
|
|
|
|
if ( ( m_flAttackFront <= 0.0 ) && ( m_flAttackRear <= 0.0 ) && ( m_flAttackLeft <= 0.0 ) && ( m_flAttackRight <= 0.0 ) )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
void CHudDamageIndicator::DrawDamageIndicatorFront( float flFade )
|
|
{
|
|
if ( m_flAttackFront > 0.4 )
|
|
{
|
|
if ( !icon_up )
|
|
{
|
|
icon_up = gHUD.GetIcon( "pain_up" );
|
|
}
|
|
|
|
if ( !icon_up )
|
|
{
|
|
return;
|
|
}
|
|
|
|
int x = ( ScreenWidth() / 2 ) - icon_up->Width() / 2;
|
|
int y = ( ScreenHeight() / 2 ) - icon_up->Height() * 3;
|
|
icon_up->DrawSelf( x, y, m_clrIndicator );
|
|
|
|
m_flAttackFront = MAX( 0.0, m_flAttackFront - flFade );
|
|
}
|
|
else
|
|
{
|
|
m_flAttackFront = 0.0;
|
|
}
|
|
}
|
|
|
|
void CHudDamageIndicator::DrawDamageIndicatorRear( float flFade )
|
|
{
|
|
if ( m_flAttackRear > 0.4 )
|
|
{
|
|
if ( !icon_down )
|
|
{
|
|
icon_down = gHUD.GetIcon( "pain_down" );
|
|
}
|
|
|
|
if ( !icon_down )
|
|
{
|
|
return;
|
|
}
|
|
|
|
int x = ( ScreenWidth() / 2 ) - icon_down->Width() / 2;
|
|
int y = ( ScreenHeight() / 2 ) + icon_down->Height() * 2;
|
|
icon_down->DrawSelf( x, y, m_clrIndicator );
|
|
|
|
m_flAttackRear = MAX( 0.0, m_flAttackRear - flFade );
|
|
}
|
|
else
|
|
{
|
|
m_flAttackRear = 0.0;
|
|
}
|
|
}
|
|
|
|
|
|
void CHudDamageIndicator::DrawDamageIndicatorLeft( float flFade )
|
|
{
|
|
if ( m_flAttackLeft > 0.4 )
|
|
{
|
|
if ( !icon_left )
|
|
{
|
|
icon_left = gHUD.GetIcon( "pain_left" );
|
|
}
|
|
|
|
if ( !icon_left )
|
|
{
|
|
return;
|
|
}
|
|
|
|
int x = ( ScreenWidth() / 2 ) - icon_left->Width() * 3;
|
|
int y = ( ScreenHeight() / 2 ) - icon_left->Height() / 2;
|
|
icon_left->DrawSelf( x, y, m_clrIndicator );
|
|
|
|
m_flAttackLeft = MAX( 0.0, m_flAttackLeft - flFade );
|
|
}
|
|
else
|
|
{
|
|
m_flAttackLeft = 0.0;
|
|
}
|
|
}
|
|
|
|
|
|
void CHudDamageIndicator::DrawDamageIndicatorRight( float flFade )
|
|
{
|
|
if ( m_flAttackRight > 0.4 )
|
|
{
|
|
if ( !icon_right )
|
|
{
|
|
icon_right = gHUD.GetIcon( "pain_right" );
|
|
}
|
|
|
|
if ( !icon_right )
|
|
{
|
|
return;
|
|
}
|
|
|
|
int x = ( ScreenWidth() / 2 ) + icon_right->Width() * 2;
|
|
int y = ( ScreenHeight() / 2 ) - icon_right->Height() / 2;
|
|
icon_right->DrawSelf( x, y, m_clrIndicator );
|
|
|
|
m_flAttackRight = MAX( 0.0, m_flAttackRight - flFade );
|
|
}
|
|
else
|
|
{
|
|
m_flAttackRight = 0.0;
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Paints the damage display
|
|
//-----------------------------------------------------------------------------
|
|
void CHudDamageIndicator::Paint()
|
|
{
|
|
if( m_flFadeCompleteTime > gpGlobals->curtime )
|
|
{
|
|
float flFade = gpGlobals->frametime * 2;
|
|
// draw damage indicators
|
|
DrawDamageIndicatorFront( flFade );
|
|
DrawDamageIndicatorRear( flFade );
|
|
DrawDamageIndicatorLeft( flFade );
|
|
DrawDamageIndicatorRight( flFade );
|
|
}
|
|
}
|
|
// NVNT static to pass damage
|
|
static float hap_damage_amount = 0;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Message handler for Damage message
|
|
//-----------------------------------------------------------------------------
|
|
void CHudDamageIndicator::MsgFunc_Damage( bf_read &msg )
|
|
{
|
|
int damageTaken = msg.ReadByte();
|
|
|
|
Vector vecFrom;
|
|
msg.ReadBitVec3Coord( vecFrom );
|
|
|
|
// NVNT pass damage to static holder
|
|
hap_damage_amount = damageTaken;
|
|
|
|
if ( damageTaken > 0 )
|
|
{
|
|
m_flFadeCompleteTime = gpGlobals->curtime + 1.0;
|
|
CalcDamageDirection( vecFrom );
|
|
}
|
|
//=============================================================================
|
|
// HPE_BEGIN:
|
|
// [menglish] Added reads for the added location based parameters to this message
|
|
//=============================================================================
|
|
msg.ReadLong();
|
|
msg.ReadBitVec3Coord( vecFrom );
|
|
//=============================================================================
|
|
// HPE_END
|
|
//=============================================================================
|
|
}
|
|
|
|
void CHudDamageIndicator::CalcDamageDirection( const Vector &vecFrom )
|
|
{
|
|
if ( vecFrom == vec3_origin )
|
|
{
|
|
m_flAttackFront = 0.0;
|
|
m_flAttackRear = 0.0;
|
|
m_flAttackRight = 0.0;
|
|
m_flAttackLeft = 0.0;
|
|
|
|
return;
|
|
}
|
|
|
|
C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer();
|
|
if ( !pLocalPlayer )
|
|
{
|
|
return;
|
|
}
|
|
|
|
Vector vecDelta = ( vecFrom - pLocalPlayer->GetRenderOrigin() );
|
|
|
|
if ( vecDelta.Length() <= 50 )
|
|
{
|
|
m_flAttackFront = 1.0;
|
|
m_flAttackRear = 1.0;
|
|
m_flAttackRight = 1.0;
|
|
m_flAttackLeft = 1.0;
|
|
|
|
return;
|
|
}
|
|
|
|
VectorNormalize( vecDelta );
|
|
|
|
Vector forward;
|
|
Vector right;
|
|
Vector up;
|
|
AngleVectors( MainViewAngles(), &forward, &right, &up );
|
|
|
|
|
|
float flFront = DotProduct( vecDelta, forward );
|
|
float flSide = DotProduct( vecDelta, right );
|
|
float flUp = DotProduct( vecDelta, up);
|
|
|
|
if ( flFront > 0 )
|
|
{
|
|
if ( flFront > 0.3 )
|
|
m_flAttackFront = MAX( m_flAttackFront, flFront );
|
|
}
|
|
else
|
|
{
|
|
float f = fabs( flFront );
|
|
if ( f > 0.3 )
|
|
m_flAttackRear = MAX( m_flAttackRear, f );
|
|
}
|
|
|
|
if ( flSide > 0 )
|
|
{
|
|
if ( flSide > 0.3 )
|
|
m_flAttackRight = MAX( m_flAttackRight, flSide );
|
|
}
|
|
else
|
|
{
|
|
float f = fabs( flSide );
|
|
if ( f > 0.3 )
|
|
m_flAttackLeft = MAX( m_flAttackLeft, f );
|
|
}
|
|
|
|
// NVNT pass damage. (use hap_damage amount to apply)
|
|
// do rotation
|
|
Vector hapDir(-flSide,-flUp,flFront);
|
|
if ( haptics )
|
|
haptics->ApplyDamageEffect(hap_damage_amount, 0, hapDir);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: hud scheme settings
|
|
//-----------------------------------------------------------------------------
|
|
void CHudDamageIndicator::ApplySchemeSettings(vgui::IScheme *pScheme)
|
|
{
|
|
BaseClass::ApplySchemeSettings(pScheme);
|
|
SetPaintBackgroundEnabled(false);
|
|
|
|
int wide, tall;
|
|
GetHudSize(wide, tall);
|
|
SetSize(wide, tall);
|
|
}
|