summaryrefslogtreecommitdiff
path: root/game/server/tf2/tf_obj_resourcepump.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/server/tf2/tf_obj_resourcepump.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/server/tf2/tf_obj_resourcepump.cpp')
-rw-r--r--game/server/tf2/tf_obj_resourcepump.cpp260
1 files changed, 260 insertions, 0 deletions
diff --git a/game/server/tf2/tf_obj_resourcepump.cpp b/game/server/tf2/tf_obj_resourcepump.cpp
new file mode 100644
index 0000000..390bdfd
--- /dev/null
+++ b/game/server/tf2/tf_obj_resourcepump.cpp
@@ -0,0 +1,260 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Resource pump
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "cbase.h"
+#include "tf_player.h"
+#include "tf_team.h"
+#include "tf_obj.h"
+#include "tf_obj_resourcepump.h"
+#include "tf_func_resource.h"
+#include "resource_chunk.h"
+#include "techtree.h"
+#include "sendproxy.h"
+#include "vstdlib/random.h"
+#include "tf_stats.h"
+#include "VGuiScreen.h"
+#include "engine/IEngineSound.h"
+
+BEGIN_DATADESC( CObjectResourcePump )
+
+ DEFINE_THINKFUNC( ResourcePumpThink ),
+
+END_DATADESC()
+
+
+// Resource pump team-only vars.
+BEGIN_SEND_TABLE_NOBASE( CObjectResourcePump, DT_ResourcePumpTeamOnlyVars )
+ SendPropInt( SENDINFO(m_iPumpLevel), 4 ),
+ SendPropEHandle( SENDINFO(m_hResourceZone) ),
+END_SEND_TABLE()
+
+
+IMPLEMENT_SERVERCLASS_ST(CObjectResourcePump, DT_ResourcePump)
+ SendPropDataTable( "teamonly", 0, &REFERENCE_SEND_TABLE( DT_ResourcePumpTeamOnlyVars ), SendProxy_OnlyToTeam ),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS(obj_resourcepump, CObjectResourcePump);
+PRECACHE_REGISTER(obj_resourcepump);
+
+ConVar obj_resourcepump_health( "obj_resourcepump_health","100", FCVAR_NONE, "Resource pump health" );
+ConVar obj_resourcepump_rate( "obj_resourcepump_rate","0", FCVAR_NONE, "Base rate at which resource pumps give resources to their team." );
+ConVar obj_resourcepump_amount( "obj_resourcepump_amount","0", FCVAR_NONE, "Base amount of resources that resource pumps give to their team." );
+
+#define RESOURCE_PUMP_CONTEXT "ResourcePumpThink"
+
+#define HUMAN_RESOURCEPUMP_MODEL "models/objects/obj_resourcepump.mdl"
+#define ALIEN_RESOURCEPUMP_MODEL "models/objects/alien_obj_resourcepump.mdl"
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CObjectResourcePump::CObjectResourcePump()
+{
+ UseClientSideAnimation();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::SetupTeamModel( void )
+{
+ if ( GetTeamNumber() == TEAM_HUMANS )
+ {
+ SetModel( HUMAN_RESOURCEPUMP_MODEL );
+ }
+ else
+ {
+ SetModel( ALIEN_RESOURCEPUMP_MODEL );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::Spawn( void )
+{
+ SetSolid( SOLID_BBOX );
+ UTIL_SetSize(this, RESOURCEPUMP_MINS, RESOURCEPUMP_MAXS);
+
+ m_iHealth = obj_resourcepump_health.GetInt();
+
+ m_hResourceZone = NULL;
+ m_flPumpSpeed = obj_resourcepump_rate.GetFloat();
+ m_fObjectFlags |= OF_DONT_PREVENT_BUILD_NEAR_OBJ | OF_DOESNT_NEED_POWER | OF_MUST_BE_BUILT_IN_RESOURCE_ZONE | OF_MUST_BE_BUILT_ON_ATTACHMENT;
+ m_iPumpLevel = 1;
+
+ SetType( OBJ_RESOURCEPUMP );
+
+ BaseClass::Spawn();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::Activate( void )
+{
+ BaseClass::Activate();
+
+ SetupPump();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Gets info about the control panels
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::GetControlPanelInfo( int nPanelIndex, const char *&pPanelName )
+{
+ pPanelName = "screen_obj_resourcepump";
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::FinishedBuilding( void )
+{
+ BaseClass::FinishedBuilding();
+
+ SetupPump();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::SetupPump( void )
+{
+ // Find the resource zone I've been planted in
+ m_hResourceZone = NULL;
+ CBaseEntity *pEntity = NULL;
+ while ((pEntity = gEntList.FindEntityByClassname( pEntity, "trigger_resourcezone" )) != NULL)
+ {
+ CResourceZone *pZone = (CResourceZone *)pEntity;
+
+ // Are we within this zone?
+ if ( pZone->CollisionProp()->IsPointInBounds( GetAbsOrigin() ) )
+ {
+ m_hResourceZone = pZone;
+ break;
+ }
+ }
+
+ if ( m_hResourceZone == NULL )
+ {
+ Msg( "Resource Pump (entindex %d) at (%.2f, %.2f, %.2f) can't find it's zone.\n",
+ entindex(), GetAbsOrigin().x, GetAbsOrigin().y, GetAbsOrigin().z );
+ UTIL_Remove( this );
+ return;
+ }
+
+ // Tell the zone
+ if ( m_hResourceZone->GetNumBuildPoints() )
+ {
+ m_hResourceZone->SetObjectOnBuildPoint( 0, this );
+ }
+
+ SetContextThink( ResourcePumpThink, gpGlobals->curtime + m_flPumpSpeed, RESOURCE_PUMP_CONTEXT );
+
+ // Start the pump animation
+ ResetSequence( SelectWeightedSequence( ACT_IDLE ) );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::Precache()
+{
+ PrecacheModel( HUMAN_RESOURCEPUMP_MODEL );
+ PrecacheModel( ALIEN_RESOURCEPUMP_MODEL );
+ PrecacheVGuiScreen( "screen_obj_resourcepump" );
+
+ PrecacheScriptSound( "ObjectResourcePump.UpgradeFailed" );
+
+}
+
+//-----------------------------------------------------------------------------
+// Gets the resource zone (may be NULL!)
+//-----------------------------------------------------------------------------
+CResourceZone* CObjectResourcePump::GetResourceZone()
+{
+ return m_hResourceZone;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Pump resources out of the zone I'm sitting on
+//-----------------------------------------------------------------------------
+void CObjectResourcePump::ResourcePumpThink( void )
+{
+ Assert( m_hResourceZone != NULL );
+ if ( !GetTeam() )
+ return;
+
+ float flSpeed = m_hResourceZone->GetResourceRate() ? m_hResourceZone->GetResourceRate() : m_flPumpSpeed;
+
+ SetNextThink( gpGlobals->curtime + flSpeed, RESOURCE_PUMP_CONTEXT );
+
+ // I can't do anything if I'm not active
+ if ( !ShouldBeActive() )
+ return;
+
+ // If the zone's not active, don't do anything
+ if ( !m_hResourceZone->GetActive() )
+ return;
+
+ // Suck resources from the zone I'm in
+ int iResourcesPerPlayer = 0;
+ for ( int i = 0; i < m_iPumpLevel; i++ )
+ {
+ // Decreasing value for each level
+ float flLevelBonus = 1.0 - (i / (float)GetObjectInfo( GetType() )->m_MaxUpgradeLevel);
+ iResourcesPerPlayer += (obj_resourcepump_amount.GetFloat() * flLevelBonus);
+ }
+ int iPumpedResources = MIN( m_hResourceZone->GetResources(), iResourcesPerPlayer );
+ if ( iPumpedResources )
+ {
+ m_hResourceZone->RemoveResources( iPumpedResources );
+
+ // Give out resources to the team
+ GetTFTeam()->AddTeamResources( iPumpedResources * GetTFTeam()->GetNumPlayers() );
+ TFStats()->IncrementTeamStat( GetTFTeam()->GetTeamNumber(), TF_TEAM_STAT_RESOURCES_HARVESTED, iPumpedResources );
+ }
+
+ // If we've just run out of resources in the zone, shut down
+ if ( m_hResourceZone->GetResources() <= 0 )
+ {
+ UTIL_Remove( this );
+ return;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handle commands sent from vgui panels on the client
+//-----------------------------------------------------------------------------
+bool CObjectResourcePump::ClientCommand( CBaseTFPlayer *pPlayer, const char *pCmd, ICommandArguments *pArg )
+{
+ if ( FStrEq( pCmd, "upgrade" ) )
+ {
+ int iCost = CalculateObjectUpgrade( GetType(), m_iPumpLevel );
+
+ // Do we have enough resources to activate it?
+ if ( !iCost || pPlayer->GetBankResources() < iCost )
+ {
+ // Play a sound indicating it didn't work...
+ CSingleUserRecipientFilter filter( pPlayer );
+ EmitSound( filter, pPlayer->entindex(), "ObjectResourcePump.UpgradeFailed" );
+ return true;
+ }
+
+ pPlayer->RemoveBankResources( iCost );
+
+ // Upgrade myself
+ m_iPumpLevel += 1;
+ return true;
+ }
+
+ return BaseClass::ClientCommand( pPlayer, pCmd, pArg );
+}