This commit is contained in:
2024-02-13 13:20:49 +01:00
commit 872504afef
1761 changed files with 871764 additions and 0 deletions

2881
maps/mp/bots/_bots.gsc Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,622 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
bot_fireteam_setup_callbacks()
{
}
bot_fireteam_init()
{
level.bots_fireteam_num_classes_loaded = [];
level thread bot_fireteam_connect_monitor();
}
bot_fireteam_connect_monitor()
{
self notify( "bot_connect_monitor" );
self endon( "bot_connect_monitor" );
level.bots_fireteam_humans = [];
for (;;)
{
foreach ( var_1 in level.players )
{
if ( !isbot( var_1 ) && !isdefined( var_1.processed_for_fireteam ) )
{
if ( isdefined( var_1.team ) && ( var_1.team == "allies" || var_1.team == "axis" ) )
{
var_1.processed_for_fireteam = 1;
level.bots_fireteam_humans[var_1.team] = var_1;
level.bots_fireteam_num_classes_loaded[var_1.team] = 0;
var_2 = maps\mp\bots\_bots_util::bot_get_team_limit();
if ( level.bots_fireteam_humans.size == 2 )
maps\mp\bots\_bots::drop_bots( var_2 - 1, var_1.team );
maps\mp\bots\_bots::spawn_bots( var_2 - 1, var_1.team, ::bot_fireteam_spawn_callback );
if ( level.bots_fireteam_humans.size == 1 )
{
var_3 = 0;
foreach ( var_5 in level.players )
{
if ( isdefined( var_5 ) && !isbot( var_5 ) )
var_3++;
}
if ( var_3 == 1 )
maps\mp\bots\_bots::spawn_bots( var_2 - 1, common_scripts\utility::get_enemy_team( var_1.team ) );
}
}
}
}
wait 0.25;
}
}
bot_fireteam_spawn_callback()
{
self.override_class_function = ::bot_fireteam_setup_callback_class;
self.fireteam_commander = level.bots_fireteam_humans[self.bot_team];
thread bot_fireteam_monitor_killstreak_earned();
}
bot_fireteam_setup_callback_class()
{
self.classcallback = ::bot_fireteam_loadout_class_callback;
return "callback";
}
bot_fireteam_loadout_class_callback()
{
if ( isdefined( self.botlastloadout ) )
return self.botlastloadout;
self.class_num = level.bots_fireteam_num_classes_loaded[self.team];
level.bots_fireteam_num_classes_loaded[self.team] = level.bots_fireteam_num_classes_loaded[self.team] + 1;
if ( self.class_num == 5 )
self.class_num = 0;
var_0["loadoutPrimary"] = self.fireteam_commander bot_fireteam_cac_getweapon( self.class_num, 0 );
var_0["loadoutPrimaryAttachment"] = self.fireteam_commander bot_fireteam_cac_getweaponattachment( self.class_num, 0 );
var_0["loadoutPrimaryAttachment2"] = self.fireteam_commander bot_fireteam_cac_getweaponattachmenttwo( self.class_num, 0 );
var_0["loadoutPrimaryBuff"] = self.fireteam_commander bot_fireteam_cac_getweaponbuff( self.class_num, 0 );
var_0["loadoutPrimaryCamo"] = self.fireteam_commander bot_fireteam_cac_getweaponcamo( self.class_num, 0 );
var_0["loadoutPrimaryReticle"] = self.fireteam_commander bot_fireteam_cac_getweaponreticle( self.class_num, 0 );
var_0["loadoutSecondary"] = self.fireteam_commander bot_fireteam_cac_getweapon( self.class_num, 1 );
var_0["loadoutSecondaryAttachment"] = self.fireteam_commander bot_fireteam_cac_getweaponattachment( self.class_num, 1 );
var_0["loadoutSecondaryAttachment2"] = self.fireteam_commander bot_fireteam_cac_getweaponattachmenttwo( self.class_num, 1 );
var_0["loadoutSecondaryBuff"] = self.fireteam_commander bot_fireteam_cac_getweaponbuff( self.class_num, 1 );
var_0["loadoutSecondaryCamo"] = self.fireteam_commander bot_fireteam_cac_getweaponcamo( self.class_num, 1 );
var_0["loadoutSecondaryReticle"] = self.fireteam_commander bot_fireteam_cac_getweaponreticle( self.class_num, 1 );
var_0["loadoutEquipment"] = self.fireteam_commander bot_fireteam_cac_getprimarygrenade( self.class_num );
var_0["loadoutOffhand"] = self.fireteam_commander bot_fireteam_cac_getsecondarygrenade( self.class_num );
var_0["loadoutPerk1"] = self.fireteam_commander bot_fireteam_cac_getperk( self.class_num, 2 );
var_0["loadoutPerk2"] = self.fireteam_commander bot_fireteam_cac_getperk( self.class_num, 3 );
var_0["loadoutPerk3"] = self.fireteam_commander bot_fireteam_cac_getperk( self.class_num, 4 );
var_0["loadoutStreakType"] = self.fireteam_commander bot_fireteam_cac_getperk( self.class_num, 5 );
if ( var_0["loadoutStreakType"] != "specialty_null" )
{
var_1 = getsubstr( var_0["loadoutStreakType"], 11 ) + "Streaks";
var_0["loadoutStreak1"] = self.fireteam_commander bot_fireteam_cac_getstreak( self.class_num, var_1, 0 );
if ( var_0["loadoutStreak1"] == "none" )
var_0["loadoutStreak1"] = undefined;
var_0["loadoutStreak2"] = self.fireteam_commander bot_fireteam_cac_getstreak( self.class_num, var_1, 1 );
if ( var_0["loadoutStreak2"] == "none" )
var_0["loadoutStreak2"] = undefined;
var_0["loadoutStreak3"] = self.fireteam_commander bot_fireteam_cac_getstreak( self.class_num, var_1, 2 );
if ( var_0["loadoutStreak3"] == "none" )
var_0["loadoutStreak3"] = undefined;
}
self.botlastloadout = var_0;
return var_0;
}
bot_fireteam_cac_getweapon( var_0, var_1 )
{
return self getcacplayerdata( var_0, "weaponSetups", var_1, "weapon" );
}
bot_fireteam_cac_getweaponattachment( var_0, var_1 )
{
return self getcacplayerdata( var_0, "weaponSetups", var_1, "attachment", 0 );
}
bot_fireteam_cac_getweaponattachmenttwo( var_0, var_1 )
{
return self getcacplayerdata( var_0, "weaponSetups", var_1, "attachment", 1 );
}
bot_fireteam_cac_getweaponbuff( var_0, var_1 )
{
return self getcacplayerdata( var_0, "weaponSetups", var_1, "buff" );
}
bot_fireteam_cac_getweaponcamo( var_0, var_1 )
{
return self getcacplayerdata( var_0, "weaponSetups", var_1, "camo" );
}
bot_fireteam_cac_getweaponreticle( var_0, var_1 )
{
return self getcacplayerdata( var_0, "weaponSetups", var_1, "reticle" );
}
bot_fireteam_cac_getprimarygrenade( var_0 )
{
return self getcacplayerdata( var_0, "perks", 0 );
}
bot_fireteam_cac_getsecondarygrenade( var_0 )
{
return self getcacplayerdata( var_0, "perks", 1 );
}
bot_fireteam_cac_getperk( var_0, var_1 )
{
return self getcacplayerdata( var_0, "perks", var_1 );
}
bot_fireteam_cac_getstreak( var_0, var_1, var_2 )
{
return self getcacplayerdata( var_0, var_1, var_2 );
}
bot_fireteam_buddy_think()
{
var_0 = 250;
var_1 = var_0 * var_0;
if ( !maps\mp\bots\_bots_util::bot_is_guarding_player( self.owner ) )
maps\mp\bots\_bots_strategy::bot_guard_player( self.owner, var_0 );
if ( distancesquared( self.origin, self.owner.origin ) > var_1 )
self botsetflag( "force_sprint", 1 );
else if ( self.owner issprinting() )
self botsetflag( "force_sprint", 1 );
else
self botsetflag( "force_sprint", 0 );
}
bot_fireteam_buddy_search()
{
self endon( "buddy_cancel" );
self endon( "disconnect" );
self notify( "buddy_search_start" );
self endon( "buddy_search_start" );
for (;;)
{
if ( isalive( self ) && !isdefined( self.bot_fireteam_follower ) )
{
if ( isdefined( self.owner ) )
{
if ( self.sessionstate == "playing" )
{
if ( !self.owner.connected )
{
self.owner.bot_fireteam_follower = undefined;
self.owner = undefined;
}
else if ( isdefined( level.fireteam_commander[self.team] ) )
{
if ( isdefined( level.fireteam_commander[self.team].commanding_bot ) && level.fireteam_commander[self.team].commanding_bot == self )
{
self.owner.bot_fireteam_follower = undefined;
self.owner.owner = level.fireteam_commander[self.team];
self.owner.personality_update_function = ::bot_fireteam_buddy_think;
self.owner = undefined;
}
else if ( isdefined( level.fireteam_commander[self.team].commanding_bot ) && level.fireteam_commander[self.team].commanding_bot == self.owner )
{
self.owner.bot_fireteam_follower = undefined;
self.owner = level.fireteam_commander[self.team];
self.owner.bot_fireteam_follower = self;
}
else if ( self.owner == level.fireteam_commander[self.team] && !isdefined( self.owner.commanding_bot ) )
{
self.owner.bot_fireteam_follower = undefined;
if ( isdefined( self.owner.last_commanded_bot ) )
{
self.owner = self.owner.last_commanded_bot;
self.owner.bot_fireteam_follower = self;
}
else
self.owner = undefined;
}
}
}
else if ( isdefined( level.fireteam_commander[self.team] ) )
{
if ( isdefined( level.fireteam_commander[self.team].commanding_bot ) && level.fireteam_commander[self.team].commanding_bot == self )
{
self.owner.bot_fireteam_follower = undefined;
self.owner.owner = level.fireteam_commander[self.team];
self.owner.personality_update_function = ::bot_fireteam_buddy_think;
self.owner = undefined;
}
}
}
if ( self.sessionstate == "playing" )
{
if ( !isdefined( self.owner ) )
{
var_0 = [];
foreach ( var_2 in level.players )
{
if ( var_2 != self && var_2.team == self.team )
{
if ( isalive( var_2 ) && var_2.sessionstate == "playing" && !isdefined( var_2.bot_fireteam_follower ) && !isdefined( var_2.owner ) )
var_0[var_0.size] = var_2;
}
}
if ( var_0.size > 0 )
{
var_4 = common_scripts\utility::getclosest( self.origin, var_0 );
if ( isdefined( var_4 ) )
{
self.owner = var_4;
self.owner.bot_fireteam_follower = self;
}
}
}
}
if ( isdefined( self.owner ) )
self.personality_update_function = ::bot_fireteam_buddy_think;
else
maps\mp\bots\_bots_personality::bot_assign_personality_functions();
}
wait 0.5;
}
}
fireteam_tdm_set_hunt_leader( var_0 )
{
var_1 = [];
foreach ( var_3 in level.players )
{
if ( var_3.team == var_0 )
{
if ( var_3.connected && isalive( var_3 ) && var_3.sessionstate == "playing" )
{
if ( !isbot( var_3 ) )
{
level.fireteam_hunt_leader[var_0] = var_3;
return 1;
}
else
var_1[var_1.size] = var_3;
}
}
}
if ( !isdefined( level.fireteam_hunt_leader[var_0] ) )
{
if ( var_1.size > 0 )
{
if ( var_1.size == 1 )
level.fireteam_hunt_leader[var_0] = var_1[0];
else
level.fireteam_hunt_leader[var_0] = var_1[randomint( var_1.size )];
return 1;
}
}
return 0;
}
fireteam_tdm_hunt_end( var_0 )
{
level notify( "hunting_party_end_" + var_0 );
level.fireteam_hunt_leader[var_0] = undefined;
level.fireteam_hunt_target_zone[var_0] = undefined;
level.bot_random_path_function[var_0] = maps\mp\bots\_bots_personality::bot_random_path_default;
}
fireteam_tdm_hunt_most_dangerous_zone( var_0, var_1 )
{
var_2 = 0;
var_3 = undefined;
var_4 = -1;
if ( level.zonecount > 0 )
{
for ( var_5 = 0; var_5 < level.zonecount; var_5++ )
{
var_6 = botzonegetcount( var_5, var_1, "enemy_predict" );
if ( var_6 < var_2 )
continue;
var_7 = undefined;
if ( var_6 == var_2 )
{
var_7 = getzonepath( var_0, var_5 );
if ( !isdefined( var_7 ) )
continue;
if ( var_4 >= 0 && var_7.size > var_4 )
continue;
}
var_2 = var_6;
var_3 = var_5;
if ( isdefined( var_7 ) )
{
var_4 = var_7.size;
continue;
}
var_4 = -1;
}
}
return var_3;
}
fireteam_tdm_find_hunt_zone( var_0 )
{
level endon( "hunting_party_end_" + var_0 );
self endon( "disconnect" );
level endon( "game_ended" );
if ( level.zonecount <= 0 )
return;
level.bot_random_path_function[var_0] = ::bot_fireteam_hunt_zone_find_node;
for (;;)
{
var_1 = 3;
if ( !isdefined( level.fireteam_hunt_leader[var_0] ) || isbot( level.fireteam_hunt_leader[var_0] ) || isdefined( level.fireteam_hunt_leader[var_0].commanding_bot ) )
fireteam_tdm_set_hunt_leader( var_0 );
if ( isdefined( level.fireteam_hunt_leader[var_0] ) )
{
var_2 = getzonenearest( level.fireteam_hunt_leader[var_0].origin );
if ( !isdefined( var_2 ) )
{
wait( var_1 );
continue;
}
if ( !isbot( level.fireteam_hunt_leader[var_0] ) )
{
if ( isalive( level.fireteam_hunt_leader[var_0] ) && level.fireteam_hunt_leader[var_0].sessionstate == "playing" && ( !isdefined( level.fireteam_hunt_leader[var_0].deathtime ) || level.fireteam_hunt_leader[var_0].deathtime + 5000 < gettime() ) )
{
level.fireteam_hunt_target_zone[var_0] = var_2;
level.fireteam_hunt_next_zone_search_time[var_0] = gettime() + 1000;
var_1 = 0.5;
}
else
var_1 = 1;
}
else
{
var_3 = 0;
var_4 = 0;
var_5 = undefined;
if ( isdefined( level.fireteam_hunt_target_zone[var_0] ) )
var_5 = level.fireteam_hunt_target_zone[var_0];
else
{
var_3 = 1;
var_4 = 1;
var_5 = var_2;
}
var_6 = undefined;
if ( isdefined( var_5 ) )
{
var_6 = fireteam_tdm_hunt_most_dangerous_zone( var_2, var_0 );
if ( !var_3 )
{
if ( !isdefined( var_6 ) || var_6 != var_5 )
{
if ( var_5 == var_2 )
var_4 = 1;
else if ( gettime() > level.fireteam_hunt_next_zone_search_time[var_0] )
var_4 = 1;
}
}
if ( var_4 )
{
if ( !isdefined( var_6 ) )
{
var_7 = 0;
var_8 = -1;
for ( var_9 = 0; var_9 < level.zonecount; var_9++ )
{
var_10 = distance2d( getzoneorigin( var_9 ), level.fireteam_hunt_leader[var_0].origin );
if ( var_10 > var_7 )
{
var_7 = var_10;
var_8 = var_9;
}
}
var_6 = var_8;
}
if ( isdefined( var_6 ) )
{
if ( !isdefined( level.fireteam_hunt_target_zone[var_0] ) || level.fireteam_hunt_target_zone[var_0] != var_6 )
{
foreach ( var_12 in level.players )
{
if ( isbot( var_12 ) && var_12.team == var_0 )
{
var_12 botclearscriptgoal();
var_12.fireteam_hunt_goalpos = undefined;
var_12 thread bot_fireteam_hunt_zone_find_node();
}
}
}
level.fireteam_hunt_target_zone[var_0] = var_6;
level.fireteam_hunt_next_zone_search_time[var_0] = gettime() + 12000;
}
}
}
}
}
wait( var_1 );
}
}
bot_debug_script_goal()
{
self notify( "bot_debug_script_goal" );
level endon( "hunting_party_end_" + self.team );
self endon( "bot_debug_script_goal" );
var_0 = 48;
for (;;)
{
if ( self bothasscriptgoal() )
{
var_1 = self botgetscriptgoal();
if ( !isdefined( self.fireteam_hunt_goalpos ) )
{
}
else if ( self.fireteam_hunt_goalpos != var_1 )
{
}
else
{
}
}
else if ( isdefined( self.fireteam_hunt_goalpos ) )
{
}
wait 0.05;
}
}
bot_fireteam_hunt_zone_find_node()
{
var_0 = 0;
var_1 = undefined;
if ( isdefined( level.fireteam_hunt_target_zone[self.team] ) )
{
var_2 = getzonenodes( level.fireteam_hunt_target_zone[self.team], 0 );
if ( var_2.size <= 18 )
{
var_2 = getzonenodes( level.fireteam_hunt_target_zone[self.team], 1 );
if ( var_2.size <= 18 )
{
var_2 = getzonenodes( level.fireteam_hunt_target_zone[self.team], 2 );
if ( var_2.size <= 18 )
var_2 = getzonenodes( level.fireteam_hunt_target_zone[self.team], 3 );
}
}
if ( var_2.size <= 0 )
return maps\mp\bots\_bots_personality::bot_random_path_default();
var_1 = self botnodepick( var_2, var_2.size, "node_hide" );
for ( var_3 = 0; !isdefined( var_1 ) || !self botnodeavailable( var_1 ); var_1 = var_2[randomint( var_2.size )] )
{
var_3++;
if ( var_3 >= 10 )
return maps\mp\bots\_bots_personality::bot_random_path_default();
}
var_4 = var_1.origin;
if ( isdefined( var_4 ) )
{
var_5 = "guard";
var_6 = getzonenearest( self.origin );
if ( isdefined( var_6 ) && var_6 == level.fireteam_hunt_target_zone[self.team] )
self botsetflag( "force_sprint", 0 );
else
self botsetflag( "force_sprint", 1 );
var_0 = self botsetscriptgoal( var_4, 128, var_5 );
self.fireteam_hunt_goalpos = var_4;
}
}
if ( !var_0 )
return maps\mp\bots\_bots_personality::bot_random_path_default();
return var_0;
}
bot_fireteam_monitor_killstreak_earned()
{
level endon( "game_ended" );
self endon( "disconnect" );
self notify( "bot_fireteam_monitor_killstreak_earned" );
self endon( "bot_fireteam_monitor_killstreak_earned" );
for (;;)
{
self waittill( "bot_killstreak_earned", var_0, var_1 );
if ( maps\mp\_utility::bot_is_fireteam_mode() )
{
if ( isdefined( self ) && isbot( self ) )
{
if ( isdefined( self.fireteam_commander ) )
{
var_2 = undefined;
if ( isdefined( self.fireteam_commander.commanding_bot ) )
var_2 = self.fireteam_commander.commanding_bot;
else
var_2 = self.fireteam_commander getspectatingplayer();
if ( !isdefined( var_2 ) || var_2 != self )
self.fireteam_commander thread maps\mp\gametypes\_hud_message::playercardsplashnotify( var_0, self, var_1 );
}
}
}
}
}

View File

@ -0,0 +1,917 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
if ( maps\mp\_utility::bot_is_fireteam_mode() )
{
level.tactic_notifies = [];
level.tactic_notifies[0] = "tactics_exit";
level.tactic_notifies[1] = "tactic_none";
if ( level.gametype == "dom" )
{
level.tactic_notifies[2] = "tactic_dom_holdA";
level.tactic_notifies[3] = "tactic_dom_holdB";
level.tactic_notifies[4] = "tactic_dom_holdC";
level.tactic_notifies[5] = "tactic_dom_holdAB";
level.tactic_notifies[6] = "tactic_dom_holdAC";
level.tactic_notifies[7] = "tactic_dom_holdBC";
level.tactic_notifies[8] = "tactic_dom_holdABC";
}
else if ( level.gametype == "war" )
{
level.tactic_notifies[2] = "tactic_war_hyg";
level.tactic_notifies[3] = "tactic_war_buddy";
level.tactic_notifies[4] = "tactic_war_hp";
level.tactic_notifies[5] = "tactic_war_pincer";
level.tactic_notifies[6] = "tactic_war_ctc";
level.tactic_notifies[7] = "tactic_war_rg";
}
else
return;
level.fireteam_commander = [];
level.fireteam_commander["axis"] = undefined;
level.fireteam_commander["allies"] = undefined;
level.fireteam_hunt_leader = [];
level.fireteam_hunt_leader["axis"] = undefined;
level.fireteam_hunt_leader["allies"] = undefined;
level.fireteam_hunt_target_zone = [];
level.fireteam_hunt_target_zone["axis"] = undefined;
level.fireteam_hunt_target_zone["allies"] = undefined;
level thread commander_wait_connect();
level thread commander_aggregate_score_on_game_end();
}
}
commander_aggregate_score_on_game_end()
{
level waittill( "game_ended" );
if ( isdefined( level.fireteam_commander["axis"] ) )
{
var_0 = 0;
foreach ( var_2 in level.players )
{
if ( isbot( var_2 ) && var_2.team == "axis" )
var_0 = var_0 + var_2.pers["score"];
}
level.fireteam_commander["axis"].pers["score"] = var_0;
level.fireteam_commander["axis"].score = var_0;
level.fireteam_commander["axis"] maps\mp\gametypes\_persistence::statadd( "score", var_0 );
level.fireteam_commander["axis"] maps\mp\gametypes\_persistence::statsetchild( "round", "score", var_0 );
}
if ( isdefined( level.fireteam_commander["allies"] ) )
{
var_0 = 0;
foreach ( var_2 in level.players )
{
if ( isbot( var_2 ) && var_2.team == "allies" )
var_0 = var_0 + var_2.pers["score"];
}
level.fireteam_commander["allies"].pers["score"] = var_0;
level.fireteam_commander["allies"].score = var_0;
level.fireteam_commander["allies"] maps\mp\gametypes\_persistence::statadd( "score", var_0 );
level.fireteam_commander["allies"] maps\mp\gametypes\_persistence::statsetchild( "round", "score", var_0 );
}
}
commander_create_dom_obj( var_0 )
{
if ( !isdefined( self.fireteam_dom_point_obj[var_0] ) )
{
self.fireteam_dom_point_obj[var_0] = maps\mp\gametypes\_gameobjects::getnextobjid();
var_1 = ( 0, 0, 0 );
foreach ( var_3 in level.domflags )
{
if ( var_3.label == "_" + var_0 )
{
var_1 = var_3.curorigin;
break;
}
}
objective_add( self.fireteam_dom_point_obj[var_0], "invisible", var_1, "compass_obj_fireteam" );
objective_playerteam( self.fireteam_dom_point_obj[var_0], self getentitynumber() );
}
}
commander_initialize_gametype()
{
if ( isdefined( self.commander_gametype_initialized ) )
return;
self.commander_gametype_initialized = 1;
self.commander_last_tactic_applied = "tactic_none";
self.commander_last_tactic_selected = "tactic_none";
switch ( level.gametype )
{
case "war":
break;
case "dom":
self.fireteam_dom_point_obj = [];
commander_create_dom_obj( "a" );
commander_create_dom_obj( "b" );
commander_create_dom_obj( "c" );
break;
}
}
commander_monitor_tactics()
{
self endon( "disconnect" );
level endon( "game_ended" );
for (;;)
{
self waittill( "luinotifyserver", var_0, var_1 );
if ( var_0 != "tactic_select" )
{
if ( var_0 == "bot_select" )
{
if ( var_1 > 0 )
commander_handle_notify_quick( "bot_next" );
else if ( var_1 < 0 )
commander_handle_notify_quick( "bot_prev" );
}
else if ( var_0 == "tactics_menu" )
{
if ( var_1 > 0 )
commander_handle_notify_quick( "tactics_menu" );
else if ( var_1 <= 0 )
commander_handle_notify_quick( "tactics_close" );
}
continue;
}
if ( var_1 >= level.tactic_notifies.size )
continue;
var_2 = level.tactic_notifies[var_1];
commander_handle_notify_quick( var_2 );
}
}
commander_handle_notify_quick( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
return;
switch ( var_0 )
{
case "bot_prev":
commander_spectate_next_bot( 1 );
break;
case "bot_next":
commander_spectate_next_bot( 0 );
break;
case "tactics_menu":
self notify( "commander_mode" );
if ( isdefined( self.forcespectatorent ) )
self.forcespectatorent notify( "commander_mode" );
break;
case "tactics_close":
self.commander_closed_menu_time = gettime();
self notify( "takeover_bot" );
break;
case "tactic_none":
if ( level.gametype == "dom" )
{
objective_state( self.fireteam_dom_point_obj["a"], "invisible" );
objective_state( self.fireteam_dom_point_obj["b"], "invisible" );
objective_state( self.fireteam_dom_point_obj["c"], "invisible" );
}
break;
case "tactic_dom_holdA":
objective_state( self.fireteam_dom_point_obj["a"], "active" );
objective_state( self.fireteam_dom_point_obj["b"], "invisible" );
objective_state( self.fireteam_dom_point_obj["c"], "invisible" );
break;
case "tactic_dom_holdB":
objective_state( self.fireteam_dom_point_obj["a"], "invisible" );
objective_state( self.fireteam_dom_point_obj["b"], "active" );
objective_state( self.fireteam_dom_point_obj["c"], "invisible" );
break;
case "tactic_dom_holdC":
objective_state( self.fireteam_dom_point_obj["a"], "invisible" );
objective_state( self.fireteam_dom_point_obj["b"], "invisible" );
objective_state( self.fireteam_dom_point_obj["c"], "active" );
break;
case "tactic_dom_holdAB":
objective_state( self.fireteam_dom_point_obj["a"], "active" );
objective_state( self.fireteam_dom_point_obj["b"], "active" );
objective_state( self.fireteam_dom_point_obj["c"], "invisible" );
break;
case "tactic_dom_holdAC":
objective_state( self.fireteam_dom_point_obj["a"], "active" );
objective_state( self.fireteam_dom_point_obj["b"], "invisible" );
objective_state( self.fireteam_dom_point_obj["c"], "active" );
break;
case "tactic_dom_holdBC":
objective_state( self.fireteam_dom_point_obj["a"], "invisible" );
objective_state( self.fireteam_dom_point_obj["b"], "active" );
objective_state( self.fireteam_dom_point_obj["c"], "active" );
break;
case "tactic_dom_holdABC":
objective_state( self.fireteam_dom_point_obj["a"], "active" );
objective_state( self.fireteam_dom_point_obj["b"], "active" );
objective_state( self.fireteam_dom_point_obj["c"], "active" );
break;
case "tactic_war_rg":
break;
case "tactic_war_ctc":
break;
case "tactic_war_hp":
break;
case "tactic_war_buddy":
break;
case "tactic_war_pincer":
break;
case "tactic_war_hyg":
break;
}
if ( common_scripts\utility::string_starts_with( var_0, "tactic_" ) )
{
self playlocalsound( "earn_superbonus" );
if ( self.commander_last_tactic_applied != var_0 )
{
self.commander_last_tactic_applied = var_0;
thread commander_order_ack();
if ( isdefined( level.bot_funcs["commander_gametype_tactics"] ) )
self [[ level.bot_funcs["commander_gametype_tactics"] ]]( var_0 );
}
}
}
commander_order_ack()
{
self notify( "commander_order_ack" );
self endon( "commander_order_ack" );
self endon( "disconnect" );
var_0 = 360000;
var_1 = var_0;
var_2 = undefined;
for (;;)
{
wait 0.5;
var_1 = var_0;
var_2 = undefined;
var_3 = self.origin;
var_4 = self getspectatingplayer();
if ( isdefined( var_4 ) )
var_3 = var_4.origin;
foreach ( var_6 in level.players )
{
if ( isdefined( var_6 ) && isalive( var_6 ) && isbot( var_6 ) && isdefined( var_6.team ) && var_6.team == self.team )
{
var_7 = distancesquared( var_3, var_6.origin );
if ( var_7 < var_1 )
var_2 = var_6;
}
}
if ( isdefined( var_2 ) )
{
var_9 = var_2.pers["voicePrefix"];
var_10 = var_9 + level.bcsounds["callout_response_generic"];
var_2 thread maps\mp\gametypes\_battlechatter_mp::dosound( var_10, 1, 1 );
return;
}
}
}
commander_hint_fade( var_0 )
{
if ( !isdefined( self ) )
return;
self notify( "commander_hint_fade_out" );
if ( isdefined( self.commanderhintelem ) )
{
var_1 = self.commanderhintelem;
if ( var_0 > 0 )
{
var_1 changefontscaleovertime( var_0 );
var_1.fontscale = var_1.fontscale * 1.5;
var_1.glowcolor = ( 0.3, 0.6, 0.3 );
var_1.glowalpha = 1;
var_1 fadeovertime( var_0 );
var_1.color = ( 0, 0, 0 );
var_1.alpha = 0;
wait( var_0 );
}
var_1 maps\mp\gametypes\_hud_util::destroyelem();
}
}
commander_hint()
{
self endon( "disconnect" );
self endon( "commander_mode" );
self.commander_gave_hint = 1;
wait 1;
if ( !isdefined( self ) )
return;
self.commanderhintelem = maps\mp\gametypes\_hud_util::createfontstring( "default", 3 );
self.commanderhintelem.color = ( 1, 1, 1 );
self.commanderhintelem settext( &"MPUI_COMMANDER_HINT" );
self.commanderhintelem.x = 0;
self.commanderhintelem.y = 20;
self.commanderhintelem.alignx = "center";
self.commanderhintelem.aligny = "middle";
self.commanderhintelem.horzalign = "center";
self.commanderhintelem.vertalign = "middle";
self.commanderhintelem.foreground = 1;
self.commanderhintelem.alpha = 1;
self.commanderhintelem.hidewhendead = 1;
self.commanderhintelem.sort = -1;
self.commanderhintelem endon( "death" );
thread commander_hint_delete_on_commander_menu();
wait 4.0;
thread commander_hint_fade( 0.5 );
}
commander_hint_delete_on_commander_menu()
{
self endon( "disconnect" );
self endon( "commander_hint_fade_out" );
self waittill( "commander_mode" );
thread commander_hint_fade( 0 );
}
hud_monitorplayerownership()
{
self endon( "disconnect" );
self.ownershipstring = [];
for ( var_0 = 0; var_0 < 16; var_0++ )
{
self.ownershipstring[var_0] = maps\mp\gametypes\_hud_util::createfontstring( "default", 1 );
self.ownershipstring[var_0].color = ( 1, 1, 1 );
self.ownershipstring[var_0].x = 0;
self.ownershipstring[var_0].y = 30 + var_0 * 12;
self.ownershipstring[var_0].alignx = "center";
self.ownershipstring[var_0].aligny = "top";
self.ownershipstring[var_0].horzalign = "center";
self.ownershipstring[var_0].vertalign = "top";
self.ownershipstring[var_0].foreground = 1;
self.ownershipstring[var_0].alpha = 1;
self.ownershipstring[var_0].sort = -1;
self.ownershipstring[var_0].archived = 0;
}
for (;;)
{
var_1 = 0;
var_2 = [];
foreach ( var_4 in self.ownershipstring )
{
}
foreach ( var_7 in level.players )
{
var_8 = 0;
if ( isdefined( var_7 ) && var_7.team == self.team )
{
if ( isdefined( var_7.owner ) )
{
if ( common_scripts\utility::array_contains( var_2, var_7 ) )
self.ownershipstring[var_1].color = ( 1, 0, 0 );
else
var_2 = common_scripts\utility::array_add( var_2, var_7 );
if ( var_7 != var_7.owner && common_scripts\utility::array_contains( var_2, var_7.owner ) )
self.ownershipstring[var_1].color = ( 1, 0, 0 );
else
var_2 = common_scripts\utility::array_add( var_2, var_7.owner );
if ( var_7 == self )
self.ownershipstring[var_1].color = ( 1, 0, 0 );
else if ( var_7.owner == var_7 )
self.ownershipstring[var_1].color = ( 1, 0, 0 );
else if ( var_7.owner == self )
self.ownershipstring[var_1].color = ( 0, 1, 0 );
else
self.ownershipstring[var_1].color = ( 1, 1, 1 );
}
else if ( isdefined( var_7.bot_fireteam_follower ) )
var_8 = 1;
else
self.ownershipstring[var_1].color = ( 1, 1, 0 );
}
else
var_8 = 1;
if ( !var_8 )
var_1++;
}
wait 0.1;
}
}
commander_wait_connect()
{
for (;;)
{
foreach ( var_1 in level.players )
{
if ( !isai( var_1 ) && !isdefined( var_1.fireteam_connected ) )
{
var_1.fireteam_connected = 1;
var_1 setclientomnvar( "ui_options_menu", 0 );
var_1.classcallback = ::commander_loadout_class_callback;
var_2 = "allies";
if ( !isdefined( var_1.team ) )
{
if ( level.teamcount["axis"] < level.teamcount["allies"] )
var_2 = "axis";
else if ( level.teamcount["allies"] < level.teamcount["axis"] )
var_2 = "allies";
}
var_1 maps\mp\gametypes\_menus::addtoteam( var_2 );
level.fireteam_commander[var_1.team] = var_1;
var_1 maps\mp\gametypes\_menus::bypassclasschoice();
var_1.class_num = 0;
var_1.waitingtoselectclass = 0;
var_1 thread onfirstspawnedplayer();
var_1 thread commander_monitor_tactics();
}
}
wait 0.05;
}
}
onfirstspawnedplayer()
{
self endon( "disconnect" );
for (;;)
{
if ( self.team != "spectator" && self.sessionstate == "spectator" )
{
thread commander_initialize_gametype();
thread wait_commander_takeover_bot();
thread commander_spectate_first_available_bot();
return;
}
wait 0.05;
}
}
commander_spectate_first_available_bot()
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "spectating_cycle" );
for (;;)
{
foreach ( var_1 in level.players )
{
if ( isbot( var_1 ) && var_1.team == self.team )
{
thread commander_spectate_bot( var_1 );
var_1 thread commander_hint();
return;
}
}
wait 0.1;
}
}
monitor_enter_commander_mode()
{
self endon( "disconnect" );
self endon( "joined_spectators" );
for (;;)
{
self waittill( "commander_mode" );
var_0 = maps\mp\killstreaks\_killstreaks::is_using_killstreak();
var_1 = maps\mp\killstreaks\_deployablebox::isholdingdeployablebox();
if ( !isalive( self ) || var_0 || var_1 )
continue;
break;
}
if ( self.team == "spectator" )
return;
thread wait_commander_takeover_bot();
self playlocalsound( "mp_card_slide" );
var_2 = 0;
foreach ( var_4 in level.players )
{
if ( isdefined( var_4 ) && var_4 != self && isbot( var_4 ) && isdefined( var_4.team ) && var_4.team == self.team && isdefined( var_4.sidelinedbycommander ) && var_4.sidelinedbycommander == 1 )
{
var_4 thread spectator_takeover_other( self );
var_2 = 1;
break;
}
}
if ( !var_2 )
thread maps\mp\gametypes\_playerlogic::spawnspectator();
}
commander_can_takeover_bot( var_0 )
{
if ( !isdefined( var_0 ) )
return 0;
if ( !isbot( var_0 ) )
return 0;
if ( !isalive( var_0 ) )
return 0;
if ( !var_0.connected )
return 0;
if ( var_0.team != self.team )
return 0;
var_1 = var_0 maps\mp\killstreaks\_killstreaks::is_using_killstreak();
if ( var_1 )
return 0;
var_2 = maps\mp\killstreaks\_deployablebox::isholdingdeployablebox();
if ( var_2 )
return 0;
return 1;
}
player_get_player_index()
{
for ( var_0 = 0; var_0 < level.players.size; var_0++ )
{
if ( level.players[var_0] == self )
return var_0;
}
return -1;
}
commander_spectate_next_bot( var_0 )
{
var_1 = self getspectatingplayer();
var_2 = undefined;
var_3 = 0;
var_4 = 1;
if ( isdefined( var_0 ) && var_0 == 1 )
var_4 = -1;
if ( isdefined( var_1 ) )
var_3 = var_1 player_get_player_index();
var_5 = 1;
for ( var_6 = var_3 + var_4; var_5 < level.players.size; var_6 = var_6 + var_4 )
{
var_5++;
if ( var_6 < 0 )
var_6 = level.players.size - 1;
else if ( var_6 >= level.players.size )
var_6 = 0;
if ( !isdefined( level.players[var_6] ) )
continue;
if ( isdefined( var_1 ) && level.players[var_6] == var_1 )
break;
var_7 = commander_can_takeover_bot( level.players[var_6] );
if ( var_7 )
{
var_2 = level.players[var_6];
break;
}
}
if ( isdefined( var_2 ) && ( !isdefined( var_1 ) || var_2 != var_1 ) )
{
thread commander_spectate_bot( var_2 );
self playlocalsound( "oldschool_return" );
var_2 thread takeover_flash();
if ( isdefined( var_1 ) )
var_1 bot_free_to_move();
}
else
self playlocalsound( "counter_uav_deactivate" );
}
commander_spectate_bot( var_0 )
{
self notify( "commander_spectate_bot" );
self endon( "commander_spectate_bot" );
self endon( "commander_spectate_stop" );
self endon( "disconnect" );
while ( isdefined( var_0 ) )
{
if ( !self.spectatekillcam && var_0.sessionstate == "playing" )
{
var_1 = var_0 getentitynumber();
if ( self.forcespectatorclient != var_1 )
{
self allowspectateteam( "none", 0 );
self allowspectateteam( "freelook", 0 );
self.forcespectatorclient = var_1;
self.forcespectatorent = var_0;
maps\mp\killstreaks\_killstreaks::copy_killstreak_status( var_0, 1 );
}
else if ( !isdefined( self.adrenaline ) || isdefined( var_0.adrenaline ) && self.adrenaline != var_0.adrenaline )
maps\mp\killstreaks\_killstreaks::copy_adrenaline( var_0 );
}
wait 0.05;
}
}
get_spectated_player()
{
var_0 = undefined;
if ( isdefined( self.forcespectatorent ) )
var_0 = self.forcespectatorent;
else
var_0 = self getspectatingplayer();
return var_0;
}
commander_takeover_first_available_bot()
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "spectating_cycle" );
for (;;)
{
foreach ( var_1 in level.players )
{
if ( isbot( var_1 ) && var_1.team == self.team )
{
spectator_takeover_other( var_1 );
return;
}
}
wait 0.1;
}
}
spectator_takeover_other( var_0 )
{
self.forcespawnorigin = var_0.origin;
var_1 = var_0 getplayerangles();
var_1 = ( var_1[0], var_1[1], 0.0 );
self.forcespawnangles = ( 0, var_0.angles[1], 0 );
self setstance( var_0 getstance() );
self.botlastloadout = var_0.botlastloadout;
self.bot_class = var_0.bot_class;
commander_or_bot_change_class( self.bot_class );
self.health = var_0.health;
self.velocity = var_0.velocity;
store_weapons_status( var_0 );
var_0 maps\mp\gametypes\_weapons::transfer_grenade_ownership( self );
var_0 thread maps\mp\gametypes\_playerlogic::spawnspectator();
if ( isbot( var_0 ) )
{
var_0.sidelinedbycommander = 1;
var_0 bot_free_to_move();
self playercommandbot( var_0 );
self notify( "commander_spectate_stop" );
var_0 notify( "commander_took_over" );
}
else
{
}
thread maps\mp\gametypes\_playerlogic::spawnclient();
self setplayerangles( var_1 );
apply_weapons_status();
maps\mp\killstreaks\_killstreaks::copy_killstreak_status( var_0 );
botsentientswap( self, var_0 );
if ( isbot( self ) )
{
var_0 thread commander_spectate_bot( self );
var_0 playercommandbot( undefined );
self.sidelinedbycommander = 0;
var_0 playlocalsound( "counter_uav_activate" );
thread takeover_flash();
var_0.commanding_bot = undefined;
var_0.last_commanded_bot = self;
bot_wait_here();
}
else
{
thread monitor_enter_commander_mode();
self playsound( "copycat_steal_class" );
thread takeover_flash();
self.commanding_bot = var_0;
self.last_commanded_bot = undefined;
if ( !isdefined( self.commander_gave_hint ) )
thread commander_hint();
}
}
takeover_flash()
{
if ( !isdefined( self.takeoverflashoverlay ) )
{
self.takeoverflashoverlay = newclienthudelem( self );
self.takeoverflashoverlay.x = 0;
self.takeoverflashoverlay.y = 0;
self.takeoverflashoverlay.alignx = "left";
self.takeoverflashoverlay.aligny = "top";
self.takeoverflashoverlay.horzalign = "fullscreen";
self.takeoverflashoverlay.vertalign = "fullscreen";
self.takeoverflashoverlay setshader( "combathigh_overlay", 640, 480 );
self.takeoverflashoverlay.sort = -10;
self.takeoverflashoverlay.archived = 1;
}
self.takeoverflashoverlay.alpha = 0.0;
self.takeoverflashoverlay fadeovertime( 0.25 );
self.takeoverflashoverlay.alpha = 1.0;
wait 0.75;
self.takeoverflashoverlay fadeovertime( 0.5 );
self.takeoverflashoverlay.alpha = 0.0;
}
wait_commander_takeover_bot()
{
self endon( "disconnect" );
self endon( "joined_team" );
self notify( "takeover_wait_start" );
self endon( "takeover_wait_start" );
for (;;)
{
self waittill( "takeover_bot" );
var_0 = get_spectated_player();
var_1 = commander_can_takeover_bot( var_0 );
if ( !var_1 )
{
commander_spectate_next_bot( 0 );
var_0 = get_spectated_player();
var_1 = commander_can_takeover_bot( var_0 );
}
if ( var_1 )
{
thread spectator_takeover_other( var_0 );
break;
}
self playlocalsound( "counter_uav_deactivate" );
}
}
bot_wait_here()
{
if ( !isdefined( self ) || !isplayer( self ) || !isbot( self ) )
return;
self notify( "wait_here" );
self botsetflag( "disable_movement", 1 );
self.badplacename = "bot_waiting_" + self.team + "_" + self.name;
badplace_cylinder( self.badplacename, 5, self.origin, 32, 72, self.team );
thread bot_delete_badplace_on_death();
thread bot_wait_free_to_move();
}
bot_delete_badplace_on_death( var_0 )
{
self endon( "freed_to_move" );
self endon( "disconnect" );
self waittill( "death" );
bot_free_to_move();
}
bot_wait_free_to_move()
{
self endon( "wait_here" );
wait 5;
thread bot_free_to_move();
}
bot_free_to_move()
{
if ( !isdefined( self ) || !isplayer( self ) || !isbot( self ) )
return;
self botsetflag( "disable_movement", 0 );
if ( isdefined( self.badplacename ) )
badplace_delete( self.badplacename );
self notify( "freed_to_move" );
}
commander_loadout_class_callback( var_0 )
{
return self.botlastloadout;
}
commander_or_bot_change_class( var_0 )
{
self.pers["class"] = var_0;
self.class = var_0;
maps\mp\gametypes\_class::setclass( var_0 );
self.tag_stowed_back = undefined;
self.tag_stowed_hip = undefined;
}
store_weapons_status( var_0 )
{
self.copy_fullweaponlist = var_0 getweaponslistall();
self.copy_weapon_current = var_0 getcurrentweapon();
foreach ( var_2 in self.copy_fullweaponlist )
{
self.copy_weapon_ammo_clip[var_2] = var_0 getweaponammoclip( var_2 );
self.copy_weapon_ammo_stock[var_2] = var_0 getweaponammostock( var_2 );
}
}
apply_weapons_status()
{
foreach ( var_1 in self.copy_fullweaponlist )
{
if ( !self hasweapon( var_1 ) )
self giveweapon( var_1 );
}
var_3 = self getweaponslistall();
foreach ( var_1 in var_3 )
{
if ( !common_scripts\utility::array_contains( self.copy_fullweaponlist, var_1 ) )
self takeweapon( var_1 );
}
foreach ( var_1 in self.copy_fullweaponlist )
{
if ( self hasweapon( var_1 ) )
{
self setweaponammoclip( var_1, self.copy_weapon_ammo_clip[var_1] );
self setweaponammostock( var_1, self.copy_weapon_ammo_stock[var_1] );
continue;
}
}
if ( self getcurrentweapon() != self.copy_weapon_current )
self switchtoweapon( self.copy_weapon_current );
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,296 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
setup_bot_blitz();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_blitz_think;
}
setup_bot_blitz()
{
maps\mp\bots\_bots_util::bot_waittill_bots_enabled( 1 );
level.protect_radius = 600;
thread bot_blitz_ai_director_update();
level.bot_gametype_precaching_done = 1;
}
bot_blitz_think()
{
self notify( "bot_blitz_think" );
self endon( "bot_blitz_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
while ( !isdefined( level.bot_gametype_precaching_done ) )
wait 0.05;
self botsetflag( "separation", 0 );
for (;;)
{
wait 0.05;
if ( !isdefined( self.role ) )
initialize_blitz_role();
if ( maps\mp\bots\_bots_strategy::bot_has_tactical_goal() )
continue;
if ( self.role == "attacker" )
{
var_0 = level.portallist[common_scripts\utility::get_enemy_team( self.team )];
if ( var_0.open )
{
if ( maps\mp\bots\_bots_util::bot_is_defending() )
maps\mp\bots\_bots_strategy::bot_defend_stop();
if ( !self bothasscriptgoal() )
self botsetscriptgoal( var_0.origin, 0, "objective" );
}
else if ( !maps\mp\bots\_bots_util::bot_is_defending() )
{
self botclearscriptgoal();
maps\mp\bots\_bots_strategy::bot_protect_point( var_0.origin, level.protect_radius );
}
continue;
}
if ( self.role == "defender" )
{
var_0 = level.portallist[self.team];
if ( !maps\mp\bots\_bots_util::bot_is_defending_point( var_0.origin ) )
{
var_1["min_goal_time"] = 20;
var_1["max_goal_time"] = 30;
var_1["score_flags"] = "strict_los";
maps\mp\bots\_bots_strategy::bot_protect_point( var_0.origin, level.protect_radius, var_1 );
}
}
}
}
initialize_blitz_role()
{
var_0 = get_allied_attackers_for_team( self.team );
var_1 = get_allied_defenders_for_team( self.team );
var_2 = blitz_bot_attacker_limit_for_team( self.team );
var_3 = blitz_bot_defender_limit_for_team( self.team );
var_4 = level.bot_personality_type[self.personality];
if ( var_4 == "active" )
{
if ( var_0.size >= var_2 )
{
var_5 = 0;
foreach ( var_7 in var_0 )
{
if ( isai( var_7 ) && level.bot_personality_type[var_7.personality] == "stationary" )
{
var_7.role = undefined;
var_5 = 1;
break;
}
}
if ( var_5 )
{
blitz_set_role( "attacker" );
return;
}
blitz_set_role( "defender" );
return;
}
else
blitz_set_role( "attacker" );
}
else if ( var_4 == "stationary" )
{
if ( var_1.size >= var_3 )
{
var_5 = 0;
foreach ( var_10 in var_1 )
{
if ( isai( var_10 ) && level.bot_personality_type[var_10.personality] == "active" )
{
var_10.role = undefined;
var_5 = 1;
break;
}
}
if ( var_5 )
{
blitz_set_role( "defender" );
return;
}
blitz_set_role( "attacker" );
return;
}
else
blitz_set_role( "defender" );
}
}
bot_blitz_ai_director_update()
{
level notify( "bot_blitz_ai_director_update" );
level endon( "bot_blitz_ai_director_update" );
level endon( "game_ended" );
var_0[0] = "allies";
var_0[1] = "axis";
for (;;)
{
foreach ( var_2 in var_0 )
{
var_3 = blitz_bot_attacker_limit_for_team( var_2 );
var_4 = blitz_bot_defender_limit_for_team( var_2 );
var_5 = get_allied_attackers_for_team( var_2 );
var_6 = get_allied_defenders_for_team( var_2 );
if ( var_5.size > var_3 )
{
var_7 = [];
var_8 = 0;
foreach ( var_10 in var_5 )
{
if ( isai( var_10 ) )
{
if ( level.bot_personality_type[var_10.personality] == "stationary" )
{
var_10 blitz_set_role( "defender" );
var_8 = 1;
break;
}
else
var_7 = common_scripts\utility::array_add( var_7, var_10 );
}
}
if ( !var_8 && var_7.size > 0 )
common_scripts\utility::random( var_7 ) blitz_set_role( "defender" );
}
if ( var_6.size > var_4 )
{
var_12 = [];
var_13 = 0;
foreach ( var_15 in var_6 )
{
if ( isai( var_15 ) )
{
if ( level.bot_personality_type[var_15.personality] == "active" )
{
var_15 blitz_set_role( "attacker" );
var_13 = 1;
break;
}
else
var_12 = common_scripts\utility::array_add( var_12, var_15 );
}
}
if ( !var_13 && var_12.size > 0 )
common_scripts\utility::random( var_12 ) blitz_set_role( "attacker" );
}
}
wait 1.0;
}
}
blitz_bot_attacker_limit_for_team( var_0 )
{
var_1 = blitz_get_num_players_on_team( var_0 );
return int( int( var_1 ) / 2 ) + 1 + int( var_1 ) % 2;
}
blitz_bot_defender_limit_for_team( var_0 )
{
var_1 = blitz_get_num_players_on_team( var_0 );
return max( int( int( var_1 ) / 2 ) - 1, 0 );
}
blitz_get_num_players_on_team( var_0 )
{
var_1 = 0;
foreach ( var_3 in level.participants )
{
if ( maps\mp\_utility::isteamparticipant( var_3 ) && isdefined( var_3.team ) && var_3.team == var_0 )
var_1++;
}
return var_1;
}
get_allied_attackers_for_team( var_0 )
{
var_1 = get_players_by_role( "attacker", var_0 );
foreach ( var_3 in level.players )
{
if ( !isai( var_3 ) && isdefined( var_3.team ) && var_3.team == var_0 )
{
if ( distancesquared( level.portallist[var_0].origin, var_3.origin ) > level.protect_radius * level.protect_radius )
var_1 = common_scripts\utility::array_add( var_1, var_3 );
}
}
return var_1;
}
get_allied_defenders_for_team( var_0 )
{
var_1 = get_players_by_role( "defender", var_0 );
foreach ( var_3 in level.players )
{
if ( !isai( var_3 ) && isdefined( var_3.team ) && var_3.team == var_0 )
{
if ( distancesquared( level.portallist[var_0].origin, var_3.origin ) <= level.protect_radius * level.protect_radius )
var_1 = common_scripts\utility::array_add( var_1, var_3 );
}
}
return var_1;
}
blitz_set_role( var_0 )
{
self.role = var_0;
self botclearscriptgoal();
maps\mp\bots\_bots_strategy::bot_defend_stop();
}
get_players_by_role( var_0, var_1 )
{
var_2 = [];
foreach ( var_4 in level.participants )
{
if ( !isdefined( var_4.team ) )
continue;
if ( isalive( var_4 ) && maps\mp\_utility::isteamparticipant( var_4 ) && var_4.team == var_1 && isdefined( var_4.role ) && var_4.role == var_0 )
var_2[var_2.size] = var_4;
}
return var_2;
}

View File

@ -0,0 +1,431 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
setup_bot_conf();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_conf_think;
}
setup_bot_conf()
{
level.bot_tag_obj_radius = 200;
level.bot_tag_allowable_jump_height = 38;
}
bot_conf_think()
{
self notify( "bot_conf_think" );
self endon( "bot_conf_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self.next_time_check_tags = gettime() + 500;
self.tags_seen = [];
childthread bot_watch_new_tags();
if ( self.personality == "camper" )
{
self.conf_camper_camp_tags = 0;
if ( !isdefined( self.conf_camping_tag ) )
self.conf_camping_tag = 0;
}
for (;;)
{
var_0 = isdefined( self.tag_getting );
var_1 = 0;
if ( var_0 && self bothasscriptgoal() )
{
var_2 = self botgetscriptgoal();
if ( maps\mp\bots\_bots_util::bot_vectors_are_equal( self.tag_getting.curorigin, var_2 ) )
{
if ( self botpursuingscriptgoal() )
var_1 = 1;
}
else if ( maps\mp\bots\_bots_strategy::bot_has_tactical_goal( "kill_tag" ) && self.tag_getting maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) )
{
self.tag_getting = undefined;
var_0 = 0;
}
}
self botsetflag( "force_sprint", var_1 );
self.tags_seen = bot_remove_invalid_tags( self.tags_seen );
var_3 = bot_find_best_tag_from_array( self.tags_seen, 1 );
var_4 = isdefined( var_3 );
if ( var_0 && !var_4 || !var_0 && var_4 || var_0 && var_4 && self.tag_getting != var_3 )
{
self.tag_getting = var_3;
self botclearscriptgoal();
self notify( "stop_camping_tag" );
maps\mp\bots\_bots_personality::clear_camper_data();
maps\mp\bots\_bots_strategy::bot_abort_tactical_goal( "kill_tag" );
}
if ( isdefined( self.tag_getting ) )
{
self.conf_camping_tag = 0;
if ( self.personality == "camper" && self.conf_camper_camp_tags )
{
self.conf_camping_tag = 1;
if ( maps\mp\bots\_bots_personality::should_select_new_ambush_point() )
{
if ( maps\mp\bots\_bots_personality::find_ambush_node( self.tag_getting.curorigin, 1000 ) )
childthread bot_camp_tag( self.tag_getting, "camp" );
else
self.conf_camping_tag = 0;
}
}
if ( !self.conf_camping_tag )
{
if ( !maps\mp\bots\_bots_strategy::bot_has_tactical_goal( "kill_tag" ) )
{
var_5 = spawnstruct();
var_5.script_goal_type = "objective";
var_5.objective_radius = level.bot_tag_obj_radius;
maps\mp\bots\_bots_strategy::bot_new_tactical_goal( "kill_tag", self.tag_getting.curorigin, 25, var_5 );
}
}
}
var_6 = 0;
if ( isdefined( self.additional_tactical_logic_func ) )
var_6 = self [[ self.additional_tactical_logic_func ]]();
if ( !isdefined( self.tag_getting ) )
{
if ( !var_6 )
self [[ self.personality_update_function ]]();
}
if ( gettime() > self.next_time_check_tags )
{
self.next_time_check_tags = gettime() + 500;
var_7 = bot_find_visible_tags( 1 );
self.tags_seen = bot_combine_tag_seen_arrays( var_7, self.tags_seen );
}
wait 0.05;
}
}
bot_check_tag_above_head( var_0 )
{
if ( isdefined( var_0.on_path_grid ) && var_0.on_path_grid )
{
var_1 = self.origin + ( 0, 0, 55 );
if ( distance2dsquared( var_0.curorigin, var_1 ) < 144 )
{
var_2 = var_0.curorigin[2] - var_1[2];
if ( var_2 > 0 )
{
if ( var_2 < level.bot_tag_allowable_jump_height )
{
if ( !isdefined( self.last_time_jumped_for_tag ) )
self.last_time_jumped_for_tag = 0;
if ( gettime() - self.last_time_jumped_for_tag > 3000 )
{
self.last_time_jumped_for_tag = gettime();
thread bot_jump_for_tag();
}
}
else
{
var_0.on_path_grid = 0;
return 1;
}
}
}
}
return 0;
}
bot_jump_for_tag()
{
self endon( "death" );
self endon( "disconnect" );
self botsetstance( "stand" );
wait 1.0;
self botpressbutton( "jump" );
wait 1.0;
self botsetstance( "none" );
}
bot_watch_new_tags()
{
for (;;)
{
level waittill( "new_tag_spawned", var_0 );
self.next_time_check_tags = -1;
if ( isdefined( var_0 ) )
{
if ( isdefined( var_0.victim ) && var_0.victim == self || isdefined( var_0.attacker ) && var_0.attacker == self )
{
if ( !isdefined( var_0.on_path_grid ) && !isdefined( var_0.calculations_in_progress ) )
{
thread calculate_tag_on_path_grid( var_0 );
waittill_tag_calculated_on_path_grid( var_0 );
if ( var_0.on_path_grid )
{
var_1 = spawnstruct();
var_1.origin = var_0.curorigin;
var_1.tag = var_0;
var_2[0] = var_1;
self.tags_seen = bot_combine_tag_seen_arrays( var_2, self.tags_seen );
}
}
}
}
}
}
bot_combine_tag_seen_arrays( var_0, var_1 )
{
var_2 = var_1;
foreach ( var_4 in var_0 )
{
var_5 = 0;
foreach ( var_7 in var_1 )
{
if ( var_4.tag == var_7.tag && maps\mp\bots\_bots_util::bot_vectors_are_equal( var_4.origin, var_7.origin ) )
{
var_5 = 1;
break;
}
}
if ( !var_5 )
var_2 = common_scripts\utility::array_add( var_2, var_4 );
}
return var_2;
}
bot_is_tag_visible( var_0, var_1, var_2 )
{
if ( !var_0.calculated_nearest_node )
{
var_0.nearest_node = getclosestnodeinsight( var_0.curorigin );
var_0.calculated_nearest_node = 1;
}
if ( isdefined( var_0.calculations_in_progress ) )
return 0;
var_3 = var_0.nearest_node;
var_4 = !isdefined( var_0.on_path_grid );
if ( isdefined( var_3 ) && ( var_4 || var_0.on_path_grid ) )
{
var_5 = var_3 == var_1 || nodesvisible( var_3, var_1, 1 );
if ( var_5 )
{
var_6 = common_scripts\utility::within_fov( self.origin, self.angles, var_0.curorigin, var_2 );
if ( var_6 )
{
if ( var_4 )
{
thread calculate_tag_on_path_grid( var_0 );
waittill_tag_calculated_on_path_grid( var_0 );
if ( !var_0.on_path_grid )
return 0;
}
return 1;
}
}
}
return 0;
}
bot_find_visible_tags( var_0, var_1, var_2 )
{
var_3 = undefined;
if ( isdefined( var_1 ) )
var_3 = var_1;
else
var_3 = self getnearestnode();
var_4 = undefined;
if ( isdefined( var_2 ) )
var_4 = var_2;
else
var_4 = self botgetfovdot();
var_5 = [];
if ( isdefined( var_3 ) )
{
foreach ( var_7 in level.dogtags )
{
if ( var_7 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) )
{
var_8 = 0;
if ( !var_0 )
{
if ( !isdefined( var_7.calculations_in_progress ) )
{
if ( !isdefined( var_7.on_path_grid ) )
{
level thread calculate_tag_on_path_grid( var_7 );
waittill_tag_calculated_on_path_grid( var_7 );
}
var_8 = distancesquared( self.origin, var_7.curorigin ) < 1000000 && var_7.on_path_grid;
}
}
else if ( bot_is_tag_visible( var_7, var_3, var_4 ) )
var_8 = 1;
if ( var_8 )
{
var_9 = spawnstruct();
var_9.origin = var_7.curorigin;
var_9.tag = var_7;
var_5 = common_scripts\utility::array_add( var_5, var_9 );
}
}
}
}
return var_5;
}
calculate_tag_on_path_grid( var_0 )
{
var_0 endon( "reset" );
var_0.calculations_in_progress = 1;
var_0.on_path_grid = maps\mp\bots\_bots_util::bot_point_is_on_pathgrid( var_0.curorigin, undefined, level.bot_tag_allowable_jump_height + 55 );
var_0.calculations_in_progress = undefined;
}
waittill_tag_calculated_on_path_grid( var_0 )
{
while ( !isdefined( var_0.on_path_grid ) )
wait 0.05;
}
bot_find_best_tag_from_array( var_0, var_1 )
{
var_2 = undefined;
if ( var_0.size > 0 )
{
var_3 = 1409865409;
foreach ( var_5 in var_0 )
{
var_6 = get_num_allies_getting_tag( var_5.tag );
if ( !var_1 || var_6 < 2 )
{
var_7 = distancesquared( var_5.tag.curorigin, self.origin );
if ( var_7 < var_3 )
{
var_2 = var_5.tag;
var_3 = var_7;
}
}
}
}
return var_2;
}
bot_remove_invalid_tags( var_0 )
{
var_1 = [];
foreach ( var_3 in var_0 )
{
if ( var_3.tag maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) && maps\mp\bots\_bots_util::bot_vectors_are_equal( var_3.tag.curorigin, var_3.origin ) )
{
if ( !bot_check_tag_above_head( var_3.tag ) && var_3.tag.on_path_grid )
var_1 = common_scripts\utility::array_add( var_1, var_3 );
}
}
return var_1;
}
get_num_allies_getting_tag( var_0 )
{
var_1 = 0;
foreach ( var_3 in level.participants )
{
if ( !isdefined( var_3.team ) )
continue;
if ( var_3.team == self.team && var_3 != self )
{
if ( isai( var_3 ) )
{
if ( isdefined( var_3.tag_getting ) && var_3.tag_getting == var_0 )
var_1++;
continue;
}
if ( distancesquared( var_3.origin, var_0.curorigin ) < 160000 )
var_1++;
}
}
return var_1;
}
bot_camp_tag( var_0, var_1, var_2 )
{
self notify( "bot_camp_tag" );
self endon( "bot_camp_tag" );
self endon( "stop_camping_tag" );
if ( isdefined( var_2 ) )
self endon( var_2 );
self botsetscriptgoalnode( self.node_ambushing_from, var_1, self.ambush_yaw );
var_3 = maps\mp\bots\_bots_util::bot_waittill_goal_or_fail();
if ( var_3 == "goal" )
{
var_4 = var_0.nearest_node;
if ( isdefined( var_4 ) )
{
var_5 = findentrances( self.origin );
var_5 = common_scripts\utility::array_add( var_5, var_4 );
childthread maps\mp\bots\_bots_util::bot_watch_nodes( var_5 );
}
}
}

View File

@ -0,0 +1,8 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
level.bot_personality_types_desired["active"] = 1;
level.bot_personality_types_desired["stationary"] = 0;
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,210 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
maps\mp\bots\_bots_gametype_conf::setup_bot_conf();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_grind_think;
}
bot_grind_think()
{
self notify( "bot_grind_think" );
self endon( "bot_grind_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self.grind_waiting_to_bank = 0;
self.goal_zone = undefined;
self.conf_camping_zone = 0;
self.additional_tactical_logic_func = ::bot_grind_extra_think;
if ( self botgetdifficultysetting( "strategyLevel" ) > 0 )
childthread enemy_watcher();
maps\mp\bots\_bots_gametype_conf::bot_conf_think();
}
bot_grind_extra_think()
{
if ( !isdefined( self.tag_getting ) )
{
if ( self.tagscarried > 0 )
{
var_0 = squared( 500 + self.tagscarried * 250 );
if ( game["teamScores"][self.team] + self.tagscarried >= maps\mp\_utility::getwatcheddvar( "scorelimit" ) )
var_0 = squared( 5000 );
else if ( !isdefined( self.enemy ) && !maps\mp\bots\_bots_util::bot_in_combat() )
var_0 = squared( 1500 + self.tagscarried * 250 );
var_1 = undefined;
foreach ( var_3 in level.zonelist )
{
var_4 = distancesquared( self.origin, var_3.origin );
if ( var_4 < var_0 )
{
var_0 = var_4;
var_1 = var_3;
}
}
if ( isdefined( var_1 ) )
{
var_6 = 1;
if ( self.grind_waiting_to_bank )
{
if ( isdefined( self.goal_zone ) && self.goal_zone == var_1 )
var_6 = 0;
}
if ( var_6 )
{
self.grind_waiting_to_bank = 1;
self.goal_zone = var_1;
self botclearscriptgoal();
self notify( "stop_going_to_zone" );
self notify( "stop_camping_zone" );
self.conf_camping_zone = 0;
maps\mp\bots\_bots_personality::clear_camper_data();
maps\mp\bots\_bots_strategy::bot_abort_tactical_goal( "kill_tag" );
childthread bot_goto_zone( var_1, "tactical" );
}
}
if ( self.grind_waiting_to_bank )
{
if ( game["teamScores"][self.team] + self.tagscarried >= maps\mp\_utility::getwatcheddvar( "scorelimit" ) )
self botsetflag( "force_sprint", 1 );
}
}
else if ( self.grind_waiting_to_bank )
{
self.grind_waiting_to_bank = 0;
self.goal_zone = undefined;
self notify( "stop_going_to_zone" );
self botclearscriptgoal();
}
if ( self.personality == "camper" && !self.conf_camping_tag && !self.grind_waiting_to_bank )
{
var_0 = undefined;
var_1 = undefined;
foreach ( var_3 in level.zonelist )
{
var_4 = distancesquared( self.origin, var_3.origin );
if ( !isdefined( var_0 ) || var_4 < var_0 )
{
var_0 = var_4;
var_1 = var_3;
}
}
if ( isdefined( var_1 ) )
{
if ( maps\mp\bots\_bots_personality::should_select_new_ambush_point() )
{
if ( maps\mp\bots\_bots_personality::find_ambush_node( var_1.origin ) )
{
self.conf_camping_zone = 1;
self notify( "stop_going_to_zone" );
self.grind_waiting_to_bank = 0;
self botclearscriptgoal();
childthread bot_camp_zone( var_1, "camp" );
}
else
{
self notify( "stop_camping_zone" );
self.conf_camping_zone = 0;
maps\mp\bots\_bots_personality::clear_camper_data();
}
}
}
else
self.conf_camping_zone = 1;
}
}
else
{
self notify( "stop_going_to_zone" );
self.grind_waiting_to_bank = 0;
self.goal_zone = undefined;
self notify( "stop_camping_zone" );
self.conf_camping_zone = 0;
}
return self.grind_waiting_to_bank || self.conf_camping_zone;
}
bot_goto_zone( var_0, var_1 )
{
self endon( "stop_going_to_zone" );
if ( !isdefined( var_0.calculated_nearest_node ) )
{
var_0.nearest_node = getclosestnodeinsight( var_0.origin );
var_0.calculated_nearest_node = 1;
}
var_2 = var_0.nearest_node;
self botsetscriptgoal( var_2.origin, 32, var_1 );
var_3 = maps\mp\bots\_bots_util::bot_waittill_goal_or_fail();
}
bot_camp_zone( var_0, var_1 )
{
self endon( "stop_camping_zone" );
self botsetscriptgoalnode( self.node_ambushing_from, var_1, self.ambush_yaw );
var_2 = maps\mp\bots\_bots_util::bot_waittill_goal_or_fail();
if ( var_2 == "goal" )
{
if ( !isdefined( var_0.calculated_nearest_node ) )
{
var_0.nearest_node = getclosestnodeinsight( var_0.origin );
var_0.calculated_nearest_node = 1;
}
var_3 = var_0.nearest_node;
if ( isdefined( var_3 ) )
{
var_4 = findentrances( self.origin );
var_4 = common_scripts\utility::array_add( var_4, var_3 );
childthread maps\mp\bots\_bots_util::bot_watch_nodes( var_4 );
}
}
}
enemy_watcher()
{
self.default_meleechargedist = self botgetdifficultysetting( "meleeChargeDist" );
for (;;)
{
if ( self botgetdifficultysetting( "strategyLevel" ) < 2 )
wait 0.5;
else
wait 0.2;
if ( isdefined( self.enemy ) && isplayer( self.enemy ) && isdefined( self.enemy.tagscarried ) && self.enemy.tagscarried >= 3 && self botcanseeentity( self.enemy ) && distance( self.origin, self.enemy.origin ) <= 500 )
{
self botsetdifficultysetting( "meleeChargeDist", 500 );
self botsetflag( "prefer_melee", 1 );
continue;
}
self botsetdifficultysetting( "meleeChargeDist", self.default_meleechargedist );
self botsetflag( "prefer_melee", 0 );
}
}

View File

@ -0,0 +1,54 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
setup_bot_grnd();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_grnd_think;
}
setup_bot_grnd()
{
maps\mp\bots\_bots_util::bot_waittill_bots_enabled( 1 );
level.protect_radius = 128;
level.bot_gametype_precaching_done = 1;
}
bot_grnd_think()
{
self notify( "bot_grnd_think" );
self endon( "bot_grnd_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
while ( !isdefined( level.bot_gametype_precaching_done ) )
wait 0.05;
self botsetflag( "separation", 0 );
for (;;)
{
wait 0.05;
if ( maps\mp\bots\_bots_strategy::bot_has_tactical_goal() )
continue;
if ( !self bothasscriptgoal() )
{
self botsetscriptgoal( level.grnd_zone.origin, 0, "objective" );
continue;
}
if ( !maps\mp\bots\_bots_util::bot_is_defending() )
{
self botclearscriptgoal();
maps\mp\bots\_bots_strategy::bot_protect_point( level.grnd_zone.origin, level.protect_radius );
}
}
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,7 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
}

View File

@ -0,0 +1,302 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
setup_bot_infect();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_infect_think;
level.bot_funcs["should_pickup_weapons"] = ::bot_should_pickup_weapons_infect;
}
setup_bot_infect()
{
level.bots_gametype_handles_class_choice = 1;
level.bots_ignore_team_balance = 1;
level.bots_gametype_handles_team_choice = 1;
thread bot_infect_ai_director_update();
}
bot_should_pickup_weapons_infect()
{
if ( level.infect_chosefirstinfected && self.team == "axis" )
return 0;
return maps\mp\bots\_bots::bot_should_pickup_weapons();
}
bot_infect_think()
{
self notify( "bot_infect_think" );
self endon( "bot_infect_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
childthread bot_infect_retrieve_knife();
for (;;)
{
if ( level.infect_chosefirstinfected )
{
if ( self.team == "axis" && self botgetpersonality() != "run_and_gun" )
maps\mp\bots\_bots_util::bot_set_personality( "run_and_gun" );
}
if ( self.bot_team != self.team )
self.bot_team = self.team;
if ( self.team == "axis" )
{
var_0 = maps\mp\bots\_bots_strategy::bot_melee_tactical_insertion_check();
if ( !isdefined( var_0 ) || var_0 )
self botclearscriptgoal();
}
self [[ self.personality_update_function ]]();
wait 0.05;
}
}
bot_infect_ai_director_update()
{
level notify( "bot_infect_ai_director_update" );
level endon( "bot_infect_ai_director_update" );
level endon( "game_ended" );
for (;;)
{
var_0 = [];
var_1 = [];
foreach ( var_3 in level.players )
{
if ( !isdefined( var_3.initial_spawn_time ) && var_3.health > 0 && isdefined( var_3.team ) && ( var_3.team == "allies" || var_3.team == "axis" ) )
var_3.initial_spawn_time = gettime();
if ( isdefined( var_3.initial_spawn_time ) && gettime() - var_3.initial_spawn_time > 5000 )
{
if ( !isdefined( var_3.team ) )
continue;
if ( var_3.team == "axis" )
{
var_0[var_0.size] = var_3;
continue;
}
if ( var_3.team == "allies" )
var_1[var_1.size] = var_3;
}
}
if ( var_0.size > 0 && var_1.size > 0 )
{
var_5 = 1;
foreach ( var_7 in var_1 )
{
if ( isbot( var_7 ) )
var_5 = 0;
}
if ( var_5 )
{
foreach ( var_3 in var_1 )
{
if ( !isdefined( var_3.last_infected_hiding_time ) )
{
var_3.last_infected_hiding_time = gettime();
var_3.last_infected_hiding_loc = var_3.origin;
var_3.time_spent_hiding = 0;
}
if ( gettime() >= var_3.last_infected_hiding_time + 5000 )
{
var_3.last_infected_hiding_time = gettime();
var_10 = distancesquared( var_3.origin, var_3.last_infected_hiding_loc );
var_3.last_infected_hiding_loc = var_3.origin;
if ( var_10 < 90000 )
{
var_3.time_spent_hiding = var_3.time_spent_hiding + 5000;
if ( var_3.time_spent_hiding >= 20000 )
{
var_11 = common_scripts\utility::get_array_of_closest( var_3.origin, var_0 );
foreach ( var_13 in var_11 )
{
if ( isbot( var_13 ) )
{
var_14 = var_13 botgetscriptgoaltype();
if ( var_14 != "tactical" && var_14 != "critical" )
{
var_13 thread hunt_human( var_3 );
break;
}
}
}
}
}
else
{
var_3.time_spent_hiding = 0;
var_3.last_infected_hiding_loc = var_3.origin;
}
}
}
}
}
wait 1.0;
}
}
hunt_human( var_0 )
{
self endon( "disconnect" );
self endon( "death" );
self botsetscriptgoal( var_0.origin, 0, "critical" );
maps\mp\bots\_bots_util::bot_waittill_goal_or_fail();
self botclearscriptgoal();
}
bot_infect_retrieve_knife()
{
if ( self.team == "axis" )
{
self.can_melee_enemy_time = 0;
self.melee_enemy = undefined;
self.melee_enemy_node = undefined;
self.melee_enemy_new_node_time = 0;
self.melee_self_node = undefined;
self.melee_self_new_node_time = 0;
var_0 = self botgetdifficultysetting( "throwKnifeChance" );
if ( var_0 < 0.25 )
self botsetdifficultysetting( "throwKnifeChance", 0.25 );
self botsetdifficultysetting( "allowGrenades", 1 );
self botsetflag( "path_traverse_wait", 1 );
for (;;)
{
if ( self hasweapon( "throwingknife_mp" ) )
{
if ( maps\mp\_utility::isgameparticipant( self.enemy ) )
{
var_1 = gettime();
if ( !isdefined( self.melee_enemy ) || self.melee_enemy != self.enemy )
{
self.melee_enemy = self.enemy;
self.melee_enemy_node = self.enemy getnearestnode();
self.melee_enemy_new_node_time = var_1;
}
else
{
var_2 = squared( self botgetdifficultysetting( "meleeDist" ) );
if ( distancesquared( self.enemy.origin, self.origin ) <= var_2 )
self.can_melee_enemy_time = var_1;
var_3 = self.enemy getnearestnode();
var_4 = self getnearestnode();
if ( !isdefined( self.melee_enemy_node ) || self.melee_enemy_node != var_3 )
{
self.melee_enemy_new_node_time = var_1;
self.melee_enemy_node = var_3;
}
if ( !isdefined( self.melee_self_node ) || self.melee_self_node != var_4 )
{
self.melee_self_new_node_time = var_1;
self.melee_self_node = var_4;
}
else if ( distancesquared( self.origin, self.melee_self_node.origin ) > 9216 )
self.melee_self_at_same_node_time = var_1;
if ( self.can_melee_enemy_time + 3000 < var_1 )
{
if ( self.melee_self_new_node_time + 3000 < var_1 )
{
if ( self.melee_enemy_new_node_time + 3000 < var_1 )
{
if ( bot_infect_angle_too_steep_for_knife_throw( self.origin, self.enemy.origin ) )
maps\mp\bots\_bots_util::bot_queued_process( "find_node_can_see_ent", ::bot_infect_find_node_can_see_ent, self.enemy, self.melee_self_node );
if ( !self getammocount( "throwingknife_mp" ) )
self setweaponammoclip( "throwingknife_mp", 1 );
maps\mp\_utility::waitfortimeornotify( 30, "enemy" );
self botclearscriptgoal();
}
}
}
}
}
}
wait 0.25;
}
}
}
bot_infect_angle_too_steep_for_knife_throw( var_0, var_1 )
{
if ( abs( var_0[2] - var_1[2] ) > 56.0 && distance2dsquared( var_0, var_1 ) < 2304 )
return 1;
return 0;
}
bot_infect_find_node_can_see_ent( var_0, var_1 )
{
if ( !isdefined( var_0 ) || !isdefined( var_1 ) )
return;
var_2 = 0;
if ( issubstr( var_1.type, "Begin" ) )
var_2 = 1;
var_3 = getlinkednodes( var_1 );
if ( isdefined( var_3 ) && var_3.size )
{
var_4 = common_scripts\utility::array_randomize( var_3 );
foreach ( var_6 in var_4 )
{
if ( var_2 && issubstr( var_6.type, "End" ) )
continue;
if ( bot_infect_angle_too_steep_for_knife_throw( var_6.origin, var_0.origin ) )
continue;
var_7 = self geteye() - self.origin;
var_8 = var_6.origin + var_7;
var_9 = var_0.origin;
if ( isplayer( var_0 ) )
var_9 = var_0 maps\mp\_utility::getstancecenter();
if ( sighttracepassed( var_8, var_9, 0, self, var_0 ) )
{
var_10 = vectortoyaw( var_9 - var_8 );
self botsetscriptgoalnode( var_6, "critical", var_10 );
maps\mp\bots\_bots_util::bot_waittill_goal_or_fail( 3.0 );
return;
}
wait 0.05;
}
}
}

View File

@ -0,0 +1,419 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
level.bot_tag_obj_radius = 200;
setup_callbacks();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_mugger_think;
level.bot_funcs["gametype_loadout_modify"] = ::bot_mugger_loadout_modify;
}
bot_mugger_think()
{
self notify( "bot_mugger_think" );
self endon( "bot_mugger_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self.last_killtag_tactical_goal_pos = ( 0, 0, 0 );
self.tag_getting = undefined;
self.heading_for_tag_pile = 0;
self.hiding_until_bank = 0;
self.default_meleechargedist = self botgetdifficultysetting( "meleeChargeDist" );
childthread tag_watcher();
if ( self botgetdifficultysetting( "strategyLevel" ) > 0 )
childthread tag_pile_watcher();
if ( self botgetdifficultysetting( "strategyLevel" ) > 0 )
childthread enemy_watcher();
for (;;)
{
if ( self botgetdifficultysetting( "strategyLevel" ) > 1 )
{
if ( isdefined( self.tags_carried ) && level.mugger_bank_limit <= self.tags_carried )
{
if ( !self.hiding_until_bank )
{
var_0 = getnodesinradius( self.origin, 1000, 0, 500, "node_hide" );
var_1 = self botnodepick( var_0, 3, "node_hide" );
if ( isdefined( var_1 ) )
{
self botsetscriptgoalnode( var_1, "critical" );
self.hiding_until_bank = 1;
}
}
}
else if ( self.hiding_until_bank )
{
self botclearscriptgoal();
self.hiding_until_bank = 0;
}
}
if ( !self.hiding_until_bank )
{
if ( !isdefined( self.tag_getting ) && !self.heading_for_tag_pile )
self [[ self.personality_update_function ]]();
}
wait 0.05;
}
}
enemy_watcher()
{
for (;;)
{
if ( self botgetdifficultysetting( "strategyLevel" ) < 2 )
wait 0.5;
else
wait 0.2;
if ( isdefined( self.enemy ) && isplayer( self.enemy ) && isdefined( self.enemy.tags_carried ) && self.enemy.tags_carried >= 3 && self botcanseeentity( self.enemy ) && distance( self.origin, self.enemy.origin ) <= 500 )
{
self botsetdifficultysetting( "meleeChargeDist", 500 );
self botsetflag( "prefer_melee", 1 );
self botsetflag( "throw_knife_melee", level.mugger_throwing_knife_mug_frac > 0 );
continue;
}
self botsetdifficultysetting( "meleeChargeDist", self.default_meleechargedist );
self botsetflag( "prefer_melee", 0 );
self botsetflag( "throw_knife_melee", 0 );
}
}
tag_pile_watcher()
{
for (;;)
{
level waittill( "mugger_tag_pile", var_0 );
if ( self.health <= 0 )
continue;
if ( self.hiding_until_bank )
continue;
if ( !isdefined( self.last_tag_pile_time ) || gettime() - self.last_tag_pile_time > 7500 )
{
self.last_tag_pile_time = undefined;
self.last_tag_pile_location = undefined;
self.heading_for_tag_pile = 0;
}
if ( !isdefined( self.last_tag_pile_location ) || distancesquared( self.origin, self.last_tag_pile_location ) > distancesquared( self.origin, var_0 ) )
{
self.last_tag_pile_time = gettime();
self.last_tag_pile_location = var_0;
}
}
}
bot_find_closest_tag()
{
var_0 = self getnearestnode();
var_1 = undefined;
if ( isdefined( var_0 ) )
{
var_2 = 1000000;
var_3 = common_scripts\utility::array_combine( level.dogtags, level.mugger_extra_tags );
foreach ( var_5 in var_3 )
{
if ( var_5 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) )
{
var_6 = distancesquared( self.origin, var_5.curorigin );
if ( !isdefined( var_1 ) || var_6 < var_2 )
{
if ( self botgetdifficultysetting( "strategyLevel" ) > 0 && var_6 < 122500 || var_6 < 1000000 && maps\mp\bots\_bots_gametype_conf::bot_is_tag_visible( var_5, var_0, self botgetfovdot() ) )
{
var_2 = var_6;
var_1 = var_5;
}
}
}
}
}
return var_1;
}
bot_find_visible_tags_mugger( var_0, var_1 )
{
var_2 = [];
if ( isdefined( var_0 ) )
{
var_3 = common_scripts\utility::array_combine( level.dogtags, level.mugger_extra_tags );
foreach ( var_5 in var_3 )
{
if ( var_5 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) )
{
if ( isplayer( self ) || distancesquared( self.origin, var_5.curorigin ) < 1000000 )
{
if ( maps\mp\bots\_bots_gametype_conf::bot_is_tag_visible( var_5, var_0, var_1 ) )
{
var_6 = spawnstruct();
var_6.origin = var_5.curorigin;
var_6.tag = var_5;
var_2[var_2.size] = var_6;
}
}
}
}
}
return var_2;
}
tag_watcher()
{
wait( randomfloatrange( 0, 0.5 ) );
for (;;)
{
if ( self botgetdifficultysetting( "strategyLevel" ) == 0 )
wait 3.0;
else if ( self botgetdifficultysetting( "strategyLevel" ) == 1 )
wait 1.5;
else
wait 0.5;
if ( self.health <= 0 )
continue;
if ( self.hiding_until_bank )
continue;
if ( isdefined( self.enemy ) && isplayer( self.enemy ) && self botcanseeentity( self.enemy ) )
continue;
var_0 = bot_find_closest_tag();
if ( isdefined( var_0 ) )
{
mugger_pick_up_tag( var_0 );
continue;
}
if ( !self.heading_for_tag_pile )
{
if ( isdefined( self.last_tag_pile_location ) && isdefined( self.last_tag_pile_time ) && gettime() - self.last_tag_pile_time <= 7500 )
thread mugger_go_to_tag_pile( self.last_tag_pile_location );
}
}
}
mugger_go_to_tag_pile( var_0 )
{
self endon( "disconnect" );
level endon( "game_ended" );
self.heading_for_tag_pile = 1;
var_1 = spawnstruct();
var_1.script_goal_type = "objective";
var_1.objective_radius = level.bot_tag_obj_radius;
maps\mp\bots\_bots_strategy::bot_new_tactical_goal( "kill_tag_pile", var_0, 25, var_1 );
var_2 = common_scripts\utility::waittill_any_return( "death", "tag_spotted" );
self botclearscriptgoal();
self.heading_for_tag_pile = 0;
maps\mp\bots\_bots_strategy::bot_abort_tactical_goal( "kill_tag_pile" );
}
mugger_pick_up_tag( var_0 )
{
self endon( "disconnect" );
level endon( "game_ended" );
self.tag_getting = var_0;
self notify( "tag_spotted" );
childthread notify_when_tag_picked_up( var_0, "tag_picked_up" );
maps\mp\bots\_bots_strategy::bot_abort_tactical_goal( "kill_tag" );
var_1 = var_0.curorigin;
if ( maps\mp\bots\_bots_util::bot_vectors_are_equal( self.last_killtag_tactical_goal_pos, var_0.curorigin ) )
{
var_2 = var_0.nearest_node;
if ( isdefined( var_2 ) )
{
var_3 = var_2.origin - var_1;
var_1 = var_1 + vectornormalize( var_3 ) * length( var_3 ) * 0.5;
}
}
self.last_killtag_tactical_goal_pos = var_0.curorigin;
var_4 = spawnstruct();
var_4.script_goal_type = "objective";
var_4.objective_radius = level.bot_tag_obj_radius;
maps\mp\bots\_bots_strategy::bot_new_tactical_goal( "kill_tag", var_1, 25, var_4 );
thread notify_when_tag_aborted( "tag_aborted" );
var_5 = common_scripts\utility::waittill_any_return( "death", "tag_picked_up" );
self notify( "tag_watch_stop" );
self.tag_getting = undefined;
self botclearscriptgoal();
maps\mp\bots\_bots_strategy::bot_abort_tactical_goal( "kill_tag" );
}
notify_when_tag_aborted( var_0 )
{
self endon( "disconnect" );
level endon( "game_ended" );
self endon( "tag_watch_stop" );
while ( maps\mp\bots\_bots_strategy::bot_has_tactical_goal( "kill_tag" ) )
wait 0.05;
self notify( var_0 );
}
notify_when_tag_picked_up( var_0, var_1 )
{
self endon( "disconnect" );
level endon( "game_ended" );
self endon( "tag_watch_stop" );
while ( var_0 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) )
wait 0.05;
self notify( var_1 );
}
bot_mugger_loadout_modify( var_0 )
{
var_1 = 0;
var_2 = self botgetdifficulty();
if ( var_2 == "recruit" )
var_1 = 0.1;
else if ( var_2 == "regular" )
var_1 = 0.25;
else if ( var_2 == "hardened" )
var_1 = 0.6;
else if ( var_2 == "veteran" )
var_1 = 0.9;
var_3 = var_0["loadoutEquipment"] == "throwingknife_mp";
if ( !var_3 )
{
if ( var_1 >= randomfloat( 1 ) )
{
var_0["loadoutEquipment"] = "throwingknife_mp";
var_3 = 1;
}
}
if ( var_1 >= randomfloat( 1 ) )
{
if ( var_0["loadoutOffhand"] != "concussion_grenade_mp" )
var_0["loadoutOffhand"] = "concussion_grenade_mp";
}
if ( var_1 >= randomfloat( 1 ) )
{
if ( var_0["loadoutPrimaryAttachment"] != "tactical" && var_0["loadoutPrimaryAttachment2"] != "tactical" )
{
var_4 = maps\mp\bots\_bots_loadout::bot_validate_weapon( var_0["loadoutPrimary"], var_0["loadoutPrimaryAttachment"], "tactical" );
if ( var_4 )
var_0["loadoutPrimaryAttachment2"] = "tactical";
else
{
var_4 = maps\mp\bots\_bots_loadout::bot_validate_weapon( var_0["loadoutPrimary"], "tactical", var_0["loadoutPrimaryAttachment2"] );
if ( var_4 )
var_0["loadoutPrimaryAttachment"] = "tactical";
}
}
}
if ( var_1 >= randomfloat( 1 ) )
{
if ( var_0["loadoutSecondaryAttachment"] != "tactical" && var_0["loadoutSecondaryAttachment2"] != "tactical" )
{
var_4 = maps\mp\bots\_bots_loadout::bot_validate_weapon( var_0["loadoutSecondary"], var_0["loadoutSecondaryAttachment"], "tactical" );
if ( var_4 )
var_0["loadoutSecondaryAttachment2"] = "tactical";
else
{
var_4 = maps\mp\bots\_bots_loadout::bot_validate_weapon( var_0["loadoutSecondary"], "tactical", var_0["loadoutSecondaryAttachment2"] );
if ( var_4 )
var_0["loadoutSecondaryAttachment"] = "tactical";
}
}
}
var_5 = [];
var_6 = [];
var_7 = [];
var_8 = [];
if ( var_3 )
var_8[var_8.size] = "specialty_extra_deadly";
var_8[var_8.size] = "specialty_lightweight";
var_8[var_8.size] = "specialty_marathon";
var_8[var_8.size] = "specialty_fastsprintrecovery";
var_8[var_8.size] = "specialty_stun_resistance";
for ( var_9 = 1; var_9 < 9; var_9++ )
{
if ( isdefined( var_0["loadoutPerk" + var_9] ) )
{
if ( var_0["loadoutPerk" + var_9] != "none" )
{
var_5[var_5.size] = var_0["loadoutPerk" + var_9];
var_6[var_6.size] = var_9;
continue;
}
var_7[var_7.size] = var_9;
}
}
foreach ( var_11 in var_8 )
{
if ( var_1 >= randomfloat( 1 ) )
{
if ( !common_scripts\utility::array_contains( var_5, var_11 ) )
{
var_12 = -1;
if ( var_7.size )
{
var_12 = var_7[0];
var_7 = common_scripts\utility::array_remove( var_7, var_12 );
}
else if ( var_6.size )
{
var_12 = common_scripts\utility::random( var_6 );
var_6 = common_scripts\utility::array_remove( var_6, var_12 );
}
if ( var_12 != -1 )
var_0["loadoutPerk" + var_12] = var_11;
}
}
}
if ( var_1 >= randomfloat( 1 ) )
{
if ( var_0["loadoutStreakType"] == "streaktype_assault" && var_0["loadoutStreak1"] != "airdrop_juggernaut_maniac" && var_0["loadoutStreak2"] != "airdrop_juggernaut_maniac" && var_0["loadoutStreak3"] != "airdrop_juggernaut_maniac" )
var_0["loadoutStreak3"] = "airdrop_juggernaut_maniac";
}
return var_0;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,132 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
thread bot_siege_manager_think();
setup_bot_siege();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_siege_think;
}
setup_bot_siege()
{
level.bot_gametype_precaching_done = 1;
}
bot_siege_manager_think()
{
level.siege_bot_team_need_flags = [];
maps\mp\_utility::gameflagwait( "prematch_done" );
for (;;)
{
level.siege_bot_team_need_flags = [];
foreach ( var_1 in level.players )
{
if ( !maps\mp\_utility::isreallyalive( var_1 ) && var_1.hasspawned )
{
if ( var_1.team != "spectator" && var_1.team != "neutral" )
level.siege_bot_team_need_flags[var_1.team] = 1;
}
}
var_3 = [];
foreach ( var_5 in level.flags )
{
var_6 = var_5.useobj maps\mp\gametypes\_gameobjects::getownerteam();
if ( var_6 != "neutral" )
{
if ( !isdefined( var_3[var_6] ) )
{
var_3[var_6] = 1;
continue;
}
var_3[var_6]++;
}
}
foreach ( var_6, var_9 in var_3 )
{
if ( var_9 >= 2 )
{
var_10 = maps\mp\_utility::getotherteam( var_6 );
level.siege_bot_team_need_flags[var_10] = 1;
}
}
wait 1.0;
}
}
bot_siege_think()
{
self notify( "bot_siege_think" );
self endon( "bot_siege_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
while ( !isdefined( level.bot_gametype_precaching_done ) )
wait 0.05;
while ( !isdefined( level.siege_bot_team_need_flags ) )
wait 0.05;
self botsetflag( "separation", 0 );
self botsetflag( "use_obj_path_style", 1 );
for (;;)
{
if ( isdefined( level.siege_bot_team_need_flags[self.team] ) && level.siege_bot_team_need_flags[self.team] )
bot_choose_flag();
else if ( isdefined( self.goalflag ) )
{
if ( maps\mp\bots\_bots_util::bot_is_defending() )
maps\mp\bots\_bots_strategy::bot_defend_stop();
self.goalflag = undefined;
}
wait 1.0;
}
}
bot_choose_flag()
{
var_0 = undefined;
var_1 = undefined;
foreach ( var_3 in level.flags )
{
var_4 = var_3.useobj maps\mp\gametypes\_gameobjects::getownerteam();
if ( var_4 != self.team )
{
var_5 = distancesquared( self.origin, var_3.origin );
if ( !isdefined( var_1 ) || var_5 < var_1 )
{
var_1 = var_5;
var_0 = var_3;
}
}
}
if ( isdefined( var_0 ) )
{
if ( !isdefined( self.goalflag ) || self.goalflag != var_0 )
{
self.goalflag = var_0;
maps\mp\bots\_bots_strategy::bot_capture_point( var_0.origin, 100 );
}
}
}

View File

@ -0,0 +1,207 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
setup_bot_sotf();
}
setup_callbacks()
{
level.bot_funcs["dropped_weapon_think"] = ::sotf_bot_think_seek_dropped_weapons;
level.bot_funcs["dropped_weapon_cancel"] = ::sotf_should_stop_seeking_weapon;
level.bot_funcs["crate_low_ammo_check"] = ::sotf_crate_low_ammo_check;
level.bot_funcs["crate_should_claim"] = ::sotf_crate_should_claim;
level.bot_funcs["crate_wait_use"] = ::sotf_crate_wait_use;
level.bot_funcs["crate_in_range"] = ::sotf_crate_in_range;
level.bot_funcs["crate_can_use"] = ::sotf_crate_can_use;
}
setup_bot_sotf()
{
level.bots_gametype_handles_class_choice = 1;
}
sotf_should_stop_seeking_weapon( var_0 )
{
if ( maps\mp\bots\_bots_util::bot_get_total_gun_ammo() > 0 )
{
var_1 = maps\mp\_utility::getweaponclass( self getcurrentweapon() );
if ( isdefined( var_0.object ) )
{
var_2 = var_0.object.classname;
if ( common_scripts\utility::string_starts_with( var_2, "weapon_" ) )
var_2 = getsubstr( var_2, 7 );
var_3 = maps\mp\_utility::getweaponclass( var_2 );
if ( !bot_weapon_is_better_class( var_1, var_3 ) )
return 1;
}
}
if ( !isdefined( var_0.object ) )
return 1;
return 0;
}
sotf_bot_think_seek_dropped_weapons()
{
self notify( "bot_think_seek_dropped_weapons" );
self endon( "bot_think_seek_dropped_weapons" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
for (;;)
{
var_0 = 0;
if ( self [[ level.bot_funcs["should_pickup_weapons"] ]]() && !maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
{
if ( maps\mp\bots\_bots_util::bot_out_of_ammo() )
{
var_1 = getentarray( "dropped_weapon", "targetname" );
var_2 = common_scripts\utility::get_array_of_closest( self.origin, var_1 );
if ( var_2.size > 0 )
{
var_3 = var_2[0];
maps\mp\bots\_bots::bot_seek_dropped_weapon( var_3 );
}
}
else
{
var_1 = getentarray( "dropped_weapon", "targetname" );
var_2 = common_scripts\utility::get_array_of_closest( self.origin, var_1 );
if ( var_2.size > 0 )
{
var_4 = self getnearestnode();
if ( isdefined( var_4 ) )
{
var_5 = maps\mp\_utility::getweaponclass( self getcurrentweapon() );
foreach ( var_3 in var_2 )
{
var_7 = var_3.classname;
if ( common_scripts\utility::string_starts_with( var_7, "weapon_" ) )
var_7 = getsubstr( var_7, 7 );
var_8 = maps\mp\_utility::getweaponclass( var_7 );
if ( bot_weapon_is_better_class( var_5, var_8 ) )
{
if ( !isdefined( var_3.calculated_nearest_node ) || !var_3.calculated_nearest_node )
{
var_3.nearest_node = getclosestnodeinsight( var_3.origin );
var_3.calculated_nearest_node = 1;
}
if ( isdefined( var_3.nearest_node ) && nodesvisible( var_4, var_3.nearest_node, 1 ) )
{
maps\mp\bots\_bots::bot_seek_dropped_weapon( var_3 );
break;
}
}
}
}
}
}
}
wait( randomfloatrange( 0.25, 0.75 ) );
}
}
bot_rank_weapon_class( var_0 )
{
var_1 = 0;
switch ( var_0 )
{
case "weapon_other":
case "weapon_explosive":
case "weapon_grenade":
case "weapon_projectile":
break;
case "weapon_pistol":
var_1 = 1;
break;
case "weapon_dmr":
case "weapon_sniper":
var_1 = 2;
break;
case "weapon_shotgun":
case "weapon_lmg":
case "weapon_assault":
case "weapon_smg":
var_1 = 3;
break;
}
return var_1;
}
bot_weapon_is_better_class( var_0, var_1 )
{
var_2 = bot_rank_weapon_class( var_0 );
var_3 = bot_rank_weapon_class( var_1 );
return var_3 > var_2;
}
sotf_crate_low_ammo_check()
{
var_0 = self getcurrentweapon();
var_1 = self getweaponammoclip( var_0 );
var_2 = self getweaponammostock( var_0 );
var_3 = weaponclipsize( var_0 );
return var_1 + var_2 < var_3 * 0.25;
}
sotf_crate_should_claim()
{
return 0;
}
sotf_crate_wait_use()
{
maps\mp\bots\_bots_util::bot_waittill_out_of_combat_or_time( 5000 );
}
sotf_crate_in_range( var_0 )
{
return 1;
}
sotf_crate_can_use( var_0 )
{
if ( maps\mp\bots\_bots::crate_can_use_always( var_0 ) )
{
if ( isdefined( var_0 ) && isdefined( var_0.bots_used ) && common_scripts\utility::array_contains( var_0.bots_used, self ) )
{
if ( maps\mp\bots\_bots_util::bot_out_of_ammo() )
return 1;
else
return 0;
}
var_1 = maps\mp\_utility::getweaponclass( self getcurrentweapon() );
if ( bot_rank_weapon_class( var_1 ) <= 1 )
return 1;
if ( sotf_crate_low_ammo_check() )
return 1;
return 0;
}
return 0;
}

View File

@ -0,0 +1,8 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
maps\mp\bots\_bots_gametype_sotf::setup_callbacks();
maps\mp\bots\_bots_gametype_sotf::setup_bot_sotf();
}

View File

@ -0,0 +1,243 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
maps\mp\bots\_bots_gametype_sd::setup_callbacks();
setup_callbacks();
maps\mp\bots\_bots_gametype_conf::setup_bot_conf();
maps\mp\bots\_bots_gametype_sd::bot_sd_start();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_sr_think;
}
bot_sr_think()
{
self notify( "bot_sr_think" );
self endon( "bot_sr_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
while ( !isdefined( level.bot_gametype_precaching_done ) )
wait 0.05;
self.suspend_sd_role = undefined;
childthread tag_watcher();
maps\mp\bots\_bots_gametype_sd::bot_sd_think();
}
tag_watcher()
{
for (;;)
{
wait 0.05;
if ( self.health <= 0 )
continue;
if ( !isdefined( self.role ) )
continue;
var_0 = maps\mp\bots\_bots_gametype_conf::bot_find_visible_tags( 0 );
if ( var_0.size > 0 )
{
var_1 = common_scripts\utility::random( var_0 );
if ( distancesquared( self.origin, var_1.tag.curorigin ) < 10000 )
sr_pick_up_tag( var_1.tag );
else if ( self.team == game["attackers"] )
{
if ( self.role != "atk_bomber" )
sr_pick_up_tag( var_1.tag );
}
else if ( self.role != "bomb_defuser" )
sr_pick_up_tag( var_1.tag );
}
}
}
sr_pick_up_tag( var_0 )
{
if ( isdefined( var_0.bot_picking_up ) && isdefined( var_0.bot_picking_up[self.team] ) && isalive( var_0.bot_picking_up[self.team] ) && var_0.bot_picking_up[self.team] != self )
return;
if ( sr_ally_near_tag( var_0 ) )
return;
if ( !isdefined( self.role ) )
return;
if ( maps\mp\bots\_bots_util::bot_is_defending() )
maps\mp\bots\_bots_strategy::bot_defend_stop();
var_0.bot_picking_up[self.team] = self;
var_0 thread clear_bot_on_reset();
var_0 thread clear_bot_on_bot_death( self );
self.suspend_sd_role = 1;
childthread notify_when_tag_picked_up_or_unavailable( var_0, "tag_picked_up" );
var_1 = var_0.curorigin;
self botsetscriptgoal( var_1, 0, "tactical" );
childthread watch_tag_destination( var_0 );
var_2 = maps\mp\bots\_bots_util::bot_waittill_goal_or_fail( undefined, "tag_picked_up", "new_role" );
self notify( "stop_watch_tag_destination" );
if ( var_2 == "no_path" )
{
var_1 = var_1 + ( 16 * rand_pos_or_neg(), 16 * rand_pos_or_neg(), 0 );
self botsetscriptgoal( var_1, 0, "tactical" );
var_2 = maps\mp\bots\_bots_util::bot_waittill_goal_or_fail( undefined, "tag_picked_up", "new_role" );
if ( var_2 == "no_path" )
{
var_1 = maps\mp\bots\_bots_util::bot_queued_process( "BotGetClosestNavigablePoint", maps\mp\bots\_bots_util::func_bot_get_closest_navigable_point, var_0.curorigin, 32, self );
if ( isdefined( var_1 ) )
{
self botsetscriptgoal( var_1, 0, "tactical" );
var_2 = maps\mp\bots\_bots_util::bot_waittill_goal_or_fail( undefined, "tag_picked_up", "new_role" );
}
}
}
else if ( var_2 == "bad_path" )
{
var_3 = getnodesinradiussorted( var_0.curorigin, 256, 0, level.bot_tag_allowable_jump_height + 55 );
if ( var_3.size > 0 )
{
var_4 = ( var_0.curorigin[0], var_0.curorigin[1], ( var_3[0].origin[2] + var_0.curorigin[2] ) * 0.5 );
self botsetscriptgoal( var_4, 0, "tactical" );
var_2 = maps\mp\bots\_bots_util::bot_waittill_goal_or_fail( undefined, "tag_picked_up", "new_role" );
}
}
if ( var_2 == "goal" && var_0 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) )
wait 3.0;
if ( self bothasscriptgoal() && isdefined( var_1 ) )
{
var_5 = self botgetscriptgoal();
if ( maps\mp\bots\_bots_util::bot_vectors_are_equal( var_5, var_1 ) )
self botclearscriptgoal();
}
self notify( "stop_tag_watcher" );
var_0.bot_picking_up[self.team] = undefined;
self.suspend_sd_role = undefined;
}
watch_tag_destination( var_0 )
{
self endon( "stop_watch_tag_destination" );
for (;;)
{
if ( !var_0 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) )
wait 0.05;
var_1 = self botgetscriptgoal();
wait 0.05;
}
}
sr_ally_near_tag( var_0 )
{
var_1 = distance( self.origin, var_0.curorigin );
var_2 = maps\mp\bots\_bots_gametype_sd::get_living_players_on_team( self.team, 1 );
foreach ( var_4 in var_2 )
{
if ( var_4 != self && isdefined( var_4.role ) && var_4.role != "atk_bomber" && var_4.role != "bomb_defuser" )
{
var_5 = distance( var_4.origin, var_0.curorigin );
if ( var_5 < var_1 * 0.5 )
return 1;
}
}
return 0;
}
rand_pos_or_neg()
{
return randomintrange( 0, 2 ) * 2 - 1;
}
clear_bot_on_reset()
{
self waittill( "reset" );
self.bot_picking_up = [];
}
clear_bot_on_bot_death( var_0 )
{
self endon( "reset" );
var_1 = var_0.team;
var_0 common_scripts\utility::waittill_any( "death", "disconnect" );
self.bot_picking_up[var_1] = undefined;
}
notify_when_tag_picked_up_or_unavailable( var_0, var_1 )
{
self endon( "stop_tag_watcher" );
while ( var_0 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) && !maps\mp\bots\_bots_gametype_conf::bot_check_tag_above_head( var_0 ) )
wait 0.05;
self notify( var_1 );
}
sr_camp_tag( var_0 )
{
if ( isdefined( var_0.bot_camping ) && isdefined( var_0.bot_camping[self.team] ) && isalive( var_0.bot_camping[self.team] ) && var_0.bot_camping[self.team] != self )
return;
if ( !isdefined( self.role ) )
return;
if ( maps\mp\bots\_bots_util::bot_is_defending() )
maps\mp\bots\_bots_strategy::bot_defend_stop();
var_0.bot_camping[self.team] = self;
var_0 thread clear_bot_camping_on_reset();
var_0 thread clear_bot_camping_on_bot_death( self );
self.suspend_sd_role = 1;
maps\mp\bots\_bots_personality::clear_camper_data();
var_1 = self.role;
while ( var_0 maps\mp\gametypes\_gameobjects::caninteractwith( self.team ) && self.role == var_1 )
{
if ( maps\mp\bots\_bots_personality::should_select_new_ambush_point() )
{
if ( maps\mp\bots\_bots_personality::find_ambush_node( var_0.curorigin, 1000 ) )
childthread maps\mp\bots\_bots_gametype_conf::bot_camp_tag( var_0, "tactical", "new_role" );
}
wait 0.05;
}
self notify( "stop_camping_tag" );
self botclearscriptgoal();
var_0.bot_camping[self.team] = undefined;
self.suspend_sd_role = undefined;
}
clear_bot_camping_on_reset()
{
self waittill( "reset" );
self.bot_camping = [];
}
clear_bot_camping_on_bot_death( var_0 )
{
self endon( "reset" );
var_1 = var_0.team;
var_0 common_scripts\utility::waittill_any( "death", "disconnect" );
self.bot_camping[var_1] = undefined;
}

View File

@ -0,0 +1,148 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
setup_callbacks();
setup_bot_war();
}
setup_callbacks()
{
level.bot_funcs["gametype_think"] = ::bot_war_think;
level.bot_funcs["commander_gametype_tactics"] = ::bot_tdm_apply_commander_tactics;
}
setup_bot_war()
{
if ( maps\mp\_utility::bot_is_fireteam_mode() )
{
level.bot_team_tdm_personality = "default";
level.bot_fireteam_buddy_up = 0;
}
}
bot_war_think()
{
self notify( "bot_war_think" );
self endon( "bot_war_think" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self endon( "owner_disconnect" );
for (;;)
{
self [[ self.personality_update_function ]]();
wait 0.05;
}
}
bot_tdm_apply_commander_tactics( var_0 )
{
var_1 = 0;
var_2 = level.bot_fireteam_buddy_up;
var_3 = 0;
level.bot_fireteam_buddy_up = 0;
switch ( var_0 )
{
case "tactic_none":
level.bot_team_tdm_personality = "revert";
var_1 = 1;
break;
case "tactic_war_hp":
level.bot_team_tdm_personality = "revert";
level thread maps\mp\bots\_bots_fireteam::fireteam_tdm_find_hunt_zone( self.team );
var_3 = 1;
var_1 = 1;
break;
case "tactic_war_buddy":
level.bot_team_tdm_personality = "revert";
level.bot_fireteam_buddy_up = 1;
var_1 = 1;
break;
case "tactic_war_hyg":
level.bot_team_tdm_personality = "camper";
var_1 = 1;
break;
}
if ( !var_3 )
level maps\mp\bots\_bots_fireteam::fireteam_tdm_hunt_end( self.team );
if ( var_1 )
{
foreach ( var_5 in level.players )
{
if ( !isdefined( var_5.team ) )
continue;
if ( isbot( var_5 ) && var_5.team == self.team )
{
var_5 botsetflag( "force_sprint", 0 );
if ( level.bot_team_tdm_personality == "revert" )
{
if ( isdefined( var_5.fireteam_personality_original ) )
{
var_5 notify( "stop_camping_tag" );
var_5 maps\mp\bots\_bots_personality::clear_camper_data();
var_5 maps\mp\bots\_bots_util::bot_set_personality( var_5.fireteam_personality_original );
var_5.can_camp_near_others = undefined;
var_5.camping_needs_fallback_camp_location = undefined;
}
continue;
}
if ( !isdefined( var_5.fireteam_personality_original ) )
var_5.fireteam_personality_original = var_5 botgetpersonality();
var_5 notify( "stop_camping_tag" );
var_5 maps\mp\bots\_bots_personality::clear_camper_data();
var_5 maps\mp\bots\_bots_util::bot_set_personality( level.bot_team_tdm_personality );
if ( level.bot_team_tdm_personality == "camper" )
{
var_5.can_camp_near_others = 1;
var_5.camping_needs_fallback_camp_location = 1;
}
}
}
}
if ( level.bot_fireteam_buddy_up )
{
foreach ( var_5 in level.players )
{
if ( !isdefined( var_5.team ) )
continue;
if ( var_5.team == self.team )
{
if ( isbot( var_5 ) )
var_5 thread maps\mp\bots\_bots_fireteam::bot_fireteam_buddy_search();
}
}
}
else if ( var_2 )
{
foreach ( var_5 in level.players )
{
if ( !isdefined( var_5.team ) )
continue;
if ( var_5.team == self.team )
{
if ( isbot( var_5 ) )
{
var_5.owner = undefined;
var_5.bot_fireteam_follower = undefined;
var_5 notify( "buddy_cancel" );
var_5 maps\mp\bots\_bots_personality::bot_assign_personality_functions();
}
}
}
}
}

678
maps/mp/bots/_bots_ks.gsc Normal file
View File

@ -0,0 +1,678 @@
// 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;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,746 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
setup_personalities()
{
level.bot_personality = [];
level.bot_personality_list = [];
level.bot_personality["active"][0] = "default";
level.bot_personality["active"][1] = "run_and_gun";
level.bot_personality["active"][2] = "cqb";
level.bot_personality["stationary"][0] = "camper";
level.bot_personality_type = [];
foreach ( var_5, var_1 in level.bot_personality )
{
foreach ( var_3 in var_1 )
{
level.bot_personality_type[var_3] = var_5;
level.bot_personality_list[level.bot_personality_list.size] = var_3;
}
}
level.bot_personality_types_desired = [];
level.bot_personality_types_desired["active"] = 2;
level.bot_personality_types_desired["stationary"] = 1;
level.bot_pers_init = [];
level.bot_pers_init["default"] = ::init_personality_default;
level.bot_pers_init["camper"] = ::init_personality_camper;
level.bot_pers_update["default"] = ::update_personality_default;
level.bot_pers_update["camper"] = ::update_personality_camper;
}
bot_assign_personality_functions()
{
self.personality = self botgetpersonality();
self.personality_init_function = level.bot_pers_init[self.personality];
if ( !isdefined( self.personality_init_function ) )
self.personality_init_function = level.bot_pers_init["default"];
self [[ self.personality_init_function ]]();
self.personality_update_function = level.bot_pers_update[self.personality];
if ( !isdefined( self.personality_update_function ) )
self.personality_update_function = level.bot_pers_update["default"];
}
bot_balance_personality()
{
if ( isdefined( self.personalitymanuallyset ) && self.personalitymanuallyset )
return;
if ( maps\mp\_utility::bot_is_fireteam_mode() )
return;
var_0 = [];
var_1 = [];
foreach ( var_7, var_3 in level.bot_personality )
{
var_1[var_7] = 0;
foreach ( var_5 in var_3 )
var_0[var_5] = 0;
}
foreach ( var_9 in level.players )
{
if ( isbot( var_9 ) && isdefined( var_9.team ) && var_9.team == self.team && var_9 != self && isdefined( var_9.has_balanced_personality ) )
{
var_5 = var_9 botgetpersonality();
var_7 = level.bot_personality_type[var_5];
var_0[var_5] = var_0[var_5] + 1;
var_1[var_7] = var_1[var_7] + 1;
}
}
var_11 = undefined;
while ( !isdefined( var_11 ) )
{
for ( var_12 = level.bot_personality_types_desired; var_12.size > 0; var_12[var_13] = undefined )
{
var_13 = maps\mp\bots\_bots_util::bot_get_string_index_for_integer( var_12, randomint( var_12.size ) );
var_1[var_13] = var_1[var_13] - level.bot_personality_types_desired[var_13];
if ( var_1[var_13] < 0 )
{
var_11 = var_13;
break;
}
}
}
var_14 = undefined;
var_15 = undefined;
var_16 = 9999;
var_17 = undefined;
var_18 = -9999;
var_19 = common_scripts\utility::array_randomize( level.bot_personality[var_11] );
foreach ( var_5 in var_19 )
{
if ( var_0[var_5] < var_16 )
{
var_15 = var_5;
var_16 = var_0[var_5];
}
if ( var_0[var_5] > var_18 )
{
var_17 = var_5;
var_18 = var_0[var_5];
}
}
if ( var_18 - var_16 >= 2 )
var_14 = var_15;
else
var_14 = common_scripts\utility::random( level.bot_personality[var_11] );
if ( self botgetpersonality() != var_14 )
self botsetpersonality( var_14 );
self.has_balanced_personality = 1;
}
init_personality_camper()
{
clear_camper_data();
}
init_personality_default()
{
clear_camper_data();
}
update_personality_camper()
{
if ( should_select_new_ambush_point() && !maps\mp\bots\_bots_util::bot_is_defending() && !maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
{
var_0 = self botgetscriptgoaltype();
var_1 = 0;
if ( !isdefined( self.camper_time_started_hunting ) )
self.camper_time_started_hunting = 0;
var_2 = var_0 == "hunt";
var_3 = gettime() > self.camper_time_started_hunting + 10000;
if ( ( !var_2 || var_3 ) && !maps\mp\bots\_bots_util::bot_out_of_ammo() )
{
if ( !self bothasscriptgoal() )
bot_random_path();
var_1 = find_camp_node();
if ( !var_1 )
self.camper_time_started_hunting = gettime();
}
if ( isdefined( var_1 ) && var_1 )
{
self.ambush_entrances = maps\mp\bots\_bots_util::bot_queued_process( "bot_find_ambush_entrances", ::bot_find_ambush_entrances, self.node_ambushing_from, 1 );
var_4 = maps\mp\bots\_bots_strategy::bot_get_ambush_trap_item( "trap_directional", "trap", "c4" );
if ( isdefined( var_4 ) )
{
var_5 = gettime();
maps\mp\bots\_bots_strategy::bot_set_ambush_trap( var_4, self.ambush_entrances, self.node_ambushing_from, self.ambush_yaw );
var_5 = gettime() - var_5;
if ( var_5 > 0 && isdefined( self.ambush_end ) && isdefined( self.node_ambushing_from ) )
{
self.ambush_end = self.ambush_end + var_5;
self.node_ambushing_from.bot_ambush_end = self.ambush_end + 10000;
}
}
if ( !maps\mp\bots\_bots_strategy::bot_has_tactical_goal() && !maps\mp\bots\_bots_util::bot_is_defending() && isdefined( self.node_ambushing_from ) )
{
self botsetscriptgoalnode( self.node_ambushing_from, "camp", self.ambush_yaw );
thread clear_script_goal_on( "bad_path", "node_relinquished", "out_of_ammo" );
thread watch_out_of_ammo();
thread bot_add_ambush_time_delayed( "clear_camper_data", "goal" );
thread bot_watch_entrances_delayed( "clear_camper_data", "bot_add_ambush_time_delayed", self.ambush_entrances, self.ambush_yaw );
return;
}
}
else
{
if ( var_0 == "camp" )
self botclearscriptgoal();
update_personality_default();
}
}
}
update_personality_default()
{
var_0 = undefined;
var_1 = self bothasscriptgoal();
if ( var_1 )
var_0 = self botgetscriptgoal();
if ( !maps\mp\bots\_bots_strategy::bot_has_tactical_goal() && !maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
{
var_2 = undefined;
var_3 = undefined;
if ( var_1 )
{
var_2 = distancesquared( self.origin, var_0 );
var_3 = self botgetscriptgoalradius();
var_4 = var_3 * 2;
if ( isdefined( self.bot_memory_goal ) && var_2 < var_4 * var_4 )
{
var_5 = botmemoryflags( "investigated" );
botflagmemoryevents( 0, gettime() - self.bot_memory_goal_time, 1, self.bot_memory_goal, var_4, "kill", var_5, self );
botflagmemoryevents( 0, gettime() - self.bot_memory_goal_time, 1, self.bot_memory_goal, var_4, "death", var_5, self );
self.bot_memory_goal = undefined;
self.bot_memory_goal_time = undefined;
}
}
if ( !var_1 || var_2 < var_3 * var_3 )
{
var_6 = bot_random_path();
if ( var_6 && randomfloat( 100 ) < 25 )
{
var_7 = maps\mp\bots\_bots_strategy::bot_get_ambush_trap_item( "trap_directional", "trap" );
if ( isdefined( var_7 ) )
{
var_8 = self botgetscriptgoal();
if ( isdefined( var_8 ) )
{
var_9 = getclosestnodeinsight( var_8 );
if ( isdefined( var_9 ) )
{
var_10 = maps\mp\bots\_bots_util::bot_queued_process( "bot_find_ambush_entrances", ::bot_find_ambush_entrances, var_9, 0 );
var_11 = maps\mp\bots\_bots_strategy::bot_set_ambush_trap( var_7, var_10, var_9 );
if ( !isdefined( var_11 ) || var_11 )
{
self botclearscriptgoal();
var_6 = bot_random_path();
}
}
}
}
}
if ( var_6 )
thread clear_script_goal_on( "enemy", "bad_path", "goal", "node_relinquished", "search_end" );
}
}
}
clear_script_goal_on( var_0, var_1, var_2, var_3, var_4 )
{
self notify( "clear_script_goal_on" );
self endon( "clear_script_goal_on" );
self endon( "death" );
self endon( "disconnect" );
self endon( "start_tactical_goal" );
var_5 = self botgetscriptgoal();
var_6 = 1;
while ( var_6 )
{
var_7 = common_scripts\utility::waittill_any_return( var_0, var_1, var_2, var_3, var_4, "script_goal_changed" );
var_6 = 0;
var_8 = 1;
if ( var_7 == "node_relinquished" || var_7 == "goal" || var_7 == "script_goal_changed" )
{
if ( !self bothasscriptgoal() )
var_8 = 0;
else
{
var_9 = self botgetscriptgoal();
var_8 = maps\mp\bots\_bots_util::bot_vectors_are_equal( var_5, var_9 );
}
}
if ( var_7 == "enemy" && isdefined( self.enemy ) )
{
var_8 = 0;
var_6 = 1;
}
if ( var_8 )
self botclearscriptgoal();
}
}
watch_out_of_ammo()
{
self notify( "watch_out_of_ammo" );
self endon( "watch_out_of_ammo" );
self endon( "death" );
self endon( "disconnect" );
while ( !maps\mp\bots\_bots_util::bot_out_of_ammo() )
wait 0.5;
self notify( "out_of_ammo" );
}
bot_add_ambush_time_delayed( var_0, var_1 )
{
self notify( "bot_add_ambush_time_delayed" );
self endon( "bot_add_ambush_time_delayed" );
self endon( "death" );
self endon( "disconnect" );
if ( isdefined( var_0 ) )
self endon( var_0 );
self endon( "node_relinquished" );
self endon( "bad_path" );
var_2 = gettime();
if ( isdefined( var_1 ) )
self waittill( var_1 );
if ( isdefined( self.ambush_end ) && isdefined( self.node_ambushing_from ) )
{
self.ambush_end = self.ambush_end + ( gettime() - var_2 );
self.node_ambushing_from.bot_ambush_end = self.ambush_end + 10000;
}
self notify( "bot_add_ambush_time_delayed" );
}
bot_watch_entrances_delayed( var_0, var_1, var_2, var_3 )
{
self notify( "bot_watch_entrances_delayed" );
if ( var_2.size > 0 )
{
self endon( "bot_watch_entrances_delayed" );
self endon( "death" );
self endon( "disconnect" );
self endon( var_0 );
self endon( "node_relinquished" );
self endon( "bad_path" );
if ( isdefined( var_1 ) )
self waittill( var_1 );
self endon( "path_enemy" );
childthread maps\mp\bots\_bots_util::bot_watch_nodes( var_2, var_3, 0, self.ambush_end );
childthread bot_monitor_watch_entrances_camp();
}
}
bot_monitor_watch_entrances_camp()
{
self notify( "bot_monitor_watch_entrances_camp" );
self endon( "bot_monitor_watch_entrances_camp" );
self notify( "bot_monitor_watch_entrances" );
self endon( "bot_monitor_watch_entrances" );
self endon( "disconnect" );
self endon( "death" );
while ( !isdefined( self.watch_nodes ) )
wait 0.05;
while ( isdefined( self.watch_nodes ) )
{
foreach ( var_1 in self.watch_nodes )
var_1.watch_node_chance[self.entity_number] = 1.0;
maps\mp\bots\_bots_strategy::prioritize_watch_nodes_toward_enemies( 0.5 );
wait( randomfloatrange( 0.5, 0.75 ) );
}
}
bot_find_ambush_entrances( var_0, var_1 )
{
self endon( "disconnect" );
var_2 = [];
var_3 = findentrances( var_0.origin );
if ( isdefined( var_3 ) && var_3.size > 0 )
{
wait 0.05;
var_4 = var_0.type != "Cover Stand" && var_0.type != "Conceal Stand";
if ( var_4 && var_1 )
var_3 = self botnodescoremultiple( var_3, "node_exposure_vis", var_0.origin, "crouch" );
foreach ( var_6 in var_3 )
{
if ( distancesquared( self.origin, var_6.origin ) < 90000 )
continue;
if ( var_4 && var_1 )
{
wait 0.05;
if ( !maps\mp\bots\_bots_util::entrance_visible_from( var_6.origin, var_0.origin, "crouch" ) )
continue;
}
var_2[var_2.size] = var_6;
}
}
return var_2;
}
bot_filter_ambush_inuse( var_0 )
{
var_1 = [];
var_2 = gettime();
var_3 = var_0.size;
for ( var_4 = 0; var_4 < var_3; var_4++ )
{
var_5 = var_0[var_4];
if ( !isdefined( var_5.bot_ambush_end ) || var_2 > var_5.bot_ambush_end )
var_1[var_1.size] = var_5;
}
return var_1;
}
bot_filter_ambush_vicinity( var_0, var_1, var_2 )
{
var_3 = [];
var_4 = [];
var_5 = var_2 * var_2;
if ( level.teambased )
{
foreach ( var_7 in level.participants )
{
if ( !maps\mp\_utility::isreallyalive( var_7 ) )
continue;
if ( !isdefined( var_7.team ) )
continue;
if ( var_7.team == var_1.team && var_7 != var_1 && isdefined( var_7.node_ambushing_from ) )
var_4[var_4.size] = var_7.node_ambushing_from.origin;
}
}
var_9 = var_4.size;
var_10 = var_0.size;
for ( var_11 = 0; var_11 < var_10; var_11++ )
{
var_12 = 0;
var_13 = var_0[var_11];
for ( var_14 = 0; !var_12 && var_14 < var_9; var_14++ )
{
var_15 = distancesquared( var_4[var_14], var_13.origin );
var_12 = var_15 < var_5;
}
if ( !var_12 )
var_3[var_3.size] = var_13;
}
return var_3;
}
clear_camper_data()
{
self notify( "clear_camper_data" );
if ( isdefined( self.node_ambushing_from ) && isdefined( self.node_ambushing_from.bot_ambush_end ) )
self.node_ambushing_from.bot_ambush_end = undefined;
self.node_ambushing_from = undefined;
self.point_to_ambush = undefined;
self.ambush_yaw = undefined;
self.ambush_entrances = undefined;
self.ambush_duration = randomintrange( 20000, 30000 );
self.ambush_end = -1;
}
should_select_new_ambush_point()
{
if ( maps\mp\bots\_bots_strategy::bot_has_tactical_goal() )
return 0;
if ( gettime() > self.ambush_end )
return 1;
if ( !self bothasscriptgoal() )
return 1;
return 0;
}
find_camp_node()
{
self notify( "find_camp_node" );
self endon( "find_camp_node" );
return maps\mp\bots\_bots_util::bot_queued_process( "find_camp_node_worker", ::find_camp_node_worker );
}
find_camp_node_worker()
{
self notify( "find_camp_node_worker" );
self endon( "find_camp_node_worker" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
clear_camper_data();
if ( level.zonecount <= 0 )
return 0;
var_0 = getzonenearest( self.origin );
var_1 = undefined;
var_2 = undefined;
var_3 = self.angles;
if ( isdefined( var_0 ) )
{
var_4 = botzonenearestcount( var_0, self.team, -1, "enemy_predict", ">", 0, "ally", "<", 1 );
if ( !isdefined( var_4 ) )
var_4 = botzonenearestcount( var_0, self.team, -1, "enemy_predict", ">", 0 );
if ( !isdefined( var_4 ) )
{
var_5 = -1;
var_6 = -1;
for ( var_7 = 0; var_7 < level.zonecount; var_7++ )
{
var_8 = distance2dsquared( getzoneorigin( var_7 ), self.origin );
if ( var_8 > var_5 )
{
var_5 = var_8;
var_6 = var_7;
}
}
var_4 = var_6;
}
var_9 = getzonepath( var_0, var_4 );
if ( isdefined( var_9 ) && var_9.size > 0 )
{
for ( var_10 = 0; var_10 <= int( var_9.size / 2 ); var_10++ )
{
var_1 = var_9[var_10];
var_2 = var_9[int( min( var_10 + 1, var_9.size - 1 ) )];
if ( botzonegetcount( var_2, self.team, "enemy_predict" ) != 0 )
break;
}
if ( isdefined( var_1 ) && isdefined( var_2 ) && var_1 != var_2 )
{
var_3 = getzoneorigin( var_2 ) - getzoneorigin( var_1 );
var_3 = vectortoangles( var_3 );
}
}
}
var_11 = undefined;
if ( isdefined( var_1 ) )
{
var_12 = 1;
var_13 = 1;
var_14 = 0;
while ( var_12 )
{
var_15 = getzonenodesbydist( var_1, 800 * var_13, 1 );
if ( var_15.size > 1024 )
var_15 = getzonenodes( var_1, 0 );
wait 0.05;
var_16 = randomint( 100 );
if ( var_16 < 66 && var_16 >= 33 )
var_3 = ( var_3[0], var_3[1] + 45, 0 );
else if ( var_16 < 33 )
var_3 = ( var_3[0], var_3[1] - 45, 0 );
if ( var_15.size > 0 )
{
var_17 = int( min( max( 1, var_15.size * 0.15 ), 5 ) );
if ( var_14 )
var_15 = self botnodepickmultiple( var_15, var_17, var_17, "node_camp", anglestoforward( var_3 ), "lenient" );
else
var_15 = self botnodepickmultiple( var_15, var_17, var_17, "node_camp", anglestoforward( var_3 ) );
var_15 = bot_filter_ambush_inuse( var_15 );
if ( !isdefined( self.can_camp_near_others ) || !self.can_camp_near_others )
{
var_18 = 800;
var_15 = bot_filter_ambush_vicinity( var_15, self, var_18 );
}
if ( var_15.size > 0 )
var_11 = common_scripts\utility::random_weight_sorted( var_15 );
}
if ( isdefined( var_11 ) )
var_12 = 0;
else if ( isdefined( self.camping_needs_fallback_camp_location ) )
{
if ( var_13 == 1 && !var_14 )
var_13 = 3;
else if ( var_13 == 3 && !var_14 )
var_14 = 1;
else if ( var_13 == 3 && var_14 )
var_12 = 0;
}
else
var_12 = 0;
if ( var_12 )
wait 0.05;
}
}
if ( !isdefined( var_11 ) || !self botnodeavailable( var_11 ) )
return 0;
self.node_ambushing_from = var_11;
self.ambush_end = gettime() + self.ambush_duration;
self.node_ambushing_from.bot_ambush_end = self.ambush_end;
self.ambush_yaw = var_3[1];
return 1;
}
find_ambush_node( var_0, var_1 )
{
clear_camper_data();
if ( isdefined( var_0 ) )
self.point_to_ambush = var_0;
else
{
var_2 = undefined;
var_3 = getnodesinradius( self.origin, 5000, 0, 2000 );
if ( var_3.size > 0 )
var_2 = self botnodepick( var_3, var_3.size * 0.25, "node_traffic" );
if ( isdefined( var_2 ) )
self.point_to_ambush = var_2.origin;
else
return 0;
}
var_4 = 2000;
if ( isdefined( var_1 ) )
var_4 = var_1;
var_5 = getnodesinradius( self.point_to_ambush, var_4, 0, 1000 );
var_6 = undefined;
if ( var_5.size > 0 )
{
var_7 = int( max( 1, int( var_5.size * 0.15 ) ) );
var_5 = self botnodepickmultiple( var_5, var_7, var_7, "node_ambush", self.point_to_ambush );
}
var_5 = bot_filter_ambush_inuse( var_5 );
if ( var_5.size > 0 )
var_6 = common_scripts\utility::random_weight_sorted( var_5 );
if ( !isdefined( var_6 ) || !self botnodeavailable( var_6 ) )
return 0;
self.node_ambushing_from = var_6;
self.ambush_end = gettime() + self.ambush_duration;
self.node_ambushing_from.bot_ambush_end = self.ambush_end;
var_8 = vectornormalize( self.point_to_ambush - self.node_ambushing_from.origin );
var_9 = vectortoangles( var_8 );
self.ambush_yaw = var_9[1];
return 1;
}
bot_random_path()
{
if ( maps\mp\bots\_bots_util::bot_is_remote_or_linked() )
return 0;
var_0 = level.bot_random_path_function[self.team];
return self [[ var_0 ]]();
}
bot_random_path_default()
{
var_0 = 0;
var_1 = 50;
if ( self.personality == "camper" )
var_1 = 0;
var_2 = undefined;
if ( randomint( 100 ) < var_1 )
var_2 = maps\mp\bots\_bots_util::bot_recent_point_of_interest();
if ( !isdefined( var_2 ) )
{
var_3 = self botfindnoderandom();
if ( isdefined( var_3 ) )
var_2 = var_3.origin;
}
if ( isdefined( var_2 ) )
var_0 = self botsetscriptgoal( var_2, 128, "hunt" );
return var_0;
}
bot_setup_callback_class()
{
if ( maps\mp\bots\_bots_loadout::bot_setup_loadout_callback() )
return "callback";
else
return "class0";
}

View File

@ -0,0 +1,331 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
bot_killstreak_sentry( var_0, var_1, var_2, var_3 )
{
self endon( "bot_sentry_exited" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
wait( randomintrange( 3, 5 ) );
while ( isdefined( self.sentry_place_delay ) && gettime() < self.sentry_place_delay )
wait 1;
if ( isdefined( self.enemy ) && self.enemy.health > 0 && self botcanseeentity( self.enemy ) )
return 1;
var_4 = self.origin;
if ( var_3 != "hide_nonlethal" )
{
var_4 = bot_sentry_choose_target( var_3 );
if ( !isdefined( var_4 ) )
return 1;
}
bot_sentry_add_goal( var_0, var_4, var_3, var_1 );
while ( maps\mp\bots\_bots_strategy::bot_has_tactical_goal( "sentry_placement" ) )
wait 0.5;
return 1;
}
bot_sentry_add_goal( var_0, var_1, var_2, var_3 )
{
var_4 = bot_sentry_choose_placement( var_0, var_1, var_2, var_3 );
if ( isdefined( var_4 ) )
{
maps\mp\bots\_bots_strategy::bot_abort_tactical_goal( "sentry_placement" );
var_5 = spawnstruct();
var_5.object = var_4;
var_5.script_goal_yaw = var_4.yaw;
var_5.script_goal_radius = 10;
var_5.start_thread = ::bot_sentry_path_start;
var_5.end_thread = ::bot_sentry_cancel;
var_5.should_abort = ::bot_sentry_should_abort;
var_5.action_thread = ::bot_sentry_activate;
self.placingitemstreakname = var_0.streakname;
maps\mp\bots\_bots_strategy::bot_new_tactical_goal( "sentry_placement", var_4.node.origin, 0, var_5 );
}
}
bot_sentry_should_abort( var_0 )
{
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
if ( isdefined( self.enemy ) && self.enemy.health > 0 && self botcanseeentity( self.enemy ) )
return 1;
self.sentry_place_delay = gettime() + 1000;
return 0;
}
bot_sentry_cancel_failsafe()
{
self endon( "death" );
self endon( "disconnect" );
self endon( "bot_sentry_canceled" );
self endon( "bot_sentry_ensure_exit" );
level endon( "game_ended" );
for (;;)
{
if ( isdefined( self.enemy ) && self.enemy.health > 0 && self botcanseeentity( self.enemy ) )
thread bot_sentry_cancel();
wait 0.05;
}
}
bot_sentry_path_start( var_0 )
{
thread bot_sentry_path_thread( var_0 );
}
bot_sentry_path_thread( var_0 )
{
self endon( "stop_tactical_goal" );
self endon( "stop_goal_aborted_watch" );
self endon( "bot_sentry_canceled" );
self endon( "bot_sentry_exited" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
while ( isdefined( var_0.object ) && isdefined( var_0.object.weapon ) )
{
if ( distance2d( self.origin, var_0.object.node.origin ) < 400 )
{
thread maps\mp\bots\_bots_util::bot_force_stance_for_time( "stand", 5.0 );
thread bot_sentry_cancel_failsafe();
maps\mp\bots\_bots_ks::bot_switch_to_killstreak_weapon( var_0.object.killstreak_info, var_0.object.killstreaks_array, var_0.object.weapon );
return;
}
wait 0.05;
}
}
bot_sentry_choose_target( var_0 )
{
var_1 = maps\mp\bots\_bots_util::defend_valid_center();
if ( isdefined( var_1 ) )
return var_1;
if ( isdefined( self.node_ambushing_from ) )
return self.node_ambushing_from.origin;
var_2 = getnodesinradius( self.origin, 1000, 0, 512 );
var_3 = 5;
if ( var_0 != "turret" )
{
if ( self botgetdifficultysetting( "strategyLevel" ) == 1 )
var_3 = 10;
else if ( self botgetdifficultysetting( "strategyLevel" ) == 0 )
var_3 = 15;
}
if ( var_0 == "turret_air" )
var_4 = self botnodepick( var_2, var_3, "node_traffic", "ignore_no_sky" );
else
var_4 = self botnodepick( var_2, var_3, "node_traffic" );
if ( isdefined( var_4 ) )
return var_4.origin;
}
bot_sentry_choose_placement( var_0, var_1, var_2, var_3 )
{
var_4 = undefined;
var_5 = getnodesinradius( var_1, 1000, 0, 512 );
var_6 = 5;
if ( var_2 != "turret" )
{
if ( self botgetdifficultysetting( "strategyLevel" ) == 1 )
var_6 = 10;
else if ( self botgetdifficultysetting( "strategyLevel" ) == 0 )
var_6 = 15;
}
if ( var_2 == "turret_air" )
var_7 = self botnodepick( var_5, var_6, "node_sentry", var_1, "ignore_no_sky" );
else if ( var_2 == "trap" )
var_7 = self botnodepick( var_5, var_6, "node_traffic" );
else if ( var_2 == "hide_nonlethal" )
var_7 = self botnodepick( var_5, var_6, "node_hide" );
else
var_7 = self botnodepick( var_5, var_6, "node_sentry", var_1 );
if ( isdefined( var_7 ) )
{
var_4 = spawnstruct();
var_4.node = var_7;
if ( var_1 != var_7.origin && var_2 != "hide_nonlethal" )
var_4.yaw = vectortoyaw( var_1 - var_7.origin );
else
var_4.yaw = undefined;
var_4.weapon = var_0.weapon;
var_4.killstreak_info = var_0;
var_4.killstreaks_array = var_3;
}
return var_4;
}
bot_sentry_carried_obj()
{
if ( isdefined( self.carriedsentry ) )
return self.carriedsentry;
if ( isdefined( self.carriedims ) )
return self.carriedims;
if ( isdefined( self.carrieditem ) )
return self.carrieditem;
}
bot_sentry_activate( var_0 )
{
var_1 = 0;
var_2 = bot_sentry_carried_obj();
if ( isdefined( var_2 ) )
{
var_3 = 0;
if ( !var_2.canbeplaced )
{
var_4 = 0.75;
var_5 = gettime();
var_6 = self.angles[1];
if ( isdefined( var_0.object.yaw ) )
var_6 = var_0.object.yaw;
var_7 = [];
var_7[0] = var_6 + 180;
var_7[1] = var_6 + 135;
var_7[2] = var_6 - 135;
var_8 = 1000;
foreach ( var_10 in var_7 )
{
var_11 = playerphysicstrace( var_0.object.node.origin, var_0.object.node.origin + anglestoforward( ( 0, var_10 + 180, 0 ) ) * 100 );
var_12 = distance2d( var_11, var_0.object.node.origin );
if ( var_12 < var_8 )
{
var_8 = var_12;
self botsetscriptmove( var_10, var_4 );
self botlookatpoint( var_0.object.node.origin, var_4, "script_forced" );
}
}
while ( !var_3 && isdefined( var_2 ) && !var_2.canbeplaced )
{
var_14 = float( gettime() - var_5 ) / 1000.0;
if ( !var_2.canbeplaced && var_14 > var_4 )
{
var_3 = 1;
self.sentry_place_delay = gettime() + 30000;
}
wait 0.05;
}
}
if ( isdefined( var_2 ) && var_2.canbeplaced )
{
bot_send_place_notify();
var_1 = 1;
}
}
wait 0.25;
bot_sentry_ensure_exit();
return var_1;
}
bot_send_place_notify()
{
self notify( "place_sentry" );
self notify( "place_ims" );
self notify( "placePlaceable" );
}
bot_send_cancel_notify()
{
self switchtoweapon( "none" );
self enableweapons();
self enableweaponswitch();
self notify( "cancel_sentry" );
self notify( "cancel_ims" );
self notify( "cancelPlaceable" );
}
bot_sentry_cancel( var_0 )
{
self notify( "bot_sentry_canceled" );
bot_send_cancel_notify();
bot_sentry_ensure_exit();
}
bot_sentry_ensure_exit()
{
self notify( "bot_sentry_abort_goal_think" );
self notify( "bot_sentry_ensure_exit" );
self endon( "bot_sentry_ensure_exit" );
self endon( "death" );
self endon( "disconnect" );
level endon( "game_ended" );
self switchtoweapon( "none" );
self botclearscriptgoal();
self botsetstance( "none" );
self enableweapons();
self enableweaponswitch();
wait 0.25;
var_0 = 0;
while ( isdefined( bot_sentry_carried_obj() ) )
{
var_0++;
bot_send_cancel_notify();
wait 0.25;
if ( var_0 > 2 )
bot_sentry_force_cancel();
}
self notify( "bot_sentry_exited" );
}
bot_sentry_force_cancel()
{
if ( isdefined( self.carriedsentry ) )
self.carriedsentry maps\mp\killstreaks\_autosentry::sentry_setcancelled();
if ( isdefined( self.carriedims ) )
self.carriedims maps\mp\killstreaks\_ims::ims_setcancelled();
if ( isdefined( self.carrieditem ) )
self.carrieditem maps\mp\killstreaks\_placeable::oncancel( self.placingitemstreakname, 0 );
self.carriedsentry = undefined;
self.carriedims = undefined;
self.carrieditem = undefined;
self switchtoweapon( "none" );
self enableweapons();
self enableweaponswitch();
}

File diff suppressed because it is too large Load Diff

1642
maps/mp/bots/_bots_util.gsc Normal file

File diff suppressed because it is too large Load Diff