iw6-scripts/maps/mp/bots/_bots_ks.gsc
2024-02-13 13:20:49 +01:00

679 lines
21 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
bot_killstreak_setup()
{
if ( !isdefined( level.killstreak_botfunc ) )
{
bot_register_killstreak_func( "ball_drone_backup", ::bot_killstreak_simple_use, ::bot_can_use_ball_drone );
bot_register_killstreak_func( "ball_drone_radar", ::bot_killstreak_simple_use, ::bot_can_use_ball_drone );
bot_register_killstreak_func( "guard_dog", ::bot_killstreak_simple_use );
bot_register_killstreak_func( "recon_agent", ::bot_killstreak_simple_use );
bot_register_killstreak_func( "agent", ::bot_killstreak_simple_use );
bot_register_killstreak_func( "nuke", ::bot_killstreak_simple_use );
bot_register_killstreak_func( "jammer", ::bot_killstreak_simple_use, ::bot_can_use_emp );
bot_register_killstreak_func( "air_superiority", ::bot_killstreak_simple_use, ::bot_can_use_air_superiority );
bot_register_killstreak_func( "helicopter", ::bot_killstreak_simple_use, ::aerial_vehicle_allowed );
bot_register_killstreak_func( "specialist", ::bot_killstreak_simple_use );
bot_register_killstreak_func( "all_perks_bonus", ::bot_killstreak_simple_use );
bot_register_killstreak_func( "airdrop_juggernaut", ::bot_killstreak_drop_outside );
bot_register_killstreak_func( "airdrop_juggernaut_maniac", ::bot_killstreak_drop_outside );
bot_register_killstreak_func( "airdrop_juggernaut_recon", ::bot_killstreak_drop_outside );
bot_register_killstreak_func( "uav_3dping", ::bot_killstreak_drop_outside );
bot_register_killstreak_func( "deployable_vest", ::bot_killstreak_drop_anywhere );
bot_register_killstreak_func( "deployable_ammo", ::bot_killstreak_drop_anywhere );
bot_register_killstreak_func( "odin_assault", maps\mp\bots\_bots_ks_remote_vehicle::bot_killstreak_remote_control, ::aerial_vehicle_allowed, maps\mp\bots\_bots_ks_remote_vehicle::bot_control_odin_assault );
bot_register_killstreak_func( "odin_support", maps\mp\bots\_bots_ks_remote_vehicle::bot_killstreak_remote_control, ::aerial_vehicle_allowed, maps\mp\bots\_bots_ks_remote_vehicle::bot_control_odin_support );
bot_register_killstreak_func( "heli_pilot", maps\mp\bots\_bots_ks_remote_vehicle::bot_killstreak_remote_control, maps\mp\bots\_bots_ks_remote_vehicle::heli_pilot_allowed, maps\mp\bots\_bots_ks_remote_vehicle::bot_control_heli_pilot );
bot_register_killstreak_func( "heli_sniper", maps\mp\bots\_bots_ks_remote_vehicle::bot_killstreak_remote_control, maps\mp\bots\_bots_ks_remote_vehicle::heli_sniper_allowed, maps\mp\bots\_bots_ks_remote_vehicle::bot_control_heli_sniper );
bot_register_killstreak_func( "drone_hive", maps\mp\bots\_bots_ks_remote_vehicle::bot_killstreak_remote_control, undefined, maps\mp\bots\_bots_ks_remote_vehicle::bot_control_switchblade_cluster );
bot_register_killstreak_func( "vanguard", maps\mp\bots\_bots_ks_remote_vehicle::bot_killstreak_vanguard_start, maps\mp\bots\_bots_ks_remote_vehicle::vanguard_allowed, maps\mp\bots\_bots_ks_remote_vehicle::bot_control_vanguard );
bot_register_killstreak_func( "ims", maps\mp\bots\_bots_sentry::bot_killstreak_sentry, undefined, "trap" );
bot_register_killstreak_func( "sentry", maps\mp\bots\_bots_sentry::bot_killstreak_sentry, undefined, "turret" );
bot_register_killstreak_func( "uplink", maps\mp\bots\_bots_sentry::bot_killstreak_sentry, undefined, "hide_nonlethal" );
bot_register_killstreak_func( "uplink_support", maps\mp\bots\_bots_sentry::bot_killstreak_sentry, undefined, "hide_nonlethal" );
bot_register_killstreak_func( "aa_launcher", ::bot_killstreak_never_use, ::bot_can_use_aa_launcher );
bot_register_killstreak_func( "airdrop_assault", ::bot_killstreak_drop_outside );
if ( isdefined( level.mapcustombotkillstreakfunc ) )
[[ level.mapcustombotkillstreakfunc ]]();
}
thread maps\mp\bots\_bots_ks_remote_vehicle::remote_vehicle_setup();
}
bot_register_killstreak_func( var_0, var_1, var_2, var_3 )
{
if ( !isdefined( level.killstreak_botfunc ) )
level.killstreak_botfunc = [];
level.killstreak_botfunc[var_0] = var_1;
if ( !isdefined( level.killstreak_botcanuse ) )
level.killstreak_botcanuse = [];
level.killstreak_botcanuse[var_0] = var_2;
if ( !isdefined( level.killstreak_botparm ) )
level.killstreak_botparm = [];
level.killstreak_botparm[var_0] = var_3;
if ( !isdefined( level.bot_supported_killstreaks ) )
level.bot_supported_killstreaks = [];
level.bot_supported_killstreaks[level.bot_supported_killstreaks.size] = var_0;
}
bot_killstreak_valid_for_specific_streaktype( var_0, var_1, var_2 )
{
if ( maps\mp\_utility::bot_is_fireteam_mode() )
return 1;
if ( bot_killstreak_is_valid_internal( var_0, "bots", undefined, var_1 ) )
return 1;
else if ( var_2 )
{
}
return 0;
}
bot_killstreak_is_valid_internal( var_0, var_1, var_2, var_3 )
{
var_4 = undefined;
if ( var_0 == "specialist" )
return 1;
if ( !bot_killstreak_is_valid_single( var_0, var_1 ) )
return 0;
if ( isdefined( var_3 ) )
{
var_4 = getsubstr( var_3, 11 );
switch ( var_4 )
{
case "assault":
if ( !maps\mp\_utility::isassaultkillstreak( var_0 ) )
return 0;
break;
case "support":
if ( !maps\mp\_utility::issupportkillstreak( var_0 ) )
return 0;
break;
case "specialist":
if ( !maps\mp\_utility::isspecialistkillstreak( var_0 ) )
return 0;
break;
}
}
return 1;
}
bot_killstreak_is_valid_single( var_0, var_1 )
{
if ( var_1 == "humans" )
return isdefined( level.killstreakfuncs[var_0] ) && maps\mp\_utility::getkillstreakindex( var_0 ) != -1;
else if ( var_1 == "bots" )
return isdefined( level.killstreak_botfunc[var_0] );
}
bot_think_killstreak()
{
self notify( "bot_think_killstreak" );
self endon( "bot_think_killstreak" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
while ( !isdefined( level.killstreak_botfunc ) )
wait 0.05;
childthread bot_start_aa_launcher_tracking();
for (;;)
{
if ( maps\mp\bots\_bots_util::bot_allowed_to_use_killstreaks() )
{
var_0 = self.pers["killstreaks"];
if ( isdefined( var_0 ) )
{
var_1 = 0;
for ( var_2 = 0; var_2 < var_0.size && !var_1; var_2++ )
{
var_3 = var_0[var_2];
if ( isdefined( var_3.streakname ) && isdefined( self.bot_killstreak_wait ) && isdefined( self.bot_killstreak_wait[var_3.streakname] ) && gettime() < self.bot_killstreak_wait[var_3.streakname] )
continue;
if ( var_3.available )
{
var_4 = var_3.streakname;
if ( var_3.streakname == "all_perks_bonus" )
continue;
if ( maps\mp\_utility::isspecialistkillstreak( var_3.streakname ) )
{
if ( !var_3.earned )
var_4 = "specialist";
else
continue;
}
var_3.weapon = maps\mp\_utility::getkillstreakweapon( var_3.streakname );
var_5 = level.killstreak_botcanuse[var_4];
if ( isdefined( var_5 ) && !self [[ var_5 ]]() )
continue;
if ( !maps\mp\_utility::validateusestreak( var_3.streakname, 1 ) )
continue;
var_6 = level.killstreak_botfunc[var_4];
if ( isdefined( var_6 ) )
{
var_7 = self [[ var_6 ]]( var_3, var_0, var_5, level.killstreak_botparm[var_3.streakname] );
if ( !isdefined( var_7 ) || var_7 == 0 )
{
if ( !isdefined( self.bot_killstreak_wait ) )
self.bot_killstreak_wait = [];
self.bot_killstreak_wait[var_3.streakname] = gettime() + 5000;
}
}
else
{
var_3.available = 0;
maps\mp\killstreaks\_killstreaks::updatekillstreaks( 0 );
}
var_1 = 1;
}
}
}
}
wait( randomfloatrange( 1.0, 2.0 ) );
}
}
bot_can_use_aa_launcher()
{
return 0;
}
bot_start_aa_launcher_tracking()
{
var_0 = maps\mp\killstreaks\_aalauncher::getaalaunchername();
for (;;)
{
self waittill( "aa_launcher_fire" );
var_1 = self getammocount( var_0 );
if ( var_1 == 0 )
{
self switchtoweapon( var_0 );
var_2 = common_scripts\utility::waittill_any_return( "LGM_player_allMissilesDestroyed", "enemy" );
wait 0.5;
self switchtoweapon( "none" );
}
}
}
bot_killstreak_never_use()
{
}
bot_can_use_air_superiority()
{
if ( !aerial_vehicle_allowed() )
return 0;
var_0 = maps\mp\killstreaks\_air_superiority::findalltargets( self, self.team );
var_1 = gettime();
foreach ( var_3 in var_0 )
{
if ( var_1 - var_3.birthtime > 5000 )
return 1;
}
return 0;
}
aerial_vehicle_allowed()
{
if ( maps\mp\_utility::isairdenied() )
return 0;
if ( vehicle_would_exceed_limit() )
return 0;
return 1;
}
vehicle_would_exceed_limit()
{
return maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + 1 >= maps\mp\_utility::maxvehiclesallowed();
}
bot_can_use_emp()
{
if ( isdefined( level.empplayer ) )
return 0;
var_0 = level.otherteam[self.team];
if ( isdefined( level.teamemped ) && isdefined( level.teamemped[var_0] ) && level.teamemped[var_0] )
return 0;
return 1;
}
bot_can_use_ball_drone()
{
if ( maps\mp\_utility::isusingremote() )
return 0;
if ( maps\mp\killstreaks\_ball_drone::exceededmaxballdrones() )
return 0;
if ( vehicle_would_exceed_limit() )
return 0;
if ( isdefined( self.balldrone ) )
return 0;
return 1;
}
bot_killstreak_simple_use( var_0, var_1, var_2, var_3 )
{
self endon( "commander_took_over" );
wait( randomintrange( 3, 5 ) );
if ( !maps\mp\bots\_bots_util::bot_allowed_to_use_killstreaks() )
return 1;
if ( isdefined( var_2 ) && !self [[ var_2 ]]() )
return 0;
bot_switch_to_killstreak_weapon( var_0, var_1, var_0.weapon );
return 1;
}
bot_killstreak_drop_anywhere( var_0, var_1, var_2, var_3 )
{
bot_killstreak_drop( var_0, var_1, var_2, var_3, "anywhere" );
}
bot_killstreak_drop_outside( var_0, var_1, var_2, var_3 )
{
bot_killstreak_drop( var_0, var_1, var_2, var_3, "outside" );
}
bot_killstreak_drop_hidden( var_0, var_1, var_2, var_3 )
{
bot_killstreak_drop( var_0, var_1, var_2, var_3, "hidden" );
}
bot_killstreak_drop( var_0, var_1, var_2, var_3, var_4 )
{
self endon( "commander_took_over" );
wait( randomintrange( 2, 4 ) );
if ( !isdefined( var_4 ) )
var_4 = "anywhere";
if ( !maps\mp\bots\_bots_util::bot_allowed_to_use_killstreaks() )
return 1;
if ( isdefined( var_2 ) && !self [[ var_2 ]]() )
return 0;
var_5 = self getweaponammoclip( var_0.weapon ) + self getweaponammostock( var_0.weapon );
if ( var_5 == 0 )
{
foreach ( var_7 in var_1 )
{
if ( isdefined( var_7.streakname ) && var_7.streakname == var_0.streakname )
var_7.available = 0;
}
maps\mp\killstreaks\_killstreaks::updatekillstreaks( 0 );
return 1;
}
var_9 = undefined;
if ( var_4 == "outside" )
{
var_10 = [];
var_11 = maps\mp\bots\_bots_util::bot_get_nodes_in_cone( 750, 0.6, 1 );
foreach ( var_13 in var_11 )
{
if ( nodeexposedtosky( var_13 ) )
var_10 = common_scripts\utility::array_add( var_10, var_13 );
}
if ( var_11.size > 5 && var_10.size > var_11.size * 0.6 )
{
var_15 = common_scripts\utility::get_array_of_closest( self.origin, var_10, undefined, undefined, undefined, 150 );
if ( var_15.size > 0 )
var_9 = common_scripts\utility::random( var_15 );
else
var_9 = common_scripts\utility::random( var_10 );
}
}
else if ( var_4 == "hidden" )
{
var_16 = getnodesinradius( self.origin, 256, 0, 40 );
var_17 = self getnearestnode();
if ( isdefined( var_17 ) )
{
var_18 = [];
foreach ( var_13 in var_16 )
{
if ( nodesvisible( var_17, var_13, 1 ) )
var_18 = common_scripts\utility::array_add( var_18, var_13 );
}
var_9 = self botnodepick( var_18, 1, "node_hide" );
}
}
if ( isdefined( var_9 ) || var_4 == "anywhere" )
{
self botsetflag( "disable_movement", 1 );
if ( isdefined( var_9 ) )
self botlookatpoint( var_9.origin, 2.45, "script_forced" );
bot_switch_to_killstreak_weapon( var_0, var_1, var_0.weapon );
wait 2.0;
self botpressbutton( "attack" );
wait 1.5;
self switchtoweapon( "none" );
self botsetflag( "disable_movement", 0 );
}
return 1;
}
bot_switch_to_killstreak_weapon( var_0, var_1, var_2 )
{
bot_notify_streak_used( var_0, var_1 );
wait 0.05;
self switchtoweapon( var_2 );
}
bot_notify_streak_used( var_0, var_1 )
{
if ( isdefined( var_0.isgimme ) && var_0.isgimme )
self notify( "streakUsed1" );
else
{
for ( var_2 = 0; var_2 < 3; var_2++ )
{
if ( isdefined( var_1[var_2].streakname ) )
{
if ( var_1[var_2].streakname == var_0.streakname )
break;
}
}
self notify( "streakUsed" + ( var_2 + 1 ) );
}
}
bot_killstreak_choose_loc_enemies( var_0, var_1, var_2, var_3 )
{
self endon( "commander_took_over" );
wait( randomintrange( 3, 5 ) );
if ( !maps\mp\bots\_bots_util::bot_allowed_to_use_killstreaks() )
return;
var_4 = getzonenearest( self.origin );
if ( !isdefined( var_4 ) )
return;
self botsetflag( "disable_movement", 1 );
bot_switch_to_killstreak_weapon( var_0, var_1, var_0.weapon );
wait 2;
var_5 = level.zonecount;
var_6 = -1;
var_7 = 0;
var_8 = [];
var_9 = randomfloat( 100 ) > 50;
for ( var_10 = 0; var_10 < var_5; var_10++ )
{
if ( var_9 )
var_11 = var_5 - 1 - var_10;
else
var_11 = var_10;
if ( var_11 != var_4 && botzonegetindoorpercent( var_11 ) < 0.25 )
{
var_12 = botzonegetcount( var_11, self.team, "enemy_predict" );
if ( var_12 > var_7 )
{
var_6 = var_11;
var_7 = var_12;
}
var_8 = common_scripts\utility::array_add( var_8, var_11 );
}
}
if ( var_6 >= 0 )
var_13 = getzoneorigin( var_6 );
else if ( var_8.size > 0 )
var_13 = getzoneorigin( common_scripts\utility::random( var_8 ) );
else
var_13 = getzoneorigin( randomint( level.zonecount ) );
var_14 = ( randomfloatrange( -500, 500 ), randomfloatrange( -500, 500 ), 0 );
self notify( "confirm_location", var_13 + var_14, randomintrange( 0, 360 ) );
wait 1.0;
self botsetflag( "disable_movement", 0 );
}
bot_think_watch_aerial_killstreak()
{
self notify( "bot_think_watch_aerial_killstreak" );
self endon( "bot_think_watch_aerial_killstreak" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
if ( !isdefined( level.last_global_badplace_time ) )
level.last_global_badplace_time = -10000;
level.killstreak_global_bp_exists_for["allies"] = [];
level.killstreak_global_bp_exists_for["axis"] = [];
var_0 = 0;
var_1 = randomfloatrange( 0.05, 4.0 );
for (;;)
{
wait( var_1 );
var_1 = randomfloatrange( 0.05, 4.0 );
if ( maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
continue;
if ( self botgetdifficultysetting( "strategyLevel" ) == 0 )
continue;
var_2 = 0;
if ( isdefined( level.chopper ) && level.chopper.team != self.team )
var_2 = 1;
if ( isdefined( level.lbsniper ) && level.lbsniper.team != self.team )
var_2 = 1;
if ( isdefined( level.heli_pilot[common_scripts\utility::get_enemy_team( self.team )] ) )
var_2 = 1;
if ( enemy_mortar_strike_exists( self.team ) )
{
var_2 = 1;
try_place_global_badplace( "mortar_strike", ::enemy_mortar_strike_exists );
}
if ( enemy_switchblade_exists( self.team ) )
{
var_2 = 1;
try_place_global_badplace( "switchblade", ::enemy_switchblade_exists );
}
if ( enemy_odin_assault_exists( self.team ) )
{
var_2 = 1;
try_place_global_badplace( "odin_assault", ::enemy_odin_assault_exists );
}
var_3 = get_enemy_vanguard();
if ( isdefined( var_3 ) )
{
var_4 = self geteye();
if ( common_scripts\utility::within_fov( var_4, self getplayerangles(), var_3.attackarrow.origin, self botgetfovdot() ) )
{
if ( sighttracepassed( var_4, var_3.attackarrow.origin, 0, self, var_3.attackarrow ) )
badplace_cylinder( "vanguard_" + var_3 getentitynumber(), var_1 + 0.5, var_3.attackarrow.origin, 200, 100, self.team );
}
}
if ( !var_0 && var_2 )
{
var_0 = 1;
self botsetflag( "hide_indoors", 1 );
}
if ( var_0 && !var_2 )
{
var_0 = 0;
self botsetflag( "hide_indoors", 0 );
}
}
}
try_place_global_badplace( var_0, var_1 )
{
if ( !isdefined( level.killstreak_global_bp_exists_for[self.team][var_0] ) )
level.killstreak_global_bp_exists_for[self.team][var_0] = 0;
if ( !level.killstreak_global_bp_exists_for[self.team][var_0] )
{
level.killstreak_global_bp_exists_for[self.team][var_0] = 1;
level thread monitor_enemy_dangerous_killstreak( self.team, var_0, var_1 );
}
}
monitor_enemy_dangerous_killstreak( var_0, var_1, var_2 )
{
var_3 = 0.5;
while ( [[ var_2 ]]( var_0 ) )
{
if ( gettime() > level.last_global_badplace_time + 4000 )
{
badplace_global( "", 5.0, var_0, "only_sky" );
level.last_global_badplace_time = gettime();
}
wait( var_3 );
}
level.killstreak_global_bp_exists_for[var_0][var_1] = 0;
}
enemy_mortar_strike_exists( var_0 )
{
if ( isdefined( level.air_raid_active ) && level.air_raid_active )
{
if ( var_0 != level.air_raid_team_called )
return 1;
}
return 0;
}
enemy_switchblade_exists( var_0 )
{
if ( isdefined( level.remotemissileinprogress ) )
{
foreach ( var_2 in level.rockets )
{
if ( isdefined( var_2.type ) && var_2.type == "remote" && var_2.team != var_0 )
return 1;
}
}
return 0;
}
enemy_odin_assault_exists( var_0 )
{
foreach ( var_2 in level.players )
{
if ( !level.teambased || isdefined( var_2.team ) && var_0 != var_2.team )
{
if ( isdefined( var_2.odin ) && var_2.odin.odintype == "odin_assault" && gettime() - var_2.odin.birthtime > 3000 )
return 1;
}
}
return 0;
}
get_enemy_vanguard()
{
foreach ( var_1 in level.players )
{
if ( !level.teambased || isdefined( var_1.team ) && self.team != var_1.team )
{
if ( isdefined( var_1.remoteuav ) && var_1.remoteuav.helitype == "remote_uav" )
return var_1.remoteuav;
}
}
return undefined;
}
iskillstreakblockedforbots( var_0 )
{
return isdefined( level.botblockedkillstreaks ) && isdefined( level.botblockedkillstreaks[var_0] ) && level.botblockedkillstreaks[var_0];
}
blockkillstreakforbots( var_0 )
{
level.botblockedkillstreaks[var_0] = 1;
}