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.
137 lines
3.3 KiB
137 lines
3.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// tf_bot_locomotion.cpp |
|
// Team Fortress NextBot locomotion interface |
|
// Michael Booth, May 2010 |
|
|
|
#include "cbase.h" |
|
|
|
#include "tf_bot.h" |
|
#include "tf_bot_locomotion.h" |
|
#include "particle_parse.h" |
|
|
|
|
|
//----------------------------------------------------------------------------------------- |
|
void CTFBotLocomotion::Update( void ) |
|
{ |
|
BaseClass::Update(); |
|
|
|
CTFBot *me = ToTFBot( GetBot()->GetEntity() ); |
|
if ( !me ) |
|
{ |
|
return; |
|
} |
|
|
|
// always 'crouch jump' |
|
if ( IsOnGround() ) |
|
{ |
|
if ( !me->IsPlayerClass( TF_CLASS_ENGINEER ) ) |
|
{ |
|
// engineers need to crouch behind their guns |
|
me->ReleaseCrouchButton(); |
|
} |
|
} |
|
else |
|
{ |
|
me->PressCrouchButton( 0.3f ); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------------------- |
|
// Move directly towards the given position |
|
void CTFBotLocomotion::Approach( const Vector &pos, float goalWeight ) |
|
{ |
|
if ( TFGameRules()->IsMannVsMachineMode() ) |
|
{ |
|
if ( !IsOnGround() && !IsClimbingOrJumping() ) |
|
{ |
|
// no air control |
|
return; |
|
} |
|
} |
|
|
|
BaseClass::Approach( pos, goalWeight ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------------------- |
|
// Distance at which we will die if we fall |
|
float CTFBotLocomotion::GetDeathDropHeight( void ) const |
|
{ |
|
return 1000.0f; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------------------- |
|
// Get maximum running speed |
|
float CTFBotLocomotion::GetRunSpeed( void ) const |
|
{ |
|
CTFBot *me = (CTFBot *)GetBot()->GetEntity(); |
|
return me->GetPlayerClass()->GetMaxSpeed(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------------------- |
|
// Return true if given area can be used for navigation |
|
bool CTFBotLocomotion::IsAreaTraversable( const CNavArea *baseArea ) const |
|
{ |
|
CTFBot *me = (CTFBot *)GetBot()->GetEntity(); |
|
CTFNavArea *area = (CTFNavArea *)baseArea; |
|
|
|
if ( area->IsBlocked( me->GetTeamNumber() ) ) |
|
{ |
|
return false; |
|
} |
|
|
|
if ( !TFGameRules()->RoundHasBeenWon() || TFGameRules()->GetWinningTeam() != me->GetTeamNumber() ) |
|
{ |
|
if ( area->HasAttributeTF( TF_NAV_SPAWN_ROOM_RED ) && me->GetTeamNumber() == TF_TEAM_BLUE ) |
|
{ |
|
return false; |
|
} |
|
|
|
if ( area->HasAttributeTF( TF_NAV_SPAWN_ROOM_BLUE ) && me->GetTeamNumber() == TF_TEAM_RED ) |
|
{ |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------------------- |
|
bool CTFBotLocomotion::IsEntityTraversable( CBaseEntity *obstacle, TraverseWhenType when ) const |
|
{ |
|
// assume all players are "traversable" in that they will move or can be killed |
|
if ( obstacle && obstacle->IsPlayer() ) |
|
{ |
|
return true; |
|
} |
|
|
|
return PlayerLocomotion::IsEntityTraversable( obstacle, when ); |
|
} |
|
|
|
|
|
void CTFBotLocomotion::Jump( void ) |
|
{ |
|
BaseClass::Jump(); |
|
|
|
CTFBot *me = ToTFBot( GetBot()->GetEntity() ); |
|
if ( !me ) |
|
{ |
|
return; |
|
} |
|
|
|
if ( TFGameRules() && TFGameRules()->IsMannVsMachineMode() ) |
|
{ |
|
int iCustomJumpParticle = 0; |
|
CALL_ATTRIB_HOOK_INT_ON_OTHER( me, iCustomJumpParticle, bot_custom_jump_particle ); |
|
if ( iCustomJumpParticle ) |
|
{ |
|
const char *pEffectName = "rocketjump_smoke"; |
|
DispatchParticleEffect( pEffectName, PATTACH_POINT_FOLLOW, me, "foot_L" ); |
|
DispatchParticleEffect( pEffectName, PATTACH_POINT_FOLLOW, me, "foot_R" ); |
|
} |
|
} |
|
}
|
|
|