summaryrefslogtreecommitdiff
path: root/game/client/tf2/c_obj_powerpack.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf2/c_obj_powerpack.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/client/tf2/c_obj_powerpack.cpp')
-rw-r--r--game/client/tf2/c_obj_powerpack.cpp340
1 files changed, 340 insertions, 0 deletions
diff --git a/game/client/tf2/c_obj_powerpack.cpp b/game/client/tf2/c_obj_powerpack.cpp
new file mode 100644
index 0000000..edbfcfd
--- /dev/null
+++ b/game/client/tf2/c_obj_powerpack.cpp
@@ -0,0 +1,340 @@
+//========= 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 );
+}
+
+