//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Map entity that adds a custom technology to the techtree // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "EntityOutput.h" #include "EntityList.h" #include "tf_team.h" #include "techtree.h" #include "info_customtech.h" #include "tier1/strtools.h" BEGIN_DATADESC( CInfoCustomTechnology ) // outputs DEFINE_OUTPUT( m_flTechPercentage, "TechPercentage" ), // keys DEFINE_KEYFIELD_NOT_SAVED( m_iszTech , FIELD_STRING, "TechToWatch" ), DEFINE_KEYFIELD_NOT_SAVED( m_iszTechTreeFile , FIELD_STRING, "NewTechFile" ), END_DATADESC() IMPLEMENT_SERVERCLASS_ST( CInfoCustomTechnology, DT_InfoCustomTechnology ) SendPropString( SENDINFO( m_szTechTreeFile ) ), END_SEND_TABLE(); LINK_ENTITY_TO_CLASS( info_customtech, CInfoCustomTechnology ); //----------------------------------------------------------------------------- // Purpose: Always transmit //----------------------------------------------------------------------------- int CInfoCustomTechnology::ShouldTransmit( const CCheckTransmitInfo *pInfo ) { // Don't need to transmit ones that don't add new techs if ( !m_iszTechTreeFile ) return FL_EDICT_DONTSEND; // Only transmit to members of my team CBaseEntity* pRecipientEntity = CBaseEntity::Instance( pInfo->m_pClientEnt ); if ( InSameTeam( pRecipientEntity ) ) { //Msg( "SENDING\n" ); return FL_EDICT_ALWAYS; } return FL_EDICT_DONTSEND; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CInfoCustomTechnology::Spawn( void ) { m_flTechPercentage.Set( 0, this, this ); memset( m_szTechTreeFile.GetForModify(), 0, sizeof(m_szTechTreeFile) ); } //----------------------------------------------------------------------------- // Purpose: Add myself to the technology tree //----------------------------------------------------------------------------- void CInfoCustomTechnology::Activate( void ) { BaseClass::Activate(); if ( !GetTeamNumber() ) { Msg( "ERROR: info_customtech without a specified team.\n" ); UTIL_Remove( this ); return; } // Get the Team's Technology Tree CTFTeam *pTeam = (CTFTeam *)GetTeam(); if ( pTeam ) { CTechnologyTree *pTechTree = pTeam->GetTechnologyTree(); if ( pTechTree ) { // Am I supposed to add some new technologies to the tech tree? if ( m_iszTechTreeFile != NULL_STRING ) { pTechTree->AddTechnologyFile( filesystem, GetTeamNumber(), (char*)STRING(m_iszTechTreeFile ) ); // Tell our clients about the technology Q_strncpy( m_szTechTreeFile.GetForModify(), STRING(m_iszTechTreeFile), sizeof(m_szTechTreeFile) ); } // Find the technology in the techtree CBaseTechnology *pTechnology = pTechTree->GetTechnology( STRING(m_iszTech) ); // Now hook the technology up to me if ( pTechnology ) { pTechnology->RegisterWatcher( this ); } } } } //----------------------------------------------------------------------------- // Purpose: Update the amount of our technology that's owned //----------------------------------------------------------------------------- void CInfoCustomTechnology::UpdateTechPercentage( float flPercentage ) { m_flTechPercentage.Set( flPercentage, this, this ); }