static bool IsValidFn_PlayersWantingAssist( void *pUserData, int a ) { CSortBase *pSortBase = (CSortBase*)pUserData; CBaseTFPlayer *pPlayer = (CBaseTFPlayer*)pSortBase->m_pPlayer->GetTeam()->GetPlayer( a ); if ( !pPlayer->IsAlive() ) { // This guy sure could have used an assist but YOU'RE TOO SLOW!!! return false; } // Don't try to assist yourself... if ( pPlayer == pSortBase->m_pPlayer ) return false; // Make sure this guy was shot recently. if ( (gpGlobals->curtime - pPlayer->LastTimeDamagedByEnemy()) > COMMANDO_ASSIST_SHOT_DELAY ) return false; // Is the guy close enough? if ( pSortBase->m_pPlayer->GetAbsOrigin().DistToSqr( pPlayer->GetAbsOrigin() ) > COMMAND_ASSIST_DISTANCE_SQR ) return false; return true; }
//----------------------------------------------------------------------------- // Purpose: Figure out if I should be using an attached item rather than this vehicle itself. //----------------------------------------------------------------------------- bool CBaseTFVehicle::UseAttachedItem( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { CBaseTFPlayer* pPlayer = dynamic_cast<CBaseTFPlayer*>(pActivator); if ( !pPlayer || !InSameTeam(pPlayer) ) return false; Vector vecPlayerOrigin = pPlayer->GetAbsOrigin(); int nBestBuildPoint = -1; float fBestDistance = FLT_MAX; // Get the closest regular entry point: int nRole = LocateEntryPoint( pPlayer, &fBestDistance ); // Iterate through each of the build points, if any, and see which we are closest to. int nBuildPoints = GetNumBuildPoints(); for( int i = 0; i < nBuildPoints; i++ ) { CBaseObject* pObject = GetBuildPointObject(i); // If there's something in the build point that isn't in the process of being built or placed: if( pObject && !pObject->IsPlacing() && !pObject->IsBuilding() ) { Vector vecOrigin; QAngle vecAngles; // If the build point is the default point for this role, just take it if (GetBuildPointPassenger(i) == nRole) { nBestBuildPoint = i; break; } // And I can get the build point. if( GetBuildPoint( i, vecOrigin, vecAngles ) ) { float fLength2dSqr = (vecOrigin - vecPlayerOrigin).AsVector2D().LengthSqr(); if( fLength2dSqr < fBestDistance ) { nBestBuildPoint = i; fBestDistance = fLength2dSqr; } } } } if( nBestBuildPoint >= 0 ) { // They're using an item on me, so push out the deterioration time ResetDeteriorationTime(); GetBuildPointObject(nBestBuildPoint)->Use( pActivator, pCaller, useType, value ); return true; } return false; }
//----------------------------------------------------------------------------- // Boost those attached to me as long as I'm not EMPed //----------------------------------------------------------------------------- void CObjectBuffStation::BoostPlayerThink( void ) { // Are we emped? bool bIsEmped = HasPowerup( POWERUP_EMP ); // Get range (squared = faster test). float flMaxRangeSq = obj_buff_station_range.GetFloat(); flMaxRangeSq *= flMaxRangeSq; // Boost all attached players and objects. for ( int iPlayer = 0; iPlayer < BUFF_STATION_MAX_PLAYERS; iPlayer++ ) { // Clean up dangling pointers + dead players, subversion, disconnection CBaseTFPlayer *pPlayer = m_hPlayers[iPlayer].Get(); if ( !pPlayer || !pPlayer->IsAlive() || !InSameTeam( pPlayer ) || !pPlayer->PlayerClass() ) { DetachPlayerByIndex( iPlayer ); continue; } // Check for out of range. float flDistSq = GetAbsOrigin().DistToSqr( pPlayer->GetAbsOrigin() ); if ( flDistSq > flMaxRangeSq ) { DetachPlayerByIndex( iPlayer ); continue; } bool bBoosted = false; if ( !bIsEmped ) { float flHealAmount = obj_buff_station_heal_rate.GetFloat() * BUFF_STATION_BOOST_PLAYER_THINK_INTERVAL; bBoosted = pPlayer->AttemptToPowerup( POWERUP_BOOST, 0, flHealAmount, this, &m_aPlayerAttachInfo[iPlayer].m_DamageModifier ); } if ( !bBoosted ) { m_aPlayerAttachInfo[iPlayer].m_DamageModifier.RemoveModifier(); } } // Set next think time. if ( m_nPlayerCount > 0 ) { SetNextThink( gpGlobals->curtime + BUFF_STATION_BOOST_PLAYER_THINK_INTERVAL, BUFF_STATION_BOOST_PLAYER_THINK_CONTEXT ); } else { SetNextThink( gpGlobals->curtime + 1.0f, BUFF_STATION_BOOST_PLAYER_THINK_CONTEXT ); } }
//----------------------------------------------------------------------------- // Purpose: The player has taken damage. Return the damage done. //----------------------------------------------------------------------------- float CPlayerClass::OnTakeDamage( const CTakeDamageInfo &info ) { if ( info.GetAttacker() ) { CBaseTFPlayer *pPlayer = dynamic_cast< CBaseTFPlayer* >( info.GetAttacker() ); if ( pPlayer && pPlayer->GetPlayerClass() ) { int iStatGroup = GetStatGroupFor( pPlayer ); CInterClassStats *pInter = &g_PlayerClassStats[iStatGroup].m_InterClassStats[GetTFClass()]; pInter->m_flTotalDamageInflicted += info.GetDamage(); float flDistToAttacker = pPlayer->GetAbsOrigin().DistTo( GetPlayer()->GetAbsOrigin() ); pInter->m_flTotalEngagementDist += flDistToAttacker; pInter->m_nEngagements++; if ( gpGlobals->curtime >= m_flNormalizedEngagementNextTime ) { pInter->m_flTotalNormalizedEngagementDist += flDistToAttacker; pInter->m_nNormalizedEngagements++; m_flNormalizedEngagementNextTime = gpGlobals->curtime + 3; } // Store detailed stats for the shot? if ( tf_DetailedStats.GetInt() ) { CShotInfo shotInfo; shotInfo.m_flDistance = flDistToAttacker; shotInfo.m_nDamage = (int)info.GetDamage(); g_ClassShotInfos[iStatGroup].AddToTail( shotInfo ); } } } return info.GetDamage(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CPlayerClassCommando::StartAdrenalinRush( void ) { // Am I actually alive? if ( !m_pPlayer->IsAlive() ) return; // Do I have rush capability? if ( !m_bCanRush ) return; m_bPersonalRush = true; // Start adrenalin rushing m_pPlayer->AttemptToPowerup( POWERUP_RUSH, class_commando_rush_length.GetFloat() ); // If I have battlecry, adrenalin up all my nearby teammates if ( m_bHasBattlecry ) { // Find nearby teammates for ( int i = 0; i < m_pPlayer->GetTFTeam()->GetNumPlayers(); i++ ) { CBaseTFPlayer *pPlayer = (CBaseTFPlayer *)m_pPlayer->GetTFTeam()->GetPlayer(i); assert(pPlayer); // Is it within range? if ( pPlayer != m_pPlayer && (pPlayer->GetAbsOrigin() - m_pPlayer->GetAbsOrigin()).Length() < class_commando_battlecry_radius.GetFloat() ) { // Can I see it? trace_t tr; UTIL_TraceLine( m_pPlayer->EyePosition(), pPlayer->EyePosition(), MASK_SOLID_BRUSHONLY, m_pPlayer, COLLISION_GROUP_NONE, &tr); CBaseEntity *pEntity = tr.m_pEnt; if ( (tr.fraction == 1.0) || ( pEntity == pPlayer ) ) { pPlayer->AttemptToPowerup( POWERUP_RUSH, class_commando_battlecry_length.GetFloat() ); } } } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CEnvLaserDesignation::ShouldTransmit( const edict_t *recipient, const void *pvs, int clientArea ) { // Only transmit to players who care about laser designation: // - Player designating // - Players in tanks // - Commandos CBaseEntity* pRecipientEntity = CBaseEntity::Instance( recipient ); if ( pRecipientEntity->IsPlayer() ) { CBaseTFPlayer *pPlayer = (CBaseTFPlayer*)pRecipientEntity; // Designating player? if ( pPlayer == GetOwnerEntity() ) return true; if ( !InSameTeam( pPlayer ) ) return false; // In a tank? if ( pPlayer->IsInAVehicle() ) { CBaseEntity *pVehicle = pPlayer->GetVehicle()->GetVehicleEnt(); if ( dynamic_cast<CVehicleTank*>(pVehicle) ) { // Make sure it's within range of the tank's fire static float flTankRange = 0; if ( !flTankRange ) { flTankRange = vehicle_tank_range.GetFloat() * weapon_grenade_rocket_track_range_mod.GetFloat(); flTankRange *= flTankRange; } float flDistanceSqr = ( GetAbsOrigin() - pPlayer->GetAbsOrigin() ).LengthSqr(); if ( flDistanceSqr < flTankRange ) return true; } else if ( dynamic_cast<CObjectMannedMissileLauncher*>(pVehicle) ) { // Make sure it's within range of the manned missile launcher's fire static float flGunRange = 0; if ( !flGunRange ) { flGunRange = obj_manned_missilelauncher_range_off.GetFloat() * weapon_grenade_rocket_track_range_mod.GetFloat(); flGunRange *= flGunRange; } float flDistanceSqr = ( GetAbsOrigin() - pPlayer->GetAbsOrigin() ).LengthSqr(); if ( flDistanceSqr < flGunRange ) return true; } } // Is the player a commando? if ( pPlayer->PlayerClass() == TFCLASS_COMMANDO ) { // Make sure it's within range of the commando's rockets static float flCommandoRange = 0; if ( !flCommandoRange ) { flCommandoRange = weapon_rocket_launcher_range.GetFloat() * weapon_grenade_rocket_track_range_mod.GetFloat(); flCommandoRange *= flCommandoRange; } float flDistanceSqr = ( GetAbsOrigin() - pPlayer->GetAbsOrigin() ).LengthSqr(); if ( flDistanceSqr < flCommandoRange ) return true; } } return false; }