summaryrefslogtreecommitdiff
path: root/game/client/tf2/c_weapon_builder.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_weapon_builder.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_weapon_builder.cpp')
-rw-r--r--game/client/tf2/c_weapon_builder.cpp380
1 files changed, 380 insertions, 0 deletions
diff --git a/game/client/tf2/c_weapon_builder.cpp b/game/client/tf2/c_weapon_builder.cpp
new file mode 100644
index 0000000..edb69ab
--- /dev/null
+++ b/game/client/tf2/c_weapon_builder.cpp
@@ -0,0 +1,380 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Client's CWeaponBuilder class
+//
+// $Workfile: $
+// $Date: $
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "hud.h"
+#include "in_buttons.h"
+#include "clientmode_tfnormal.h"
+#include "engine/IEngineSound.h"
+#include "c_weapon_builder.h"
+#include "c_weapon__stubs.h"
+#include "iinput.h"
+#include "ObjectControlPanel.h"
+#include <vgui/IVGui.h>
+
+#define BUILD_ICON_SCALE 0.75
+
+#define BUILD_ICON_BOTTOM_OFFSET YRES(160)
+
+//-----------------------------------------------------------------------------
+// Purpose: Draw a material on a quad
+//-----------------------------------------------------------------------------
+void DrawQuadMaterial( IMaterial *pMaterial, int iX, int iY, int iWidth, int iHeight,
+ unsigned char r = 255, unsigned char g = 255, unsigned char b = 255, unsigned char a = 255,
+ float flTextureLeft = 0.0, float flTextureRight = 1.0, bool bRotated = false )
+{
+ IMesh* pMesh = materials->GetDynamicMesh( true, NULL, NULL, pMaterial );
+
+ CMeshBuilder meshBuilder;
+ meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );
+
+ meshBuilder.Color4ub( r, g, b, a );
+ if ( bRotated )
+ {
+ meshBuilder.TexCoord2f( 0,flTextureLeft,1 );
+ }
+ else
+ {
+ meshBuilder.TexCoord2f( 0,flTextureLeft,0 );
+ }
+ meshBuilder.Position3f( iX,iY,0 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Color4ub( r, g, b, a );
+ if ( bRotated )
+ {
+ meshBuilder.TexCoord2f( 0,flTextureLeft,0 );
+ }
+ else
+ {
+ meshBuilder.TexCoord2f( 0,flTextureRight,0 );
+ }
+ meshBuilder.Position3f( iX+iWidth, iY, 0 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Color4ub( r, g, b, a );
+ if ( bRotated )
+ {
+ meshBuilder.TexCoord2f( 0,flTextureRight,0 );
+ }
+ else
+ {
+ meshBuilder.TexCoord2f( 0,flTextureRight,1 );
+ }
+ meshBuilder.Position3f( iX+iWidth, iY+iHeight, 0 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.Color4ub( r, g, b, a );
+ if ( bRotated )
+ {
+ meshBuilder.TexCoord2f( 0,flTextureRight,1 );
+ }
+ else
+ {
+ meshBuilder.TexCoord2f( 0,flTextureLeft,1 );
+ }
+ meshBuilder.Position3f( iX, iY+iHeight, 0 );
+ meshBuilder.AdvanceVertex();
+
+ meshBuilder.End();
+ pMesh->Draw();
+}
+
+STUB_WEAPON_CLASS_IMPLEMENT( weapon_builder, C_WeaponBuilder );
+
+IMPLEMENT_CLIENTCLASS_DT(C_WeaponBuilder, DT_WeaponBuilder, CWeaponBuilder)
+ RecvPropInt( RECVINFO(m_iBuildState) ),
+ RecvPropInt( RECVINFO(m_iCurrentObject) ),
+ RecvPropInt( RECVINFO(m_iCurrentObjectState) ),
+ RecvPropEHandle( RECVINFO(m_hObjectBeingBuilt) ),
+ RecvPropTime( RECVINFO(m_flStartTime) ),
+ RecvPropTime( RECVINFO(m_flTotalTime) ),
+ RecvPropArray
+ (
+ RecvPropInt( RECVINFO(m_bObjectValidity[0])), m_bObjectValidity
+ ),
+ RecvPropArray
+ (
+ RecvPropInt( RECVINFO(m_bObjectBuildability[0])), m_bObjectBuildability
+ ),
+END_RECV_TABLE()
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_WeaponBuilder::C_WeaponBuilder()
+{
+ m_iBuildState = 0;
+ m_iCurrentObject = BUILDER_INVALID_OBJECT;
+ m_iCurrentObjectState = 0;
+ m_flStartTime = 0;
+ m_flTotalTime = 0;
+
+ m_pIconFireToSelect.Init( "Hud/build/firetobuild", TEXTURE_GROUP_VGUI );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+C_WeaponBuilder::~C_WeaponBuilder()
+{
+}
+
+//-----------------------------------------------------------------------------
+// A couple helper methods for drawing builder status
+//-----------------------------------------------------------------------------
+static void DrawTextIcon( IMaterial* pMaterial, int parentWidth, int parentHeight, float r = 1.0f, float g = 1.0f, float b = 1.0f )
+{
+ if ( !pMaterial )
+ return;
+
+ // We're in build selection mode, so draw the current build icon
+ int iWidth = pMaterial->GetMappingWidth();
+ int iHeight = pMaterial->GetMappingHeight();
+ int iX = (parentWidth - iWidth) / 2;
+ int iY = (parentHeight - 216);
+ DrawQuadMaterial( pMaterial, iX, iY, iWidth, iHeight, r * 255, g * 255, b * 255 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : char const
+//-----------------------------------------------------------------------------
+const char *C_WeaponBuilder::GetCurrentSelectionObjectName( void )
+{
+ if ( m_iCurrentObject == -1 || (m_iBuildState == BS_SELECTING) )
+ return "";
+
+ return GetObjectInfo( m_iCurrentObject )->m_pBuilderWeaponName;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void C_WeaponBuilder::Redraw()
+{
+ BaseClass::Redraw();
+
+ // Don't draw if we're hiding the weapons, or the player's dead
+ if ( gHUD.IsHidden( HIDEHUD_WEAPONSELECTION | HIDEHUD_PLAYERDEAD ) )
+ return;
+ C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer();
+ if (!pPlayer)
+ return;
+
+ vgui::Panel *pParent = GetClientModeNormal()->GetViewport();
+ int parentWidth, parentHeight;
+ pParent->GetSize(parentWidth, parentHeight);
+
+ // If we're in placement mode, draw the placement icon
+ switch( m_iBuildState )
+ {
+ case BS_PLACING:
+ case BS_PLACING_INVALID:
+ break;
+
+ default:
+ {
+ if( !inv_demo.GetInt() )
+ {
+ DrawTextIcon( m_pIconFireToSelect, parentWidth, parentHeight );
+ }
+ break;
+ }
+ break;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool C_WeaponBuilder::IsPlacingObject( void )
+{
+ if ( m_iBuildState == BS_PLACING || m_iBuildState == BS_PLACING_INVALID )
+ return true;
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool C_WeaponBuilder::IsBuildingObject( void )
+{
+ if ( m_iBuildState == BS_BUILDING )
+ return true;
+ return false;
+}
+
+#include "vgui_bitmapimage.h"
+#include "vgui_bitmappanel.h"
+
+
+//-----------------------------------------------------------------------------
+// Control screen
+//-----------------------------------------------------------------------------
+class CHumanPDAPanel : public CVGuiScreenPanel
+{
+ DECLARE_CLASS( CHumanPDAPanel, CVGuiScreenPanel );
+
+public:
+ CHumanPDAPanel( vgui::Panel *parent, const char *panelName );
+ ~CHumanPDAPanel();
+ virtual bool Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData );
+ virtual void OnTick();
+
+private:
+ C_BaseCombatWeapon *GetOwningWeapon();
+
+ vgui::Label *m_pObjectName;
+ vgui::Label *m_pObjectCost;
+ vgui::Label *m_pObjectOnTeamCount;
+ vgui::Label *m_pObjectPlacementDetails;
+
+ CBitmapPanel *m_pBitmapPanel;
+
+ BitmapImage *m_pObjectImage;
+
+ int m_nLastObjectID;
+ int m_nLastObjectCount;
+ int m_nLastObjectCost;
+
+};
+
+
+DECLARE_VGUI_SCREEN_FACTORY( CHumanPDAPanel, "human_pda" );
+
+
+//-----------------------------------------------------------------------------
+// Constructor:
+//-----------------------------------------------------------------------------
+CHumanPDAPanel::CHumanPDAPanel( vgui::Panel *parent, const char *panelName )
+ : BaseClass( parent, "CHumanPDAPanel", vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/PDAControlPanelScheme.res", "TFBase" ) )
+{
+ m_pObjectImage = NULL;
+
+ m_pObjectName = new vgui::Label( this, "ObjectName", "" );
+ m_pObjectCost = new vgui::Label( this, "ObjectCost", "" );
+ m_pObjectOnTeamCount = new vgui::Label( this, "ObjectOnTeamCount", "" );
+ m_pObjectPlacementDetails = new vgui::Label( this, "ObjectPlacementDetails", "" );
+
+ m_pBitmapPanel = new CBitmapPanel( this, "ObjectImage" );
+ m_pObjectImage = new BitmapImage();
+ m_pObjectImage->UsePanelRenderSize( m_pBitmapPanel->GetVPanel() );
+ m_pBitmapPanel->SetImage( m_pObjectImage );
+
+ m_nLastObjectID = -1;
+ m_nLastObjectCount = -1;
+ m_nLastObjectCost = -1;
+}
+
+CHumanPDAPanel::~CHumanPDAPanel()
+{
+ if ( m_pObjectImage )
+ {
+ delete m_pObjectImage;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Initialization
+//-----------------------------------------------------------------------------
+bool CHumanPDAPanel::Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData )
+{
+
+ // Make sure we get ticked...
+ vgui::ivgui()->AddTickSignal( GetVPanel() );
+
+ if (!BaseClass::Init(pKeyValues, pInitData))
+ return false;
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Returns the object it's attached to
+//-----------------------------------------------------------------------------
+C_BaseCombatWeapon *CHumanPDAPanel::GetOwningWeapon()
+{
+ C_BaseEntity *pScreenEnt = GetEntity();
+ if (!pScreenEnt)
+ return NULL;
+
+ C_BaseEntity *pOwner = pScreenEnt->GetOwnerEntity();
+ if (!pOwner)
+ return NULL;
+
+ C_BaseViewModel *pViewModel = dynamic_cast< C_BaseViewModel * >( pOwner );
+ if ( !pViewModel )
+ return NULL;
+
+ return pViewModel->GetOwningWeapon();
+}
+
+//-----------------------------------------------------------------------------
+// Frame-based update
+//-----------------------------------------------------------------------------
+void CHumanPDAPanel::OnTick()
+{
+ BaseClass::OnTick();
+
+ SetVisible( true );
+
+ char buf[256];
+
+ C_BaseCombatWeapon *weapon = GetOwningWeapon();
+ if ( !weapon )
+ return;
+
+ C_WeaponBuilder *builder = dynamic_cast< C_WeaponBuilder * >( weapon );
+ if ( !builder )
+ return;
+
+ CBaseTFPlayer *pOwner = ToBaseTFPlayer( builder->GetOwner() );
+ if ( !pOwner )
+ return;
+
+ // FIXME: Check build state??
+
+ int objectType = builder->m_iCurrentObject;
+ CObjectInfo const *info = GetObjectInfo( objectType );
+ if ( !info )
+ return;
+
+ int numOwned = pOwner->GetNumObjects(objectType);
+ int iCost = CalculateObjectCost( objectType, numOwned, pOwner->GetTeamNumber() );
+
+ if ( m_nLastObjectID == objectType &&
+ m_nLastObjectCount == numOwned &&
+ m_nLastObjectCost == iCost)
+ return;
+
+ m_nLastObjectID = objectType;
+ m_nLastObjectCount = numOwned;
+ m_nLastObjectCost = iCost;
+
+ Q_snprintf( buf, sizeof( buf ), "hud/menu/%s", info->m_pClassName );
+ m_pObjectImage->SetImageFile( buf );
+ m_pObjectImage->SetColor( GetFgColor() );
+
+ Q_snprintf( buf, sizeof( buf ), "%s", info->m_pStatusName );
+ m_pObjectName->SetText( buf );
+
+ Q_snprintf( buf, sizeof( buf ), "Cost: %i", iCost );
+ m_pObjectCost->SetText( buf );
+
+ Q_snprintf( buf, sizeof( buf ), "You own: %i", numOwned );
+ m_pObjectOnTeamCount->SetText( buf );
+
+ Q_snprintf( buf, sizeof( buf ), "%s", info->m_pBuilderPlacementString ? info->m_pBuilderPlacementString : "" );
+ m_pObjectPlacementDetails->SetText( buf );
+ //m_pObjectPlacementDetails->SizeToContents();
+}