summaryrefslogtreecommitdiff
path: root/game/server/tf2/tf_playerlocaldata.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/tf_playerlocaldata.cpp')
-rw-r--r--game/server/tf2/tf_playerlocaldata.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/game/server/tf2/tf_playerlocaldata.cpp b/game/server/tf2/tf_playerlocaldata.cpp
new file mode 100644
index 0000000..1b82242
--- /dev/null
+++ b/game/server/tf2/tf_playerlocaldata.cpp
@@ -0,0 +1,147 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "tf_playerlocaldata.h"
+#include "tf_player.h"
+#include "mathlib/mathlib.h"
+#include "entitylist.h"
+
+extern ConVar tf_fastbuild;
+ConVar tf_maxbankresources( "tf_maxbankresources", "2000", 0, "Max resources a single player can have." );
+
+#define BANK_RESOURCE_BITS 20
+#define MAX_PLAYER_RESOURCES ( (1 <<BANK_RESOURCE_BITS) - 1 )
+
+//-----------------------------------------------------------------------------
+// Purpose: SendProxy that converts the UtlVector list of objects to entindexes, where it's reassembled on the client
+//-----------------------------------------------------------------------------
+void SendProxy_PlayerObjectList( const SendProp *pProp, const void *pStruct, const void *pData, DVariant *pOut, int iElement, int objectID )
+{
+ CTFPlayerLocalData *pLocalData = (CTFPlayerLocalData*)pStruct;
+ Assert( pLocalData->m_pPlayer );
+
+ // If this fails, then SendProxyArrayLength_PlayerObjects didn't work.
+ Assert( iElement < pLocalData->m_pPlayer->GetObjectCount() );
+
+ CBaseObject *pObject = pLocalData->m_pPlayer->GetObject(iElement);
+
+ EHANDLE hObject;
+ hObject = pObject;
+
+ SendProxy_EHandleToInt( pProp, pStruct, &hObject, pOut, iElement, objectID );
+}
+
+
+int SendProxyArrayLength_PlayerObjects( const void *pStruct, int objectID )
+{
+ CTFPlayerLocalData *pLocalData = (CTFPlayerLocalData*)pStruct;
+ Assert( pLocalData->m_pPlayer );
+ int iObjects = pLocalData->m_pPlayer->GetObjectCount();
+ Assert( iObjects < MAX_OBJECTS_PER_PLAYER );
+ return iObjects;
+}
+
+BEGIN_SEND_TABLE_NOBASE( CTFPlayerLocalData, DT_TFLocal )
+ SendPropInt( SENDINFO(m_nInTacticalView), 1, SPROP_UNSIGNED ),
+ SendPropInt( SENDINFO( m_bKnockedDown ), 1, SPROP_UNSIGNED ),
+ SendPropVector( SENDINFO( m_vecKnockDownDir ), -1, SPROP_COORD ),
+ SendPropInt( SENDINFO( m_bThermalVision ), 1, SPROP_UNSIGNED ),
+ SendPropInt( SENDINFO( m_iIDEntIndex ), 10, SPROP_UNSIGNED ),
+ SendPropArray( SendPropInt( SENDINFO_ARRAY(m_iResourceAmmo), 4, SPROP_UNSIGNED ), m_iResourceAmmo ),
+ SendPropInt( SENDINFO(m_iBankResources), BANK_RESOURCE_BITS, SPROP_UNSIGNED ),
+ SendPropArray2(
+ SendProxyArrayLength_PlayerObjects,
+ SendPropInt("player_object_array_element", 0, SIZEOF_IGNORE, NUM_NETWORKED_EHANDLE_BITS, SPROP_UNSIGNED, SendProxy_PlayerObjectList),
+ MAX_OBJECTS_PER_PLAYER,
+ 0,
+ "player_object_array"
+ ),
+ SendPropInt( SENDINFO( m_bAttachingSapper ), 1, SPROP_UNSIGNED ),
+ SendPropFloat( SENDINFO( m_flSapperAttachmentFrac ), 7, SPROP_ROUNDDOWN, 0.0f, 1.0f ),
+ SendPropInt( SENDINFO( m_bForceMapOverview ), 1, SPROP_UNSIGNED ),
+END_SEND_TABLE()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CTFPlayerLocalData::CTFPlayerLocalData()
+{
+ m_nInTacticalView = 0;
+ m_pPlayer = NULL;
+
+ m_bKnockedDown = false;
+ m_vecKnockDownDir.Init();
+
+ m_bThermalVision = false;
+ m_iIDEntIndex = 0;
+
+ // Resource carrying
+ for ( int i = 0; i < RESOURCE_TYPES; i++ )
+ {
+ m_iResourceAmmo.Set( i, 0 );
+ }
+
+ if( inv_demo.GetInt() )
+ {
+ m_iBankResources = 5000;
+ }
+ else
+ {
+ m_iBankResources = 0;
+ }
+ m_aObjects.Purge();
+
+ m_bAttachingSapper = false;
+ m_flSapperAttachmentFrac = 0;
+ m_bForceMapOverview = false;
+}
+
+//-----------------------------------------------------------------------------
+// Add, remove, count resources
+//-----------------------------------------------------------------------------
+void CTFPlayerLocalData::AddResources( int iAmount )
+{
+ m_iBankResources += iAmount;
+
+ if ( !tf_fastbuild.GetBool() && (m_iBankResources > tf_maxbankresources.GetFloat()) )
+ {
+ m_iBankResources = tf_maxbankresources.GetFloat();
+ }
+
+ // Clamp for overflow...
+ if ( m_iBankResources > MAX_PLAYER_RESOURCES )
+ {
+ Msg("Warning: Player overflowed resource count!\n");
+ m_iBankResources = MAX_PLAYER_RESOURCES;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTFPlayerLocalData::RemoveResources( int iAmount )
+{
+ Assert( iAmount <= m_iBankResources );
+ m_iBankResources = MAX(0, m_iBankResources - iAmount);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+int CTFPlayerLocalData::ResourceCount( void ) const
+{
+ return m_iBankResources;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTFPlayerLocalData::SetResources( int iAmount )
+{
+ m_iBankResources = iAmount;
+} \ No newline at end of file