diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/server/hl2mp/hl2mp_bot_temp.cpp | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/server/hl2mp/hl2mp_bot_temp.cpp')
| -rw-r--r-- | mp/src/game/server/hl2mp/hl2mp_bot_temp.cpp | 870 |
1 files changed, 435 insertions, 435 deletions
diff --git a/mp/src/game/server/hl2mp/hl2mp_bot_temp.cpp b/mp/src/game/server/hl2mp/hl2mp_bot_temp.cpp index 3aab7a12..054eea40 100644 --- a/mp/src/game/server/hl2mp/hl2mp_bot_temp.cpp +++ b/mp/src/game/server/hl2mp/hl2mp_bot_temp.cpp @@ -1,435 +1,435 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose: Basic BOT handling.
-//
-// $Workfile: $
-// $Date: $
-//
-//-----------------------------------------------------------------------------
-// $Log: $
-//
-// $NoKeywords: $
-//=============================================================================//
-
-
-#include "cbase.h"
-#include "player.h"
-#include "hl2mp_player.h"
-#include "in_buttons.h"
-#include "movehelper_server.h"
-
-void ClientPutInServer( edict_t *pEdict, const char *playername );
-void Bot_Think( CHL2MP_Player *pBot );
-
-#ifdef DEBUG
-
-ConVar bot_forcefireweapon( "bot_forcefireweapon", "", 0, "Force bots with the specified weapon to fire." );
-ConVar bot_forceattack2( "bot_forceattack2", "0", 0, "When firing, use attack2." );
-ConVar bot_forceattackon( "bot_forceattackon", "0", 0, "When firing, don't tap fire, hold it down." );
-ConVar bot_flipout( "bot_flipout", "0", 0, "When on, all bots fire their guns." );
-ConVar bot_defend( "bot_defend", "0", 0, "Set to a team number, and that team will all keep their combat shields raised." );
-ConVar bot_changeclass( "bot_changeclass", "0", 0, "Force all bots to change to the specified class." );
-ConVar bot_zombie( "bot_zombie", "0", 0, "Brraaaaaiiiins." );
-static ConVar bot_mimic_yaw_offset( "bot_mimic_yaw_offset", "0", 0, "Offsets the bot yaw." );
-ConVar bot_attack( "bot_attack", "1", 0, "Shoot!" );
-
-ConVar bot_sendcmd( "bot_sendcmd", "", 0, "Forces bots to send the specified command." );
-
-ConVar bot_crouch( "bot_crouch", "0", 0, "Bot crouches" );
-
-#ifdef NEXT_BOT
-extern ConVar bot_mimic;
-#else
-ConVar bot_mimic( "bot_mimic", "0", 0, "Bot uses usercmd of player by index." );
-#endif
-
-static int BotNumber = 1;
-static int g_iNextBotTeam = -1;
-static int g_iNextBotClass = -1;
-
-typedef struct
-{
- bool backwards;
-
- float nextturntime;
- bool lastturntoright;
-
- float nextstrafetime;
- float sidemove;
-
- QAngle forwardAngle;
- QAngle lastAngles;
-
- float m_flJoinTeamTime;
- int m_WantedTeam;
- int m_WantedClass;
-} botdata_t;
-
-static botdata_t g_BotData[ MAX_PLAYERS ];
-
-
-//-----------------------------------------------------------------------------
-// Purpose: Create a new Bot and put it in the game.
-// Output : Pointer to the new Bot, or NULL if there's no free clients.
-//-----------------------------------------------------------------------------
-CBasePlayer *BotPutInServer( bool bFrozen, int iTeam )
-{
- g_iNextBotTeam = iTeam;
-
- char botname[ 64 ];
- Q_snprintf( botname, sizeof( botname ), "Bot%02i", BotNumber );
-
- // This is an evil hack, but we use it to prevent sv_autojointeam from kicking in.
-
- edict_t *pEdict = engine->CreateFakeClient( botname );
-
- if (!pEdict)
- {
- Msg( "Failed to create Bot.\n");
- return NULL;
- }
-
- // Allocate a CBasePlayer for the bot, and call spawn
- //ClientPutInServer( pEdict, botname );
- CHL2MP_Player *pPlayer = ((CHL2MP_Player *)CBaseEntity::Instance( pEdict ));
- pPlayer->ClearFlags();
- pPlayer->AddFlag( FL_CLIENT | FL_FAKECLIENT );
-
- if ( bFrozen )
- pPlayer->AddEFlags( EFL_BOT_FROZEN );
-
- BotNumber++;
-
- g_BotData[pPlayer->entindex()-1].m_WantedTeam = iTeam;
- g_BotData[pPlayer->entindex()-1].m_flJoinTeamTime = gpGlobals->curtime + 0.3;
-
- return pPlayer;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Run through all the Bots in the game and let them think.
-//-----------------------------------------------------------------------------
-void Bot_RunAll( void )
-{
- for ( int i = 1; i <= gpGlobals->maxClients; i++ )
- {
- CHL2MP_Player *pPlayer = ToHL2MPPlayer( UTIL_PlayerByIndex( i ) );
-
- if ( pPlayer && (pPlayer->GetFlags() & FL_FAKECLIENT) )
- {
- Bot_Think( pPlayer );
- }
- }
-}
-
-bool RunMimicCommand( CUserCmd& cmd )
-{
- if ( bot_mimic.GetInt() <= 0 )
- return false;
-
- if ( bot_mimic.GetInt() > gpGlobals->maxClients )
- return false;
-
-
- CBasePlayer *pPlayer = UTIL_PlayerByIndex( bot_mimic.GetInt() );
- if ( !pPlayer )
- return false;
-
- if ( !pPlayer->GetLastUserCommand() )
- return false;
-
- cmd = *pPlayer->GetLastUserCommand();
- cmd.viewangles[YAW] += bot_mimic_yaw_offset.GetFloat();
-
- return true;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Simulates a single frame of movement for a player
-// Input : *fakeclient -
-// *viewangles -
-// forwardmove -
-// sidemove -
-// upmove -
-// buttons -
-// impulse -
-// msec -
-// Output : virtual void
-//-----------------------------------------------------------------------------
-static void RunPlayerMove( CHL2MP_Player *fakeclient, const QAngle& viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, float frametime )
-{
- if ( !fakeclient )
- return;
-
- CUserCmd cmd;
-
- // Store off the globals.. they're gonna get whacked
- float flOldFrametime = gpGlobals->frametime;
- float flOldCurtime = gpGlobals->curtime;
-
- float flTimeBase = gpGlobals->curtime + gpGlobals->frametime - frametime;
- fakeclient->SetTimeBase( flTimeBase );
-
- Q_memset( &cmd, 0, sizeof( cmd ) );
-
- if ( !RunMimicCommand( cmd ) && !bot_zombie.GetBool() )
- {
- VectorCopy( viewangles, cmd.viewangles );
- cmd.forwardmove = forwardmove;
- cmd.sidemove = sidemove;
- cmd.upmove = upmove;
- cmd.buttons = buttons;
- cmd.impulse = impulse;
- cmd.random_seed = random->RandomInt( 0, 0x7fffffff );
- }
-
- if( bot_crouch.GetInt() )
- cmd.buttons |= IN_DUCK;
-
- if ( bot_attack.GetBool() )
- cmd.buttons |= IN_ATTACK;
-
- MoveHelperServer()->SetHost( fakeclient );
- fakeclient->PlayerRunCommand( &cmd, MoveHelperServer() );
-
- // save off the last good usercmd
- fakeclient->SetLastUserCommand( cmd );
-
- // Clear out any fixangle that has been set
- fakeclient->pl.fixangle = FIXANGLE_NONE;
-
- // Restore the globals..
- gpGlobals->frametime = flOldFrametime;
- gpGlobals->curtime = flOldCurtime;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Run this Bot's AI for one frame.
-//-----------------------------------------------------------------------------
-void Bot_Think( CHL2MP_Player *pBot )
-{
- // Make sure we stay being a bot
- pBot->AddFlag( FL_FAKECLIENT );
-
- botdata_t *botdata = &g_BotData[ ENTINDEX( pBot->edict() ) - 1 ];
-
- QAngle vecViewAngles;
- float forwardmove = 0.0;
- float sidemove = botdata->sidemove;
- float upmove = 0.0;
- unsigned short buttons = 0;
- byte impulse = 0;
- float frametime = gpGlobals->frametime;
-
- vecViewAngles = pBot->GetLocalAngles();
-
-
- // Create some random values
- if ( pBot->IsAlive() && (pBot->GetSolid() == SOLID_BBOX) )
- {
- trace_t trace;
-
- // Stop when shot
- if ( !pBot->IsEFlagSet(EFL_BOT_FROZEN) )
- {
- if ( pBot->m_iHealth == 100 )
- {
- forwardmove = 600 * ( botdata->backwards ? -1 : 1 );
- if ( botdata->sidemove != 0.0f )
- {
- forwardmove *= random->RandomFloat( 0.1, 1.0f );
- }
- }
- else
- {
- forwardmove = 0;
- }
- }
-
- // Only turn if I haven't been hurt
- if ( !pBot->IsEFlagSet(EFL_BOT_FROZEN) && pBot->m_iHealth == 100 )
- {
- Vector vecEnd;
- Vector forward;
-
- QAngle angle;
- float angledelta = 15.0;
-
- int maxtries = (int)360.0/angledelta;
-
- if ( botdata->lastturntoright )
- {
- angledelta = -angledelta;
- }
-
- angle = pBot->GetLocalAngles();
-
- Vector vecSrc;
- while ( --maxtries >= 0 )
- {
- AngleVectors( angle, &forward );
-
- vecSrc = pBot->GetLocalOrigin() + Vector( 0, 0, 36 );
-
- vecEnd = vecSrc + forward * 10;
-
- UTIL_TraceHull( vecSrc, vecEnd, VEC_HULL_MIN_SCALED( pBot ), VEC_HULL_MAX_SCALED( pBot ),
- MASK_PLAYERSOLID, pBot, COLLISION_GROUP_NONE, &trace );
-
- if ( trace.fraction == 1.0 )
- {
- if ( gpGlobals->curtime < botdata->nextturntime )
- {
- break;
- }
- }
-
- angle.y += angledelta;
-
- if ( angle.y > 180 )
- angle.y -= 360;
- else if ( angle.y < -180 )
- angle.y += 360;
-
- botdata->nextturntime = gpGlobals->curtime + 2.0;
- botdata->lastturntoright = random->RandomInt( 0, 1 ) == 0 ? true : false;
-
- botdata->forwardAngle = angle;
- botdata->lastAngles = angle;
-
- }
-
-
- if ( gpGlobals->curtime >= botdata->nextstrafetime )
- {
- botdata->nextstrafetime = gpGlobals->curtime + 1.0f;
-
- if ( random->RandomInt( 0, 5 ) == 0 )
- {
- botdata->sidemove = -600.0f + 1200.0f * random->RandomFloat( 0, 2 );
- }
- else
- {
- botdata->sidemove = 0;
- }
- sidemove = botdata->sidemove;
-
- if ( random->RandomInt( 0, 20 ) == 0 )
- {
- botdata->backwards = true;
- }
- else
- {
- botdata->backwards = false;
- }
- }
-
- pBot->SetLocalAngles( angle );
- vecViewAngles = angle;
- }
-
- // Is my team being forced to defend?
- if ( bot_defend.GetInt() == pBot->GetTeamNumber() )
- {
- buttons |= IN_ATTACK2;
- }
- // If bots are being forced to fire a weapon, see if I have it
- else if ( bot_forcefireweapon.GetString() )
- {
- CBaseCombatWeapon *pWeapon = pBot->Weapon_OwnsThisType( bot_forcefireweapon.GetString() );
- if ( pWeapon )
- {
- // Switch to it if we don't have it out
- CBaseCombatWeapon *pActiveWeapon = pBot->GetActiveWeapon();
-
- // Switch?
- if ( pActiveWeapon != pWeapon )
- {
- pBot->Weapon_Switch( pWeapon );
- }
- else
- {
- // Start firing
- // Some weapons require releases, so randomise firing
- if ( bot_forceattackon.GetBool() || (RandomFloat(0.0,1.0) > 0.5) )
- {
- buttons |= bot_forceattack2.GetBool() ? IN_ATTACK2 : IN_ATTACK;
- }
- }
- }
- }
-
- if ( bot_flipout.GetInt() )
- {
- if ( bot_forceattackon.GetBool() || (RandomFloat(0.0,1.0) > 0.5) )
- {
- buttons |= bot_forceattack2.GetBool() ? IN_ATTACK2 : IN_ATTACK;
- }
- }
-
- if ( strlen( bot_sendcmd.GetString() ) > 0 )
- {
- //send the cmd from this bot
- CCommand args;
- args.Tokenize( bot_sendcmd.GetString() );
- pBot->ClientCommand( args );
-
- bot_sendcmd.SetValue("");
- }
- }
- else
- {
- // Wait for Reinforcement wave
- if ( !pBot->IsAlive() )
- {
- // Try hitting my buttons occasionally
- if ( random->RandomInt( 0, 100 ) > 80 )
- {
- // Respawn the bot
- if ( random->RandomInt( 0, 1 ) == 0 )
- {
- buttons |= IN_JUMP;
- }
- else
- {
- buttons = 0;
- }
- }
- }
- }
-
- if ( bot_flipout.GetInt() >= 2 )
- {
-
- QAngle angOffset = RandomAngle( -1, 1 );
-
- botdata->lastAngles += angOffset;
-
- for ( int i = 0 ; i < 2; i++ )
- {
- if ( fabs( botdata->lastAngles[ i ] - botdata->forwardAngle[ i ] ) > 15.0f )
- {
- if ( botdata->lastAngles[ i ] > botdata->forwardAngle[ i ] )
- {
- botdata->lastAngles[ i ] = botdata->forwardAngle[ i ] + 15;
- }
- else
- {
- botdata->lastAngles[ i ] = botdata->forwardAngle[ i ] - 15;
- }
- }
- }
-
- botdata->lastAngles[ 2 ] = 0;
-
- pBot->SetLocalAngles( botdata->lastAngles );
- }
-
- RunPlayerMove( pBot, pBot->GetLocalAngles(), forwardmove, sidemove, upmove, buttons, impulse, frametime );
-}
-
-
-
-
-#endif
-
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Basic BOT handling. +// +// $Workfile: $ +// $Date: $ +// +//----------------------------------------------------------------------------- +// $Log: $ +// +// $NoKeywords: $ +//=============================================================================// + + +#include "cbase.h" +#include "player.h" +#include "hl2mp_player.h" +#include "in_buttons.h" +#include "movehelper_server.h" + +void ClientPutInServer( edict_t *pEdict, const char *playername ); +void Bot_Think( CHL2MP_Player *pBot ); + +#ifdef DEBUG + +ConVar bot_forcefireweapon( "bot_forcefireweapon", "", 0, "Force bots with the specified weapon to fire." ); +ConVar bot_forceattack2( "bot_forceattack2", "0", 0, "When firing, use attack2." ); +ConVar bot_forceattackon( "bot_forceattackon", "0", 0, "When firing, don't tap fire, hold it down." ); +ConVar bot_flipout( "bot_flipout", "0", 0, "When on, all bots fire their guns." ); +ConVar bot_defend( "bot_defend", "0", 0, "Set to a team number, and that team will all keep their combat shields raised." ); +ConVar bot_changeclass( "bot_changeclass", "0", 0, "Force all bots to change to the specified class." ); +ConVar bot_zombie( "bot_zombie", "0", 0, "Brraaaaaiiiins." ); +static ConVar bot_mimic_yaw_offset( "bot_mimic_yaw_offset", "0", 0, "Offsets the bot yaw." ); +ConVar bot_attack( "bot_attack", "1", 0, "Shoot!" ); + +ConVar bot_sendcmd( "bot_sendcmd", "", 0, "Forces bots to send the specified command." ); + +ConVar bot_crouch( "bot_crouch", "0", 0, "Bot crouches" ); + +#ifdef NEXT_BOT +extern ConVar bot_mimic; +#else +ConVar bot_mimic( "bot_mimic", "0", 0, "Bot uses usercmd of player by index." ); +#endif + +static int BotNumber = 1; +static int g_iNextBotTeam = -1; +static int g_iNextBotClass = -1; + +typedef struct +{ + bool backwards; + + float nextturntime; + bool lastturntoright; + + float nextstrafetime; + float sidemove; + + QAngle forwardAngle; + QAngle lastAngles; + + float m_flJoinTeamTime; + int m_WantedTeam; + int m_WantedClass; +} botdata_t; + +static botdata_t g_BotData[ MAX_PLAYERS ]; + + +//----------------------------------------------------------------------------- +// Purpose: Create a new Bot and put it in the game. +// Output : Pointer to the new Bot, or NULL if there's no free clients. +//----------------------------------------------------------------------------- +CBasePlayer *BotPutInServer( bool bFrozen, int iTeam ) +{ + g_iNextBotTeam = iTeam; + + char botname[ 64 ]; + Q_snprintf( botname, sizeof( botname ), "Bot%02i", BotNumber ); + + // This is an evil hack, but we use it to prevent sv_autojointeam from kicking in. + + edict_t *pEdict = engine->CreateFakeClient( botname ); + + if (!pEdict) + { + Msg( "Failed to create Bot.\n"); + return NULL; + } + + // Allocate a CBasePlayer for the bot, and call spawn + //ClientPutInServer( pEdict, botname ); + CHL2MP_Player *pPlayer = ((CHL2MP_Player *)CBaseEntity::Instance( pEdict )); + pPlayer->ClearFlags(); + pPlayer->AddFlag( FL_CLIENT | FL_FAKECLIENT ); + + if ( bFrozen ) + pPlayer->AddEFlags( EFL_BOT_FROZEN ); + + BotNumber++; + + g_BotData[pPlayer->entindex()-1].m_WantedTeam = iTeam; + g_BotData[pPlayer->entindex()-1].m_flJoinTeamTime = gpGlobals->curtime + 0.3; + + return pPlayer; +} + +//----------------------------------------------------------------------------- +// Purpose: Run through all the Bots in the game and let them think. +//----------------------------------------------------------------------------- +void Bot_RunAll( void ) +{ + for ( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CHL2MP_Player *pPlayer = ToHL2MPPlayer( UTIL_PlayerByIndex( i ) ); + + if ( pPlayer && (pPlayer->GetFlags() & FL_FAKECLIENT) ) + { + Bot_Think( pPlayer ); + } + } +} + +bool RunMimicCommand( CUserCmd& cmd ) +{ + if ( bot_mimic.GetInt() <= 0 ) + return false; + + if ( bot_mimic.GetInt() > gpGlobals->maxClients ) + return false; + + + CBasePlayer *pPlayer = UTIL_PlayerByIndex( bot_mimic.GetInt() ); + if ( !pPlayer ) + return false; + + if ( !pPlayer->GetLastUserCommand() ) + return false; + + cmd = *pPlayer->GetLastUserCommand(); + cmd.viewangles[YAW] += bot_mimic_yaw_offset.GetFloat(); + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: Simulates a single frame of movement for a player +// Input : *fakeclient - +// *viewangles - +// forwardmove - +// sidemove - +// upmove - +// buttons - +// impulse - +// msec - +// Output : virtual void +//----------------------------------------------------------------------------- +static void RunPlayerMove( CHL2MP_Player *fakeclient, const QAngle& viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, float frametime ) +{ + if ( !fakeclient ) + return; + + CUserCmd cmd; + + // Store off the globals.. they're gonna get whacked + float flOldFrametime = gpGlobals->frametime; + float flOldCurtime = gpGlobals->curtime; + + float flTimeBase = gpGlobals->curtime + gpGlobals->frametime - frametime; + fakeclient->SetTimeBase( flTimeBase ); + + Q_memset( &cmd, 0, sizeof( cmd ) ); + + if ( !RunMimicCommand( cmd ) && !bot_zombie.GetBool() ) + { + VectorCopy( viewangles, cmd.viewangles ); + cmd.forwardmove = forwardmove; + cmd.sidemove = sidemove; + cmd.upmove = upmove; + cmd.buttons = buttons; + cmd.impulse = impulse; + cmd.random_seed = random->RandomInt( 0, 0x7fffffff ); + } + + if( bot_crouch.GetInt() ) + cmd.buttons |= IN_DUCK; + + if ( bot_attack.GetBool() ) + cmd.buttons |= IN_ATTACK; + + MoveHelperServer()->SetHost( fakeclient ); + fakeclient->PlayerRunCommand( &cmd, MoveHelperServer() ); + + // save off the last good usercmd + fakeclient->SetLastUserCommand( cmd ); + + // Clear out any fixangle that has been set + fakeclient->pl.fixangle = FIXANGLE_NONE; + + // Restore the globals.. + gpGlobals->frametime = flOldFrametime; + gpGlobals->curtime = flOldCurtime; +} + +//----------------------------------------------------------------------------- +// Purpose: Run this Bot's AI for one frame. +//----------------------------------------------------------------------------- +void Bot_Think( CHL2MP_Player *pBot ) +{ + // Make sure we stay being a bot + pBot->AddFlag( FL_FAKECLIENT ); + + botdata_t *botdata = &g_BotData[ ENTINDEX( pBot->edict() ) - 1 ]; + + QAngle vecViewAngles; + float forwardmove = 0.0; + float sidemove = botdata->sidemove; + float upmove = 0.0; + unsigned short buttons = 0; + byte impulse = 0; + float frametime = gpGlobals->frametime; + + vecViewAngles = pBot->GetLocalAngles(); + + + // Create some random values + if ( pBot->IsAlive() && (pBot->GetSolid() == SOLID_BBOX) ) + { + trace_t trace; + + // Stop when shot + if ( !pBot->IsEFlagSet(EFL_BOT_FROZEN) ) + { + if ( pBot->m_iHealth == 100 ) + { + forwardmove = 600 * ( botdata->backwards ? -1 : 1 ); + if ( botdata->sidemove != 0.0f ) + { + forwardmove *= random->RandomFloat( 0.1, 1.0f ); + } + } + else + { + forwardmove = 0; + } + } + + // Only turn if I haven't been hurt + if ( !pBot->IsEFlagSet(EFL_BOT_FROZEN) && pBot->m_iHealth == 100 ) + { + Vector vecEnd; + Vector forward; + + QAngle angle; + float angledelta = 15.0; + + int maxtries = (int)360.0/angledelta; + + if ( botdata->lastturntoright ) + { + angledelta = -angledelta; + } + + angle = pBot->GetLocalAngles(); + + Vector vecSrc; + while ( --maxtries >= 0 ) + { + AngleVectors( angle, &forward ); + + vecSrc = pBot->GetLocalOrigin() + Vector( 0, 0, 36 ); + + vecEnd = vecSrc + forward * 10; + + UTIL_TraceHull( vecSrc, vecEnd, VEC_HULL_MIN_SCALED( pBot ), VEC_HULL_MAX_SCALED( pBot ), + MASK_PLAYERSOLID, pBot, COLLISION_GROUP_NONE, &trace ); + + if ( trace.fraction == 1.0 ) + { + if ( gpGlobals->curtime < botdata->nextturntime ) + { + break; + } + } + + angle.y += angledelta; + + if ( angle.y > 180 ) + angle.y -= 360; + else if ( angle.y < -180 ) + angle.y += 360; + + botdata->nextturntime = gpGlobals->curtime + 2.0; + botdata->lastturntoright = random->RandomInt( 0, 1 ) == 0 ? true : false; + + botdata->forwardAngle = angle; + botdata->lastAngles = angle; + + } + + + if ( gpGlobals->curtime >= botdata->nextstrafetime ) + { + botdata->nextstrafetime = gpGlobals->curtime + 1.0f; + + if ( random->RandomInt( 0, 5 ) == 0 ) + { + botdata->sidemove = -600.0f + 1200.0f * random->RandomFloat( 0, 2 ); + } + else + { + botdata->sidemove = 0; + } + sidemove = botdata->sidemove; + + if ( random->RandomInt( 0, 20 ) == 0 ) + { + botdata->backwards = true; + } + else + { + botdata->backwards = false; + } + } + + pBot->SetLocalAngles( angle ); + vecViewAngles = angle; + } + + // Is my team being forced to defend? + if ( bot_defend.GetInt() == pBot->GetTeamNumber() ) + { + buttons |= IN_ATTACK2; + } + // If bots are being forced to fire a weapon, see if I have it + else if ( bot_forcefireweapon.GetString() ) + { + CBaseCombatWeapon *pWeapon = pBot->Weapon_OwnsThisType( bot_forcefireweapon.GetString() ); + if ( pWeapon ) + { + // Switch to it if we don't have it out + CBaseCombatWeapon *pActiveWeapon = pBot->GetActiveWeapon(); + + // Switch? + if ( pActiveWeapon != pWeapon ) + { + pBot->Weapon_Switch( pWeapon ); + } + else + { + // Start firing + // Some weapons require releases, so randomise firing + if ( bot_forceattackon.GetBool() || (RandomFloat(0.0,1.0) > 0.5) ) + { + buttons |= bot_forceattack2.GetBool() ? IN_ATTACK2 : IN_ATTACK; + } + } + } + } + + if ( bot_flipout.GetInt() ) + { + if ( bot_forceattackon.GetBool() || (RandomFloat(0.0,1.0) > 0.5) ) + { + buttons |= bot_forceattack2.GetBool() ? IN_ATTACK2 : IN_ATTACK; + } + } + + if ( strlen( bot_sendcmd.GetString() ) > 0 ) + { + //send the cmd from this bot + CCommand args; + args.Tokenize( bot_sendcmd.GetString() ); + pBot->ClientCommand( args ); + + bot_sendcmd.SetValue(""); + } + } + else + { + // Wait for Reinforcement wave + if ( !pBot->IsAlive() ) + { + // Try hitting my buttons occasionally + if ( random->RandomInt( 0, 100 ) > 80 ) + { + // Respawn the bot + if ( random->RandomInt( 0, 1 ) == 0 ) + { + buttons |= IN_JUMP; + } + else + { + buttons = 0; + } + } + } + } + + if ( bot_flipout.GetInt() >= 2 ) + { + + QAngle angOffset = RandomAngle( -1, 1 ); + + botdata->lastAngles += angOffset; + + for ( int i = 0 ; i < 2; i++ ) + { + if ( fabs( botdata->lastAngles[ i ] - botdata->forwardAngle[ i ] ) > 15.0f ) + { + if ( botdata->lastAngles[ i ] > botdata->forwardAngle[ i ] ) + { + botdata->lastAngles[ i ] = botdata->forwardAngle[ i ] + 15; + } + else + { + botdata->lastAngles[ i ] = botdata->forwardAngle[ i ] - 15; + } + } + } + + botdata->lastAngles[ 2 ] = 0; + + pBot->SetLocalAngles( botdata->lastAngles ); + } + + RunPlayerMove( pBot, pBot->GetLocalAngles(), forwardmove, sidemove, upmove, buttons, impulse, frametime ); +} + + + + +#endif + |