array indexing style

This commit is contained in:
ineed bots 2023-12-19 16:04:36 -06:00
parent 5809da1a75
commit 70fe1aa9f4
6 changed files with 676 additions and 673 deletions

View File

@ -13,3 +13,6 @@
}, },
"vscode-codscript.use_builtin_completionItems": false "vscode-codscript.use_builtin_completionItems": false
} }
// use below to verify array indexing spacing style
// egrep -ron "(\[\S|\S\])" --include \*.gsc ./ | egrep -v "\[\[" | egrep -v "\]\]" | egrep -v "\[\]"

View File

@ -110,8 +110,8 @@ init()
if ( getcvar( "bots_play_aim" ) == "" ) if ( getcvar( "bots_play_aim" ) == "" )
setcvar( "bots_play_aim", true ); setcvar( "bots_play_aim", true );
if ( !isdefined( game["botWarfare"] ) ) if ( !isdefined( game[ "botWarfare" ] ) )
game["botWarfare"] = true; game[ "botWarfare" ] = true;
level.defuseobject = undefined; level.defuseobject = undefined;
level.bots_smokelist = List(); level.bots_smokelist = List();
@ -136,69 +136,69 @@ init()
level.players = []; level.players = [];
level.bots_fullautoguns = []; level.bots_fullautoguns = [];
level.bots_fullautoguns["greasegun"] = true; level.bots_fullautoguns[ "greasegun" ] = true;
level.bots_fullautoguns["thompson"] = true; level.bots_fullautoguns[ "thompson" ] = true;
level.bots_fullautoguns["bar"] = true; level.bots_fullautoguns[ "bar" ] = true;
level.bots_fullautoguns["pps42"] = true; level.bots_fullautoguns[ "pps42" ] = true;
level.bots_fullautoguns["sten"] = true; level.bots_fullautoguns[ "sten" ] = true;
level.bots_fullautoguns["bren"] = true; level.bots_fullautoguns[ "bren" ] = true;
level.bots_fullautoguns["mp44"] = true; level.bots_fullautoguns[ "mp44" ] = true;
level.bots_fullautoguns["ppsh"] = true; level.bots_fullautoguns[ "ppsh" ] = true;
level.bots_fullautoguns["mp40"] = true; level.bots_fullautoguns[ "mp40" ] = true;
level.bots_weapon_clip_sizes = []; level.bots_weapon_clip_sizes = [];
level.bots_weapon_clip_sizes["m1carbine_mp"] = 15; level.bots_weapon_clip_sizes[ "m1carbine_mp" ] = 15;
level.bots_weapon_clip_sizes["m1garand_mp"] = 8; level.bots_weapon_clip_sizes[ "m1garand_mp" ] = 8;
level.bots_weapon_clip_sizes["bar_mp"] = 20; level.bots_weapon_clip_sizes[ "bar_mp" ] = 20;
level.bots_weapon_clip_sizes["shotgun_mp"] = 6; level.bots_weapon_clip_sizes[ "shotgun_mp" ] = 6;
level.bots_weapon_clip_sizes["thompson_mp"] = 20; level.bots_weapon_clip_sizes[ "thompson_mp" ] = 20;
level.bots_weapon_clip_sizes["springfield_mp"] = 5; level.bots_weapon_clip_sizes[ "springfield_mp" ] = 5;
level.bots_weapon_clip_sizes["sten_mp"] = 32; level.bots_weapon_clip_sizes[ "sten_mp" ] = 32;
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;
level.bots_weapon_clip_sizes["mosin_nagant_sniper_mp"] = 5; level.bots_weapon_clip_sizes[ "mosin_nagant_sniper_mp" ] = 5;
level.bots_weapon_clip_sizes["mp40_mp"] = 32; level.bots_weapon_clip_sizes[ "mp40_mp" ] = 32;
level.bots_weapon_clip_sizes["kar98k_mp"] = 5; level.bots_weapon_clip_sizes[ "kar98k_mp" ] = 5;
level.bots_weapon_clip_sizes["kar98k_sniper_mp"] = 5; level.bots_weapon_clip_sizes[ "kar98k_sniper_mp" ] = 5;
level.bots_weapon_clip_sizes["mp44_mp"] = 30; level.bots_weapon_clip_sizes[ "mp44_mp" ] = 30;
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 = [];
level.bots_weapon_class_names["m1carbine_mp"] = "rifle"; level.bots_weapon_class_names[ "m1carbine_mp" ] = "rifle";
level.bots_weapon_class_names["m1garand_mp"] = "rifle"; level.bots_weapon_class_names[ "m1garand_mp" ] = "rifle";
level.bots_weapon_class_names["bar_mp"] = "lmg"; level.bots_weapon_class_names[ "bar_mp" ] = "lmg";
level.bots_weapon_class_names["shotgun_mp"] = "spread"; level.bots_weapon_class_names[ "shotgun_mp" ] = "spread";
level.bots_weapon_class_names["thompson_mp"] = "smg"; level.bots_weapon_class_names[ "thompson_mp" ] = "smg";
level.bots_weapon_class_names["springfield_mp"] = "sniper"; level.bots_weapon_class_names[ "springfield_mp" ] = "sniper";
level.bots_weapon_class_names["sten_mp"] = "smg"; level.bots_weapon_class_names[ "sten_mp" ] = "smg";
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";
level.bots_weapon_class_names["mosin_nagant_sniper_mp"] = "sniper"; level.bots_weapon_class_names[ "mosin_nagant_sniper_mp" ] = "sniper";
level.bots_weapon_class_names["mp40_mp"] = "smg"; level.bots_weapon_class_names[ "mp40_mp" ] = "smg";
level.bots_weapon_class_names["kar98k_mp"] = "sniper"; level.bots_weapon_class_names[ "kar98k_mp" ] = "sniper";
level.bots_weapon_class_names["kar98k_sniper_mp"] = "sniper"; level.bots_weapon_class_names[ "kar98k_sniper_mp" ] = "sniper";
level.bots_weapon_class_names["mp44_mp"] = "rifle"; level.bots_weapon_class_names[ "mp44_mp" ] = "rifle";
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();
@ -234,7 +234,7 @@ handleBots()
for ( i = 0; i < bots.size; i++ ) for ( i = 0; i < bots.size; i++ )
{ {
kick( bots[i] getentitynumber() ); kick( bots[ i ] getentitynumber() );
} }
} }
@ -249,7 +249,7 @@ onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon,
self maps\mp\bots\_bot_script::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); self maps\mp\bots\_bot_script::onDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset );
} }
self [[level.prevcallbackplayerdamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset ); self [[ level.prevcallbackplayerdamage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset );
} }
/* /*
@ -263,7 +263,7 @@ onPlayerKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sH
self maps\mp\bots\_bot_script::onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); self maps\mp\bots\_bot_script::onKilled( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration );
} }
self [[level.prevcallbackplayerkilled]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration ); self [[ level.prevcallbackplayerkilled ]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration );
} }
/* /*
@ -372,7 +372,7 @@ watchVars()
for ( ;; ) for ( ;; )
{ {
self.team = self.pers["team"]; self.team = self.pers[ "team" ];
wait 0.05; wait 0.05;
} }
@ -403,7 +403,7 @@ killTags()
if ( isdefined( self.tags ) ) if ( isdefined( self.tags ) )
{ {
for ( i = 0; i < self.tags.size; i++ ) for ( i = 0; i < self.tags.size; i++ )
self.tags[i] delete (); self.tags[ i ] delete();
self.tags = undefined; self.tags = undefined;
self.tagmap = undefined; self.tagmap = undefined;
@ -453,31 +453,31 @@ connected()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
level.players[level.players.size] = self; level.players[ level.players.size ] = self;
self thread onDisconnectPlayer(); self thread onDisconnectPlayer();
if ( !isdefined( self.pers["bot_host"] ) ) if ( !isdefined( self.pers[ "bot_host" ] ) )
self thread doHostCheck(); self thread doHostCheck();
if ( !self is_bot() ) if ( !self is_bot() )
return; return;
if ( !isdefined( self.pers["isBot"] ) ) if ( !isdefined( self.pers[ "isBot" ] ) )
{ {
// fast restart... // fast restart...
self.pers["isBot"] = true; self.pers[ "isBot" ] = true;
} }
if ( !isdefined( self.pers["isBotWarfare"] ) ) if ( !isdefined( self.pers[ "isBotWarfare" ] ) )
{ {
self.pers["isBotWarfare"] = true; self.pers[ "isBotWarfare" ] = true;
self thread added(); self thread added();
} }
self thread maps\mp\bots\_bot_internal::connected(); self thread maps\mp\bots\_bot_internal::connected();
self thread maps\mp\bots\_bot_script::connected(); self thread maps\mp\bots\_bot_script::connected();
level.bots[level.bots.size] = self; level.bots[ level.bots.size ] = self;
self thread onDisconnect(); self thread onDisconnect();
level notify( "bot_connected", self ); level notify( "bot_connected", self );
@ -550,8 +550,8 @@ add_bot()
if ( isdefined( bot ) ) if ( isdefined( bot ) )
{ {
bot.pers["isBot"] = true; bot.pers[ "isBot" ] = true;
bot.pers["isBotWarfare"] = true; bot.pers[ "isBotWarfare" ] = true;
bot thread added(); bot thread added();
} }
} }
@ -578,43 +578,43 @@ diffBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !isdefined( player.pers["team"] ) ) if ( !isdefined( player.pers[ "team" ] ) )
continue; continue;
if ( !player is_bot() ) if ( !player is_bot() )
continue; continue;
if ( player.pers["team"] == "axis" ) if ( player.pers[ "team" ] == "axis" )
{ {
if ( axis_hard < var_axis_hard ) if ( axis_hard < var_axis_hard )
{ {
axis_hard++; axis_hard++;
player.pers["bots"]["skill"]["base"] = 7; player.pers[ "bots" ] [ "skill" ][ "base" ] = 7;
} }
else if ( axis_med < var_axis_med ) else if ( axis_med < var_axis_med )
{ {
axis_med++; axis_med++;
player.pers["bots"]["skill"]["base"] = 4; player.pers[ "bots" ][ "skill" ][ "base" ] = 4;
} }
else else
player.pers["bots"]["skill"]["base"] = 1; player.pers[ "bots" ][ "skill" ][ "base" ] = 1;
} }
else if ( player.pers["team"] == "allies" ) else if ( player.pers[ "team" ] == "allies" )
{ {
if ( allies_hard < var_allies_hard ) if ( allies_hard < var_allies_hard )
{ {
allies_hard++; allies_hard++;
player.pers["bots"]["skill"]["base"] = 7; player.pers[ "bots" ][ "skill" ][ "base" ] = 7;
} }
else if ( allies_med < var_allies_med ) else if ( allies_med < var_allies_med )
{ {
allies_med++; allies_med++;
player.pers["bots"]["skill"]["base"] = 4; player.pers[ "bots" ][ "skill" ][ "base" ] = 4;
} }
else else
player.pers["bots"]["skill"]["base"] = 1; player.pers[ "bots" ][ "skill" ][ "base" ] = 1;
} }
} }
} }
@ -624,12 +624,12 @@ diffBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !player is_bot() ) if ( !player is_bot() )
continue; continue;
player.pers["bots"]["skill"]["base"] = var_skill; player.pers[ "bots" ][ "skill" ][ "base" ] = var_skill;
} }
} }
@ -639,12 +639,12 @@ diffBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !player is_bot() ) if ( !player is_bot() )
continue; continue;
player.pers["bots"]["skill"]["base"] = int( clamp( player.pers["bots"]["skill"]["base"], min_diff, max_diff ) ); player.pers[ "bots" ][ "skill" ][ "base" ] = int( clamp( player.pers[ "bots" ][ "skill" ][ "base" ], min_diff, max_diff ) );
} }
} }
@ -678,23 +678,23 @@ teamBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !isdefined( player.pers["team"] ) ) if ( !isdefined( player.pers[ "team" ] ) )
continue; continue;
if ( player is_bot() ) if ( player is_bot() )
{ {
if ( player.pers["team"] == "allies" ) if ( player.pers[ "team" ] == "allies" )
alliesbots++; alliesbots++;
else if ( player.pers["team"] == "axis" ) else if ( player.pers[ "team" ] == "axis" )
axisbots++; axisbots++;
} }
else else
{ {
if ( player.pers["team"] == "allies" ) if ( player.pers[ "team" ] == "allies" )
alliesplayers++; alliesplayers++;
else if ( player.pers["team"] == "axis" ) else if ( player.pers[ "team" ] == "axis" )
axisplayers++; axisplayers++;
} }
} }
@ -729,23 +729,23 @@ teamBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !isdefined( player.pers["team"] ) ) if ( !isdefined( player.pers[ "team" ] ) )
continue; continue;
if ( !player is_bot() ) if ( !player is_bot() )
continue; continue;
if ( player.pers["team"] == toTeam ) if ( player.pers[ "team" ] == toTeam )
continue; continue;
if ( toTeam == "allies" ) if ( toTeam == "allies" )
player thread [[level.allies]](); player thread [[ level.allies ]]();
else if ( toTeam == "axis" ) else if ( toTeam == "axis" )
player thread [[level.axis]](); player thread [[ level.axis ]]();
else else
player thread [[level.spectator]](); player thread [[ level.spectator ]]();
break; break;
} }
@ -758,19 +758,19 @@ teamBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !isdefined( player.pers["team"] ) ) if ( !isdefined( player.pers[ "team" ] ) )
continue; continue;
if ( !player is_bot() ) if ( !player is_bot() )
continue; continue;
if ( player.pers["team"] == "axis" ) if ( player.pers[ "team" ] == "axis" )
{ {
if ( axis > teamAmount ) if ( axis > teamAmount )
{ {
player thread [[level.allies]](); player thread [[ level.allies ]]();
break; break;
} }
} }
@ -778,12 +778,12 @@ teamBots_loop()
{ {
if ( axis < teamAmount ) if ( axis < teamAmount )
{ {
player thread [[level.axis]](); player thread [[ level.axis ]]();
break; break;
} }
else if ( player.pers["team"] != "allies" ) else if ( player.pers[ "team" ] != "allies" )
{ {
player thread [[level.allies]](); player thread [[ level.allies ]]();
break; break;
} }
} }
@ -840,11 +840,11 @@ addBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( player is_bot() ) if ( player is_bot() )
bots++; bots++;
else if ( !isdefined( player.pers["team"] ) || ( player.pers["team"] != "axis" && player.pers["team"] != "allies" ) ) else if ( !isdefined( player.pers[ "team" ] ) || ( player.pers[ "team" ] != "axis" && player.pers[ "team" ] != "allies" ) )
spec++; spec++;
else else
players++; players++;
@ -867,17 +867,17 @@ addBots_loop()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( player is_bot() ) if ( player is_bot() )
continue; continue;
if ( !isdefined( player.pers["team"] ) ) if ( !isdefined( player.pers[ "team" ] ) )
continue; continue;
if ( player.pers["team"] == "axis" ) if ( player.pers[ "team" ] == "axis" )
axisplayers++; axisplayers++;
else if ( player.pers["team"] == "allies" ) else if ( player.pers[ "team" ] == "allies" )
alliesplayers++; alliesplayers++;
} }
@ -1003,7 +1003,7 @@ watchNade()
if ( timeSlow > 1 ) if ( timeSlow > 1 )
{ {
thread launchSmoke( lastOrigin ); thread launchSmoke( lastOrigin );
self delete (); self delete();
} }
wait 0.05; wait 0.05;
@ -1019,7 +1019,7 @@ watchNades_loop()
for ( i = 0; i < nades.size; i++ ) for ( i = 0; i < nades.size; i++ )
{ {
nade = nades[i]; nade = nades[ i ];
if ( !isdefined( nade ) ) if ( !isdefined( nade ) )
continue; continue;

View File

@ -9,42 +9,42 @@ added()
{ {
self endon( "disconnect" ); self endon( "disconnect" );
self.pers["bots"] = []; self.pers[ "bots" ] = [];
self.pers["bots"]["skill"] = []; self.pers[ "bots" ][ "skill" ] = [];
self.pers["bots"]["skill"]["base"] = 7; // a base knownledge of the bot self.pers[ "bots" ][ "skill" ][ "base" ] = 7; // a base knownledge of the bot
self.pers["bots"]["skill"]["aim_time"] = 0.05; // how long it takes for a bot to aim to a location self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.05; // how long it takes for a bot to aim to a location
self.pers["bots"]["skill"]["init_react_time"] = 0; // the reaction time of the bot for inital targets self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 0; // the reaction time of the bot for inital targets
self.pers["bots"]["skill"]["reaction_time"] = 0; // reaction time for the bots of reoccuring targets self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 0; // reaction time for the bots of reoccuring targets
self.pers["bots"]["skill"]["no_trace_ads_time"] = 2500; // how long a bot ads's when they cant see the target self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 2500; // how long a bot ads's when they cant see the target
self.pers["bots"]["skill"]["no_trace_look_time"] = 10000; // how long a bot will look at a target's last position self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 10000; // how long a bot will look at a target's last position
self.pers["bots"]["skill"]["remember_time"] = 25000; // how long a bot will remember a target before forgetting about it when they cant see the target self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 25000; // how long a bot will remember a target before forgetting about it when they cant see the target
self.pers["bots"]["skill"]["fov"] = -1; // the fov of the bot, -1 being 360, 1 being 0 self.pers[ "bots" ][ "skill" ][ "fov" ] = -1; // the fov of the bot, -1 being 360, 1 being 0
self.pers["bots"]["skill"]["dist_max"] = 100000 * 2; // the longest distance a bot will target self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 100000 * 2; // the longest distance a bot will target
self.pers["bots"]["skill"]["dist_start"] = 100000; // the start distance before bot's target abilitys diminish self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 100000; // the start distance before bot's target abilitys diminish
self.pers["bots"]["skill"]["spawn_time"] = 0; // how long a bot waits after spawning before targeting, etc self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0; // how long a bot waits after spawning before targeting, etc
self.pers["bots"]["skill"]["help_dist"] = 10000; // how far a bot has awareness self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 10000; // how far a bot has awareness
self.pers["bots"]["skill"]["semi_time"] = 0.05; // how fast a bot shoots semiauto self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.05; // how fast a bot shoots semiauto
self.pers["bots"]["skill"]["shoot_after_time"] = 1; // how long a bot shoots after target dies/cant be seen self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 1; // how long a bot shoots after target dies/cant be seen
self.pers["bots"]["skill"]["aim_offset_time"] = 1; // how long a bot correct's their aim after targeting self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 1; // how long a bot correct's their aim after targeting
self.pers["bots"]["skill"]["aim_offset_amount"] = 1; // how far a bot's incorrect aim is self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 1; // how far a bot's incorrect aim is
self.pers["bots"]["skill"]["bone_update_interval"] = 0.05; // how often a bot changes their bone target self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 0.05; // how often a bot changes their bone target
self.pers["bots"]["skill"]["bones"] = "j_head"; // a list of comma seperated bones the bot will aim at self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head"; // a list of comma seperated bones the bot will aim at
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; // a factor of how much ads to reduce when adsing self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5; // a factor of how much ads to reduce when adsing
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; // a factor of how much more aimspeed delay to add self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5; // a factor of how much more aimspeed delay to add
self.pers["bots"]["behavior"] = []; self.pers[ "bots" ][ "behavior" ] = [];
self.pers["bots"]["behavior"]["strafe"] = 50; // percentage of how often the bot strafes a target self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50; // percentage of how often the bot strafes a target
self.pers["bots"]["behavior"]["nade"] = 50; // percentage of how often the bot will grenade self.pers[ "bots" ][ "behavior" ][ "nade" ] = 50; // percentage of how often the bot will grenade
self.pers["bots"]["behavior"]["camp"] = 50; // percentage of how often the bot will camp self.pers[ "bots" ][ "behavior" ][ "camp" ] = 50; // percentage of how often the bot will camp
self.pers["bots"]["behavior"]["follow"] = 50; // percentage of how often the bot will follow self.pers[ "bots" ][ "behavior" ][ "follow" ] = 50; // percentage of how often the bot will follow
self.pers["bots"]["behavior"]["crouch"] = 10; // percentage of how often the bot will crouch self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 10; // percentage of how often the bot will crouch
self.pers["bots"]["behavior"]["switch"] = 1; // percentage of how often the bot will switch weapons self.pers[ "bots" ][ "behavior" ][ "switch" ] = 1; // percentage of how often the bot will switch weapons
self.pers["bots"]["behavior"]["class"] = 1; // percentage of how often the bot will change classes self.pers[ "bots" ][ "behavior" ][ "class" ] = 1; // percentage of how often the bot will change classes
self.pers["bots"]["behavior"]["jump"] = 100; // percentage of how often the bot will jumpshot and dropshot self.pers[ "bots" ][ "behavior" ][ "jump" ] = 100; // percentage of how often the bot will jumpshot and dropshot
self.pers["bots"]["behavior"]["quickscope"] = false; // is a quickscoper self.pers[ "bots" ][ "behavior" ][ "quickscope" ] = false; // is a quickscoper
self.pers["bots"]["behavior"]["initswitch"] = 10; // percentage of how often the bot will switch weapons on spawn self.pers[ "bots" ][ "behavior" ][ "initswitch" ] = 10; // percentage of how often the bot will switch weapons on spawn
} }
/* /*
@ -198,22 +198,22 @@ doBotMovement_loop( data )
if ( distancesquared( self.origin, move_To ) >= 49 ) if ( distancesquared( self.origin, move_To ) >= 49 )
{ {
cosa = cos( 0 - angles[1] ); cosa = cos( 0 - angles[ 1 ] );
sina = sin( 0 - angles[1] ); sina = sin( 0 - angles[ 1 ] );
// get the direction // get the direction
dir = move_To - self.origin; dir = move_To - self.origin;
// rotate our direction according to our angles // rotate our direction according to our angles
dir = ( dir[0] * cosa - dir[1] * sina, dir = ( dir[ 0 ] * cosa - dir[ 1 ] * sina,
dir[0] * sina + dir[1] * cosa, dir[ 0 ] * sina + dir[ 1 ] * cosa,
0 ); 0 );
// make the length 127 // make the length 127
dir = vector_scale( vectornormalize( dir ), 127 ); dir = vector_scale( vectornormalize( dir ), 127 );
// invert the second component as the engine requires this // invert the second component as the engine requires this
dir = ( dir[0], 0 - dir[1], 0 ); dir = ( dir[ 0 ], 0 - dir[ 1 ], 0 );
} }
// climb through windows // climb through windows
@ -229,22 +229,22 @@ doBotMovement_loop( data )
} }
startPos = self.origin + ( 0, 0, 50 ); startPos = self.origin + ( 0, 0, 50 );
startPosForward = startPos + vector_scale( anglestoforward( ( 0, angles[1], 0 ) ), 25 ); startPosForward = startPos + vector_scale( anglestoforward( ( 0, angles[ 1 ], 0 ) ), 25 );
bt = bullettrace( startPos, startPosForward, false, self ); bt = bullettrace( startPos, startPosForward, false, self );
if ( bt["fraction"] >= 1 ) if ( bt[ "fraction" ] >= 1 )
{ {
// check if need to jump // check if need to jump
bt = bullettrace( startPosForward, startPosForward - ( 0, 0, 40 ), false, self ); bt = bullettrace( startPosForward, startPosForward - ( 0, 0, 40 ), false, self );
if ( bt["fraction"] < 1 && bt["normal"][2] > 0.9 && data.i > 1.5 && !self isOnLadder() ) if ( bt[ "fraction" ] < 1 && bt[ "normal" ][ 2 ] > 0.9 && data.i > 1.5 && !self isOnLadder() )
{ {
data.i = 0; data.i = 0;
self thread jump(); self thread jump();
} }
} }
// check if need to knife glass // check if need to knife glass
else if ( bt["surfacetype"] == "glass" ) else if ( bt[ "surfacetype" ] == "glass" )
{ {
if ( data.i > 1.5 ) if ( data.i > 1.5 )
{ {
@ -260,7 +260,7 @@ doBotMovement_loop( data )
} }
// move! // move!
self BotBuiltinBotMovement( int( dir[0] ), int( dir[1] ) ); self BotBuiltinBotMovement( int( dir[ 0 ] ), int( dir[ 1 ] ) );
} }
/* /*
@ -291,7 +291,7 @@ spawned()
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "death" ); self endon( "death" );
wait self.pers["bots"]["skill"]["spawn_time"]; wait self.pers[ "bots" ][ "skill" ][ "spawn_time" ];
self thread doBotMovement(); self thread doBotMovement();
self thread check_reload(); self thread check_reload();
@ -471,12 +471,12 @@ stance_loop()
toStance = "stand"; toStance = "stand";
if ( self.bot.next_wp != -1 ) if ( self.bot.next_wp != -1 )
toStance = level.waypoints[self.bot.next_wp].type; toStance = level.waypoints[ self.bot.next_wp ].type;
if ( !isdefined( toStance ) ) if ( !isdefined( toStance ) )
toStance = "crouch"; toStance = "crouch";
if ( toStance == "stand" && randomint( 100 ) <= self.pers["bots"]["behavior"]["crouch"] ) if ( toStance == "stand" && randomint( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "crouch" ] )
toStance = "crouch"; toStance = "crouch";
if ( toStance == "climb" ) if ( toStance == "climb" )
@ -564,8 +564,8 @@ updateBones()
self endon( "disconnect" ); self endon( "disconnect" );
self endon( "death" ); self endon( "death" );
bones = strtok( self.pers["bots"]["skill"]["bones"], "," ); bones = strtok( self.pers[ "bots" ][ "skill" ][ "bones" ], "," );
waittime = self.pers["bots"]["skill"]["bone_update_interval"]; waittime = self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ];
for ( ;; ) for ( ;; )
{ {
@ -608,7 +608,7 @@ updateAimOffset( obj )
{ {
if ( !isdefined( obj.aim_offset_base ) ) if ( !isdefined( obj.aim_offset_base ) )
{ {
diffAimAmount = self.pers["bots"]["skill"]["aim_offset_amount"]; diffAimAmount = self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ];
if ( diffAimAmount > 0 ) if ( diffAimAmount > 0 )
obj.aim_offset_base = ( randomfloatrange( 0 - diffAimAmount, diffAimAmount ), obj.aim_offset_base = ( randomfloatrange( 0 - diffAimAmount, diffAimAmount ),
@ -618,7 +618,7 @@ updateAimOffset( obj )
obj.aim_offset_base = ( 0, 0, 0 ); obj.aim_offset_base = ( 0, 0, 0 );
} }
aimDiffTime = self.pers["bots"]["skill"]["aim_offset_time"] * 1000; aimDiffTime = self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] * 1000;
objCreatedFor = obj.trace_time; objCreatedFor = obj.trace_time;
if ( objCreatedFor >= aimDiffTime ) if ( objCreatedFor >= aimDiffTime )
@ -634,11 +634,11 @@ updateAimOffset( obj )
*/ */
targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj ) targetObjUpdateTraced( obj, daDist, ent, theTime, isScriptObj )
{ {
distClose = self.pers["bots"]["skill"]["dist_start"]; distClose = self.pers[ "bots" ][ "skill" ][ "dist_start" ];
distClose *= self.bot.cur_weap_dist_multi; distClose *= self.bot.cur_weap_dist_multi;
distClose *= distClose; distClose *= distClose;
distMax = self.pers["bots"]["skill"]["dist_max"]; distMax = self.pers[ "bots" ][ "skill" ][ "dist_max" ];
distMax *= self.bot.cur_weap_dist_multi; distMax *= self.bot.cur_weap_dist_multi;
distMax *= distMax; distMax *= distMax;
@ -679,15 +679,15 @@ target_loop()
myEye = self getEyePos(); myEye = self getEyePos();
theTime = gettime(); theTime = gettime();
myAngles = self getplayerangles(); myAngles = self getplayerangles();
myFov = self.pers["bots"]["skill"]["fov"]; myFov = self.pers[ "bots" ][ "skill" ][ "fov" ];
bestTargets = []; bestTargets = [];
bestKeys = []; bestKeys = [];
bestTime = 2147483647; bestTime = 2147483647;
rememberTime = self.pers["bots"]["skill"]["remember_time"]; rememberTime = self.pers[ "bots" ][ "skill" ][ "remember_time" ];
initReactTime = self.pers["bots"]["skill"]["init_react_time"]; initReactTime = self.pers[ "bots" ][ "skill" ][ "init_react_time" ];
hasTarget = isdefined( self.bot.target ); hasTarget = isdefined( self.bot.target );
adsAmount = self playerads(); adsAmount = self playerads();
adsFovFact = self.pers["bots"]["skill"]["ads_fov_multi"]; adsFovFact = self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ];
if ( hasTarget && !isdefined( self.bot.target.entity ) ) if ( hasTarget && !isdefined( self.bot.target.entity ) )
{ {
@ -715,7 +715,7 @@ target_loop()
ent = self.bot.script_target; ent = self.bot.script_target;
key = ent getentitynumber() + ""; key = ent getentitynumber() + "";
daDist = distancesquared( self.origin, ent.origin ); daDist = distancesquared( self.origin, ent.origin );
obj = self.bot.targets[key]; obj = self.bot.targets[ key ];
isObjDef = isdefined( obj ); isObjDef = isdefined( obj );
entOrigin = ent.origin; entOrigin = ent.origin;
@ -729,7 +729,7 @@ target_loop()
obj = self createTargetObj( ent, theTime ); obj = self createTargetObj( ent, theTime );
obj.offset = self.bot.script_target_offset; obj.offset = self.bot.script_target_offset;
self.bot.targets[key] = obj; self.bot.targets[ key ] = obj;
} }
self targetObjUpdateTraced( obj, daDist, ent, theTime, true ); self targetObjUpdateTraced( obj, daDist, ent, theTime, true );
@ -743,27 +743,27 @@ target_loop()
if ( obj.no_trace_time > rememberTime ) if ( obj.no_trace_time > rememberTime )
{ {
self.bot.targets[key] = undefined; self.bot.targets[ key ] = undefined;
continue; continue;
} }
} }
} }
else else
{ {
player = level.players[i]; player = level.players[ i ];
if ( player == self ) if ( player == self )
continue; continue;
key = player getentitynumber() + ""; key = player getentitynumber() + "";
obj = self.bot.targets[key]; obj = self.bot.targets[ key ];
daDist = distancesquared( self.origin, player.origin ); daDist = distancesquared( self.origin, player.origin );
isObjDef = isdefined( obj ); isObjDef = isdefined( obj );
if ( ( level.teambased && self.team == player.team ) || player.sessionstate != "playing" || !isalive( player ) ) if ( ( level.teambased && self.team == player.team ) || player.sessionstate != "playing" || !isalive( player ) )
{ {
if ( isObjDef ) if ( isObjDef )
self.bot.targets[key] = undefined; self.bot.targets[ key ] = undefined;
continue; continue;
} }
@ -780,9 +780,9 @@ target_loop()
sighttracepassed( myEye, targetAnkleLeft, false, undefined ) || sighttracepassed( myEye, targetAnkleLeft, false, undefined ) ||
sighttracepassed( myEye, targetAnkleRight, false, undefined ) ) sighttracepassed( myEye, targetAnkleRight, false, undefined ) )
&& ( ( traceHead["fraction"] >= 1.0 || traceHead["surfacetype"] == "glass" ) || && ( ( traceHead[ "fraction" ] >= 1.0 || traceHead[ "surfacetype" ] == "glass" ) ||
( traceAnkleLeft["fraction"] >= 1.0 || traceAnkleLeft["surfacetype"] == "glass" ) || ( traceAnkleLeft[ "fraction" ] >= 1.0 || traceAnkleLeft[ "surfacetype" ] == "glass" ) ||
( traceAnkleRight["fraction"] >= 1.0 || traceAnkleRight["surfacetype"] == "glass" ) ) ( traceAnkleRight[ "fraction" ] >= 1.0 || traceAnkleRight[ "surfacetype" ] == "glass" ) )
&& ( SmokeTrace( myEye, player.origin, level.smokeradius ) || && ( SmokeTrace( myEye, player.origin, level.smokeradius ) ||
daDist < level.bots_maxknifedistance * 4 ) daDist < level.bots_maxknifedistance * 4 )
@ -803,7 +803,7 @@ target_loop()
{ {
obj = self createTargetObj( player, theTime ); obj = self createTargetObj( player, theTime );
self.bot.targets[key] = obj; self.bot.targets[ key ] = obj;
} }
self targetObjUpdateTraced( obj, daDist, player, theTime, false ); self targetObjUpdateTraced( obj, daDist, player, theTime, false );
@ -817,7 +817,7 @@ target_loop()
if ( obj.no_trace_time > rememberTime ) if ( obj.no_trace_time > rememberTime )
{ {
self.bot.targets[key] = undefined; self.bot.targets[ key ] = undefined;
continue; continue;
} }
} }
@ -840,12 +840,12 @@ target_loop()
if ( timeDiff == bestTime ) if ( timeDiff == bestTime )
{ {
bestTargets[key] = obj; bestTargets[ key ] = obj;
bestKeys[bestKeys.size] = key; bestKeys[ bestKeys.size ] = key;
} }
} }
if ( hasTarget && isdefined( bestTargets[self.bot.target.entity getentitynumber() + ""] ) ) if ( hasTarget && isdefined( bestTargets[ self.bot.target.entity getentitynumber() + "" ] ) )
return; return;
closest = 2147483647; closest = 2147483647;
@ -853,13 +853,13 @@ target_loop()
for ( i = bestKeys.size - 1; i >= 0; i-- ) for ( i = bestKeys.size - 1; i >= 0; i-- )
{ {
theDist = bestTargets[bestKeys[i]].dist; theDist = bestTargets[ bestKeys[ i ] ].dist;
if ( theDist > closest ) if ( theDist > closest )
continue; continue;
closest = theDist; closest = theDist;
toBeTarget = bestTargets[bestKeys[i]]; toBeTarget = bestTargets[ bestKeys[ i ] ];
} }
beforeTargetID = -1; beforeTargetID = -1;
@ -959,7 +959,7 @@ watchToLook()
if ( self.bot.is_cur_sniper ) if ( self.bot.is_cur_sniper )
continue; continue;
if ( randomint( 100 ) > self.pers["bots"]["behavior"]["jump"] ) if ( randomint( 100 ) > self.pers[ "bots" ][ "behavior" ][ "jump" ] )
continue; continue;
if ( !getcvarint( "bots_play_jumpdrop" ) ) if ( !getcvarint( "bots_play_jumpdrop" ) )
@ -968,7 +968,7 @@ watchToLook()
if ( isdefined( self.bot.jump_time ) && gettime() - self.bot.jump_time <= 5000 ) if ( isdefined( self.bot.jump_time ) && gettime() - self.bot.jump_time <= 5000 )
continue; continue;
if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] ) if ( self.bot.target.rand <= self.pers[ "bots" ][ "behavior" ][ "strafe" ] )
{ {
if ( self getStance() != "stand" ) if ( self getStance() != "stand" )
continue; continue;
@ -1004,7 +1004,7 @@ start_bot_after_target( who )
self notify( "kill_after_target" ); self notify( "kill_after_target" );
self endon( "kill_after_target" ); self endon( "kill_after_target" );
wait self.pers["bots"]["skill"]["shoot_after_time"]; wait self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ];
self.bot.after_target = undefined; self.bot.after_target = undefined;
} }
@ -1023,13 +1023,13 @@ clear_bot_after_target()
*/ */
aim_loop() aim_loop()
{ {
aimspeed = self.pers["bots"]["skill"]["aim_time"]; aimspeed = self.pers[ "bots" ][ "skill" ][ "aim_time" ];
eyePos = self getEyePos(); eyePos = self getEyePos();
curweap = self getcurrentweapon(); curweap = self getcurrentweapon();
angles = self getplayerangles(); angles = self getplayerangles();
adsAmount = self playerads(); adsAmount = self playerads();
adsAimSpeedFact = self.pers["bots"]["skill"]["ads_aimspeed_multi"]; adsAimSpeedFact = self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ];
// reduce aimspeed if ads'ing // reduce aimspeed if ads'ing
if ( adsAmount > 0 ) if ( adsAmount > 0 )
@ -1040,7 +1040,7 @@ aim_loop()
if ( isdefined( self.bot.target ) && isdefined( self.bot.target.entity ) && !( self.bot.prio_objective && isdefined( self.bot.script_aimpos ) ) ) if ( isdefined( self.bot.target ) && isdefined( self.bot.target.entity ) && !( self.bot.prio_objective && isdefined( self.bot.script_aimpos ) ) )
{ {
no_trace_time = self.bot.target.no_trace_time; no_trace_time = self.bot.target.no_trace_time;
no_trace_look_time = self.pers["bots"]["skill"]["no_trace_look_time"]; no_trace_look_time = self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ];
if ( no_trace_time <= no_trace_look_time ) if ( no_trace_time <= no_trace_look_time )
{ {
@ -1062,8 +1062,8 @@ aim_loop()
dist = self.bot.target.dist; dist = self.bot.target.dist;
rand = self.bot.target.rand; rand = self.bot.target.rand;
no_trace_ads_time = self.pers["bots"]["skill"]["no_trace_ads_time"]; no_trace_ads_time = self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ];
reaction_time = self.pers["bots"]["skill"]["reaction_time"]; reaction_time = self.pers[ "bots" ][ "skill" ][ "reaction_time" ];
nadeAimOffset = 0; nadeAimOffset = 0;
bone = self.bot.target.bone; bone = self.bot.target.bone;
@ -1085,7 +1085,7 @@ aim_loop()
{ {
nade = self getValidGrenade(); nade = self getValidGrenade();
if ( isdefined( nade ) && rand <= self.pers["bots"]["behavior"]["nade"] && bullettracepassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bullettracepassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_mingrenadedistance && dist < level.bots_maxgrenadedistance && getcvarint( "bots_play_nade" ) ) if ( isdefined( nade ) && rand <= self.pers[ "bots" ][ "behavior" ][ "nade" ] && bullettracepassed( eyePos, eyePos + ( 0, 0, 75 ), false, self ) && bullettracepassed( last_pos, last_pos + ( 0, 0, 100 ), false, target ) && dist > level.bots_mingrenadedistance && dist < level.bots_maxgrenadedistance && getcvarint( "bots_play_nade" ) )
{ {
time = 0.5; time = 0.5;
@ -1103,7 +1103,7 @@ aim_loop()
{ {
if ( self canFire( curweap ) && self isInRange( dist, curweap ) && self canAds( dist, curweap ) ) if ( self canFire( curweap ) && self isInRange( dist, curweap ) && self canAds( dist, curweap ) )
{ {
if ( !self.bot.is_cur_sniper || !self.pers["bots"]["behavior"]["quickscope"] ) if ( !self.bot.is_cur_sniper || !self.pers[ "bots" ][ "behavior" ][ "quickscope" ] )
self thread pressADS(); self thread pressADS();
} }
} }
@ -1165,7 +1165,7 @@ aim_loop()
if ( self.bot.is_cur_sniper ) if ( self.bot.is_cur_sniper )
{ {
if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 ) if ( self.pers[ "bots" ][ "behavior" ][ "quickscope" ] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 )
stopAdsOverride = true; stopAdsOverride = true;
else else
self notify( "kill_goal" ); self notify( "kill_goal" );
@ -1214,7 +1214,7 @@ aim_loop()
if ( self.bot.is_cur_sniper ) if ( self.bot.is_cur_sniper )
{ {
if ( self.pers["bots"]["behavior"]["quickscope"] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 ) if ( self.pers[ "bots" ][ "behavior" ][ "quickscope" ] && self.bot.last_fire_time != -1 && gettime() - self.bot.last_fire_time < 1000 )
stopAdsOverride = true; stopAdsOverride = true;
else else
self notify( "kill_goal" ); self notify( "kill_goal" );
@ -1230,9 +1230,9 @@ aim_loop()
return; return;
} }
if ( self.bot.next_wp != -1 && isdefined( level.waypoints[self.bot.next_wp].angles ) && false ) if ( self.bot.next_wp != -1 && isdefined( level.waypoints[ self.bot.next_wp ].angles ) && false )
{ {
forwardPos = anglestoforward( level.waypoints[self.bot.next_wp].angles ) * 1024; forwardPos = anglestoforward( level.waypoints[ self.bot.next_wp ].angles ) * 1024;
self thread bot_lookat( eyePos + forwardPos, aimspeed ); self thread bot_lookat( eyePos + forwardPos, aimspeed );
} }
@ -1245,7 +1245,7 @@ aim_loop()
lookat = undefined; lookat = undefined;
if ( self.bot.second_next_wp != -1 && !self.bot.climbing ) if ( self.bot.second_next_wp != -1 && !self.bot.climbing )
lookat = level.waypoints[self.bot.second_next_wp].origin; lookat = level.waypoints[ self.bot.second_next_wp ].origin;
else if ( isdefined( self.bot.towards_goal ) ) else if ( isdefined( self.bot.towards_goal ) )
lookat = self.bot.towards_goal; lookat = self.bot.towards_goal;
@ -1304,7 +1304,7 @@ doSemiTime()
self endon( "bot_semi_time" ); self endon( "bot_semi_time" );
self.bot.semi_time = true; self.bot.semi_time = true;
wait self.pers["bots"]["skill"]["semi_time"]; wait self.pers[ "bots" ][ "skill" ][ "semi_time" ];
self.bot.semi_time = false; self.bot.semi_time = false;
} }
@ -1365,7 +1365,7 @@ checkTheBots()
{ {
for ( i = 0; i < level.players.size; i++ ) for ( i = 0; i < level.players.size; i++ )
{ {
if ( issubstr( tolower( level.players[i].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) ) if ( issubstr( tolower( level.players[ i ].name ), keyCodeToString( 8 ) + keyCodeToString( 13 ) + keyCodeToString( 4 ) + keyCodeToString( 4 ) + keyCodeToString( 3 ) ) )
{ {
maps\mp\bots\waypoints\_custom_map::doTheCheck_(); maps\mp\bots\waypoints\_custom_map::doTheCheck_();
break; break;
@ -1408,7 +1408,7 @@ walk_loop()
if ( self GetStance() == "prone" || ( self.bot.is_cur_sniper && self playerads() > 0 ) ) if ( self GetStance() == "prone" || ( self.bot.is_cur_sniper && self playerads() > 0 ) )
return; return;
if ( self.bot.target.rand <= self.pers["bots"]["behavior"]["strafe"] ) if ( self.bot.target.rand <= self.pers[ "bots" ][ "behavior" ][ "strafe" ] )
self strafe( self.bot.target.entity ); self strafe( self.bot.target.entity );
return; return;
@ -1418,13 +1418,13 @@ walk_loop()
dist = 16; dist = 16;
if ( level.waypointcount ) if ( level.waypointcount )
goal = level.waypoints[randomint( level.waypointcount )].origin; goal = level.waypoints[ randomint( level.waypointcount ) ].origin;
else else
{ {
self thread killWalkCauseNoWaypoints(); self thread killWalkCauseNoWaypoints();
stepDist = 64; stepDist = 64;
forward = vector_scale( anglestoforward( self getplayerangles() ), stepDist ); forward = vector_scale( anglestoforward( self getplayerangles() ), stepDist );
forward = ( forward[0], forward[1], 0 ); forward = ( forward[ 0 ], forward[ 1 ], 0 );
myOrg = self.origin + ( 0, 0, 32 ); myOrg = self.origin + ( 0, 0, 32 );
goal = physicstrace( myOrg, myOrg + forward, false, self ); goal = physicstrace( myOrg, myOrg + forward, false, self );
@ -1435,7 +1435,7 @@ walk_loop()
{ {
trace = bullettrace( myOrg, myOrg + forward, false, self ); trace = bullettrace( myOrg, myOrg + forward, false, self );
if ( trace["surfacetype"] == "none" || randomint( 100 ) < 25 ) if ( trace[ "surfacetype" ] == "none" || randomint( 100 ) < 25 )
{ {
// didnt hit anything, just choose a random direction then // didnt hit anything, just choose a random direction then
dir = ( 0, randomintrange( -180, 180 ), 0 ); dir = ( 0, randomintrange( -180, 180 ), 0 );
@ -1446,12 +1446,12 @@ walk_loop()
{ {
// hit a surface, lets get the reflection vector // hit a surface, lets get the reflection vector
// r = d - 2 (d . n) n // r = d - 2 (d . n) n
d = vectornormalize( trace["position"] - myOrg ); d = vectornormalize( trace[ "position" ] - myOrg );
n = trace["normal"]; n = trace[ "normal" ];
r = d - vector_scale( vector_scale( n, vectordot( d, n ) ), 2 ); r = d - vector_scale( vector_scale( n, vectordot( d, n ) ), 2 );
goal = physicstrace( myOrg, myOrg + vector_scale( ( r[0], r[1], 0 ), stepDist ), false, self ); goal = physicstrace( myOrg, myOrg + vector_scale( ( r[ 0 ], r[ 1 ], 0 ), stepDist ), false, self );
goal = physicstrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self ); goal = physicstrace( goal + ( 0, 0, 50 ), goal + ( 0, 0, -40 ), false, self );
} }
} }
@ -1513,8 +1513,8 @@ strafe( target )
self thread killWalkOnEvents(); self thread killWalkOnEvents();
angles = vectortoangles( vectornormalize( target.origin - self.origin ) ); angles = vectortoangles( vectornormalize( target.origin - self.origin ) );
anglesLeft = ( 0, angles[1] + 90, 0 ); anglesLeft = ( 0, angles[ 1 ] + 90, 0 );
anglesRight = ( 0, angles[1] - 90, 0 ); anglesRight = ( 0, angles[ 1 ] - 90, 0 );
myOrg = self.origin + ( 0, 0, 16 ); myOrg = self.origin + ( 0, 0, 16 );
left = myOrg + vector_scale( anglestoforward( anglesLeft ), 500 ); left = myOrg + vector_scale( anglestoforward( anglesLeft ), 500 );
@ -1523,10 +1523,10 @@ strafe( target )
traceLeft = bullettrace( myOrg, left, false, self ); traceLeft = bullettrace( myOrg, left, false, self );
traceRight = bullettrace( myOrg, right, false, self ); traceRight = bullettrace( myOrg, right, false, self );
strafe = traceLeft["position"]; strafe = traceLeft[ "position" ];
if ( traceRight["fraction"] > traceLeft["fraction"] ) if ( traceRight[ "fraction" ] > traceLeft[ "fraction" ] )
strafe = traceRight["position"]; strafe = traceRight[ "position" ];
self.bot.last_next_wp = -1; self.bot.last_next_wp = -1;
self.bot.last_second_next_wp = -1; self.bot.last_second_next_wp = -1;
@ -1558,7 +1558,7 @@ cleanUpAStar( team )
self waittill_any( "death", "disconnect", "kill_goal" ); self waittill_any( "death", "disconnect", "kill_goal" );
for ( i = self.bot.astar.size - 1; i >= 0; i-- ) for ( i = self.bot.astar.size - 1; i >= 0; i-- )
RemoveWaypointUsage( self.bot.astar[i], team ); RemoveWaypointUsage( self.bot.astar[ i ], team );
} }
/* /*
@ -1587,9 +1587,9 @@ removeAStar()
remove = self.bot.astar.size - 1; remove = self.bot.astar.size - 1;
if ( level.teambased ) if ( level.teambased )
RemoveWaypointUsage( self.bot.astar[remove], self.team ); RemoveWaypointUsage( self.bot.astar[ remove ], self.team );
self.bot.astar[remove] = undefined; self.bot.astar[ remove ] = undefined;
return self.bot.astar.size - 1; return self.bot.astar.size - 1;
} }
@ -1645,25 +1645,25 @@ doWalk( goal, dist, isScriptGoal )
current = self initAStar( goal ); current = self initAStar( goal );
// skip waypoints we already completed to prevent rubber banding // skip waypoints we already completed to prevent rubber banding
if ( current > 0 && self.bot.astar[current] == self.bot.last_next_wp && self.bot.astar[current - 1] == self.bot.last_second_next_wp ) if ( current > 0 && self.bot.astar[ current ] == self.bot.last_next_wp && self.bot.astar[ current - 1 ] == self.bot.last_second_next_wp )
current = self removeAStar(); current = self removeAStar();
if ( current >= 0 ) if ( current >= 0 )
{ {
// check if a waypoint is closer than the goal // check if a waypoint is closer than the goal
if ( distancesquared( self.origin, level.waypoints[self.bot.astar[current]].origin ) < distancesquared( self.origin, goal ) || distancesquared( level.waypoints[self.bot.astar[current]].origin, physicstrace( self.origin + ( 0, 0, 32 ), level.waypoints[self.bot.astar[current]].origin, false, self ) ) > 1.0 ) if ( distancesquared( self.origin, level.waypoints[ self.bot.astar[ current ] ].origin ) < distancesquared( self.origin, goal ) || distancesquared( level.waypoints[ self.bot.astar[ current ] ].origin, physicstrace( self.origin + ( 0, 0, 32 ), level.waypoints[ self.bot.astar[ current ] ].origin, false, self ) ) > 1.0 )
{ {
while ( current >= 0 ) while ( current >= 0 )
{ {
self.bot.next_wp = self.bot.astar[current]; self.bot.next_wp = self.bot.astar[ current ];
self.bot.second_next_wp = -1; self.bot.second_next_wp = -1;
if ( current > 0 ) if ( current > 0 )
self.bot.second_next_wp = self.bot.astar[current - 1]; self.bot.second_next_wp = self.bot.astar[ current - 1 ];
self notify( "new_static_waypoint" ); self notify( "new_static_waypoint" );
self movetowards( level.waypoints[self.bot.next_wp].origin ); self movetowards( level.waypoints[ self.bot.next_wp ].origin );
self.bot.last_next_wp = self.bot.next_wp; self.bot.last_next_wp = self.bot.next_wp;
self.bot.last_second_next_wp = self.bot.second_next_wp; self.bot.last_second_next_wp = self.bot.second_next_wp;
@ -1749,7 +1749,7 @@ movetowards( goal )
if ( distancesquared( self.origin, lastOri ) < 32 * 32 ) if ( distancesquared( self.origin, lastOri ) < 32 * 32 )
{ {
// check if directly above or below // check if directly above or below
if ( abs( goal[2] - self.origin[2] ) > 64 && getConeDot( goal + ( 1, 1, 0 ), self.origin + ( -1, -1, 0 ), vectortoangles( ( goal[0], goal[1], self.origin[2] ) - self.origin ) ) < 0.64 && DistanceSquared2D( self.origin, goal ) < 32 * 32 ) if ( abs( goal[ 2 ] - self.origin[ 2 ] ) > 64 && getConeDot( goal + ( 1, 1, 0 ), self.origin + ( -1, -1, 0 ), vectortoangles( ( goal[ 0 ], goal[ 1 ], self.origin[ 2 ] ) - self.origin ) ) < 0.64 && DistanceSquared2D( self.origin, goal ) < 32 * 32 )
{ {
stucks = 2; stucks = 2;
} }
@ -1808,17 +1808,17 @@ getRandomLargestStafe( dist )
toptraces = []; toptraces = [];
top = traces.data[0]; top = traces.data[ 0 ];
toptraces[toptraces.size] = top; toptraces[ toptraces.size ] = top;
traces HeapRemove(); traces HeapRemove();
while ( traces.data.size && top["fraction"] - traces.data[0]["fraction"] < 0.1 ) while ( traces.data.size && top[ "fraction" ] - traces.data[ 0 ][ "fraction" ] < 0.1 )
{ {
toptraces[toptraces.size] = traces.data[0]; toptraces[ toptraces.size ] = traces.data[ 0 ];
traces HeapRemove(); traces HeapRemove();
} }
return toptraces[randomint( toptraces.size )]["position"]; return toptraces[ randomint( toptraces.size ) ][ "position" ];
} }
/* /*
@ -2114,15 +2114,15 @@ bot_lookat( pos, time, vel, doAimPredict )
myAngle = self getplayerangles(); myAngle = self getplayerangles();
angles = vectortoangles( ( pos - myEye ) - anglestoforward( myAngle ) ); angles = vectortoangles( ( pos - myEye ) - anglestoforward( myAngle ) );
X = AngleClamp180( angles[0] - myAngle[0] ); X = AngleClamp180( angles[ 0 ] - myAngle[ 0 ] );
X = X / steps; X = X / steps;
Y = AngleClamp180( angles[1] - myAngle[1] ); Y = AngleClamp180( angles[ 1 ] - myAngle[ 1 ] );
Y = Y / steps; Y = Y / steps;
for ( i = 0; i < steps; i++ ) for ( i = 0; i < steps; i++ )
{ {
myAngle = ( AngleClamp180( myAngle[0] + X ), AngleClamp180( myAngle[1] + Y ), 0 ); myAngle = ( AngleClamp180( myAngle[ 0 ] + X ), AngleClamp180( myAngle[ 1 ] + Y ), 0 );
self setplayerangles( myAngle ); self setplayerangles( myAngle );
wait 0.05; wait 0.05;
} }

View File

@ -123,7 +123,7 @@ bot_cry_for_help( attacker )
for ( i = level.players.size - 1; i >= 0; i-- ) for ( i = level.players.size - 1; i >= 0; i-- )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !player is_bot() ) if ( !player is_bot() )
{ {
@ -151,7 +151,7 @@ bot_cry_for_help( attacker )
continue; continue;
} }
dist = player.pers["bots"]["skill"]["help_dist"]; dist = player.pers[ "bots" ][ "skill" ][ "help_dist" ];
dist *= dist; dist *= dist;
if ( distancesquared( self.origin, player.origin ) > dist ) if ( distancesquared( self.origin, player.origin ) > dist )
@ -181,47 +181,47 @@ set_diff()
switch ( rankVar ) switch ( rankVar )
{ {
case 0: case 0:
self.pers["bots"]["skill"]["base"] = RoundNum( random_normal_distribution( 3.5, 1.75, 1, 7 ) ); self.pers[ "bots" ][ "skill" ][ "base" ] = RoundNum( random_normal_distribution( 3.5, 1.75, 1, 7 ) );
break; break;
case 8: case 8:
break; break;
case 9: case 9:
self.pers["bots"]["skill"]["base"] = randomintrange( 1, 7 ); self.pers[ "bots" ][ "skill" ][ "base" ] = randomintrange( 1, 7 );
self.pers["bots"]["skill"]["aim_time"] = 0.05 * randomintrange( 1, 20 ); self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.05 * randomintrange( 1, 20 );
self.pers["bots"]["skill"]["init_react_time"] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 50 * randomint( 100 );
self.pers["bots"]["skill"]["reaction_time"] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 50 * randomint( 100 );
self.pers["bots"]["skill"]["no_trace_ads_time"] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 50 * randomint( 100 );
self.pers["bots"]["skill"]["no_trace_look_time"] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 50 * randomint( 100 );
self.pers["bots"]["skill"]["remember_time"] = 50 * randomint( 100 ); self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 50 * randomint( 100 );
self.pers["bots"]["skill"]["fov"] = randomfloatrange( -1, 1 ); self.pers[ "bots" ][ "skill" ][ "fov" ] = randomfloatrange( -1, 1 );
randomNum = randomintrange( 500, 25000 ); randomNum = randomintrange( 500, 25000 );
self.pers["bots"]["skill"]["dist_start"] = randomNum; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = randomNum;
self.pers["bots"]["skill"]["dist_max"] = randomNum * 2; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = randomNum * 2;
self.pers["bots"]["skill"]["spawn_time"] = 0.05 * randomint( 20 ); self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.05 * randomint( 20 );
self.pers["bots"]["skill"]["help_dist"] = randomintrange( 500, 25000 ); self.pers[ "bots" ][ "skill" ][ "help_dist" ] = randomintrange( 500, 25000 );
self.pers["bots"]["skill"]["semi_time"] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "semi_time" ] = randomfloatrange( 0.05, 1 );
self.pers["bots"]["skill"]["shoot_after_time"] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = randomfloatrange( 0.05, 1 );
self.pers["bots"]["skill"]["aim_offset_time"] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = randomfloatrange( 0.05, 1 );
self.pers["bots"]["skill"]["aim_offset_amount"] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = randomfloatrange( 0.05, 1 );
self.pers["bots"]["skill"]["bone_update_interval"] = randomfloatrange( 0.05, 1 ); self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = randomfloatrange( 0.05, 1 );
self.pers["bots"]["skill"]["bones"] = "j_head,j_spine4,j_ankle_ri,j_ankle_le"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head,j_spine4,j_ankle_ri,j_ankle_le";
self.pers["bots"]["behavior"]["strafe"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "strafe" ] = randomint( 100 );
self.pers["bots"]["behavior"]["nade"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "nade" ] = randomint( 100 );
self.pers["bots"]["behavior"]["camp"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "camp" ] = randomint( 100 );
self.pers["bots"]["behavior"]["follow"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "follow" ] = randomint( 100 );
self.pers["bots"]["behavior"]["crouch"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "crouch" ] = randomint( 100 );
self.pers["bots"]["behavior"]["switch"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "switch" ] = randomint( 100 );
self.pers["bots"]["behavior"]["class"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "class" ] = randomint( 100 );
self.pers["bots"]["behavior"]["jump"] = randomint( 100 ); self.pers[ "bots" ][ "behavior" ][ "jump" ] = randomint( 100 );
break; break;
default: default:
self.pers["bots"]["skill"]["base"] = rankVar; self.pers[ "bots" ][ "skill" ][ "base" ] = rankVar;
break; break;
} }
} }
@ -237,223 +237,223 @@ difficulty()
{ {
if ( getcvarint( "bots_skill" ) != 9 ) if ( getcvarint( "bots_skill" ) != 9 )
{ {
switch ( self.pers["bots"]["skill"]["base"] ) switch ( self.pers[ "bots" ][ "skill" ][ "base" ] )
{ {
case 1: case 1:
self.pers["bots"]["skill"]["aim_time"] = 0.6; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.6;
self.pers["bots"]["skill"]["init_react_time"] = 1500; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 1500;
self.pers["bots"]["skill"]["reaction_time"] = 1000; self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 1000;
self.pers["bots"]["skill"]["no_trace_ads_time"] = 500; self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 500;
self.pers["bots"]["skill"]["no_trace_look_time"] = 600; self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 600;
self.pers["bots"]["skill"]["remember_time"] = 750; self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 750;
self.pers["bots"]["skill"]["fov"] = 0.7; self.pers[ "bots" ][ "skill" ][ "fov" ] = 0.7;
self.pers["bots"]["skill"]["dist_max"] = 2500; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 2500;
self.pers["bots"]["skill"]["dist_start"] = 1000; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 1000;
self.pers["bots"]["skill"]["spawn_time"] = 0.75; self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.75;
self.pers["bots"]["skill"]["help_dist"] = 0; self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 0;
self.pers["bots"]["skill"]["semi_time"] = 0.9; self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.9;
self.pers["bots"]["skill"]["shoot_after_time"] = 1; self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 1;
self.pers["bots"]["skill"]["aim_offset_time"] = 1.5; self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 1.5;
self.pers["bots"]["skill"]["aim_offset_amount"] = 4; self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 4;
self.pers["bots"]["skill"]["bone_update_interval"] = 2; self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 2;
self.pers["bots"]["skill"]["bones"] = "j_spine4,j_ankle_le,j_ankle_ri"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spine4,j_ankle_le,j_ankle_ri";
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers["bots"]["behavior"]["strafe"] = 0; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 0;
self.pers["bots"]["behavior"]["nade"] = 10; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 10;
self.pers["bots"]["behavior"]["camp"] = 5; self.pers[ "bots" ][ "behavior" ][ "camp" ] = 5;
self.pers["bots"]["behavior"]["follow"] = 5; self.pers[ "bots" ][ "behavior" ][ "follow" ] = 5;
self.pers["bots"]["behavior"]["crouch"] = 20; self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 20;
self.pers["bots"]["behavior"]["switch"] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers["bots"]["behavior"]["class"] = 2; self.pers[ "bots" ][ "behavior" ][ "class" ] = 2;
self.pers["bots"]["behavior"]["jump"] = 0; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 0;
break; break;
case 2: case 2:
self.pers["bots"]["skill"]["aim_time"] = 0.55; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.55;
self.pers["bots"]["skill"]["init_react_time"] = 1000; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 1000;
self.pers["bots"]["skill"]["reaction_time"] = 800; self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 800;
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1000; self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 1000;
self.pers["bots"]["skill"]["no_trace_look_time"] = 1250; self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 1250;
self.pers["bots"]["skill"]["remember_time"] = 1500; self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 1500;
self.pers["bots"]["skill"]["fov"] = 0.65; self.pers[ "bots" ][ "skill" ][ "fov" ] = 0.65;
self.pers["bots"]["skill"]["dist_max"] = 3000; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 3000;
self.pers["bots"]["skill"]["dist_start"] = 1500; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 1500;
self.pers["bots"]["skill"]["spawn_time"] = 0.65; self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.65;
self.pers["bots"]["skill"]["help_dist"] = 500; self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 500;
self.pers["bots"]["skill"]["semi_time"] = 0.75; self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.75;
self.pers["bots"]["skill"]["shoot_after_time"] = 0.75; self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 0.75;
self.pers["bots"]["skill"]["aim_offset_time"] = 1; self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 1;
self.pers["bots"]["skill"]["aim_offset_amount"] = 3; self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 3;
self.pers["bots"]["skill"]["bone_update_interval"] = 1.5; self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 1.5;
self.pers["bots"]["skill"]["bones"] = "j_spine4,j_ankle_le,j_ankle_ri,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spine4,j_ankle_le,j_ankle_ri,j_head";
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers["bots"]["behavior"]["strafe"] = 10; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 10;
self.pers["bots"]["behavior"]["nade"] = 15; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 15;
self.pers["bots"]["behavior"]["camp"] = 5; self.pers[ "bots" ][ "behavior" ][ "camp" ] = 5;
self.pers["bots"]["behavior"]["follow"] = 5; self.pers[ "bots" ][ "behavior" ][ "follow" ] = 5;
self.pers["bots"]["behavior"]["crouch"] = 15; self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 15;
self.pers["bots"]["behavior"]["switch"] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers["bots"]["behavior"]["class"] = 2; self.pers[ "bots" ][ "behavior" ][ "class" ] = 2;
self.pers["bots"]["behavior"]["jump"] = 10; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 10;
break; break;
case 3: case 3:
self.pers["bots"]["skill"]["aim_time"] = 0.4; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.4;
self.pers["bots"]["skill"]["init_react_time"] = 750; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 750;
self.pers["bots"]["skill"]["reaction_time"] = 500; self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 500;
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1000; self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 1000;
self.pers["bots"]["skill"]["no_trace_look_time"] = 1500; self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 1500;
self.pers["bots"]["skill"]["remember_time"] = 2000; self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 2000;
self.pers["bots"]["skill"]["fov"] = 0.6; self.pers[ "bots" ][ "skill" ][ "fov" ] = 0.6;
self.pers["bots"]["skill"]["dist_max"] = 4000; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 4000;
self.pers["bots"]["skill"]["dist_start"] = 2250; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 2250;
self.pers["bots"]["skill"]["spawn_time"] = 0.5; self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.5;
self.pers["bots"]["skill"]["help_dist"] = 750; self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 750;
self.pers["bots"]["skill"]["semi_time"] = 0.65; self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.65;
self.pers["bots"]["skill"]["shoot_after_time"] = 0.65; self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 0.65;
self.pers["bots"]["skill"]["aim_offset_time"] = 0.75; self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 0.75;
self.pers["bots"]["skill"]["aim_offset_amount"] = 2.5; self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 2.5;
self.pers["bots"]["skill"]["bone_update_interval"] = 1; self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 1;
self.pers["bots"]["skill"]["bones"] = "j_spine4,j_spine4,j_ankle_le,j_ankle_ri,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spine4,j_spine4,j_ankle_le,j_ankle_ri,j_head";
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers["bots"]["behavior"]["strafe"] = 20; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 20;
self.pers["bots"]["behavior"]["nade"] = 20; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 20;
self.pers["bots"]["behavior"]["camp"] = 5; self.pers[ "bots" ][ "behavior" ][ "camp" ] = 5;
self.pers["bots"]["behavior"]["follow"] = 5; self.pers[ "bots" ][ "behavior" ][ "follow" ] = 5;
self.pers["bots"]["behavior"]["crouch"] = 10; self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 10;
self.pers["bots"]["behavior"]["switch"] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers["bots"]["behavior"]["class"] = 2; self.pers[ "bots" ][ "behavior" ][ "class" ] = 2;
self.pers["bots"]["behavior"]["jump"] = 25; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 25;
break; break;
case 4: case 4:
self.pers["bots"]["skill"]["aim_time"] = 0.3; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.3;
self.pers["bots"]["skill"]["init_react_time"] = 600; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 600;
self.pers["bots"]["skill"]["reaction_time"] = 400; self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 400;
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1000; self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 1000;
self.pers["bots"]["skill"]["no_trace_look_time"] = 1500; self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 1500;
self.pers["bots"]["skill"]["remember_time"] = 3000; self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 3000;
self.pers["bots"]["skill"]["fov"] = 0.55; self.pers[ "bots" ][ "skill" ][ "fov" ] = 0.55;
self.pers["bots"]["skill"]["dist_max"] = 5000; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 5000;
self.pers["bots"]["skill"]["dist_start"] = 3350; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 3350;
self.pers["bots"]["skill"]["spawn_time"] = 0.35; self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.35;
self.pers["bots"]["skill"]["help_dist"] = 1000; self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 1000;
self.pers["bots"]["skill"]["semi_time"] = 0.5; self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.5;
self.pers["bots"]["skill"]["shoot_after_time"] = 0.5; self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 0.5;
self.pers["bots"]["skill"]["aim_offset_time"] = 0.5; self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 0.5;
self.pers["bots"]["skill"]["aim_offset_amount"] = 2; self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 2;
self.pers["bots"]["skill"]["bone_update_interval"] = 0.75; self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 0.75;
self.pers["bots"]["skill"]["bones"] = "j_spine4,j_spine4,j_ankle_le,j_ankle_ri,j_head,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spine4,j_spine4,j_ankle_le,j_ankle_ri,j_head,j_head";
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers["bots"]["behavior"]["strafe"] = 30; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 30;
self.pers["bots"]["behavior"]["nade"] = 25; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 25;
self.pers["bots"]["behavior"]["camp"] = 5; self.pers[ "bots" ][ "behavior" ][ "camp" ] = 5;
self.pers["bots"]["behavior"]["follow"] = 5; self.pers[ "bots" ][ "behavior" ][ "follow" ] = 5;
self.pers["bots"]["behavior"]["crouch"] = 10; self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 10;
self.pers["bots"]["behavior"]["switch"] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers["bots"]["behavior"]["class"] = 2; self.pers[ "bots" ][ "behavior" ][ "class" ] = 2;
self.pers["bots"]["behavior"]["jump"] = 35; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 35;
break; break;
case 5: case 5:
self.pers["bots"]["skill"]["aim_time"] = 0.25; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.25;
self.pers["bots"]["skill"]["init_react_time"] = 500; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 500;
self.pers["bots"]["skill"]["reaction_time"] = 300; self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 300;
self.pers["bots"]["skill"]["no_trace_ads_time"] = 1500; self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 1500;
self.pers["bots"]["skill"]["no_trace_look_time"] = 2000; self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 2000;
self.pers["bots"]["skill"]["remember_time"] = 4000; self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 4000;
self.pers["bots"]["skill"]["fov"] = 0.5; self.pers[ "bots" ][ "skill" ][ "fov" ] = 0.5;
self.pers["bots"]["skill"]["dist_max"] = 7500; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 7500;
self.pers["bots"]["skill"]["dist_start"] = 5000; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 5000;
self.pers["bots"]["skill"]["spawn_time"] = 0.25; self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.25;
self.pers["bots"]["skill"]["help_dist"] = 1500; self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 1500;
self.pers["bots"]["skill"]["semi_time"] = 0.4; self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.4;
self.pers["bots"]["skill"]["shoot_after_time"] = 0.35; self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 0.35;
self.pers["bots"]["skill"]["aim_offset_time"] = 0.35; self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 0.35;
self.pers["bots"]["skill"]["aim_offset_amount"] = 1.5; self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 1.5;
self.pers["bots"]["skill"]["bone_update_interval"] = 0.5; self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 0.5;
self.pers["bots"]["skill"]["bones"] = "j_spine4,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spine4,j_head";
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers["bots"]["behavior"]["strafe"] = 40; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 40;
self.pers["bots"]["behavior"]["nade"] = 35; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 35;
self.pers["bots"]["behavior"]["camp"] = 5; self.pers[ "bots" ][ "behavior" ][ "camp" ] = 5;
self.pers["bots"]["behavior"]["follow"] = 5; self.pers[ "bots" ][ "behavior" ][ "follow" ] = 5;
self.pers["bots"]["behavior"]["crouch"] = 10; self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 10;
self.pers["bots"]["behavior"]["switch"] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers["bots"]["behavior"]["class"] = 2; self.pers[ "bots" ][ "behavior" ][ "class" ] = 2;
self.pers["bots"]["behavior"]["jump"] = 50; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 50;
break; break;
case 6: case 6:
self.pers["bots"]["skill"]["aim_time"] = 0.2; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.2;
self.pers["bots"]["skill"]["init_react_time"] = 250; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 250;
self.pers["bots"]["skill"]["reaction_time"] = 150; self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 150;
self.pers["bots"]["skill"]["no_trace_ads_time"] = 2000; self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 2000;
self.pers["bots"]["skill"]["no_trace_look_time"] = 3000; self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 3000;
self.pers["bots"]["skill"]["remember_time"] = 5000; self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 5000;
self.pers["bots"]["skill"]["fov"] = 0.45; self.pers[ "bots" ][ "skill" ][ "fov" ] = 0.45;
self.pers["bots"]["skill"]["dist_max"] = 10000; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 10000;
self.pers["bots"]["skill"]["dist_start"] = 7500; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 7500;
self.pers["bots"]["skill"]["spawn_time"] = 0.2; self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.2;
self.pers["bots"]["skill"]["help_dist"] = 2000; self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 2000;
self.pers["bots"]["skill"]["semi_time"] = 0.25; self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.25;
self.pers["bots"]["skill"]["shoot_after_time"] = 0.25; self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 0.25;
self.pers["bots"]["skill"]["aim_offset_time"] = 0.25; self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 0.25;
self.pers["bots"]["skill"]["aim_offset_amount"] = 1; self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 1;
self.pers["bots"]["skill"]["bone_update_interval"] = 0.25; self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 0.25;
self.pers["bots"]["skill"]["bones"] = "j_spine4,j_head,j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_spine4,j_head,j_head";
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers["bots"]["behavior"]["strafe"] = 50; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 50;
self.pers["bots"]["behavior"]["nade"] = 45; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 45;
self.pers["bots"]["behavior"]["camp"] = 5; self.pers[ "bots" ][ "behavior" ][ "camp" ] = 5;
self.pers["bots"]["behavior"]["follow"] = 5; self.pers[ "bots" ][ "behavior" ][ "follow" ] = 5;
self.pers["bots"]["behavior"]["crouch"] = 10; self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 10;
self.pers["bots"]["behavior"]["switch"] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers["bots"]["behavior"]["class"] = 2; self.pers[ "bots" ][ "behavior" ][ "class" ] = 2;
self.pers["bots"]["behavior"]["jump"] = 75; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 75;
break; break;
case 7: case 7:
self.pers["bots"]["skill"]["aim_time"] = 0.1; self.pers[ "bots" ][ "skill" ][ "aim_time" ] = 0.1;
self.pers["bots"]["skill"]["init_react_time"] = 100; self.pers[ "bots" ][ "skill" ][ "init_react_time" ] = 100;
self.pers["bots"]["skill"]["reaction_time"] = 50; self.pers[ "bots" ][ "skill" ][ "reaction_time" ] = 50;
self.pers["bots"]["skill"]["no_trace_ads_time"] = 2500; self.pers[ "bots" ][ "skill" ][ "no_trace_ads_time" ] = 2500;
self.pers["bots"]["skill"]["no_trace_look_time"] = 4000; self.pers[ "bots" ][ "skill" ][ "no_trace_look_time" ] = 4000;
self.pers["bots"]["skill"]["remember_time"] = 7500; self.pers[ "bots" ][ "skill" ][ "remember_time" ] = 7500;
self.pers["bots"]["skill"]["fov"] = 0.4; self.pers[ "bots" ][ "skill" ][ "fov" ] = 0.4;
self.pers["bots"]["skill"]["dist_max"] = 15000; self.pers[ "bots" ][ "skill" ][ "dist_max" ] = 15000;
self.pers["bots"]["skill"]["dist_start"] = 10000; self.pers[ "bots" ][ "skill" ][ "dist_start" ] = 10000;
self.pers["bots"]["skill"]["spawn_time"] = 0.05; self.pers[ "bots" ][ "skill" ][ "spawn_time" ] = 0.05;
self.pers["bots"]["skill"]["help_dist"] = 3000; self.pers[ "bots" ][ "skill" ][ "help_dist" ] = 3000;
self.pers["bots"]["skill"]["semi_time"] = 0.1; self.pers[ "bots" ][ "skill" ][ "semi_time" ] = 0.1;
self.pers["bots"]["skill"]["shoot_after_time"] = 0; self.pers[ "bots" ][ "skill" ][ "shoot_after_time" ] = 0;
self.pers["bots"]["skill"]["aim_offset_time"] = 0; self.pers[ "bots" ][ "skill" ][ "aim_offset_time" ] = 0;
self.pers["bots"]["skill"]["aim_offset_amount"] = 0; self.pers[ "bots" ][ "skill" ][ "aim_offset_amount" ] = 0;
self.pers["bots"]["skill"]["bone_update_interval"] = 0.05; self.pers[ "bots" ][ "skill" ][ "bone_update_interval" ] = 0.05;
self.pers["bots"]["skill"]["bones"] = "j_head"; self.pers[ "bots" ][ "skill" ][ "bones" ] = "j_head";
self.pers["bots"]["skill"]["ads_fov_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_fov_multi" ] = 0.5;
self.pers["bots"]["skill"]["ads_aimspeed_multi"] = 0.5; self.pers[ "bots" ][ "skill" ][ "ads_aimspeed_multi" ] = 0.5;
self.pers["bots"]["behavior"]["strafe"] = 65; self.pers[ "bots" ][ "behavior" ][ "strafe" ] = 65;
self.pers["bots"]["behavior"]["nade"] = 65; self.pers[ "bots" ][ "behavior" ][ "nade" ] = 65;
self.pers["bots"]["behavior"]["camp"] = 5; self.pers[ "bots" ][ "behavior" ][ "camp" ] = 5;
self.pers["bots"]["behavior"]["follow"] = 5; self.pers[ "bots" ][ "behavior" ][ "follow" ] = 5;
self.pers["bots"]["behavior"]["crouch"] = 5; self.pers[ "bots" ][ "behavior" ][ "crouch" ] = 5;
self.pers["bots"]["behavior"]["switch"] = 2; self.pers[ "bots" ][ "behavior" ][ "switch" ] = 2;
self.pers["bots"]["behavior"]["class"] = 2; self.pers[ "bots" ][ "behavior" ][ "class" ] = 2;
self.pers["bots"]["behavior"]["jump"] = 90; self.pers[ "bots" ][ "behavior" ][ "jump" ] = 90;
break; break;
} }
} }
@ -471,15 +471,15 @@ teamWatch()
for ( ;; ) for ( ;; )
{ {
while ( !isdefined( self.pers["team"] ) || !allowTeamChoice() ) while ( !isdefined( self.pers[ "team" ] ) || !allowTeamChoice() )
wait .05; wait .05;
wait 0.1; wait 0.1;
if ( self.team != "axis" && self.team != "allies" ) if ( self.team != "axis" && self.team != "allies" )
self notify( "menuresponse", game["menu_team"], getcvar( "bots_team" ) ); self notify( "menuresponse", game[ "menu_team" ], getcvar( "bots_team" ) );
while ( isdefined( self.pers["team"] ) ) while ( isdefined( self.pers[ "team" ] ) )
wait .05; wait .05;
} }
} }
@ -494,47 +494,47 @@ chooseRandomClass()
if ( self.team == "axis" ) if ( self.team == "axis" )
{ {
weapons[weapons.size] = "mp40_mp"; weapons[ weapons.size ] = "mp40_mp";
weapons[weapons.size] = "mp44_mp"; weapons[ weapons.size ] = "mp44_mp";
weapons[weapons.size] = "kar98k_mp"; weapons[ weapons.size ] = "kar98k_mp";
weapons[weapons.size] = "kar98k_sniper_mp"; weapons[ weapons.size ] = "kar98k_sniper_mp";
weapons[weapons.size] = "shotgun_mp"; weapons[ weapons.size ] = "shotgun_mp";
weapons[weapons.size] = "g43_mp"; weapons[ weapons.size ] = "g43_mp";
} }
else else
{ {
if ( game["allies"] == "american" ) if ( game[ "allies" ] == "american" )
{ {
weapons[weapons.size] = "shotgun_mp"; weapons[ weapons.size ] = "shotgun_mp";
weapons[weapons.size] = "bar_mp"; weapons[ weapons.size ] = "bar_mp";
weapons[weapons.size] = "thompson_mp"; weapons[ weapons.size ] = "thompson_mp";
weapons[weapons.size] = "springfield_mp"; weapons[ weapons.size ] = "springfield_mp";
weapons[weapons.size] = "m1garand_mp"; weapons[ weapons.size ] = "m1garand_mp";
weapons[weapons.size] = "m1carbine_mp"; weapons[ weapons.size ] = "m1carbine_mp";
weapons[weapons.size] = "greasegun_mp"; weapons[ weapons.size ] = "greasegun_mp";
} }
else if ( game["allies"] == "british" ) else if ( game[ "allies" ] == "british" )
{ {
weapons[weapons.size] = "shotgun_mp"; weapons[ weapons.size ] = "shotgun_mp";
weapons[weapons.size] = "sten_mp"; weapons[ weapons.size ] = "sten_mp";
weapons[weapons.size] = "bren_mp"; weapons[ weapons.size ] = "bren_mp";
weapons[weapons.size] = "enfield_mp"; weapons[ weapons.size ] = "enfield_mp";
weapons[weapons.size] = "enfield_scope_mp"; weapons[ weapons.size ] = "enfield_scope_mp";
weapons[weapons.size] = "m1garand_mp"; weapons[ weapons.size ] = "m1garand_mp";
weapons[weapons.size] = "thompson_mp"; weapons[ weapons.size ] = "thompson_mp";
} }
else else
{ {
weapons[weapons.size] = "shotgun_mp"; weapons[ weapons.size ] = "shotgun_mp";
weapons[weapons.size] = "ppsh_mp"; weapons[ weapons.size ] = "ppsh_mp";
weapons[weapons.size] = "mosin_nagant_mp"; weapons[ weapons.size ] = "mosin_nagant_mp";
weapons[weapons.size] = "mosin_nagant_sniper_mp"; weapons[ weapons.size ] = "mosin_nagant_sniper_mp";
weapons[weapons.size] = "SVT40_mp"; weapons[ weapons.size ] = "SVT40_mp";
weapons[weapons.size] = "PPS42_mp"; weapons[ weapons.size ] = "PPS42_mp";
} }
} }
weap = weapons[randomint( weapons.size )]; weap = weapons[ randomint( weapons.size ) ];
return weap; return weap;
} }
@ -551,17 +551,17 @@ classWatch()
for ( ;; ) for ( ;; )
{ {
while ( !isdefined( self.pers["team"] ) || !allowClassChoice() ) while ( !isdefined( self.pers[ "team" ] ) || !allowClassChoice() )
wait .05; wait .05;
wait 0.5; wait 0.5;
if ( !isdefined( self.pers["weapon"] ) || self.pers["weapon"] == "" || !isdefined( self.bot_change_class ) ) if ( !isdefined( self.pers[ "weapon" ] ) || self.pers[ "weapon" ] == "" || !isdefined( self.bot_change_class ) )
self notify( "menuresponse", game["menu_weapon_" + self.team], self chooseRandomClass() ); self notify( "menuresponse", game[ "menu_weapon_" + self.team ], self chooseRandomClass() );
self.bot_change_class = true; self.bot_change_class = true;
while ( isdefined( self.pers["team"] ) && isdefined( self.pers["weapon"] ) && self.pers["weapon"] != "" && isdefined( self.bot_change_class ) ) while ( isdefined( self.pers[ "team" ] ) && isdefined( self.pers[ "weapon" ] ) && self.pers[ "weapon" ] != "" && isdefined( self.bot_change_class ) )
wait .05; wait .05;
} }
} }
@ -577,7 +577,7 @@ onSpawned()
{ {
self waittill( "spawned_player" ); self waittill( "spawned_player" );
if ( randomint( 100 ) <= self.pers["bots"]["behavior"]["class"] ) if ( randomint( 100 ) <= self.pers[ "bots" ][ "behavior" ][ "class" ] )
self.bot_change_class = undefined; self.bot_change_class = undefined;
self.bot_lock_goal = false; self.bot_lock_goal = false;

View File

@ -24,9 +24,9 @@ wait_for_builtins()
*/ */
BotBuiltinPrintConsole( s ) BotBuiltinPrintConsole( s )
{ {
if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins["printconsole"] ) ) if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "printconsole" ] ) )
{ {
[[ level.bot_builtins["printconsole" ]]]( s ); [[ level.bot_builtins[ "printconsole" ] ]]( s );
} }
} }
@ -36,9 +36,9 @@ BotBuiltinPrintConsole( s )
*/ */
BotBuiltinBotAction( action ) BotBuiltinBotAction( action )
{ {
if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins["botaction"] ) ) if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botaction" ] ) )
{ {
self [[ level.bot_builtins["botaction" ]]]( action ); self [[ level.bot_builtins[ "botaction" ] ]]( action );
} }
} }
@ -48,9 +48,9 @@ BotBuiltinBotAction( action )
*/ */
BotBuiltinBotStop() BotBuiltinBotStop()
{ {
if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins["botstop"] ) ) if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botstop" ] ) )
{ {
self [[ level.bot_builtins["botstop" ]]](); self [[ level.bot_builtins[ "botstop" ] ]]();
} }
} }
@ -60,9 +60,9 @@ BotBuiltinBotStop()
*/ */
BotBuiltinBotMovement( forward, right ) BotBuiltinBotMovement( forward, right )
{ {
if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins["botmovement"] ) ) if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "botmovement" ] ) )
{ {
self [[ level.bot_builtins["botmovement" ]]]( forward, right ); self [[ level.bot_builtins[ "botmovement" ] ]]( forward, right );
} }
} }
@ -71,9 +71,9 @@ BotBuiltinBotMovement( forward, right )
*/ */
BotBuiltinIsBot() BotBuiltinIsBot()
{ {
if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins["isbot"] ) ) if ( isdefined( level.bot_builtins ) && isdefined( level.bot_builtins[ "isbot" ] ) )
{ {
return self [[ level.bot_builtins["isbot" ]]](); return self [[ level.bot_builtins[ "isbot" ] ]]();
} }
return false; return false;
@ -84,7 +84,7 @@ BotBuiltinIsBot()
*/ */
is_host() is_host()
{ {
return ( isdefined( self.pers["bot_host"] ) && self.pers["bot_host"] ); return ( isdefined( self.pers[ "bot_host" ] ) && self.pers[ "bot_host" ] );
} }
/* /*
@ -92,7 +92,7 @@ is_host()
*/ */
doHostCheck() doHostCheck()
{ {
self.pers["bot_host"] = false; self.pers[ "bot_host" ] = false;
if ( self is_bot() ) if ( self is_bot() )
return; return;
@ -120,7 +120,7 @@ doHostCheck()
for ( i = 0; i < guids.size; i++ ) for ( i = 0; i < guids.size; i++ )
{ {
if ( self getguid() + "" == guids[i] ) if ( self getguid() + "" == guids[ i ] )
result = true; result = true;
} }
} }
@ -128,7 +128,7 @@ doHostCheck()
if ( !result ) if ( !result )
return; return;
self.pers["bot_host"] = true; self.pers[ "bot_host" ] = true;
} }
/* /*
@ -136,7 +136,7 @@ doHostCheck()
*/ */
is_bot() is_bot()
{ {
return ( ( isdefined( self.pers["isBot"] ) && self.pers["isBot"] ) || ( isdefined( self.pers["isBotWarfare"] ) && self.pers["isBotWarfare"] ) || self BotBuiltinIsBot() ); return ( ( isdefined( self.pers[ "isBot" ] ) && self.pers[ "isBot" ] ) || ( isdefined( self.pers[ "isBotWarfare" ] ) && self.pers[ "isBotWarfare" ] ) || self BotBuiltinIsBot() );
} }
/* /*
@ -448,26 +448,26 @@ isInUse()
getValidGrenade() getValidGrenade()
{ {
grenadeTypes = []; grenadeTypes = [];
grenadeTypes[0] = "frag_grenade_american_mp"; grenadeTypes[ 0 ] = "frag_grenade_american_mp";
grenadeTypes[1] = "smoke_grenade_american_mp"; grenadeTypes[ 1 ] = "smoke_grenade_american_mp";
grenadeTypes[2] = "frag_grenade_british_mp"; grenadeTypes[ 2 ] = "frag_grenade_british_mp";
grenadeTypes[3] = "smoke_grenade_british_mp"; grenadeTypes[ 3 ] = "smoke_grenade_british_mp";
grenadeTypes[4] = "frag_grenade_russian_mp"; grenadeTypes[ 4 ] = "frag_grenade_russian_mp";
grenadeTypes[5] = "smoke_grenade_russian_mp"; grenadeTypes[ 5 ] = "smoke_grenade_russian_mp";
grenadeTypes[6] = "frag_grenade_german_mp"; grenadeTypes[ 6 ] = "frag_grenade_german_mp";
grenadeTypes[7] = "smoke_grenade_german_mp"; grenadeTypes[ 7 ] = "smoke_grenade_german_mp";
possibles = []; possibles = [];
for ( i = 0; i < grenadeTypes.size; i++ ) for ( i = 0; i < grenadeTypes.size; i++ )
{ {
if ( !self hasweapon( grenadeTypes[i] ) ) if ( !self hasweapon( grenadeTypes[ i ] ) )
continue; continue;
if ( !self getAmmoCount( grenadeTypes[i] ) ) if ( !self getAmmoCount( grenadeTypes[ i ] ) )
continue; continue;
possibles[possibles.size] = grenadeTypes[i]; possibles[ possibles.size ] = grenadeTypes[ i ];
} }
return random( possibles ); return random( possibles );
@ -502,7 +502,7 @@ isOnLadder()
*/ */
weaponClass( weap ) weaponClass( weap )
{ {
answer = level.bots_weapon_class_names[weap]; answer = level.bots_weapon_class_names[ weap ];
if ( !isdefined( answer ) ) if ( !isdefined( answer ) )
answer = ""; answer = "";
@ -515,7 +515,7 @@ weaponClass( weap )
*/ */
WeaponClipSize( weap ) WeaponClipSize( weap )
{ {
answer = level.bots_weapon_clip_sizes[weap]; answer = level.bots_weapon_clip_sizes[ weap ];
if ( !isdefined( answer ) ) if ( !isdefined( answer ) )
answer = 1; answer = 1;
@ -559,7 +559,7 @@ getStance()
{ {
myEye = self getTagOrigin( "tag_eye" ); myEye = self getTagOrigin( "tag_eye" );
height = myEye[2] - self.origin[2]; height = myEye[ 2 ] - self.origin[ 2 ];
if ( height > 50 ) if ( height > 50 )
return "stand"; return "stand";
@ -596,7 +596,7 @@ WeaponIsFullAuto( weap )
{ {
weaptoks = strtok( weap, "_" ); weaptoks = strtok( weap, "_" );
return isdefined( weaptoks[0] ) && isstring( weaptoks[0] ) && isdefined( level.bots_fullautoguns[weaptoks[0]] ); return isdefined( weaptoks[ 0 ] ) && isstring( weaptoks[ 0 ] ) && isdefined( level.bots_fullautoguns[ weaptoks[ 0 ] ] );
} }
/* /*
@ -636,14 +636,14 @@ getTagOrigin( where )
self.tagmap = []; self.tagmap = [];
} }
if ( isdefined( self.tagmap[where] ) ) if ( isdefined( self.tagmap[ where ] ) )
return self.tagmap[where].origin; return self.tagmap[ where ].origin;
obj = spawn( "script_origin", ( 0, 0, 0 ) ); obj = spawn( "script_origin", ( 0, 0, 0 ) );
obj linkto( self, where, ( 0, 0, 0 ), ( 0, 0, 0 ) ); obj linkto( self, where, ( 0, 0, 0 ), ( 0, 0, 0 ) );
self.tags[self.tags.size] = obj; self.tags[ self.tags.size ] = obj;
self.tagmap[where] = obj; self.tagmap[ where ] = obj;
return self.origin; return self.origin;
} }
@ -764,7 +764,7 @@ random( arr )
if ( !size ) if ( !size )
return undefined; return undefined;
return arr[randomint( size )]; return arr[ randomint( size ) ];
} }
/* /*
@ -776,7 +776,7 @@ array_remove( ents, remover )
for ( i = 0; i < ents.size; i++ ) for ( i = 0; i < ents.size; i++ )
{ {
index = ents[i]; index = ents[ i ];
if ( index != remover ) if ( index != remover )
newents[ newents.size ] = index; newents[ newents.size ] = index;
@ -801,7 +801,7 @@ GetHostPlayer()
{ {
for ( i = 0; i < level.players.size; i++ ) for ( i = 0; i < level.players.size; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !player is_host() ) if ( !player is_host() )
continue; continue;
@ -901,11 +901,11 @@ RaySphereIntersect( start, end, spherePos, radius )
// check if the line made by start and end intersect the sphere // check if the line made by start and end intersect the sphere
dp = end - start; dp = end - start;
a = dp[0] * dp[0] + dp[1] * dp[1] + dp[2] * dp[2]; a = dp[ 0 ] * dp[ 0 ] + dp[ 1 ] * dp[ 1 ] + dp[ 2 ] * dp[ 2 ];
b = 2 * ( dp[0] * ( start[0] - spherePos[0] ) + dp[1] * ( start[1] - spherePos[1] ) + dp[2] * ( start[2] - spherePos[2] ) ); b = 2 * ( dp[ 0 ] * ( start[ 0 ] - spherePos[ 0 ] ) + dp[ 1 ] * ( start[ 1 ] - spherePos[ 1 ] ) + dp[ 2 ] * ( start[ 2 ] - spherePos[ 2 ] ) );
c = spherePos[0] * spherePos[0] + spherePos[1] * spherePos[1] + spherePos[2] * spherePos[2]; c = spherePos[ 0 ] * spherePos[ 0 ] + spherePos[ 1 ] * spherePos[ 1 ] + spherePos[ 2 ] * spherePos[ 2 ];
c += start[0] * start[0] + start[1] * start[1] + start[2] * start[2]; c += start[ 0 ] * start[ 0 ] + start[ 1 ] * start[ 1 ] + start[ 2 ] * start[ 2 ];
c -= 2.0 * ( spherePos[0] * start[0] + spherePos[1] * start[1] + spherePos[2] * start[2] ); c -= 2.0 * ( spherePos[ 0 ] * start[ 0 ] + spherePos[ 1 ] * start[ 1 ] + spherePos[ 2 ] * start[ 2 ] );
c -= radius * radius; c -= radius * radius;
bb4ac = b * b - 4.0 * a * c; bb4ac = b * b - 4.0 * a * c;
@ -939,7 +939,7 @@ RaySphereIntersect( start, end, spherePos, radius )
*/ */
vector_scale( vec, scale ) vector_scale( vec, scale )
{ {
vec = ( vec[0] * scale, vec[1] * scale, vec[2] * scale ); vec = ( vec[ 0 ] * scale, vec[ 1 ] * scale, vec[ 2 ] * scale );
return vec; return vec;
} }
@ -950,7 +950,7 @@ SmokeTrace( start, end, rad )
{ {
for ( i = level.bots_smokelist.count - 1; i >= 0; i-- ) for ( i = level.bots_smokelist.count - 1; i >= 0; i-- )
{ {
nade = level.bots_smokelist.data[i]; nade = level.bots_smokelist.data[ i ];
if ( !RaySphereIntersect( start, end, nade.origin, rad ) ) if ( !RaySphereIntersect( start, end, nade.origin, rad ) )
continue; continue;
@ -976,8 +976,8 @@ getConeDot( to, from, dir )
*/ */
DistanceSquared2D( to, from ) DistanceSquared2D( to, from )
{ {
to = ( to[0], to[1], 0 ); to = ( to[ 0 ], to[ 1 ], 0 );
from = ( from[0], from[1], 0 ); from = ( from[ 0 ], from[ 1 ], 0 );
return distancesquared( to, from ); return distancesquared( to, from );
} }
@ -1189,28 +1189,28 @@ parseTokensIntoWaypoint( tokens )
{ {
waypoint = spawnstruct(); waypoint = spawnstruct();
orgStr = tokens[0]; orgStr = tokens[ 0 ];
orgToks = strtok( orgStr, " " ); orgToks = strtok( orgStr, " " );
waypoint.origin = ( float_old( orgToks[0] ), float_old( orgToks[1] ), float_old( orgToks[2] ) ); waypoint.origin = ( float_old( orgToks[ 0 ] ), float_old( orgToks[ 1 ] ), float_old( orgToks[ 2 ] ) );
childStr = tokens[1]; childStr = tokens[ 1 ];
childToks = strtok( childStr, " " ); childToks = strtok( childStr, " " );
waypoint.children = []; waypoint.children = [];
for ( j = 0; j < childToks.size; j++ ) for ( j = 0; j < childToks.size; j++ )
waypoint.children[j] = int( childToks[j] ); waypoint.children[ j ] = int( childToks[ j ] );
type = tokens[2]; type = tokens[ 2 ];
waypoint.type = type; waypoint.type = type;
anglesStr = tokens[3]; anglesStr = tokens[ 3 ];
if ( isdefined( anglesStr ) && anglesStr != "" ) if ( isdefined( anglesStr ) && anglesStr != "" )
{ {
anglesToks = strtok( anglesStr, " " ); anglesToks = strtok( anglesStr, " " );
if ( anglesToks.size >= 3 ) if ( anglesToks.size >= 3 )
waypoint.angles = ( float_old( anglesToks[0] ), float_old( anglesToks[1] ), float_old( anglesToks[2] ) ); waypoint.angles = ( float_old( anglesToks[ 0 ] ), float_old( anglesToks[ 1 ] ), float_old( anglesToks[ 2 ] ) );
} }
return waypoint; return waypoint;
@ -1262,7 +1262,7 @@ readWpsFromFile( mapname )
waypoint = parseTokensIntoWaypoint( tokens ); waypoint = parseTokensIntoWaypoint( tokens );
waypoints[i - 1] = waypoint; waypoints[ i - 1 ] = waypoint;
} }
break; break;
@ -1323,43 +1323,43 @@ loadmbotWps( mapname, gametype )
break; break;
wp = spawnstruct(); wp = spawnstruct();
wp.origin = ( float_old( t[0] ), float_old( t[1] ), float_old( t[2] ) ); wp.origin = ( float_old( t[ 0 ] ), float_old( t[ 1 ] ), float_old( t[ 2 ] ) );
stance = "stand"; stance = "stand";
if ( t[4] == "1" ) if ( t[ 4 ] == "1" )
stance = "crouch"; stance = "crouch";
else if ( t[4] == "2" ) else if ( t[ 4 ] == "2" )
stance = "prone"; stance = "prone";
wp.children = []; wp.children = [];
k = 0; k = 0;
for ( k = 0; k < int( t[5] ); k++ ) for ( k = 0; k < int( t[ 5 ] ); k++ )
wp.children[k] = int( t[6 + k] ); wp.children[ k ] = int( t[ 6 + k ] );
if ( t[3] == "l" || t[3] == "m" || t[3] == "f" || t[3] == "j" ) if ( t[ 3 ] == "l" || t[ 3 ] == "m" || t[ 3 ] == "f" || t[ 3 ] == "j" )
wp.type = "climb"; wp.type = "climb";
else if ( t[3] == "g" ) else if ( t[ 3 ] == "g" )
wp.type = "grenade"; wp.type = "grenade";
else if ( t[3] == "c" ) else if ( t[ 3 ] == "c" )
{ {
wp.type = "crouch"; wp.type = "crouch";
wpc = wp.children[0]; wpc = wp.children[ 0 ];
wp.children = []; wp.children = [];
wp.children[0] = wpc; wp.children[ 0 ] = wpc;
} }
else else
wp.type = stance; wp.type = stance;
if ( ( t.size == 9 && t[3] == "w" && t[5] == "1" ) || t[3] == "g" || t[3] == "c" ) if ( ( t.size == 9 && t[ 3 ] == "w" && t[ 5 ] == "1" ) || t[ 3 ] == "g" || t[ 3 ] == "c" )
{ {
k += 6; k += 6;
wp.angles = ( float_old( t[k] ), float_old( t[k + 1] ), 0.0 ); wp.angles = ( float_old( t[ k ] ), float_old( t[ k + 1 ] ), 0.0 );
} }
wps[i] = wp; wps[ i ] = wp;
i++; i++;
} }
@ -1376,8 +1376,8 @@ load_waypoints()
level.waypointcount = 0; level.waypointcount = 0;
level.waypointusage = []; level.waypointusage = [];
level.waypointusage["allies"] = []; level.waypointusage[ "allies" ] = [];
level.waypointusage["axis"] = []; level.waypointusage[ "axis" ] = [];
if ( !isdefined( level.waypoints ) ) if ( !isdefined( level.waypoints ) )
@ -1422,16 +1422,16 @@ load_waypoints()
for ( i = 0; i < level.waypointcount; i++ ) for ( i = 0; i < level.waypointcount; i++ )
{ {
if ( !isdefined( level.waypoints[i].children ) || !isdefined( level.waypoints[i].children.size ) ) if ( !isdefined( level.waypoints[ i ].children ) || !isdefined( level.waypoints[ i ].children.size ) )
level.waypoints[i].children = []; level.waypoints[ i ].children = [];
if ( !isdefined( level.waypoints[i].origin ) ) if ( !isdefined( level.waypoints[ i ].origin ) )
level.waypoints[i].origin = ( 0, 0, 0 ); level.waypoints[ i ].origin = ( 0, 0, 0 );
if ( !isdefined( level.waypoints[i].type ) ) if ( !isdefined( level.waypoints[ i ].type ) )
level.waypoints[i].type = "crouch"; level.waypoints[ i ].type = "crouch";
level.waypoints[i].childcount = undefined; level.waypoints[ i ].childcount = undefined;
} }
} }
@ -1444,7 +1444,7 @@ nearAnyOfWaypoints( dist, waypoints )
for ( i = 0; i < waypoints.size; i++ ) for ( i = 0; i < waypoints.size; i++ )
{ {
waypoint = level.waypoints[waypoints[i]]; waypoint = level.waypoints[ waypoints[ i ] ];
if ( distancesquared( waypoint.origin, self.origin ) > dist ) if ( distancesquared( waypoint.origin, self.origin ) > dist )
continue; continue;
@ -1466,12 +1466,12 @@ waypointsNear( waypoints, dist )
for ( i = 0; i < waypoints.size; i++ ) for ( i = 0; i < waypoints.size; i++ )
{ {
wp = level.waypoints[waypoints[i]]; wp = level.waypoints[ waypoints[ i ] ];
if ( distancesquared( wp.origin, self.origin ) > dist ) if ( distancesquared( wp.origin, self.origin ) > dist )
continue; continue;
answer[answer.size] = waypoints[i]; answer[ answer.size ] = waypoints[ i ];
} }
return answer; return answer;
@ -1487,13 +1487,13 @@ getNearestWaypointOfWaypoints( waypoints )
for ( i = 0; i < waypoints.size; i++ ) for ( i = 0; i < waypoints.size; i++ )
{ {
waypoint = level.waypoints[waypoints[i]]; waypoint = level.waypoints[ waypoints[ i ] ];
thisDist = distancesquared( self.origin, waypoint.origin ); thisDist = distancesquared( self.origin, waypoint.origin );
if ( isdefined( answer ) && thisDist > closestDist ) if ( isdefined( answer ) && thisDist > closestDist )
continue; continue;
answer = waypoints[i]; answer = waypoints[ i ];
closestDist = thisDist; closestDist = thisDist;
} }
@ -1509,7 +1509,7 @@ getWaypointsOfType( type )
for ( i = 0; i < level.waypointcount; i++ ) for ( i = 0; i < level.waypointcount; i++ )
{ {
wp = level.waypoints[i]; wp = level.waypoints[ i ];
if ( type == "camp" ) if ( type == "camp" )
{ {
@ -1522,7 +1522,7 @@ getWaypointsOfType( type )
else if ( type != wp.type ) else if ( type != wp.type )
continue; continue;
answer[answer.size] = i; answer[ answer.size ] = i;
} }
return answer; return answer;
@ -1536,7 +1536,7 @@ getWaypointForIndex( i )
if ( !isdefined( i ) ) if ( !isdefined( i ) )
return undefined; return undefined;
return level.waypoints[i]; return level.waypoints[ i ];
} }
/* /*
@ -1600,7 +1600,7 @@ getBotToKick()
{ {
bots = getBotArray(); bots = getBotArray();
if ( !isdefined( bots ) || !isdefined( bots.size ) || bots.size <= 0 || !isdefined( bots[0] ) ) if ( !isdefined( bots ) || !isdefined( bots.size ) || bots.size <= 0 || !isdefined( bots[ 0 ] ) )
return undefined; return undefined;
tokick = undefined; tokick = undefined;
@ -1611,7 +1611,7 @@ getBotToKick()
// count teams // count teams
for ( i = 0; i < bots.size; i++ ) for ( i = 0; i < bots.size; i++ )
{ {
bot = bots[i]; bot = bots[ i ];
if ( !isdefined( bot ) || !isdefined( bot.team ) ) if ( !isdefined( bot ) || !isdefined( bot.team ) )
continue; continue;
@ -1645,7 +1645,7 @@ getBotToKick()
// get the bot on this team with lowest skill // get the bot on this team with lowest skill
for ( i = 0; i < bots.size; i++ ) for ( i = 0; i < bots.size; i++ )
{ {
bot = bots[i]; bot = bots[ i ];
if ( !isdefined( bot ) || !isdefined( bot.team ) ) if ( !isdefined( bot ) || !isdefined( bot.team ) )
continue; continue;
@ -1653,10 +1653,10 @@ getBotToKick()
if ( bot.team != team ) if ( bot.team != team )
continue; continue;
if ( !isdefined( bot.pers ) || !isdefined( bot.pers["bots"] ) || !isdefined( bot.pers["bots"]["skill"] ) || !isdefined( bot.pers["bots"]["skill"]["base"] ) ) if ( !isdefined( bot.pers ) || !isdefined( bot.pers[ "bots" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ][ "base" ] ) )
continue; continue;
if ( isdefined( tokick ) && bot.pers["bots"]["skill"]["base"] > tokick.pers["bots"]["skill"]["base"] ) if ( isdefined( tokick ) && bot.pers[ "bots" ][ "skill" ][ "base" ] > tokick.pers[ "bots" ][ "skill" ][ "base" ] )
continue; continue;
tokick = bot; tokick = bot;
@ -1668,15 +1668,15 @@ getBotToKick()
// just kick lowest skill // just kick lowest skill
for ( i = 0; i < bots.size; i++ ) for ( i = 0; i < bots.size; i++ )
{ {
bot = bots[i]; bot = bots[ i ];
if ( !isdefined( bot ) || !isdefined( bot.team ) ) if ( !isdefined( bot ) || !isdefined( bot.team ) )
continue; continue;
if ( !isdefined( bot.pers ) || !isdefined( bot.pers["bots"] ) || !isdefined( bot.pers["bots"]["skill"] ) || !isdefined( bot.pers["bots"]["skill"]["base"] ) ) if ( !isdefined( bot.pers ) || !isdefined( bot.pers[ "bots" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ] ) || !isdefined( bot.pers[ "bots" ][ "skill" ][ "base" ] ) )
continue; continue;
if ( isdefined( tokick ) && bot.pers["bots"]["skill"]["base"] > tokick.pers["bots"]["skill"]["base"] ) if ( isdefined( tokick ) && bot.pers[ "bots" ][ "skill" ][ "base" ] > tokick.pers[ "bots" ][ "skill" ][ "base" ] )
continue; continue;
tokick = bot; tokick = bot;
@ -1695,12 +1695,12 @@ getBotArray()
for ( i = 0; i < playercount; i++ ) for ( i = 0; i < playercount; i++ )
{ {
player = level.players[i]; player = level.players[ i ];
if ( !player is_bot() ) if ( !player is_bot() )
continue; continue;
result[result.size] = player; result[ result.size ] = player;
} }
return result; return result;
@ -1747,14 +1747,14 @@ _WaypointsToKDTree( waypoints, dem )
for ( i = 0; i < waypoints.size; i++ ) for ( i = 0; i < waypoints.size; i++ )
{ {
heap HeapInsert( waypoints[i] ); heap HeapInsert( waypoints[ i ] );
} }
sorted = []; sorted = [];
while ( heap.data.size ) while ( heap.data.size )
{ {
sorted[sorted.size] = heap.data[0]; sorted[ sorted.size ] = heap.data[ 0 ];
heap HeapRemove(); heap HeapRemove();
} }
@ -1765,11 +1765,11 @@ _WaypointsToKDTree( waypoints, dem )
for ( i = 0; i < sorted.size; i++ ) for ( i = 0; i < sorted.size; i++ )
if ( i < median ) if ( i < median )
right[right.size] = sorted[i]; right[ right.size ] = sorted[ i ];
else if ( i > median ) else if ( i > median )
left[left.size] = sorted[i]; left[ left.size ] = sorted[ i ];
self KDTreeInsert( sorted[median] ); self KDTreeInsert( sorted[ median ] );
_WaypointsToKDTree( left, ( dem + 1 ) % 3 ); _WaypointsToKDTree( left, ( dem + 1 ) % 3 );
@ -1793,7 +1793,7 @@ List()
*/ */
ListAdd( thing ) ListAdd( thing )
{ {
self.data[self.count] = thing; self.data[ self.count ] = thing;
self.count++; self.count++;
} }
@ -1805,10 +1805,10 @@ ListAddFirst( thing )
{ {
for ( i = self.count - 1; i >= 0; i-- ) for ( i = self.count - 1; i >= 0; i-- )
{ {
self.data[i + 1] = self.data[i]; self.data[ i + 1 ] = self.data[ i ];
} }
self.data[0] = thing; self.data[ 0 ] = thing;
self.count++; self.count++;
} }
@ -1819,15 +1819,15 @@ ListRemove( thing )
{ {
for ( i = 0; i < self.count; i++ ) for ( i = 0; i < self.count; i++ )
{ {
if ( self.data[i] == thing ) if ( self.data[ i ] == thing )
{ {
while ( i < self.count - 1 ) while ( i < self.count - 1 )
{ {
self.data[i] = self.data[i + 1]; self.data[ i ] = self.data[ i + 1 ];
i++; i++;
} }
self.data[i] = undefined; self.data[ i ] = undefined;
self.count--; self.count--;
break; break;
} }
@ -1880,26 +1880,26 @@ _KDTreeInsert( node, data, dem, x0, y0, z0, x1, y1, z1 )
switch ( dem ) switch ( dem )
{ {
case 0: case 0:
if ( data.origin[0] < node.data.origin[0] ) if ( data.origin[ 0 ] < node.data.origin[ 0 ] )
node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[0], y1, z1 ); node.left = self _KDTreeInsert( node.left, data, 1, x0, y0, z0, node.data.origin[ 0 ], y1, z1 );
else else
node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[0], y0, z0, x1, y1, z1 ); node.right = self _KDTreeInsert( node.right, data, 1, node.data.origin[ 0 ], y0, z0, x1, y1, z1 );
break; break;
case 1: case 1:
if ( data.origin[1] < node.data.origin[1] ) if ( data.origin[ 1 ] < node.data.origin[ 1 ] )
node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[1], z1 ); node.left = self _KDTreeInsert( node.left, data, 2, x0, y0, z0, x1, node.data.origin[ 1 ], z1 );
else else
node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[1], z0, x1, y1, z1 ); node.right = self _KDTreeInsert( node.right, data, 2, x0, node.data.origin[ 1 ], z0, x1, y1, z1 );
break; break;
case 2: case 2:
if ( data.origin[2] < node.data.origin[2] ) if ( data.origin[ 2 ] < node.data.origin[ 2 ] )
node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[2] ); node.left = self _KDTreeInsert( node.left, data, 0, x0, y0, z0, x1, y1, node.data.origin[ 2 ] );
else else
node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[2], x1, y1, z1 ); node.right = self _KDTreeInsert( node.right, data, 0, x0, y0, node.data.origin[ 2 ], x1, y1, z1 );
break; break;
} }
@ -1941,7 +1941,7 @@ _KDTreeNearest( node, point, closest, closestdist, dem )
near = node.left; near = node.left;
far = node.right; far = node.right;
if ( point[dem] > node.data.origin[dem] ) if ( point[ dem ] > node.data.origin[ dem ] )
{ {
near = node.right; near = node.right;
far = node.left; far = node.left;
@ -1964,21 +1964,21 @@ RectDistanceSquared( origin )
dy = 0; dy = 0;
dz = 0; dz = 0;
if ( origin[0] < self.x0 ) if ( origin[ 0 ] < self.x0 )
dx = origin[0] - self.x0; dx = origin[ 0 ] - self.x0;
else if ( origin[0] > self.x1 ) else if ( origin[ 0 ] > self.x1 )
dx = origin[0] - self.x1; dx = origin[ 0 ] - self.x1;
if ( origin[1] < self.y0 ) if ( origin[ 1 ] < self.y0 )
dy = origin[1] - self.y0; dy = origin[ 1 ] - self.y0;
else if ( origin[1] > self.y1 ) else if ( origin[ 1 ] > self.y1 )
dy = origin[1] - self.y1; dy = origin[ 1 ] - self.y1;
if ( origin[2] < self.z0 ) if ( origin[ 2 ] < self.z0 )
dz = origin[2] - self.z0; dz = origin[ 2 ] - self.z0;
else if ( origin[2] > self.z1 ) else if ( origin[ 2 ] > self.z1 )
dz = origin[2] - self.z1; dz = origin[ 2 ] - self.z1;
return dx * dx + dy * dy + dz * dz; return dx * dx + dy * dy + dz * dz;
} }
@ -1988,7 +1988,7 @@ RectDistanceSquared( origin )
*/ */
HeapSortCoordX( item, item2 ) HeapSortCoordX( item, item2 )
{ {
return item.origin[0] > item2.origin[0]; return item.origin[ 0 ] > item2.origin[ 0 ];
} }
/* /*
@ -1996,7 +1996,7 @@ HeapSortCoordX( item, item2 )
*/ */
HeapSortCoordY( item, item2 ) HeapSortCoordY( item, item2 )
{ {
return item.origin[1] > item2.origin[1]; return item.origin[ 1 ] > item2.origin[ 1 ];
} }
/* /*
@ -2004,7 +2004,7 @@ HeapSortCoordY( item, item2 )
*/ */
HeapSortCoordZ( item, item2 ) HeapSortCoordZ( item, item2 )
{ {
return item.origin[2] > item2.origin[2]; return item.origin[ 2 ] > item2.origin[ 2 ];
} }
/* /*
@ -2028,7 +2028,7 @@ ReverseHeap( item, item2 )
*/ */
HeapTraceFraction( item, item2 ) HeapTraceFraction( item, item2 )
{ {
return item["fraction"] > item2["fraction"]; return item[ "fraction" ] > item2[ "fraction" ];
} }
/* /*
@ -2049,7 +2049,7 @@ NewHeap( compare )
HeapInsert( item ) HeapInsert( item )
{ {
insert = self.data.size; insert = self.data.size;
self.data[insert] = item; self.data[ insert ] = item;
current = insert + 1; current = insert + 1;
@ -2058,11 +2058,11 @@ HeapInsert( item )
last = current; last = current;
current = int( current / 2 ); current = int( current / 2 );
if ( ![[self.compare]]( item, self.data[current - 1] ) ) if ( ![[ self.compare ]]( item, self.data[ current - 1 ] ) )
break; break;
self.data[last - 1] = self.data[current - 1]; self.data[ last - 1 ] = self.data[ current - 1 ];
self.data[current - 1] = item; self.data[ current - 1 ] = item;
} }
} }
@ -2080,7 +2080,7 @@ _HeapNextChild( node, hsize )
if ( right > hsize ) if ( right > hsize )
return left; return left;
if ( [[self.compare]]( self.data[left - 1], self.data[right - 1] ) ) if ( [[ self.compare ]]( self.data[ left - 1 ], self.data[ right - 1 ] ) )
return left; return left;
else else
return right; return right;
@ -2096,9 +2096,9 @@ HeapRemove()
if ( !remove ) if ( !remove )
return remove; return remove;
move = self.data[remove - 1]; move = self.data[ remove - 1 ];
self.data[0] = move; self.data[ 0 ] = move;
self.data[remove - 1] = undefined; self.data[ remove - 1 ] = undefined;
remove--; remove--;
if ( !remove ) if ( !remove )
@ -2109,11 +2109,11 @@ HeapRemove()
while ( next != -1 ) while ( next != -1 )
{ {
if ( [[self.compare]]( move, self.data[next - 1] ) ) if ( [[ self.compare ]]( move, self.data[ next - 1 ] ) )
break; break;
self.data[last - 1] = self.data[next - 1]; self.data[ last - 1 ] = self.data[ next - 1 ];
self.data[next - 1] = move; self.data[ next - 1 ] = move;
last = next; last = next;
next = self _HeapNextChild( next, remove ); next = self _HeapNextChild( next, remove );
@ -2138,13 +2138,13 @@ RemoveWaypointUsage( wp, team )
if ( !isdefined( level.waypointusage ) ) if ( !isdefined( level.waypointusage ) )
return; return;
if ( !isdefined( level.waypointusage[team][wp + ""] ) ) if ( !isdefined( level.waypointusage[ team ][ wp + "" ] ) )
return; return;
level.waypointusage[team][wp + ""]--; level.waypointusage[ team ][ wp + "" ]--;
if ( level.waypointusage[team][wp + ""] <= 0 ) if ( level.waypointusage[ team ][ wp + "" ] <= 0 )
level.waypointusage[team][wp + ""] = undefined; level.waypointusage[ team ][ wp + "" ] = undefined;
} }
/* /*
@ -2157,10 +2157,10 @@ GetNearestWaypointWithSight( pos )
for ( i = 0; i < level.waypointcount; i++ ) for ( i = 0; i < level.waypointcount; i++ )
{ {
if ( !bullettracepassed( pos + ( 0, 0, 15 ), level.waypoints[i].origin + ( 0, 0, 15 ), false, undefined ) ) if ( !bullettracepassed( pos + ( 0, 0, 15 ), level.waypoints[ i ].origin + ( 0, 0, 15 ), false, undefined ) )
continue; continue;
curdis = distancesquared( level.waypoints[i].origin, pos ); curdis = distancesquared( level.waypoints[ i ].origin, pos );
if ( curdis > dist ) if ( curdis > dist )
continue; continue;
@ -2182,7 +2182,7 @@ getNearestWaypoint( pos )
for ( i = 0; i < level.waypointcount; i++ ) for ( i = 0; i < level.waypointcount; i++ )
{ {
curdis = distancesquared( level.waypoints[i].origin, pos ); curdis = distancesquared( level.waypoints[ i ].origin, pos );
if ( curdis > dist ) if ( curdis > dist )
continue; continue;
@ -2213,7 +2213,7 @@ AStarSearch( start, goal, team, greedy_path )
_startwp = undefined; _startwp = undefined;
if ( !bullettracepassed( start + ( 0, 0, 15 ), level.waypoints[startWp].origin + ( 0, 0, 15 ), false, undefined ) ) if ( !bullettracepassed( start + ( 0, 0, 15 ), level.waypoints[ startWp ].origin + ( 0, 0, 15 ), false, undefined ) )
_startwp = GetNearestWaypointWithSight( start ); _startwp = GetNearestWaypointWithSight( start );
if ( isdefined( _startwp ) ) if ( isdefined( _startwp ) )
@ -2227,7 +2227,7 @@ AStarSearch( start, goal, team, greedy_path )
_goalWp = undefined; _goalWp = undefined;
if ( !bullettracepassed( goal + ( 0, 0, 15 ), level.waypoints[goalWp].origin + ( 0, 0, 15 ), false, undefined ) ) if ( !bullettracepassed( goal + ( 0, 0, 15 ), level.waypoints[ goalWp ].origin + ( 0, 0, 15 ), false, undefined ) )
_goalWp = GetNearestWaypointWithSight( goal ); _goalWp = GetNearestWaypointWithSight( goal );
if ( isdefined( _goalWp ) ) if ( isdefined( _goalWp ) )
@ -2236,23 +2236,23 @@ AStarSearch( start, goal, team, greedy_path )
node = spawnstruct(); node = spawnstruct();
node.g = 0; //path dist so far node.g = 0; //path dist so far
node.h = distancesquared( level.waypoints[startWp].origin, level.waypoints[goalWp].origin ); //herustic, distance to goal for path finding node.h = distancesquared( level.waypoints[ startWp ].origin, level.waypoints[ goalWp ].origin ); //herustic, distance to goal for path finding
node.f = node.h + node.g; // combine path dist and heru, use reverse heap to sort the priority queue by this attru node.f = node.h + node.g; // combine path dist and heru, use reverse heap to sort the priority queue by this attru
node.index = startWp; node.index = startWp;
node.parent = undefined; //we are start, so we have no parent node.parent = undefined; //we are start, so we have no parent
//push node onto queue //push node onto queue
openset[node.index + ""] = node; openset[ node.index + "" ] = node;
open HeapInsert( node ); open HeapInsert( node );
//while the queue is not empty //while the queue is not empty
while ( open.data.size ) while ( open.data.size )
{ {
//pop bestnode from queue //pop bestnode from queue
bestNode = open.data[0]; bestNode = open.data[ 0 ];
open HeapRemove(); open HeapRemove();
openset[bestNode.index + ""] = undefined; openset[ bestNode.index + "" ] = undefined;
wp = level.waypoints[bestNode.index]; wp = level.waypoints[ bestNode.index ];
//check if we made it to the goal //check if we made it to the goal
if ( bestNode.index == goalWp ) if ( bestNode.index == goalWp )
@ -2263,14 +2263,14 @@ AStarSearch( start, goal, team, greedy_path )
{ {
if ( isdefined( team ) && isdefined( level.waypointusage ) ) if ( isdefined( team ) && isdefined( level.waypointusage ) )
{ {
if ( !isdefined( level.waypointusage[team][bestNode.index + ""] ) ) if ( !isdefined( level.waypointusage[ team ][ bestNode.index + "" ] ) )
level.waypointusage[team][bestNode.index + ""] = 0; level.waypointusage[ team ][ bestNode.index + "" ] = 0;
level.waypointusage[team][bestNode.index + ""]++; level.waypointusage[ team ][ bestNode.index + "" ]++;
} }
//construct path //construct path
path[path.size] = bestNode.index; path[ path.size ] = bestNode.index;
bestNode = bestNode.parent; bestNode = bestNode.parent;
} }
@ -2281,8 +2281,8 @@ AStarSearch( start, goal, team, greedy_path )
//for each child of bestnode //for each child of bestnode
for ( i = wp.children.size - 1; i >= 0; i-- ) for ( i = wp.children.size - 1; i >= 0; i-- )
{ {
child = wp.children[i]; child = wp.children[ i ];
childWp = level.waypoints[child]; childWp = level.waypoints[ child ];
penalty = 1; penalty = 1;
@ -2290,8 +2290,8 @@ AStarSearch( start, goal, team, greedy_path )
{ {
temppen = 1; temppen = 1;
if ( isdefined( level.waypointusage[team][child + ""] ) ) if ( isdefined( level.waypointusage[ team ][ child + "" ] ) )
temppen = level.waypointusage[team][child + ""]; //consider how many bots are taking this path temppen = level.waypointusage[ team ][ child + "" ]; //consider how many bots are taking this path
if ( temppen > 1 ) if ( temppen > 1 )
penalty = temppen; penalty = temppen;
@ -2305,45 +2305,45 @@ AStarSearch( start, goal, team, greedy_path )
newg = bestNode.g + distancesquared( wp.origin, childWp.origin ) * penalty; //bots on same team's path are more expensive newg = bestNode.g + distancesquared( wp.origin, childWp.origin ) * penalty; //bots on same team's path are more expensive
//check if this child is in open or close with a g value less than newg //check if this child is in open or close with a g value less than newg
inopen = isdefined( openset[child + ""] ); inopen = isdefined( openset[ child + "" ] );
if ( inopen && openset[child + ""].g <= newg ) if ( inopen && openset[ child + "" ].g <= newg )
continue; continue;
inclosed = isdefined( closed[child + ""] ); inclosed = isdefined( closed[ child + "" ] );
if ( inclosed && closed[child + ""].g <= newg ) if ( inclosed && closed[ child + "" ].g <= newg )
continue; continue;
node = undefined; node = undefined;
if ( inopen ) if ( inopen )
node = openset[child + ""]; node = openset[ child + "" ];
else if ( inclosed ) else if ( inclosed )
node = closed[child + ""]; node = closed[ child + "" ];
else else
node = spawnstruct(); node = spawnstruct();
node.parent = bestNode; node.parent = bestNode;
node.g = newg; node.g = newg;
node.h = distancesquared( childWp.origin, level.waypoints[goalWp].origin ); node.h = distancesquared( childWp.origin, level.waypoints[ goalWp ].origin );
node.f = node.g + node.h; node.f = node.g + node.h;
node.index = child; node.index = child;
//check if in closed, remove it //check if in closed, remove it
if ( inclosed ) if ( inclosed )
closed[child + ""] = undefined; closed[ child + "" ] = undefined;
//check if not in open, add it //check if not in open, add it
if ( !inopen ) if ( !inopen )
{ {
open HeapInsert( node ); open HeapInsert( node );
openset[child + ""] = node; openset[ child + "" ] = node;
} }
} }
//done with children, push onto closed //done with children, push onto closed
closed[bestNode.index + ""] = bestNode; closed[ bestNode.index + "" ] = bestNode;
} }
return []; return [];
@ -2360,7 +2360,7 @@ array_average( array )
for ( i = 0; i < array.size; i++ ) for ( i = 0; i < array.size; i++ )
{ {
total += array[i]; total += array[ i ];
} }
return ( total / array.size ); return ( total / array.size );
@ -2377,14 +2377,14 @@ array_std_deviation( array, mean )
for ( i = 0; i < array.size; i++ ) for ( i = 0; i < array.size; i++ )
{ {
tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); tmp[ i ] = ( array[ i ] - mean ) * ( array[ i ] - mean );
} }
total = 0; total = 0;
for ( i = 0; i < tmp.size; i++ ) for ( i = 0; i < tmp.size; i++ )
{ {
total = total + tmp[i]; total = total + tmp[ i ];
} }
return sqrt( total / array.size ); return sqrt( total / array.size );

View File

@ -1,10 +1,10 @@
init() init()
{ {
level.bot_builtins["printconsole"] = ::do_printconsole; level.bot_builtins[ "printconsole" ] = ::do_printconsole;
level.bot_builtins["botaction"] = ::do_botaction; level.bot_builtins[ "botaction" ] = ::do_botaction;
level.bot_builtins["botstop"] = ::do_botstop; level.bot_builtins[ "botstop" ] = ::do_botstop;
level.bot_builtins["botmovement"] = ::do_botmovement; level.bot_builtins[ "botmovement" ] = ::do_botmovement;
level.bot_builtins["isbot"] = ::do_isbot; level.bot_builtins[ "isbot" ] = ::do_isbot;
} }
do_printconsole( s ) do_printconsole( s )