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.
139 lines
4.2 KiB
139 lines
4.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: A team's resource processor back at their base |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "tf_team.h" |
|
#include "info_resourceprocessor.h" |
|
#include "tf_player.h" |
|
#include "npc_minicarrier.h" |
|
#include "tf_gamerules.h" |
|
|
|
BEGIN_DATADESC( CResourceProcessor ) |
|
|
|
// functions |
|
DEFINE_FUNCTION( ProcessorTouch ), |
|
|
|
END_DATADESC() |
|
|
|
IMPLEMENT_SERVERCLASS_ST(CResourceProcessor, DT_ResourceProcessor) |
|
END_SEND_TABLE() |
|
|
|
LINK_ENTITY_TO_CLASS( info_resourceprocessor, CResourceProcessor); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CResourceProcessor::Spawn( void ) |
|
{ |
|
Precache(); |
|
|
|
SetSolid( SOLID_SLIDEBOX ); |
|
SetMoveType( MOVETYPE_NONE ); |
|
AddFlag( FL_NOTARGET ); |
|
|
|
UTIL_SetSize( pev, Vector(-32,-32,0), Vector(32,32, 128) ); |
|
SetModel( "models/objects/obj_resourceprocessor.mdl" ); |
|
SetTouch( ProcessorTouch ); |
|
|
|
m_flHackSpawnHeight = 256; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CResourceProcessor::Precache( void ) |
|
{ |
|
PrecacheModel( "models/objects/obj_resourceprocessor.mdl" ); |
|
|
|
UTIL_PrecacheOther( "npc_minicarrier" ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CResourceProcessor::Activate( void ) |
|
{ |
|
BaseClass::Activate(); |
|
if ( GetTeamNumber() < 0 || GetTeamNumber() >= GetNumberOfTeams() ) |
|
{ |
|
Warning( "Warning, info_resourceprocessor with invalid Team Number set.\n" ); |
|
UTIL_Remove( this ); |
|
return; |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CResourceProcessor::ProcessorTouch( CBaseEntity *pOther ) |
|
{ |
|
// Players |
|
if ( pOther->IsPlayer() ) |
|
{ |
|
// Ignore touches from enemy players |
|
if ( !InSameTeam( pOther ) ) |
|
return; |
|
|
|
CBaseTFPlayer *pPlayer = (CBaseTFPlayer *)pOther; |
|
|
|
// Remove all the player's resources and add them to the team's stash |
|
for ( int i = 0; i < MAX_RESOURCE_TYPES; i++ ) |
|
{ |
|
int iCount = pPlayer->GetResourceChunkCount(i, false); |
|
if ( iCount ) |
|
{ |
|
pPlayer->RemoveResourceChunks( i, iCount, false ); |
|
AddResources( i, iCount * CHUNK_RESOURCE_VALUE ); |
|
} |
|
|
|
// Now remove processed versions too |
|
iCount = pPlayer->GetResourceChunkCount(i, true); |
|
if ( iCount ) |
|
{ |
|
pPlayer->RemoveResourceChunks( i, iCount, true ); |
|
AddResources( i, iCount * PROCESSED_CHUNK_RESOURCE_VALUE ); |
|
} |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Add resources to the processor, and hence the team's bank |
|
//----------------------------------------------------------------------------- |
|
void CResourceProcessor::AddResources( int iResourceType, float flResources ) |
|
{ |
|
if ( !GetTeam() ) |
|
return; |
|
|
|
((CTFTeam *)GetTeam())->AddResources( iResourceType, flResources ); |
|
((CTFTeam *)GetTeam())->ResourceLoadDeposited(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Spawn a minicarrier |
|
//----------------------------------------------------------------------------- |
|
void CResourceProcessor::SpawnMiniCarrier( void ) |
|
{ |
|
CNPC_MiniCarrier *pMiniCarrier = (CNPC_MiniCarrier*)CreateEntityByName( "npc_minicarrier" ); |
|
pMiniCarrier->Spawn(); |
|
pMiniCarrier->ChangeTeam( m_iTeamNumber ); |
|
|
|
// Find a clear spot near me & spawn in it |
|
if ( !EntityPlacementTest( pMiniCarrier, GetAbsOrigin() + Vector(0,0,m_flHackSpawnHeight), |
|
pMiniCarrier->GetAbsOrigin(), false ) ) |
|
{ |
|
Warning( "Failed to find empty space to spawn a minicarrier.\n" ); |
|
( ( CTFTeam * )GetTeam() )->RemoveRobot( pMiniCarrier ); |
|
UTIL_Remove( pMiniCarrier ); |
|
return; |
|
} |
|
|
|
m_flHackSpawnHeight += 64; |
|
|
|
engine->SetOrigin( pMiniCarrier->pev, pMiniCarrier->GetOrigin() ); |
|
pMiniCarrier->SetHomeProcessor( this ); |
|
}
|
|
|