Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

105 lines
3.2 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
// Michael Booth, September 2012
#include "cbase.h"
#include "string_t.h"
#include "nav_mesh.h"
#include "tf_player.h"
#include "tf_obj.h"
#include "tf_obj_sentrygun.h"
#include "tf_obj_dispenser.h"
#include "tf_gamerules.h"
#include "tf_weapon_builder.h"
#include "bot/tf_bot.h"
#include "bot/behavior/engineer/mvm_engineer/tf_bot_mvm_engineer_build_teleporter.h"
#include "bot/map_entities/tf_bot_hint_teleporter_exit.h"
ConVar tf_bot_engineer_mvm_building_health_multiplier( "tf_bot_engineer_building_health_multiplier", "2", FCVAR_CHEAT );
extern ConVar tf_bot_path_lookahead_range;
//---------------------------------------------------------------------------------------------
CTFBotMvMEngineerBuildTeleportExit::CTFBotMvMEngineerBuildTeleportExit( CTFBotHintTeleporterExit *hint )
{
m_teleporterBuildHint = hint;
}
//---------------------------------------------------------------------------------------------
ActionResult< CTFBot > CTFBotMvMEngineerBuildTeleportExit::OnStart( CTFBot *me, Action< CTFBot > *priorAction )
{
return Continue();
}
//---------------------------------------------------------------------------------------------
ActionResult< CTFBot > CTFBotMvMEngineerBuildTeleportExit::Update( CTFBot *me, float interval )
{
if ( m_teleporterBuildHint == NULL )
return Done( "No hint entity" );
// various interruptions could mean we're away from our build location - move to it
if ( me->IsRangeGreaterThan( m_teleporterBuildHint->GetAbsOrigin(), 25.0f ) )
{
if ( m_repathTimer.IsElapsed() )
{
m_repathTimer.Start( RandomFloat( 1.0f, 2.0f ) );
CTFBotPathCost cost( me, FASTEST_ROUTE );
m_path.Compute( me, m_teleporterBuildHint->GetAbsOrigin(), cost );
}
m_path.Update( me );
if ( !m_path.IsValid() )
{
return Done( "Path failed" );
}
return Continue();
}
if ( !m_delayBuildTime.HasStarted() )
{
m_delayBuildTime.Start( 0.1f );
TFGameRules()->PushAllPlayersAway( m_teleporterBuildHint->GetAbsOrigin(), 400, 500, TF_TEAM_RED );
}
else if ( m_delayBuildTime.IsElapsed() )
{
// destroy previous object
me->DetonateObjectOfType( OBJ_TELEPORTER, MODE_TELEPORTER_EXIT, true );
// directly create at the precise position and orientation desired
CObjectTeleporter* myTeleporter = (CObjectTeleporter *)CreateEntityByName( "obj_teleporter" );
if ( myTeleporter )
{
myTeleporter->SetAbsOrigin( m_teleporterBuildHint->GetAbsOrigin() );
myTeleporter->SetAbsAngles( QAngle( 0, m_teleporterBuildHint->GetAbsAngles().y, 0 ) );
myTeleporter->SetObjectMode( MODE_TELEPORTER_EXIT );
myTeleporter->Spawn();
myTeleporter->SetTeleportWhere( me->GetTeleportWhere() );
if ( me->ShouldQuickBuild() )
{
myTeleporter->ForceQuickBuild();
}
myTeleporter->StartPlacement( me );
myTeleporter->StartBuilding( me );
int iHealth = myTeleporter->GetMaxHealthForCurrentLevel() * tf_bot_engineer_mvm_building_health_multiplier.GetFloat();
myTeleporter->SetMaxHealth( iHealth );
myTeleporter->SetHealth( iHealth );
m_teleporterBuildHint->SetOwnerEntity( myTeleporter );
me->EmitSound( "Engineer.MVM_AutoBuildingTeleporter02" );
return Done( "Teleport exit built" );
}
}
return Continue();
}