mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-03-13 06:01:53 +00:00
266 lines
8.3 KiB
C++
266 lines
8.3 KiB
C++
|
|
#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>
|
|
|
|
#include <filesystem.h>
|
|
#include <keyvalues.h>
|
|
|
|
#include "asw_hudelement.h"
|
|
#include "c_asw_marine.h"
|
|
#include "asw_marine_profile.h"
|
|
#include "c_asw_marine_resource.h"
|
|
#include "c_asw_sentry_base.h"
|
|
#include "c_asw_game_resource.h"
|
|
#include "c_asw_door.h"
|
|
#include "c_asw_use_area.h"
|
|
|
|
#include "ConVar.h"
|
|
#include "tier0/vprof.h"
|
|
#include "idebugoverlaypanel.h"
|
|
#include "engine/IVDebugOverlay.h"
|
|
#include "vguimatsurface/imatsystemsurface.h"
|
|
#include "tier1/fmtstr.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
using namespace vgui;
|
|
|
|
extern ConVar asw_draw_hud;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Shows the marines emote graphics
|
|
//-----------------------------------------------------------------------------
|
|
class CASWHudEmotes : public CASW_HudElement, public vgui::Panel
|
|
{
|
|
DECLARE_CLASS_SIMPLE( CASWHudEmotes, vgui::Panel );
|
|
|
|
public:
|
|
CASWHudEmotes( const char *pElementName );
|
|
~CASWHudEmotes();
|
|
|
|
virtual void Paint();
|
|
virtual void ApplySchemeSettings(IScheme *pScheme);
|
|
virtual void PaintEmotes();
|
|
virtual void PaintEmotesFor(C_ASW_Marine* pMarine);
|
|
virtual void PaintEmote(C_BaseEntity* pEnt, float fTime, int iTexture, float fScale=1.0f);
|
|
virtual bool ShouldDraw( void ) { return asw_draw_hud.GetBool() && CASW_HudElement::ShouldDraw(); }
|
|
|
|
CPanelAnimationVarAliasType( int, m_nMedicTexture, "MedicEmoteTexture", "vgui/swarm/Emotes/EmoteMedic", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nAmmoTexture, "AmmoEmoteTexture", "vgui/swarm/Emotes/EmoteAmmo", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nSmileTexture, "SmileEmoteTexture", "vgui/swarm/Emotes/EmoteSmile", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nStopTexture, "StopEmoteTexture", "vgui/swarm/Emotes/EmoteStop", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nGoTexture, "GoEmoteTexture", "vgui/swarm/Emotes/EmoteGo", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nExclaimTexture, "ExclaimEmoteTexture", "vgui/swarm/Emotes/EmoteExclaim", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nAnimeTexture, "AnimeEmoteTexture", "vgui/swarm/Emotes/EmoteAnime", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nQuestionTexture, "QuestionTexture", "vgui/swarm/Emotes/EmoteQuestion", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nWrenchTexture, "WrenchTexture", "vgui/swarm/ClassIcons/EngineerIcon", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nSentryUpTexture, "SentryUpTexture", "vgui/swarm/ClassIcons/SentryBuild", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nSentryDnTexture, "SentryDnTexture", "vgui/swarm/ClassIcons/SentryDismantle", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nHackTexture, "HackTexture", "vgui/swarm/ClassIcons/HackIcon", "textureid" );
|
|
CPanelAnimationVarAliasType( int, m_nWeldTexture, "WeldTexture", "vgui/swarm/ClassIcons/WeldIcon", "textureid" );
|
|
};
|
|
|
|
DECLARE_HUDELEMENT( CASWHudEmotes );
|
|
|
|
CASWHudEmotes::CASWHudEmotes( const char *pElementName ) : CASW_HudElement( pElementName ), BaseClass( NULL, "ASWHudEmotes" )
|
|
{
|
|
vgui::Panel *pParent = GetClientMode()->GetViewport();
|
|
SetParent( pParent );
|
|
SetHiddenBits( HIDEHUD_REMOTE_TURRET);
|
|
|
|
vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFile("resource/SwarmSchemeNew.res", "SwarmSchemeNew");
|
|
SetScheme(scheme);
|
|
}
|
|
|
|
CASWHudEmotes::~CASWHudEmotes()
|
|
{
|
|
|
|
}
|
|
|
|
void CASWHudEmotes::ApplySchemeSettings(IScheme *pScheme)
|
|
{
|
|
BaseClass::ApplySchemeSettings(pScheme);
|
|
SetBgColor(Color(0,0,0,0));
|
|
SetPaintBackgroundEnabled( false );
|
|
}
|
|
|
|
void CASWHudEmotes::Paint()
|
|
{
|
|
VPROF_BUDGET( "CASWHudEmotes::Paint", VPROF_BUDGETGROUP_ASW_CLIENT );
|
|
BaseClass::Paint();
|
|
PaintEmotes();
|
|
}
|
|
|
|
|
|
void CASWHudEmotes::PaintEmotes()
|
|
{
|
|
C_ASW_Game_Resource *pGameResource = ASWGameResource();
|
|
if (!pGameResource)
|
|
return;
|
|
|
|
for (int i=0;i<pGameResource->GetMaxMarineResources();i++)
|
|
{
|
|
C_ASW_Marine_Resource *pMR = pGameResource->GetMarineResource(i);
|
|
if (!pMR)
|
|
continue;
|
|
|
|
C_ASW_Marine *marine = pMR->GetMarineEntity();
|
|
if ( !marine )
|
|
continue;
|
|
|
|
PaintEmotesFor(marine);
|
|
}
|
|
}
|
|
|
|
void CASWHudEmotes::PaintEmotesFor(C_ASW_Marine* pMarine)
|
|
{
|
|
if (pMarine->bClientEmoteMedic)
|
|
PaintEmote(pMarine, pMarine->fEmoteMedicTime, m_nMedicTexture);
|
|
if (pMarine->bClientEmoteAmmo)
|
|
PaintEmote(pMarine, pMarine->fEmoteAmmoTime, m_nAmmoTexture);
|
|
if (pMarine->bClientEmoteSmile)
|
|
PaintEmote(pMarine, pMarine->fEmoteSmileTime, m_nSmileTexture);
|
|
if (pMarine->bClientEmoteStop)
|
|
PaintEmote(pMarine, pMarine->fEmoteStopTime, m_nStopTexture);
|
|
if (pMarine->bClientEmoteGo)
|
|
PaintEmote(pMarine, pMarine->fEmoteGoTime, m_nGoTexture);
|
|
if (pMarine->bClientEmoteExclaim)
|
|
PaintEmote(pMarine, pMarine->fEmoteExclaimTime, m_nExclaimTexture);
|
|
if (pMarine->bClientEmoteAnimeSmile)
|
|
PaintEmote(pMarine, pMarine->fEmoteAnimeSmileTime, m_nAnimeTexture);
|
|
if (pMarine->bClientEmoteQuestion)
|
|
PaintEmote(pMarine, pMarine->fEmoteQuestionTime, m_nQuestionTexture);
|
|
|
|
bool bBuildingSentry = false;
|
|
bool bWelding = false;
|
|
|
|
// paint wrench over a sentry gun if a marine is setting one up within an engineer's aura
|
|
C_BaseEntity *pUsing = pMarine->m_hUsingEntity.Get();
|
|
if (pUsing)
|
|
{
|
|
C_ASW_Sentry_Base* pSentry = dynamic_cast<C_ASW_Sentry_Base*>(pUsing);
|
|
if ( pSentry )
|
|
{
|
|
if ( pSentry->IsAssembled() )
|
|
PaintEmote(pMarine, 1.5f, m_nSentryDnTexture, 0.9f);
|
|
else
|
|
PaintEmote(pMarine, 1.5f, m_nSentryUpTexture, 0.9f);
|
|
|
|
if ( pSentry->m_bSkillMarineHelping )
|
|
{
|
|
PaintEmote(pSentry, 1.0f, m_nWrenchTexture, 0.4f);
|
|
}
|
|
|
|
bBuildingSentry = true;
|
|
}
|
|
}
|
|
|
|
// and a welding door
|
|
if (pMarine->GetMarineResource())
|
|
{
|
|
C_ASW_Door *pDoor = pMarine->GetMarineResource()->m_hWeldingDoor.Get();
|
|
if ( pDoor )
|
|
{
|
|
bWelding = true;
|
|
if ( pDoor->m_bSkillMarineHelping )
|
|
PaintEmote(pDoor, 1.0f, m_nWrenchTexture, 0.4f);
|
|
|
|
PaintEmote(pMarine, 1.5f, m_nWeldTexture, 0.75f);
|
|
}
|
|
}
|
|
|
|
// paint wrench over an engineer if he's boosting a sentry/weld
|
|
if (pMarine->GetMarineResource())
|
|
{
|
|
if ( pMarine->GetMarineResource()->m_bUsingEngineeringAura && !bBuildingSentry && !bWelding )
|
|
{
|
|
PaintEmote(pMarine, 0.9f, m_nWrenchTexture, 0.4f);
|
|
}
|
|
}
|
|
|
|
bool bDrawHackIcon = false;
|
|
|
|
if ( pMarine->IsInhabited() )
|
|
{
|
|
if ( pMarine->IsHacking() )
|
|
bDrawHackIcon = true;
|
|
}
|
|
else
|
|
{
|
|
if ( pUsing )
|
|
{
|
|
C_ASW_Use_Area *pArea = static_cast< C_ASW_Use_Area* >( pUsing );
|
|
if ( pArea->Classify() == CLASS_ASW_BUTTON_PANEL )
|
|
bDrawHackIcon = true;
|
|
}
|
|
}
|
|
|
|
if ( bDrawHackIcon )
|
|
PaintEmote(pMarine, 1.0f, m_nHackTexture, 0.75f);
|
|
}
|
|
|
|
void CASWHudEmotes::PaintEmote(C_BaseEntity* pEnt, float fTime, int iTexture, float fEmoteScale)
|
|
{
|
|
//Msg("PaintEmote scale = %f\n", fEmoteScale);
|
|
if (fEmoteScale < 0)
|
|
fEmoteScale = 0;
|
|
Vector screenPos;
|
|
Vector vecFacing;
|
|
AngleVectors(pEnt->GetRenderAngles(), &vecFacing);
|
|
vecFacing *= 5;
|
|
if (!debugoverlay->ScreenPosition( pEnt->GetRenderOrigin() + Vector(0,40,70) + vecFacing, screenPos ))
|
|
{
|
|
//Msg("Emote marinepos: %s\n", VecToString(pEnt->GetRenderOrigin()));
|
|
//Msg("Emote marinefacing: %s\n", VecToString(vecFacing));
|
|
|
|
float xPos = screenPos[0];
|
|
float yPos = screenPos[1];
|
|
|
|
if (iTexture != -1)
|
|
{
|
|
float fAlpha = 0;
|
|
float fSize = 0.5 + 0.5 * ((2.0 - fTime) / 2.0f);
|
|
if (fTime < 1.0f) // fade in
|
|
fAlpha = fTime;
|
|
else // fade out
|
|
fAlpha = 2.0 - fTime;
|
|
float f = clamp(1.0f - fAlpha, 0.0f, 1.0f);
|
|
f = f * f * f;
|
|
fAlpha = 1.0f - f;
|
|
|
|
fSize = (0.5f + 0.5f * fAlpha) * 0.5f;
|
|
float fScale = (ScreenHeight() / 768.0f) * fEmoteScale;
|
|
float HalfW = 128.0f * fScale * fSize * 0.5f;
|
|
float HalfH = 128.0f * fScale * fSize * 0.5f;
|
|
|
|
surface()->DrawSetColor(Color(255,255,255,fAlpha*255.0f));
|
|
surface()->DrawSetTexture(iTexture);
|
|
//int x = xPos - HalfW;
|
|
//int y = yPos - HalfH;
|
|
|
|
Vertex_t points[4] =
|
|
{
|
|
Vertex_t( Vector2D(xPos - HalfW, yPos - HalfH), Vector2D(0,0) ),
|
|
Vertex_t( Vector2D(xPos + HalfW, yPos - HalfH), Vector2D(1,0) ),
|
|
Vertex_t( Vector2D(xPos + HalfW, yPos + HalfH), Vector2D(1,1) ),
|
|
Vertex_t( Vector2D(xPos - HalfW, yPos + HalfH), Vector2D(0,1) )
|
|
};
|
|
surface()->DrawTexturedPolygon( 4, points );
|
|
|
|
//surface()->DrawTexturedRect(xPos - HalfW, yPos - HalfH,
|
|
//xPos + HalfW, yPos + HalfH);
|
|
}
|
|
}
|
|
}
|
|
|