//-----------------------------------------------------------------------------
// 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;
}
Example #5
0
//-----------------------------------------------------------------------------
// 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 );
    }
}
Example #8
0
//-----------------------------------------------------------------------------
// 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 );
}