Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

341 lines
9.7 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "c_baseobject.h"
#include "ObjectControlPanel.h"
#include "tf_shareddefs.h"
#include "tempent.h"
#include "c_te_legacytempents.h"
#include "iviewrender_beams.h"
#include "beamdraw.h"
#include "view.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define NUM_POWERPACK_GLOWS 6
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class C_ObjectPowerPack : public C_BaseObject
{
DECLARE_CLASS( C_ObjectPowerPack, C_BaseObject );
public:
DECLARE_CLIENTCLASS();
C_ObjectPowerPack();
~C_ObjectPowerPack();
int SocketsLeft() const { return (MAX_OBJECTS_PER_PACK - m_iObjectsAttached); }
// Since we have material proxies to show building amount, don't offset origin
virtual bool OffsetObjectOrigin( Vector& origin )
{
return false;
}
virtual void OnGoActive( void );
virtual void OnGoInactive( void );
void RemoveGlows( void );
virtual void ClientThink( void );
virtual int DrawModel( int flags );
private:
int m_iObjectsAttached;
int m_iGlowModelIndex;
C_LocalTempEntity *m_pGlowSprites[ NUM_POWERPACK_GLOWS ];
// Jacob's laddder
Beam_t *m_pJacobsLadderBeam;
float m_flJacobsLeftPoint;
float m_flJacobsRightPoint;
Vector m_vecJacobsStart;
Vector m_vecJacobsEnd;
CMaterialReference m_hJacobsPointMaterial;
private:
C_ObjectPowerPack( const C_ObjectPowerPack & ); // not defined, not accessible
};
IMPLEMENT_CLIENTCLASS_DT(C_ObjectPowerPack, DT_ObjectPowerPack, CObjectPowerPack)
RecvPropInt( RECVINFO(m_iObjectsAttached) ),
END_RECV_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
C_ObjectPowerPack::C_ObjectPowerPack()
{
for ( int i = 0; i < NUM_POWERPACK_GLOWS; i++ )
{
m_pGlowSprites[i] = NULL;
}
m_iGlowModelIndex = PrecacheModel( "effects/human_object_glow.vmt" );
m_pJacobsLadderBeam = NULL;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
C_ObjectPowerPack::~C_ObjectPowerPack( void )
{
RemoveGlows();
}
//-----------------------------------------------------------------------------
// Purpose: We've just gone active
//-----------------------------------------------------------------------------
void C_ObjectPowerPack::OnGoActive( void )
{
// Turn on our glows
for ( int i = 0; i < NUM_POWERPACK_GLOWS; i++ )
{
// Find the attachment point
int iAttachment = LookupAttachment( VarArgs("glow_%d",(i+1)) );
Vector vecOrigin;
QAngle vecAngles;
if ( GetAttachment( iAttachment, vecOrigin, vecAngles ) )
{
Vector vecForward;
AngleVectors( vecAngles, &vecForward );
m_pGlowSprites[i] = tempents->TempSprite( vecOrigin, vec3_origin, 0.35, m_iGlowModelIndex, kRenderTransAdd, 0, 0.5, 1, FTENT_PERSIST | FTENT_NEVERDIE | FTENT_BEOCCLUDED, vecForward );
}
}
m_flJacobsLeftPoint = 0;
m_flJacobsRightPoint = 0;
m_hJacobsPointMaterial.Init( "sprites/blueflare2", TEXTURE_GROUP_CLIENT_EFFECTS );
}
//-----------------------------------------------------------------------------
// Purpose: We've just gone inactive
//-----------------------------------------------------------------------------
void C_ObjectPowerPack::OnGoInactive( void )
{
// Turn off our glows
RemoveGlows();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_ObjectPowerPack::RemoveGlows( void )
{
for ( int i = 0; i < NUM_POWERPACK_GLOWS; i++ )
{
if ( m_pGlowSprites[i] )
{
m_pGlowSprites[i]->die = 0;
m_pGlowSprites[i] = NULL;
}
}
// Stop the jacob's ladder
if ( m_pJacobsLadderBeam )
{
m_pJacobsLadderBeam->flags &= ~FBEAM_FOREVER;
m_pJacobsLadderBeam->die = gpGlobals->curtime;
m_pJacobsLadderBeam = NULL;
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_ObjectPowerPack::ClientThink( void )
{
// Create the jacob's ladder
if ( !m_pJacobsLadderBeam )
{
BeamInfo_t beamInfo;
beamInfo.m_vecStart.Init();
beamInfo.m_vecEnd.Init();
beamInfo.m_pszModelName = "sprites/physbeam.vmt";
beamInfo.m_flHaloScale = 0.0f;
beamInfo.m_flLife = 0.0f;
beamInfo.m_flWidth = 8.0f;
beamInfo.m_flEndWidth = 4.0f;
beamInfo.m_flFadeLength = 0.0f;
beamInfo.m_flAmplitude = 20.0f;
beamInfo.m_flBrightness = 255.0f;
beamInfo.m_flSpeed = 0.0f;
beamInfo.m_nStartFrame = 0;
beamInfo.m_flFrameRate = 0.0f;
beamInfo.m_flRed = 206.0f;
beamInfo.m_flGreen = 181.0f;
beamInfo.m_flBlue = 127.0f;
beamInfo.m_nSegments = 5;
beamInfo.m_bRenderable = true;
m_pJacobsLadderBeam = beams->CreateBeamPoints( beamInfo );
}
// Update the position of the jacob's ladder
BeamInfo_t beamInfo;
QAngle vecAngle;
int iAttachment;
// Setup a color reflecting the amount of power being used
color32 color;
color.r = 206;
color.g = 182;
color.b = 127;
color.a = 255;
// Tesla Effect
Vector vecRightTop, vecRightBottom;
Vector vecLeftTop, vecLeftBottom;
iAttachment = LookupAttachment( "Tesla_ll" );
GetAttachment( iAttachment, vecLeftBottom, vecAngle );
iAttachment = LookupAttachment( "Tesla_ul" );
GetAttachment( iAttachment, vecLeftTop, vecAngle );
iAttachment = LookupAttachment( "Tesla_lr" );
GetAttachment( iAttachment, vecRightBottom, vecAngle );
iAttachment = LookupAttachment( "Tesla_ur" );
GetAttachment( iAttachment, vecRightTop, vecAngle );
float flSpeed = 0.02;
m_flJacobsLeftPoint += random->RandomFloat( flSpeed * 0.25, flSpeed * 2);
m_flJacobsRightPoint += random->RandomFloat( flSpeed * 0.25, flSpeed * 2);
// If they've both hit the end, break the ladder
if ( m_flJacobsLeftPoint >= 1.0f && m_flJacobsRightPoint >= 1.0f )
{
// Snap!
m_flJacobsLeftPoint = 0.0f;
m_flJacobsRightPoint = 0.0f;
}
else if ( m_flJacobsLeftPoint > 1.0f )
{
// Only the left point's made it
m_flJacobsLeftPoint = 1.0f;
}
else if ( m_flJacobsRightPoint > 1.0f )
{
// Only the right point's made it
m_flJacobsRightPoint = 1.0f;
}
Vector vecLeft = vecLeftTop - vecLeftBottom;
Vector vecRight = vecRightTop - vecRightBottom;
m_vecJacobsStart = vecLeftBottom + ( m_flJacobsLeftPoint * vecLeft );
m_vecJacobsEnd = vecRightBottom + ( m_flJacobsRightPoint * vecRight );
beamInfo.m_vecStart = m_vecJacobsStart;
beamInfo.m_vecEnd = m_vecJacobsEnd;
beamInfo.m_flRed = color.r;
beamInfo.m_flGreen = color.g;
beamInfo.m_flBlue = color.b;
beams->UpdateBeamInfo( m_pJacobsLadderBeam, beamInfo );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int C_ObjectPowerPack::DrawModel( int flags )
{
if ( BaseClass::DrawModel( flags ) )
{
if ( ShouldBeActive() )
{
// Get the distance to the view
float flDistance = (GetAbsOrigin() - MainViewOrigin()).LengthSqr();
if ( flDistance < (1024 * 1024) )
{
// Draw a sprite at the tips.
color32 color;
color.r = 255;
color.g = 255;
color.b = 255;
color.a = 255;
float flSize = 25.0f;
materials->Bind( m_hJacobsPointMaterial, this );
DrawSprite( m_vecJacobsStart, flSize, flSize, color );
DrawSprite( m_vecJacobsEnd, flSize, flSize, color );
}
}
return true;
}
return false;
}
//-----------------------------------------------------------------------------
// Control screen
//-----------------------------------------------------------------------------
class CPowerPackControlPanel : public CObjectControlPanel
{
DECLARE_CLASS( CPowerPackControlPanel, CObjectControlPanel );
public:
CPowerPackControlPanel( vgui::Panel *parent, const char *panelName );
virtual bool Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData );
virtual void OnTick();
private:
vgui::Label *m_pSocketsLabel;
};
DECLARE_VGUI_SCREEN_FACTORY( CPowerPackControlPanel, "powerpack_control_panel" );
//-----------------------------------------------------------------------------
// Constructor:
//-----------------------------------------------------------------------------
CPowerPackControlPanel::CPowerPackControlPanel( vgui::Panel *parent, const char *panelName )
: BaseClass( parent, "CPowerPackControlPanel" )
{
}
//-----------------------------------------------------------------------------
// Initialization
//-----------------------------------------------------------------------------
bool CPowerPackControlPanel::Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData )
{
m_pSocketsLabel = new vgui::Label( GetActivePanel(), "SocketReadout", "" );
if (!BaseClass::Init(pKeyValues, pInitData))
return false;
return true;
}
//-----------------------------------------------------------------------------
// Frame-based update
//-----------------------------------------------------------------------------
void CPowerPackControlPanel::OnTick()
{
BaseClass::OnTick();
C_BaseObject *pObj = GetOwningObject();
if (!pObj)
return;
Assert( dynamic_cast<C_ObjectPowerPack*>(pObj) );
C_ObjectPowerPack *pPowerPack = static_cast<C_ObjectPowerPack*>(pObj);
char buf[256];
int nSocketsLeft = pPowerPack->SocketsLeft();
if (nSocketsLeft > 0)
{
Q_snprintf( buf, sizeof( buf ), "%d sockets left", pPowerPack->SocketsLeft() );
}
else
{
Q_strncpy( buf, "No sockets left", sizeof( buf ) );
}
m_pSocketsLabel->SetText( buf );
}