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.
113 lines
3.7 KiB
113 lines
3.7 KiB
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
// tf_bot_engineer_build_teleport_entrance.cpp
|
||
|
// Engineer building a teleport entrance right outside of the spawn room
|
||
|
// Michael Booth, May 2009
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "nav_mesh.h"
|
||
|
#include "tf_player.h"
|
||
|
#include "tf_obj.h"
|
||
|
#include "tf_weapon_builder.h"
|
||
|
#include "bot/tf_bot.h"
|
||
|
#include "bot/behavior/engineer/tf_bot_engineer_build_teleport_entrance.h"
|
||
|
#include "bot/behavior/engineer/tf_bot_engineer_move_to_build.h"
|
||
|
#include "bot/behavior/tf_bot_get_ammo.h"
|
||
|
|
||
|
extern ConVar tf_bot_path_lookahead_range;
|
||
|
|
||
|
ConVar tf_bot_max_teleport_entrance_travel( "tf_bot_max_teleport_entrance_travel", "1500", FCVAR_CHEAT, "Don't plant teleport entrances farther than this travel distance from our spawn room" );
|
||
|
ConVar tf_bot_teleport_build_surface_normal_limit( "tf_bot_teleport_build_surface_normal_limit", "0.99", FCVAR_CHEAT, "If the ground normal Z component is less that this value, Engineer bots won't place their entrance teleporter" );
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------
|
||
|
ActionResult< CTFBot > CTFBotEngineerBuildTeleportEntrance::OnStart( CTFBot *me, Action< CTFBot > *priorAction )
|
||
|
{
|
||
|
return Continue();
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------
|
||
|
ActionResult< CTFBot > CTFBotEngineerBuildTeleportEntrance::Update( CTFBot *me, float interval )
|
||
|
{
|
||
|
CTeamControlPoint *point = me->GetMyControlPoint();
|
||
|
if ( !point )
|
||
|
{
|
||
|
// wait until a control point becomes available
|
||
|
return Continue();
|
||
|
}
|
||
|
|
||
|
CTFNavArea *myArea = me->GetLastKnownArea();
|
||
|
|
||
|
if ( !myArea )
|
||
|
{
|
||
|
return Done( "No nav mesh!" );
|
||
|
}
|
||
|
|
||
|
if ( myArea->GetIncursionDistance( me->GetTeamNumber() ) > tf_bot_max_teleport_entrance_travel.GetFloat() )
|
||
|
{
|
||
|
return ChangeTo( new CTFBotEngineerMoveToBuild, "Too far from our spawn room to build teleporter entrance" );
|
||
|
}
|
||
|
|
||
|
// make sure we go back to our resupply cabinet after planting the teleporter entrance before we move on
|
||
|
if ( !me->IsAmmoFull() && CTFBotGetAmmo::IsPossible( me ) )
|
||
|
{
|
||
|
return SuspendFor( new CTFBotGetAmmo, "Refilling ammo" );
|
||
|
}
|
||
|
|
||
|
CBaseObject *myTeleportEntrance = me->GetObjectOfType( OBJ_TELEPORTER, MODE_TELEPORTER_ENTRANCE );
|
||
|
if ( myTeleportEntrance )
|
||
|
{
|
||
|
// successfully built
|
||
|
return ChangeTo( new CTFBotEngineerMoveToBuild, "Teleport entrance built" );
|
||
|
}
|
||
|
|
||
|
// head towards the control point and build as soon as we can
|
||
|
if ( !m_path.IsValid() )
|
||
|
{
|
||
|
CTFBotPathCost cost( me, FASTEST_ROUTE );
|
||
|
m_path.Compute( me, point->GetAbsOrigin(), cost );
|
||
|
}
|
||
|
|
||
|
m_path.Update( me );
|
||
|
|
||
|
// build
|
||
|
CTFWeaponBase *myGun = me->GetActiveTFWeapon();
|
||
|
if ( myGun )
|
||
|
{
|
||
|
CTFWeaponBuilder *builder = dynamic_cast< CTFWeaponBuilder * >( myGun );
|
||
|
if ( builder )
|
||
|
{
|
||
|
// don't build on slopes - causes player blockages
|
||
|
Vector forward;
|
||
|
me->EyeVectors( &forward );
|
||
|
|
||
|
const float placementRange = 30.0f;
|
||
|
forward *= placementRange;
|
||
|
|
||
|
trace_t result;
|
||
|
UTIL_TraceLine( me->WorldSpaceCenter() + Vector( forward.x, forward.y, 0.0f ), me->WorldSpaceCenter() + Vector( forward.x, forward.y, -200.0f ), MASK_PLAYERSOLID, me, COLLISION_GROUP_NONE, &result );
|
||
|
|
||
|
if ( builder->IsValidPlacement() && result.DidHit() && result.plane.normal.z > tf_bot_teleport_build_surface_normal_limit.GetFloat() )
|
||
|
{
|
||
|
// place it down
|
||
|
me->PressFireButton();
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// switch to teleporter builder
|
||
|
me->StartBuildingObjectOfType( OBJ_TELEPORTER, MODE_TELEPORTER_ENTRANCE );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return Continue();
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------
|
||
|
EventDesiredResult< CTFBot > CTFBotEngineerBuildTeleportEntrance::OnStuck( CTFBot *me )
|
||
|
{
|
||
|
m_path.Invalidate();
|
||
|
|
||
|
return TryContinue();
|
||
|
}
|