diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/tf2/resource_chunk.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/tf2/resource_chunk.cpp')
| -rw-r--r-- | game/server/tf2/resource_chunk.cpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/game/server/tf2/resource_chunk.cpp b/game/server/tf2/resource_chunk.cpp new file mode 100644 index 0000000..a4a00d4 --- /dev/null +++ b/game/server/tf2/resource_chunk.cpp @@ -0,0 +1,172 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Resource chunks +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "tf_func_resource.h" +#include "tf_team.h" +#include "tf_basecombatweapon.h" +#include "tf_obj.h" +#include "resource_chunk.h" +#include "vstdlib/random.h" +#include "tf_stats.h" +#include "engine/IEngineSound.h" + +ConVar resource_chunk_value( "resource_chunk_value","20", FCVAR_NONE, "Resource value of a single resource chunk." ); +ConVar resource_chunk_processed_value( "resource_chunk_processed_value","80", FCVAR_NONE, "Resource value of a single processed resource chunk." ); + +// Resource Chunk Models +char *sResourceChunkModel = "models/resources/resource_chunk_B.mdl"; +char *sProcessedResourceChunkModel = "models/resources/processed_resource_chunk_B.mdl"; + +BEGIN_DATADESC( CResourceChunk ) + + // functions + DEFINE_FUNCTION( ChunkTouch ), + DEFINE_FUNCTION( ChunkRemove ), + +END_DATADESC() + +IMPLEMENT_SERVERCLASS_ST( CResourceChunk, DT_ResourceChunk ) +END_SEND_TABLE() + +LINK_ENTITY_TO_CLASS( resource_chunk, CResourceChunk ); +PRECACHE_REGISTER( resource_chunk ); + +//----------------------------------------------------------------------------- +// Purpose: Remove me from any lists I'm in when I'm deleted +//----------------------------------------------------------------------------- +void CResourceChunk::UpdateOnRemove( void ) +{ + if ( m_hZone ) + { + m_hZone->RemoveChunk( this, false ); + m_hZone = NULL; + } + + // Chain at end to mimic destructor unwind order + BaseClass::UpdateOnRemove(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CResourceChunk::Spawn( ) +{ + // Init model + if ( IsProcessed() ) + { + SetModelName( AllocPooledString( sProcessedResourceChunkModel ) ); + } + else + { + SetModelName( AllocPooledString( sResourceChunkModel ) ); + } + + BaseClass::Spawn(); + + UTIL_SetSize( this, Vector(-4,-4,-4), Vector(4,4,4) ); + SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE ); + SetSolid( SOLID_BBOX ); + AddSolidFlags( FSOLID_TRIGGER ); + CollisionProp()->UseTriggerBounds( true, 24 ); + SetCollisionGroup( TFCOLLISION_GROUP_RESOURCE_CHUNK ); + SetGravity( 1.0 ); + SetFriction( 1 ); + SetTouch( ChunkTouch ); + SetThink( ChunkRemove ); + SetNextThink( gpGlobals->curtime + random->RandomFloat( 50.0, 80.0 ) ); // Remove myself the +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CResourceChunk::Precache( void ) +{ + PrecacheModel( sResourceChunkModel ); + PrecacheModel( sProcessedResourceChunkModel ); + PrecacheModel( "sprites/redglow1.vmt" ); + + PrecacheScriptSound( "ResourceChunk.Pickup" ); + +} + +//----------------------------------------------------------------------------- +// Purpose: Create a resource chunk +//----------------------------------------------------------------------------- +CResourceChunk *CResourceChunk::Create( bool bProcessed, const Vector &vecOrigin, const Vector &vecVelocity ) +{ + CResourceChunk *pChunk = (CResourceChunk*)CreateEntityByName("resource_chunk"); + + UTIL_SetOrigin( pChunk, vecOrigin ); + pChunk->m_bIsProcessed = bProcessed; + pChunk->m_bBeingCollected = false; + pChunk->Spawn(); + pChunk->SetAbsVelocity( vecVelocity ); + pChunk->SetLocalAngularVelocity( RandomAngle( -100, 100 ) ); + pChunk->SetLocalAngles( vec3_angle ); + + return pChunk; +} + +//----------------------------------------------------------------------------- +// Purpose: If we're picked up by another pla`yer, give resources to that team +//----------------------------------------------------------------------------- +void CResourceChunk::ChunkTouch( CBaseEntity *pOther ) +{ + if ( pOther->IsPlayer() || pOther->GetServerVehicle() ) + { + // Give the team the resources + int iAmountPerPlayer = ((CTFTeam *)pOther->GetTeam())->AddTeamResources( GetResourceValue(), TF_PLAYER_STAT_RESOURCES_ACQUIRED_FROM_CHUNKS ); + TFStats()->IncrementTeamStat( pOther->GetTeamNumber(), TF_TEAM_STAT_RESOURCE_CHUNKS_COLLECTED, GetResourceValue() ); + + pOther->EmitSound( "ResourceChunk.Pickup" ); + + // Tell the player + CSingleUserRecipientFilter user( (CBasePlayer*)pOther ); + UserMessageBegin( user, "PickupRes" ); + WRITE_BYTE( iAmountPerPlayer ); + MessageEnd(); + + // Tell our zone to remove this chunk from it's list + if ( m_hZone ) + { + m_hZone->RemoveChunk( this, false ); + m_hZone = NULL; + } + + // Remove this chunk + SetTouch( NULL ); + UTIL_Remove( this ); + return; + } +} + +//----------------------------------------------------------------------------- +// Purpose: Remove myself if I'm not being harvested +//----------------------------------------------------------------------------- +void CResourceChunk::ChunkRemove( void ) +{ + // Remove this chunk + if ( m_hZone ) + { + m_hZone->RemoveChunk( this, true ); + m_hZone = NULL; + } + UTIL_Remove( this ); +} + + +//----------------------------------------------------------------------------- +// Purpose: Return the resource value of this chunk +//----------------------------------------------------------------------------- +float CResourceChunk::GetResourceValue( void ) +{ + // Init value & model + if ( IsProcessed() ) + return resource_chunk_processed_value.GetFloat(); + + return resource_chunk_value.GetFloat(); +}
\ No newline at end of file |