1 #using scripts\codescripts\struct;
2 #using scripts\shared\array_shared;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\killstreaks_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\rank_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\weapons_shared;
10 #using scripts\shared\weapons\_weapons;
12 #using scripts\shared\bots\_bot;
13 #using scripts\shared\bots\_bot_combat;
14 #using scripts\shared\bots\bot_traversals;
15 #using scripts\shared\bots\bot_buttons;
16 #using scripts\mp\bots\_bot_combat;
17 #using scripts\mp\bots\_bot_dom;
18 #using scripts\mp\bots\_bot_koth;
19 #using scripts\mp\bots\_bot_loadout;
20 #using scripts\mp\bots\_bot_sd;
21 #using scripts\mp\bots\_bot_ctf;
22 #using scripts\mp\killstreaks\_killstreakrules;
23 #using scripts\mp\killstreaks\_killstreaks;
24 #using scripts\mp\killstreaks\_uav;
25 #using scripts\mp\killstreaks\_satellite;
26 #using scripts\mp\killstreaks\_emp;
27 #using scripts\mp\teams\_teams;
28 #using scripts\mp\_util;
30 #insert scripts\shared\shared.gsh;
31 #insert scripts\mp\bots\_bot.gsh;
33 #define MAX_LOCAL_PLAYERS 10
34 #define MAX_ONLINE_PLAYERS 18
35 #define MAX_ONLINE_PLAYERS_PER_TEAM 6
37 #define RESPAWN_DELAY 0.1
38 #define RESPAWN_INTERVAL 0.1
64 level.enemyEmpActive = &emp::EnemyEmpActive;
69 level endon(
"game_ended" );
88 return IsDedicated() && GetDvarInt(
"sv_botsoak", 0 );
93 level endon(
"game_ended" );
102 while ( !isdefined( host ) )
113 if ( !isdefined( host ) || host.team ==
"spectator" )
132 self endon(
"disconnect" );
133 level endon(
"game_ended" );
135 if (
IS_TRUE( level.disableClassSelection ) )
146 if ( !
IS_TRUE(
self.pers[
"bot_loadout"] ) )
155 self.pers[
"bot_loadout"] =
true;
164 self.bot.goalTag = undefined;
169 self endon(
"disconnect");
170 level endon(
"game_ended" );
171 self endon(
"spawned" );
172 self waittill (
"death_delay_finished" );
186 self endon(
"spawned" );
187 self endon(
"disconnect" );
188 level endon(
"game_ended" );
212 #define CRATE_GOAL_RADIUS 39
213 #define CRATE_USE_RADIUS 62 // Wild guess on usable radius
217 crates = GetEntArray(
"care_package",
"script_noteworthy" );
219 maxRangeSq = maxRange * maxRange;
223 closestCrate = undefined;
224 closestCrateDistSq = undefined;
226 foreach( crate
in crates )
228 if ( !crate IsOnGround() )
233 crateDistSq = Distance2DSquared(
self.origin, crate.origin );
235 if ( crateDistSq > maxRangeSq )
240 inUse = isdefined( crate.useEnt ) &&
IS_TRUE( crate.useEnt.inUse );
242 if ( crateDistSq <= useRadiusSq )
244 if ( inUse && !
self useButtonPressed() )
253 if ( !
self has_minimap() && !
self BotSightTracePassed( crate ) )
258 if ( !isdefined( closestCrate ) || crateDistSq < closestCrateDistSq )
260 closestCrate = crate;
261 closestCrateDistSq = crateDistSq;
265 if ( isdefined( closestCrate ) )
267 randomAngle = ( 0, RandomInt( 360 ), 0 );
268 randomVec = AnglesToForward( randomAngle );
272 if (
self BotSetGoal( point ) )
284 self endon(
"death" );
285 self endon(
"bot_goal_reached" );
286 level endon(
"game_ended" );
290 wait level.botSettings.thinkInterval;
293 self BotSetGoal(
self.origin );
301 level endon(
"game_ended" );
303 if ( level.teambased )
305 maxAllies = GetDvarInt(
"bot_maxAllies", 0 );
306 maxAxis = GetDvarInt(
"bot_maxAxis", 0 );
312 maxFree = GetDvarInt(
"bot_maxFree", 0 );
320 level endon(
"game_ended" );
322 if ( !maxAllies && !maxAxis )
334 allies = GetPlayers(
"allies" );
335 axis = GetPlayers(
"axis" );
337 if ( allies.size > maxAllies &&
343 if ( axis.size > maxAxis &&
349 if ( allies.size < maxAllies || axis.size < maxAxis )
358 allies = GetPlayers(
"allies" );
359 axis = GetPlayers(
"axis" );
361 while ( ( allies.size < maxAllies || axis.size < maxAxis ) &&
366 allies = GetPlayers(
"allies" );
367 axis = GetPlayers(
"axis" );
375 if ( allies.size < maxAllies &&
376 ( allies.size <= axis.size || axis.size >= maxAxis ) )
380 else if ( axis.size < maxAxis )
385 return isdefined( bot );
390 level endon(
"game_ended" );
398 players = GetPlayers( );
399 while ( players.size < maxFree )
403 players = GetPlayers( );
411 players = GetPlayers( );
413 if ( players.size < maxFree )
417 else if ( players.size > maxFree )
436 foreach( bot
in bots )
439 if ( bot.sessionstate ==
"spectator" )
446 bestBots[bestBots.size] = bot;
452 remove_bot( bestBots[RandomInt( bestBots.size )] );
467 if (
IS_TRUE( level.disableClassSelection ) )
474 if ( !isdefined( currClass ) || RandomInt( 100 ) <
VAL( level.botSettings.changeClassWeight, 0 ) )
476 classIndex = RandomInt(
self.loadoutClasses.size );
477 className =
self.loadoutClasses[classIndex].name;
480 if ( !isdefined(className) || className === currClass )
495 if ( !level.loadoutKillstreaksEnabled ||
501 weapons =
self GetWeaponsList();
502 inventoryWeapon =
self GetInventoryWeapon();
504 foreach( weapon
in weapons )
508 if ( !isdefined( killstreak ) )
513 if ( weapon != inventoryWeapon && !
self GetWeaponAmmoClip( weapon ) )
525 if ( !isdefined( useWeapon ) )
532 switch( killstreak_ref )
534 case "killstreak_uav":
535 case "killstreak_counteruav":
536 case "killstreak_satellite":
537 case "killstreak_helicopter_player_gunner":
538 case "killstreak_raps":
539 case "killstreak_sentinel":
540 self SwitchToWeapon( useWeapon );
548 if ( level.teambased )
558 if (
self IsEmpJammed() )
563 if (
IS_TRUE( level.hardcoreMode ) )
573 if ( !isdefined( on_radar ) )
578 enemies =
self GetEnemies();
582 for ( i = 0; i < enemies.size; i++ )
584 if ( !isdefined( enemies[i].lastFireTime ) )
586 ArrayRemoveIndex( enemies, i );
589 else if ( GetTime() - enemies[i].lastFireTime > 2000 )
591 ArrayRemoveIndex( enemies, i );
602 players = GetPlayers();
608 for ( i = 0; i < players.size; i++ )
610 if ( players[i] ==
self )
613 if ( isdefined( players[i].pers[
"rank" ] ) )
617 bot_ranks[ bot_ranks.size ] = players[i].pers[
"rank" ];
621 human_ranks[ human_ranks.size ] = players[i].pers[
"rank" ];
626 if( !human_ranks.size )
627 human_ranks[ human_ranks.size ] = 10;
631 while ( bot_ranks.size + human_ranks.size < 5 )
634 r = human_avg + RandomIntRange( -5, 5 );
636 human_ranks[ human_ranks.size ] = rank;
639 ranks = ArrayCombine( human_ranks, bot_ranks,
true,
false );
646 while ( !isdefined(
self.pers[
"codpoints"] ) )
651 self.pers[
"rank" ] = rank;
654 self setRank( rank );
660 switch( level.gameType )
682 switch ( GetDvarInt(
"bot_difficulty", 1 ) )
685 bundleName =
"bot_mp_easy";
689 bundleName =
"bot_mp_normal";
692 bundleName =
"bot_mp_hard";
696 bundleName =
"bot_mp_veteran";