//----------------------------------------------------------------------------- // Here's where we deal with weapons, ladders, etc. //----------------------------------------------------------------------------- void CVehicleTeleportStation::OnItemPostFrame( CBaseTFPlayer *pDriver ) { // I can't do anything if I'm not active if ( !ShouldBeActive() ) return; if ( GetPassengerRole( pDriver ) != VEHICLE_DRIVER ) return; if ( !IsDeployed() && ( pDriver->m_afButtonPressed & IN_ATTACK ) ) { if ( ValidDeployPosition() ) { Deploy(); } } else if ( IsDeployed() && ( pDriver->m_afButtonPressed & IN_ATTACK ) ) { UnDeploy(); SetControlPanelsActive( false ); SetBodygroup( 1, true ); RemoveCornerSprites(); SetContextThink( NULL, 0, TELEPORT_STATION_THINK_CONTEXT ); } }
//----------------------------------------------------------------------------- // Here's where we deal with weapons //----------------------------------------------------------------------------- void CObjectBaseMannedGun::OnItemPostFrame( CBaseTFPlayer *pDriver ) { // I can't do anything if I'm not active if ( !ShouldBeActive() ) return; if ( !IsReadyToDrive() ) return; // If we don't have a laser designator yet, create one if ( !m_hLaserDesignation ) { m_hLaserDesignation = CEnvLaserDesignation::CreatePredicted( pDriver ); } // Designating? if (pDriver->m_nButtons & IN_ATTACK2) { UpdateDesignator(); return; } StopDesignating(); // Fire our base weapon? if ( pDriver->m_nButtons & IN_ATTACK ) { Fire(); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseObject::AttemptToGoActive( void ) { // Go active if we can if ( ShouldBeActive() ) { OnGoActive(); } }
//----------------------------------------------------------------------------- // Here's where we deal with weapons //----------------------------------------------------------------------------- void CVehicleMortar::OnItemPostFrame( CBaseTFPlayer *pDriver ) { // I can't do anything if I'm not active if ( !ShouldBeActive() ) return; if ( GetPassengerRole( pDriver ) != VEHICLE_ROLE_DRIVER ) return; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_BaseObject::PreDataUpdate( DataUpdateType_t updateType ) { BaseClass::PreDataUpdate( updateType ); m_iOldHealth = m_iHealth; m_hOldOwner = GetOwner(); m_bWasActive = ShouldBeActive(); m_bWasBuilding = m_bBuilding; m_bOldDisabled = m_bDisabled; m_bWasPlacing = m_bPlacing; m_bWasCarried = m_bCarried; m_nObjectOldSequence = GetSequence(); }
//----------------------------------------------------------------------------- // Here's where we deal with weapons, ladders, etc. //----------------------------------------------------------------------------- void CVehicleSiegeTower::OnItemPostFrame( CBaseTFPlayer *pDriver ) { // I can't do anything if I'm not active if ( !ShouldBeActive() ) return; if ( GetPassengerRole( pDriver ) != VEHICLE_DRIVER ) return; if ( !IsDeployed() && ( pDriver->m_afButtonPressed & IN_ATTACK ) ) { InternalDeploy(); } else if ( IsDeployed() && ( pDriver->m_afButtonPressed & IN_ATTACK ) ) { InternalUnDeploy(); } }
//----------------------------------------------------------------------------- // Recharge think... //----------------------------------------------------------------------------- void CObjectMannedPlasmagun::RechargeThink( ) { // Prevent manned guns from deteriorating ResetDeteriorationTime(); float flNextRechargeTime = MANNED_PLASMAGUN_RECHARGE_TIME; /* ROBIN: Remove idle recharging for now if (gpGlobals->curtime >= m_flNextIdleTime) flNextRechargeTime = MANNED_PLASMAGUN_IDLE_RECHARGE_TIME; else flNextRechargeTime = MANNED_PLASMAGUN_RECHARGE_TIME; */ // If I'm EMPed, slow the recharge rate down if ( HasPowerup(POWERUP_EMP) ) { flNextRechargeTime *= 1.5; } SetNextThink( gpGlobals->curtime + flNextRechargeTime ); // I can't do anything if I'm not active if ( !ShouldBeActive() ) return; if (m_nAmmoCount < m_nMaxAmmoCount) { ++m_nAmmoCount; } else { // No need to think when it's full SetNextThink( gpGlobals->curtime + 5.0f ); } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_BaseObject::OnDataChanged( DataUpdateType_t updateType ) { if (updateType == DATA_UPDATE_CREATED) { CreateBuildPoints(); } BaseClass::OnDataChanged( updateType ); // Did we just finish building? if ( m_bWasBuilding && !m_bBuilding ) { FinishedBuilding(); } // Did we just go active? bool bShouldBeActive = ShouldBeActive(); if ( !m_bWasActive && bShouldBeActive ) { OnGoActive(); } else if ( m_bWasActive && !bShouldBeActive ) { OnGoInactive(); } if ( m_bDisabled != m_bOldDisabled ) { if ( m_bDisabled ) { OnStartDisabled(); } else { OnEndDisabled(); } } if ( ( !IsBuilding() && m_iHealth != m_iOldHealth ) ) { // recalc our damage particle state BuildingDamageLevel_t damageLevel = CalculateDamageLevel(); if ( damageLevel != m_damageLevel ) { UpdateDamageEffects( damageLevel ); m_damageLevel = damageLevel; } } if ( m_bWasBuilding && !m_bBuilding ) { // Force update damage effect when finishing construction. BuildingDamageLevel_t damageLevel = CalculateDamageLevel(); UpdateDamageEffects( damageLevel ); m_damageLevel = damageLevel; } // Kill all particles when getting picked up. if ( !m_bWasCarried && m_bCarried ) { ParticleProp()->StopParticlesInvolving( this ); } if ( m_iHealth > m_iOldHealth && m_iHealth == m_iMaxHealth ) { // If we were just fully healed, remove all decals RemoveAllDecals(); } if ( GetOwner() == C_TFPlayer::GetLocalTFPlayer() ) { IGameEvent *event = gameeventmanager->CreateEvent( "building_info_changed" ); if ( event ) { event->SetInt( "building_type", GetType() ); event->SetInt( "object_mode", GetObjectMode() ); gameeventmanager->FireEventClientSide( event ); } } if ( IsPlacing() && GetSequence() != m_nObjectOldSequence ) { // Ignore server sequences while placing OnPlacementStateChanged( m_iLastPlacementPosValid > 0 ); } }
//----------------------------------------------------------------------------- // Handle commands sent from vgui panels on the client //----------------------------------------------------------------------------- bool CObjectResupply::ClientCommand( CBaseTFPlayer *pPlayer, const char *pCmd, ICommandArguments *pArg ) { // NOTE: Must match ResupplyBuyType_t static float s_Costs[] = { RESUPPLY_AMMO_COST, RESUPPLY_HEALTH_COST, RESUPPLY_GRENADES_COST, RESUPPLY_ALL_COST }; COMPILE_TIME_ASSERT( RESUPPLY_BUY_TYPE_COUNT == 4 ); if ( FStrEq( pCmd, "buy" ) ) { if ( pArg->Argc() < 2 ) return true; // I can't do anything if I'm not active if ( !ShouldBeActive() ) return true; // Do we have enough resources to activate it? if (pPlayer->GetBankResources() <= 0) { // Play a sound indicating it didn't work... CSingleUserRecipientFilter filter( pPlayer ); EmitSound( filter, pPlayer->entindex(), "ObjectResupply.InsufficientFunds" ); return true; } bool bUsedResupply = false; ResupplyBuyType_t type = (ResupplyBuyType_t)atoi( pArg->Argv(1) ); if (type >= RESUPPLY_BUY_TYPE_COUNT) return true; // Get the potential cost. float flCost = s_Costs[type]; // flCost += pPlayer->ClassCostAdjustment( type ); float flFraction = pPlayer->GetBankResources() / flCost; if (flFraction > 1.0f) flFraction = 1.0f; switch( type ) { case RESUPPLY_BUY_HEALTH: // Calculate the amount to heal if (ResupplyHealth(pPlayer, flFraction)) { bUsedResupply = true; } break; case RESUPPLY_BUY_AMMO: // Refill the player's ammo too if (pPlayer->ResupplyAmmo( flFraction * RESUPPLY_AMMO_AMT, RESUPPLY_AMMO_FROM_STATION )) { bUsedResupply = true; } break; case RESUPPLY_BUY_GRENADES: // Refill the player's ammo too if (pPlayer->ResupplyAmmo( flFraction * RESUPPLY_AMMO_AMT, RESUPPLY_GRENADES_FROM_STATION )) { bUsedResupply = true; } break; case RESUPPLY_BUY_ALL: // Calculate the amount to heal if (ResupplyHealth(pPlayer, flFraction)) { bUsedResupply = true; } // Refill the player's ammo too if (pPlayer->ResupplyAmmo( flFraction * RESUPPLY_AMMO_AMT, RESUPPLY_ALL_FROM_STATION )) { bUsedResupply = true; } break; } if (bUsedResupply) { // Play an ammo pickup just to this player CSingleUserRecipientFilter filter( pPlayer ); pPlayer->EmitSound( filter, pPlayer->entindex(), "BaseCombatCharacter.AmmoPickup" ); pPlayer->RemoveBankResources( flFraction * flCost ); } return true; } return BaseClass::ClientCommand( pPlayer, pCmd, pArg ); }