mirror of
https://github.com/ineedbots/iw2_bot_warfare.git
synced 2025-07-05 02:31:53 +00:00
Compare commits
9 Commits
0028ed705f
...
master
Author | SHA1 | Date | |
---|---|---|---|
c7188a9cfc | |||
aa75e1f048 | |||
8f0b21578a | |||
0a0c63ca76 | |||
2cfed9d4ab | |||
2fc779f013 | |||
df30894124 | |||
1923142b72 | |||
3bc50e5a33 |
@ -6,7 +6,7 @@
|
|||||||
*/
|
*/
|
||||||
init()
|
init()
|
||||||
{
|
{
|
||||||
level.bw_version = "2.2.0 PR 1";
|
level.bw_version = "2.3.0 PR 1";
|
||||||
|
|
||||||
if ( getcvar( "bots_main" ) == "" )
|
if ( getcvar( "bots_main" ) == "" )
|
||||||
{
|
{
|
||||||
@ -43,7 +43,7 @@ init()
|
|||||||
|
|
||||||
if ( getcvar( "bots_main_kickBotsAtEnd" ) == "" )
|
if ( getcvar( "bots_main_kickBotsAtEnd" ) == "" )
|
||||||
{
|
{
|
||||||
setcvar( "bots_main_kickBotsAtEnd", false ); // kicks the bots at game end
|
setcvar( "bots_main_kickBotsAtEnd", true ); // kicks the bots at game end
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( getcvar( "bots_manage_add" ) == "" )
|
if ( getcvar( "bots_manage_add" ) == "" )
|
||||||
@ -70,7 +70,7 @@ init()
|
|||||||
{
|
{
|
||||||
setcvar( "bots_manage_fill_kick", false ); // kick bots if too many
|
setcvar( "bots_manage_fill_kick", false ); // kick bots if too many
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( getcvar( "bots_manage_fill_watchplayers" ) == "" )
|
if ( getcvar( "bots_manage_fill_watchplayers" ) == "" )
|
||||||
{
|
{
|
||||||
setcvar( "bots_manage_fill_watchplayers", false ); // add bots when player exists, kick if not
|
setcvar( "bots_manage_fill_watchplayers", false ); // add bots when player exists, kick if not
|
||||||
@ -233,8 +233,8 @@ init()
|
|||||||
level.bots_weapon_clip_sizes[ "enfield_mp" ] = 10;
|
level.bots_weapon_clip_sizes[ "enfield_mp" ] = 10;
|
||||||
level.bots_weapon_clip_sizes[ "bren_mp" ] = 30;
|
level.bots_weapon_clip_sizes[ "bren_mp" ] = 30;
|
||||||
level.bots_weapon_clip_sizes[ "enfield_scope_mp" ] = 10;
|
level.bots_weapon_clip_sizes[ "enfield_scope_mp" ] = 10;
|
||||||
level.bots_weapon_clip_sizes[ "svt40_mp" ] = 10;
|
level.bots_weapon_clip_sizes[ "SVT40_mp" ] = 10;
|
||||||
level.bots_weapon_clip_sizes[ "pps42_mp" ] = 35;
|
level.bots_weapon_clip_sizes[ "PPS42_mp" ] = 35;
|
||||||
level.bots_weapon_clip_sizes[ "ppsh_mp" ] = 71;
|
level.bots_weapon_clip_sizes[ "ppsh_mp" ] = 71;
|
||||||
level.bots_weapon_clip_sizes[ "g43_mp" ] = 10;
|
level.bots_weapon_clip_sizes[ "g43_mp" ] = 10;
|
||||||
level.bots_weapon_clip_sizes[ "mosin_nagant_mp" ] = 5;
|
level.bots_weapon_clip_sizes[ "mosin_nagant_mp" ] = 5;
|
||||||
@ -246,7 +246,7 @@ init()
|
|||||||
level.bots_weapon_clip_sizes[ "colt_mp" ] = 7;
|
level.bots_weapon_clip_sizes[ "colt_mp" ] = 7;
|
||||||
level.bots_weapon_clip_sizes[ "webley_mp" ] = 6;
|
level.bots_weapon_clip_sizes[ "webley_mp" ] = 6;
|
||||||
level.bots_weapon_clip_sizes[ "luger_mp" ] = 8;
|
level.bots_weapon_clip_sizes[ "luger_mp" ] = 8;
|
||||||
level.bots_weapon_clip_sizes[ "tt30_mp" ] = 8;
|
level.bots_weapon_clip_sizes[ "TT30_mp" ] = 8;
|
||||||
level.bots_weapon_clip_sizes[ "greasegun_mp" ] = 32;
|
level.bots_weapon_clip_sizes[ "greasegun_mp" ] = 32;
|
||||||
|
|
||||||
level.bots_weapon_class_names = [];
|
level.bots_weapon_class_names = [];
|
||||||
@ -260,8 +260,8 @@ init()
|
|||||||
level.bots_weapon_class_names[ "enfield_mp" ] = "sniper";
|
level.bots_weapon_class_names[ "enfield_mp" ] = "sniper";
|
||||||
level.bots_weapon_class_names[ "bren_mp" ] = "lmg";
|
level.bots_weapon_class_names[ "bren_mp" ] = "lmg";
|
||||||
level.bots_weapon_class_names[ "enfield_scope_mp" ] = "sniper";
|
level.bots_weapon_class_names[ "enfield_scope_mp" ] = "sniper";
|
||||||
level.bots_weapon_class_names[ "svt40_mp" ] = "rifle";
|
level.bots_weapon_class_names[ "SVT40_mp" ] = "rifle";
|
||||||
level.bots_weapon_class_names[ "pps42_mp" ] = "smg";
|
level.bots_weapon_class_names[ "PPS42_mp" ] = "smg";
|
||||||
level.bots_weapon_class_names[ "ppsh_mp" ] = "smg";
|
level.bots_weapon_class_names[ "ppsh_mp" ] = "smg";
|
||||||
level.bots_weapon_class_names[ "g43_mp" ] = "rifle";
|
level.bots_weapon_class_names[ "g43_mp" ] = "rifle";
|
||||||
level.bots_weapon_class_names[ "mosin_nagant_mp" ] = "sniper";
|
level.bots_weapon_class_names[ "mosin_nagant_mp" ] = "sniper";
|
||||||
@ -273,7 +273,7 @@ init()
|
|||||||
level.bots_weapon_class_names[ "colt_mp" ] = "pistol";
|
level.bots_weapon_class_names[ "colt_mp" ] = "pistol";
|
||||||
level.bots_weapon_class_names[ "webley_mp" ] = "pistol";
|
level.bots_weapon_class_names[ "webley_mp" ] = "pistol";
|
||||||
level.bots_weapon_class_names[ "luger_mp" ] = "pistol";
|
level.bots_weapon_class_names[ "luger_mp" ] = "pistol";
|
||||||
level.bots_weapon_class_names[ "tt30_mp" ] = "pistol";
|
level.bots_weapon_class_names[ "TT30_mp" ] = "pistol";
|
||||||
level.bots_weapon_class_names[ "greasegun_mp" ] = "smg";
|
level.bots_weapon_class_names[ "greasegun_mp" ] = "smg";
|
||||||
|
|
||||||
level thread fixGamemodes();
|
level thread fixGamemodes();
|
||||||
@ -595,10 +595,10 @@ connected()
|
|||||||
|
|
||||||
level.bots[ level.bots.size ] = self;
|
level.bots[ level.bots.size ] = self;
|
||||||
self thread onDisconnect();
|
self thread onDisconnect();
|
||||||
|
|
||||||
level notify( "bot_connected", self );
|
|
||||||
|
|
||||||
self thread watchBotDebugEvent();
|
self thread watchBotDebugEvent();
|
||||||
|
|
||||||
|
waittillframeend; // wait for waittills to process
|
||||||
|
level notify( "bot_connected", self );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1209,7 +1209,7 @@ aim_loop()
|
|||||||
|
|
||||||
if ( !isdefined( bone ) )
|
if ( !isdefined( bone ) )
|
||||||
{
|
{
|
||||||
bone = "j_spineupper";
|
bone = "j_spine4";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( self.bot.isfraggingafter || self.bot.issmokingafter || issubstr( "_grenade_", curweap ) )
|
if ( self.bot.isfraggingafter || self.bot.issmokingafter || issubstr( "_grenade_", curweap ) )
|
||||||
|
@ -9,6 +9,11 @@ added()
|
|||||||
self endon( "disconnect" );
|
self endon( "disconnect" );
|
||||||
|
|
||||||
self set_diff();
|
self set_diff();
|
||||||
|
|
||||||
|
if ( randomfloatrange( 0, 1 ) < 0.5 )
|
||||||
|
{
|
||||||
|
self.pers[ "bots" ][ "behavior" ][ "quickscope" ] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -662,4 +667,569 @@ start_bot_threads()
|
|||||||
self endon( "disconnect" );
|
self endon( "disconnect" );
|
||||||
level endon( "game_ended" );
|
level endon( "game_ended" );
|
||||||
self endon( "death" );
|
self endon( "death" );
|
||||||
|
|
||||||
|
self thread doReloadCancel();
|
||||||
|
self thread bot_weapon_think();
|
||||||
|
|
||||||
|
self thread bot_revenge_think();
|
||||||
|
self thread follow_target();
|
||||||
|
self thread bot_listen_to_steps();
|
||||||
|
self thread bot_uav_think();
|
||||||
|
|
||||||
|
if ( getcvarint( "bots_play_nade" ) )
|
||||||
|
{
|
||||||
|
// self thread bot_use_grenade_think();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( getcvarint( "bots_play_obj" ) )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Changes to the weap
|
||||||
|
*/
|
||||||
|
changeToWeapon( weap )
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "death" );
|
||||||
|
level endon( "game_ended" );
|
||||||
|
|
||||||
|
if ( !self hasweapon( weap ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotBuiltinBotWeapon( weap );
|
||||||
|
|
||||||
|
if ( self getcurrentweapon() == weap )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
self waittill_any_timeout( 5, "weapon_change" );
|
||||||
|
|
||||||
|
return ( self getcurrentweapon() == weap );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Clears goal when events death
|
||||||
|
*/
|
||||||
|
stop_go_target_on_death( tar )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "new_goal" );
|
||||||
|
self endon( "bad_path" );
|
||||||
|
self endon( "goal" );
|
||||||
|
|
||||||
|
tar waittill_either( "death", "disconnect" );
|
||||||
|
|
||||||
|
self ClearScriptGoal();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot logic for UAV detection here. Checks for UAV and players who are shooting.
|
||||||
|
*/
|
||||||
|
bot_uav_think_loop()
|
||||||
|
{
|
||||||
|
dist = self.pers[ "bots" ][ "skill" ][ "help_dist" ];
|
||||||
|
dist *= dist * 8;
|
||||||
|
|
||||||
|
for ( i = level.players.size - 1; i >= 0; i-- )
|
||||||
|
{
|
||||||
|
player = level.players[ i ];
|
||||||
|
|
||||||
|
if ( !player IsPlayerModelOK() )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( player == self )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isdefined( player.team ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( player.sessionstate != "playing" )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( level.teambased && player.team == self.team )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isalive( player ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
distFromPlayer = distancesquared( self.origin, player.origin );
|
||||||
|
|
||||||
|
if ( distFromPlayer > dist )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( player.bots_firing )
|
||||||
|
{
|
||||||
|
self BotNotifyBotEvent( "uav_target", "start", player );
|
||||||
|
|
||||||
|
distSq = self.pers[ "bots" ][ "skill" ][ "help_dist" ] * self.pers[ "bots" ][ "skill" ][ "help_dist" ];
|
||||||
|
|
||||||
|
if ( distFromPlayer < distSq && bullettracepassed( self getEyePos(), player getTagOrigin( "j_spine4" ), false, player ) )
|
||||||
|
{
|
||||||
|
self SetAttacker( player );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !self HasScriptGoal() && !self.bot_lock_goal )
|
||||||
|
{
|
||||||
|
self SetScriptGoal( player.origin, 128 );
|
||||||
|
self thread stop_go_target_on_death( player );
|
||||||
|
|
||||||
|
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||||
|
{
|
||||||
|
self ClearScriptGoal();
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotNotifyBotEvent( "uav_target", "stop", player );
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot logic for UAV detection here. Checks for UAV and players who are shooting.
|
||||||
|
*/
|
||||||
|
bot_uav_think()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
wait 0.75;
|
||||||
|
|
||||||
|
if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
self bot_uav_think_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot logic for detecting nearby players.
|
||||||
|
*/
|
||||||
|
bot_listen_to_steps_loop()
|
||||||
|
{
|
||||||
|
dist = level.bots_listendist;
|
||||||
|
|
||||||
|
dist *= dist;
|
||||||
|
|
||||||
|
heard = undefined;
|
||||||
|
|
||||||
|
for ( i = level.players.size - 1 ; i >= 0; i-- )
|
||||||
|
{
|
||||||
|
player = level.players[ i ];
|
||||||
|
|
||||||
|
if ( !player IsPlayerModelOK() )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( player == self )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( level.teambased && self.team == player.team )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( player.sessionstate != "playing" )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isalive( player ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( lengthsquared( player getVelocity() ) < 20000 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( distancesquared( player.origin, self.origin ) > dist )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
heard = player;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isdefined( heard ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotNotifyBotEvent( "heard_target", "start", heard );
|
||||||
|
|
||||||
|
if ( bullettracepassed( self getEyePos(), heard getTagOrigin( "j_spine4" ), false, heard ) )
|
||||||
|
{
|
||||||
|
self SetAttacker( heard );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self HasScriptGoal() || self.bot_lock_goal )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self SetScriptGoal( heard.origin, 64 );
|
||||||
|
|
||||||
|
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||||
|
{
|
||||||
|
self ClearScriptGoal();
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotNotifyBotEvent( "heard_target", "stop", heard );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot logic for detecting nearby players.
|
||||||
|
*/
|
||||||
|
bot_listen_to_steps()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "death" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
wait 1;
|
||||||
|
|
||||||
|
if ( self.pers[ "bots" ][ "skill" ][ "base" ] < 3 )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
self bot_listen_to_steps_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Goes to the target's location if it had one
|
||||||
|
*/
|
||||||
|
follow_target_loop()
|
||||||
|
{
|
||||||
|
threat = self getThreat();
|
||||||
|
|
||||||
|
if ( !isplayer( threat ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "follow" ] * 5 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotNotifyBotEvent( "follow_threat", "start", threat );
|
||||||
|
|
||||||
|
self SetScriptGoal( threat.origin, 64 );
|
||||||
|
self thread stop_go_target_on_death( threat );
|
||||||
|
|
||||||
|
if ( self waittill_any_return( "new_goal", "goal", "bad_path" ) != "new_goal" )
|
||||||
|
{
|
||||||
|
self ClearScriptGoal();
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotNotifyBotEvent( "follow_threat", "stop", threat );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Goes to the target's location if it had one
|
||||||
|
*/
|
||||||
|
follow_target()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
wait 1;
|
||||||
|
|
||||||
|
if ( self HasScriptGoal() || self.bot_lock_goal )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !self HasThreat() )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
self follow_target_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
bots will go to their target's kill location
|
||||||
|
*/
|
||||||
|
bot_revenge_think()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
|
||||||
|
if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isdefined( self.lastkiller ) && isalive( self.lastkiller ) )
|
||||||
|
{
|
||||||
|
if ( bullettracepassed( self getEyePos(), self.lastkiller getTagOrigin( "j_spine4" ), false, self.lastkiller ) )
|
||||||
|
{
|
||||||
|
self SetAttacker( self.lastkiller );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isdefined( self.killerlocation ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loc = self.killerlocation;
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
wait( randomintrange( 1, 5 ) );
|
||||||
|
|
||||||
|
if ( self HasScriptGoal() || self.bot_lock_goal )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( randomint( 100 ) < 75 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotNotifyBotEvent( "revenge", "start", loc, self.lastkiller );
|
||||||
|
|
||||||
|
self SetScriptGoal( loc, 64 );
|
||||||
|
|
||||||
|
if ( self waittill_any_return( "goal", "bad_path", "new_goal" ) != "new_goal" )
|
||||||
|
{
|
||||||
|
self ClearScriptGoal();
|
||||||
|
}
|
||||||
|
|
||||||
|
self BotNotifyBotEvent( "revenge", "stop", loc, self.lastkiller );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Reload cancels
|
||||||
|
*/
|
||||||
|
doReloadCancel_loop()
|
||||||
|
{
|
||||||
|
ret = self waittill_either_return( "reload", "weapon_change" );
|
||||||
|
|
||||||
|
if ( self BotIsFrozen() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self isPlantingOrDefusing() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
curWeap = self getcurrentweapon();
|
||||||
|
|
||||||
|
if ( !isWeaponDroppable( curWeap ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ret == "reload" )
|
||||||
|
{
|
||||||
|
// check single reloads
|
||||||
|
if ( self getweaponslotclipammo( self getWeaponSlot( curWeap ) ) < WeaponClipSize( curWeap ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check difficulty
|
||||||
|
if ( self.pers[ "bots" ][ "skill" ][ "base" ] <= 3 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if got another weapon
|
||||||
|
weaponslist = self getWeaponsListPrimaries();
|
||||||
|
weap = "";
|
||||||
|
|
||||||
|
while ( weaponslist.size )
|
||||||
|
{
|
||||||
|
weapon = weaponslist[ randomint( weaponslist.size ) ];
|
||||||
|
weaponslist = array_remove( weaponslist, weapon );
|
||||||
|
|
||||||
|
if ( !isWeaponDroppable( curWeap ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( curWeap == weapon || weapon == "none" || weapon == "" )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
weap = weapon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( weap == "" )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// do the cancel
|
||||||
|
wait 0.1;
|
||||||
|
self thread changeToWeapon( weap );
|
||||||
|
wait 0.25;
|
||||||
|
self thread changeToWeapon( curWeap );
|
||||||
|
wait 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Reload cancels
|
||||||
|
*/
|
||||||
|
doReloadCancel()
|
||||||
|
{
|
||||||
|
self endon( "disconnect" );
|
||||||
|
self endon( "death" );
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self doReloadCancel_loop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot logic for switching weapons.
|
||||||
|
*/
|
||||||
|
bot_weapon_think_loop( data )
|
||||||
|
{
|
||||||
|
ret = self waittill_any_timeout( randomintrange( 2, 4 ), "bot_force_check_switch" );
|
||||||
|
|
||||||
|
if ( self BotIsFrozen() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( self isPlantingOrDefusing() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasTarget = self HasThreat();
|
||||||
|
curWeap = self getcurrentweapon();
|
||||||
|
|
||||||
|
force = ( ret == "bot_force_check_switch" );
|
||||||
|
|
||||||
|
if ( data.first )
|
||||||
|
{
|
||||||
|
data.first = false;
|
||||||
|
|
||||||
|
if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "initswitch" ] )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( curWeap != "none" && self getAmmoCount( curWeap ) )
|
||||||
|
{
|
||||||
|
if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "switch" ] )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( hasTarget )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
force = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
weaponslist = self getWeaponsListPrimaries();
|
||||||
|
weap = "";
|
||||||
|
|
||||||
|
while ( weaponslist.size )
|
||||||
|
{
|
||||||
|
weapon = weaponslist[ randomint( weaponslist.size ) ];
|
||||||
|
weaponslist = array_remove( weaponslist, weapon );
|
||||||
|
|
||||||
|
if ( !self getAmmoCount( weapon ) && !force )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !isWeaponDroppable( weapon ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( curWeap == weapon || weapon == "none" || weapon == "" )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
weap = weapon;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( weap == "" )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self thread changeToWeapon( weap );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bot logic for switching weapons.
|
||||||
|
*/
|
||||||
|
bot_weapon_think()
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
self endon( "disconnect" );
|
||||||
|
level endon( "game_ended" );
|
||||||
|
|
||||||
|
data = spawnstruct();
|
||||||
|
data.first = true;
|
||||||
|
|
||||||
|
for ( ;; )
|
||||||
|
{
|
||||||
|
self bot_weapon_think_loop( data );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -96,6 +96,17 @@ BotBuiltinBotAngles( angles )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Sets weapon
|
||||||
|
*/
|
||||||
|
BotBuiltinBotWeapon( weapon )
|
||||||
|
{
|
||||||
|
if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botweapon" ] ) )
|
||||||
|
{
|
||||||
|
self [[ level.bot_builtins[ "botweapon" ] ]]( weapon );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Returns if player is the host
|
Returns if player is the host
|
||||||
*/
|
*/
|
||||||
@ -479,6 +490,11 @@ ClearPriorityObjective()
|
|||||||
self notify( "kill_goal" );
|
self notify( "kill_goal" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isPlantingOrDefusing()
|
||||||
|
{
|
||||||
|
return isdefined( self.progressbackground );
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If the site is in use
|
If the site is in use
|
||||||
*/
|
*/
|
||||||
@ -591,6 +607,16 @@ getWeaponSlot( weap )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getWeaponsListPrimaries()
|
||||||
|
{
|
||||||
|
answer = [];
|
||||||
|
|
||||||
|
answer[ answer.size ] = self getweaponslotweapon( "primary" );
|
||||||
|
answer[ answer.size ] = self getweaponslotweapon( "primaryb" );
|
||||||
|
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
cOD2
|
cOD2
|
||||||
*/
|
*/
|
||||||
@ -827,6 +853,52 @@ _timeout( delay )
|
|||||||
self notify( "returned", "timeout" );
|
self notify( "returned", "timeout" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
From newer gscs
|
||||||
|
*/
|
||||||
|
waittill_any_return( string1, string2, string3, string4, string5 )
|
||||||
|
{
|
||||||
|
if ( ( !isdefined( string1 ) || string1 != "death" ) &&
|
||||||
|
( !isdefined( string2 ) || string2 != "death" ) &&
|
||||||
|
( !isdefined( string3 ) || string3 != "death" ) &&
|
||||||
|
( !isdefined( string4 ) || string4 != "death" ) &&
|
||||||
|
( !isdefined( string5 ) || string5 != "death" ) )
|
||||||
|
{
|
||||||
|
self endon( "death" );
|
||||||
|
}
|
||||||
|
|
||||||
|
ent = spawnstruct();
|
||||||
|
|
||||||
|
if ( isdefined( string1 ) )
|
||||||
|
{
|
||||||
|
self thread waittill_string( string1, ent );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isdefined ( string2 ) )
|
||||||
|
{
|
||||||
|
self thread waittill_string( string2, ent );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isdefined ( string3 ) )
|
||||||
|
{
|
||||||
|
self thread waittill_string( string3, ent );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isdefined ( string4 ) )
|
||||||
|
{
|
||||||
|
self thread waittill_string( string4, ent );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isdefined ( string5 ) )
|
||||||
|
{
|
||||||
|
self thread waittill_string( string5, ent );
|
||||||
|
}
|
||||||
|
|
||||||
|
ent waittill( "returned", msg );
|
||||||
|
ent notify( "die" );
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If the weapon is allowed to be dropped
|
If the weapon is allowed to be dropped
|
||||||
*/
|
*/
|
||||||
@ -1357,7 +1429,7 @@ parseTokensIntoWaypoint( tokens )
|
|||||||
readWpsFromFile( mapname )
|
readWpsFromFile( mapname )
|
||||||
{
|
{
|
||||||
waypoints = [];
|
waypoints = [];
|
||||||
filename = mapname + "_wp.csv";
|
filename = "waypoints/" + mapname + "_wp.csv";
|
||||||
f = openfile( filename, "read" );
|
f = openfile( filename, "read" );
|
||||||
|
|
||||||
if ( f < 0 )
|
if ( f < 0 )
|
||||||
|
@ -6,6 +6,103 @@ init()
|
|||||||
level.bot_builtins[ "botmovement" ] = ::do_botmovement;
|
level.bot_builtins[ "botmovement" ] = ::do_botmovement;
|
||||||
level.bot_builtins[ "isbot" ] = ::do_isbot;
|
level.bot_builtins[ "isbot" ] = ::do_isbot;
|
||||||
level.bot_builtins[ "botangles" ] = ::do_botangles;
|
level.bot_builtins[ "botangles" ] = ::do_botangles;
|
||||||
|
level.bot_builtins[ "botweapon" ] = ::do_botweapon;
|
||||||
|
|
||||||
|
thread setup_weaponid_map();
|
||||||
|
}
|
||||||
|
|
||||||
|
register_weaponid( weap )
|
||||||
|
{
|
||||||
|
if ( !isdefined( level.bot_weaponids[ weap ] ) )
|
||||||
|
{
|
||||||
|
level.bot_weaponids[ weap ] = level.bot_weaponids.size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_weaponid_map()
|
||||||
|
{
|
||||||
|
waittillframeend;
|
||||||
|
|
||||||
|
level.bot_weaponids = [];
|
||||||
|
register_weaponid( "none" );
|
||||||
|
register_weaponid( "defaultweapon_mp" );
|
||||||
|
|
||||||
|
turrets = getentarray( "misc_turret", "classname" );
|
||||||
|
|
||||||
|
for ( i = 0; i < turrets.size; i++ )
|
||||||
|
{
|
||||||
|
if ( !isdefined( turrets[i].weaponinfo ) )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
register_weaponid( turrets[i].weaponinfo );
|
||||||
|
}
|
||||||
|
|
||||||
|
// in the order of precache
|
||||||
|
switch ( game[ "allies" ] )
|
||||||
|
{
|
||||||
|
case "american":
|
||||||
|
register_weaponid( "frag_grenade_american_mp" );
|
||||||
|
register_weaponid( "smoke_grenade_american_mp" );
|
||||||
|
register_weaponid( "colt_mp" );
|
||||||
|
register_weaponid( "m1carbine_mp" );
|
||||||
|
register_weaponid( "m1garand_mp" );
|
||||||
|
register_weaponid( "thompson_mp" );
|
||||||
|
register_weaponid( "bar_mp" );
|
||||||
|
register_weaponid( "springfield_mp" );
|
||||||
|
register_weaponid( "greasegun_mp" );
|
||||||
|
register_weaponid( "shotgun_mp" );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "british":
|
||||||
|
register_weaponid( "frag_grenade_british_mp" );
|
||||||
|
register_weaponid( "smoke_grenade_british_mp" );
|
||||||
|
register_weaponid( "webley_mp" );
|
||||||
|
register_weaponid( "enfield_mp" );
|
||||||
|
register_weaponid( "sten_mp" );
|
||||||
|
register_weaponid( "bren_mp" );
|
||||||
|
register_weaponid( "enfield_scope_mp" );
|
||||||
|
register_weaponid( "m1garand_mp" );
|
||||||
|
register_weaponid( "thompson_mp" );
|
||||||
|
register_weaponid( "shotgun_mp" );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "russian":
|
||||||
|
register_weaponid( "frag_grenade_russian_mp" );
|
||||||
|
register_weaponid( "smoke_grenade_russian_mp" );
|
||||||
|
register_weaponid( "TT30_mp" );
|
||||||
|
register_weaponid( "mosin_nagant_mp" );
|
||||||
|
register_weaponid( "SVT40_mp" );
|
||||||
|
register_weaponid( "PPS42_mp" );
|
||||||
|
register_weaponid( "ppsh_mp" );
|
||||||
|
register_weaponid( "mosin_nagant_sniper_mp" );
|
||||||
|
register_weaponid( "shotgun_mp" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
register_weaponid( "frag_grenade_german_mp" );
|
||||||
|
register_weaponid( "smoke_grenade_german_mp" );
|
||||||
|
register_weaponid( "luger_mp" );
|
||||||
|
register_weaponid( "kar98k_mp" );
|
||||||
|
register_weaponid( "g43_mp" );
|
||||||
|
register_weaponid( "mp40_mp" );
|
||||||
|
register_weaponid( "mp44_mp" );
|
||||||
|
register_weaponid( "kar98k_sniper_mp" );
|
||||||
|
register_weaponid( "shotgun_mp" );
|
||||||
|
register_weaponid( "binoculars_mp" );
|
||||||
|
}
|
||||||
|
|
||||||
|
get_weaponid_for_string( weap )
|
||||||
|
{
|
||||||
|
ans = level.bot_weaponids[ weap ];
|
||||||
|
|
||||||
|
if ( !isdefined( ans ) )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
do_printconsole( s )
|
do_printconsole( s )
|
||||||
@ -94,7 +191,7 @@ do_botstop()
|
|||||||
self setbotstance( "stand" );
|
self setbotstance( "stand" );
|
||||||
self setlean( "none" );
|
self setlean( "none" );
|
||||||
self setwalkdir( "none" );
|
self setwalkdir( "none" );
|
||||||
self switchtoweaponid( 1 ); // libcod needs weapon name to id
|
self switchtoweaponid( get_weaponid_for_string( self getcurrentweapon() ) );
|
||||||
|
|
||||||
// self botstop();
|
// self botstop();
|
||||||
}
|
}
|
||||||
@ -138,3 +235,9 @@ do_botangles( angles )
|
|||||||
self setplayerangles( angles );
|
self setplayerangles( angles );
|
||||||
// self botangles( angles[ 0 ], angles[ 1 ], angles[ 2 ] );
|
// self botangles( angles[ 0 ], angles[ 1 ], angles[ 2 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_botweapon( weapon )
|
||||||
|
{
|
||||||
|
self switchtoweaponid( get_weaponid_for_string( weapon ) );
|
||||||
|
// self switchtoweapon( weapon );
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user