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
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(); |
|
}
|
|
|